强烈推荐通讯录管理八皇后问题约瑟夫环表达式求值毕业论文报告.docx
- 文档编号:23647419
- 上传时间:2023-05-19
- 格式:DOCX
- 页数:30
- 大小:33.11KB
强烈推荐通讯录管理八皇后问题约瑟夫环表达式求值毕业论文报告.docx
《强烈推荐通讯录管理八皇后问题约瑟夫环表达式求值毕业论文报告.docx》由会员分享,可在线阅读,更多相关《强烈推荐通讯录管理八皇后问题约瑟夫环表达式求值毕业论文报告.docx(30页珍藏版)》请在冰豆网上搜索。
强烈推荐通讯录管理八皇后问题约瑟夫环表达式求值毕业论文报告
数据结构
课程设计报告
选题名称:
通讯录管理、八皇后问题、
约瑟夫环、表达式求值
系(院):
计算机学院
专业:
计算机科学与技术
班级:
111-3
姓名:
孙鹏程
指导教师:
武秀川
2013年9月1
1通讯录3
1.1功能需求分析:
3
1.2系统功能模块图4
1.3设计思想:
4
1.4设计原理4
1.5主要代码描述5
2八皇后问题12
2.1问题简介12
2.2存储结构12
2.3关键算法分析12
2.4源代码13
3约瑟夫环16
3.1问题简介16
3.2数据结构描述16
3.3程序源代码17
4表达式求值18
4.1需求分析18
4.2设计概要19
4.3源程序19
5.心得体会27
1通讯录
1.1功能需求分析:
通讯录主要有一下模块:
通讯录界面设计、添加联系人、删除联系人、显示所有联系人、修改信息、查询联系人,其中姓名可以由字符和数字混合编码,电话号码可由字符和数字组成。
1.11通讯录界面设计
主要功能是设计通讯录的界面,能够提示用户的实际操作等。
我采用的是按照序号来实现相应的操作的,其中:
1添加联系人2删除联系人3显示所有联系人4修改信息5查询联系人6关闭通讯录
1.12通讯录添加联系人模块
主要功能是添加联系人模块,添加操作是根据用户的要求实现的。
包括添加联系人的姓名、电话、QQ、邮编、地址等,最后输入完成后,将提示新联系人信息已经保存好!
!
1.13通讯录删除联系人模块
主要功能是删除不再需要的联系人。
其中包括输入你要删除输入电话或电话号码如果没有的话,将提示:
对不起!
!
!
联系人中没你要找的人!
!
!
如果找到,
则提示删除联系人的所有信息和这个人的信息已经从你的通讯录中删除的信息!
1.14通讯录显示所有联系人模块
显示所有的联系人的信息,包括姓名、电话、QQ、邮编、地址并提示所有联系人已经全部显示出来!
!
1.15通讯录修改联系人模块
主要是修改联系人的信息,界面提示要输入需要修改的姓名或者电话号码,如果不正确,显示对不起,联系人中没有你找的人。
如果正确,则显示出改联系人的所有信息,并提示根据下面提示修改信息,姓名、电话号、QQ、邮编、地址等
1.16通讯录关闭通讯录模块
1.2系统功能模块图
通讯录系统
信息的初始化
添加联系人
删除联系人
显示所有联系人
修改信息
查询联系人
关闭通讯录
1.3设计思想:
通讯录系统是用面向对象的方法设计,在类中定义了一下方法:
add_person(),del_person(),show_all(),alter(),select(),save_new()等方法和name,address,
,number,post,qq属性来实现通讯录的各种操作。
1.4设计原理
通讯录管理系统以菜单选择,通过调用各个函数,通过使用各种循环语句如while和do…while,实现不同的功能.不同函数处理后返回的只是一个头结点,但是通过头结点可以找到所有链表中的信息,只要有函数,找到头指针就能进行相应的操作,所以模块化的程序方便以后添加或者删除某些功能,程序中通过system(“cls”)清屏函数实现界面的转换,主函数中的循环保证程序不会退出,一个循环和一个清屏函数实现了主菜单和各子画面的切换(子函数)。
这样的话各个子函数都可以调用一开始输入的数据,这样就实现了各个不同函数调用时都能使用整个系统连续起来了。
作为一个通讯录管理系统,增加了文件的读入和写出功能,增加了程序的实用性。
1.5主要代码描述
#include charTel[N]; charName[N]; charAddress[2*N]; structPerson*next; }Person,*Linklist; 输入函数 voidInPut(Linklistp) { printf("\n请输入通讯者姓名: \n"); scanf("%s",p->Name); printf("\n请输入通讯者联系电话: \n"); scanf("%s",p->Tel); printf("\n请输入通讯者地址: \n"); scanf("%s",p->Address); } 输出单个联系人的信息 voidPutNode(Linklistp) { printf("\n通讯者姓名: \n%s",p->Name); printf("\n通讯者联系电话: \n%s",p->Tel); printf("\n通讯者地址: \n%s\n\n",p->Address); } 回收内存函数 voidRelease(LinklistL) { Linklistz,p; p=L; while(p! =NULL) { z=p->next; free(p); p=z; } } 建立链表的函数 LinklistCreatList() { inttem1; Linklists,p,L; printf("\n输入通讯者信息: \n输入非零整数开始;或者输入'0'退出: \n"); scanf("%d",&tem1); L=(Linklist)malloc(sizeof(Person)); L->next=NULL; s=L; while(tem1! =0){ p=(Linklist)malloc(sizeof(Person)); InPut(p); p->next=s->next;s->next=p;s=p; printf("\n输入学生信息: \n输入非零整数继续;或者输入'0'退出: \n"); scanf("%d",&tem1); } returnL; } 向通讯录中第i个位置前插入一个联系人的函数 voidListInsert(LinklistL,inti) { intj=0; Linklists,p; p=L; while(p&&j if(! p||j>i-1)exit(0); s=(Linklist)malloc(sizeof(Person)); InPut(s); s->next=p->next; p->next=s; } 删除通讯录中第i个联系人的函数 voidListDelete(LinklistL,inti) { intj=0; Linklistp,q; p=L; while(p->next&&j if(! (p->next)||j>i-1)exit(0); q=p->next;p->next=q->next; printf("您将删除的联系人信息为: \n"); PutNode(q); free(q); } 输出通讯录中的所有联系人信息 voidOutPut(LinklistL) { Linklistp; p=L->next; printf("输出所有联系人信息: \n"); while(p! =NULL) { PutNode(p); p=p->next; } } 按姓名查找的函数 LinklistFindName(Linklistp) { chartem[N]; printf("\n请输入要查找同学的姓名: \n"); scanf("%s",tem); while(p! =NULL){ if(! strcmp(p->Name,tem)) returnp; else p=p->next; } returnNULL; } 按联系电话查找的函数 LinklistFindTel(Linklistp) { chartem[N]; printf("\n请输入要查找同学的联系电话: \n"); scanf("%s",tem); while(p! =NULL){ if(! strcmp(p->Tel,tem)) returnp; else p=p->next; } returnNULL; } 按住址查找的函数 LinklistFindAddress(Linklistp) { chartem[2*N]; printf("\n请输入要查找同学的住址: \n"); scanf("%s",tem); while(p! =NULL){ if(! strcmp(p->Address,tem)) returnp; else p=p->next; } returnNULL; } 查找函数 voidListFind(Linkliststu) { Linklistp; intb; printf("\n请输入对应功能号,实现不同方式查找: \n"); printf("\n1: 按姓名查找;2: 按联系电话查找;3: 按住址查找;其他: 退出\n"); scanf("%d",&b); while((b>0)&&(b<4)){ switch(b){ case1: { p=FindName(stu); if(p! =NULL) PutNode(p); else printf("没找到! "); break;} case2: { p=FindTel(stu); if(p! =NULL) PutNode(p); else printf("没找到! "); break;} case3: { p=FindAddress(stu); if(p! =NULL) PutNode(p); else printf("没找到! "); break;} default: break; } printf("\n1: 按姓名查找;2: 按联系电话查找;3: 按住址查找;其他: 退出\n"); scanf("%d",&b); } } 按照联系人姓名排序 voidSortName(LinklistL) { Linklistp,q,s; q=L;p=q->next->next;q->next->next=NULL; while(p) { while(q->next&&(strcmp(p->Name,q->next->Name)>0)) q=q->next; s=p->next; p->next=q->next; q->next=p; p=s; q=L; } } 按照联系人地址排序 voidSortAddress(LinklistL) { Linklistp,q,s; q=L;p=q->next->next;q->next->next=NULL; while(p) { while(q->next&&(strcmp(p->Address,q->next->Address)>0)) q=q->next; s=p->next; p->next=q->next; q->next=p; p=s; q=L; } } 按照联系人电话号码排序 voidSortTel(LinklistL) { Linklistp,q,s; q=L;p=q->next->next;q->next->next=NULL; while(p) { while(q->next&&(strcmp(p->Tel,q->next->Tel)>0)) q=q->next; s=p->next; p->next=q->next; q->next=p; p=s; q=L; } } 排序函数 voidSort(LinklistL) { Linklistp; p=L; inti; printf("请选择通讯录的几种排序方式: \n"); printf("1: 按姓名排序;2: 按电话号码排序;3: 按地址排序;其他整数: 退出\n"); scanf("%d",&i); switch(i) { case1: SortName(p);break; case2: SortTel(p);break; case3: SortAddress(p);break; default: break; } } 主函数 voidmain() { inti,j,t; LinklistL; while (1){ printf("通讯录功能如下: \n1.通讯录链表的建立;\n2.通讯者结点的插入;\n3.通讯者结点的查询;\n4.通讯者结点的删除;\n5.通讯录链表的输出;\n0.退出管理系统: \n请选择0-5\n"); scanf("%d",&t); if((t<=0)||(t>5))break; switch(t){ case1: {L=CreatList();Sort(L);break;} case2: { printf("在第i个联系人前插入,请输入i值\n"); scanf("%d",&i); ListInsert(L,i);break;} case3: ListFind(L);break; case4: { printf("删除第j个联系人的信息,请输入j值\n"); scanf("%d",&j); ListDelete(L,j);break;} case5: OutPut(L);break; } } printf("开始回收内存! "); Release(L); printf("回收内存结束! "); } 2八皇后问题 2.1问题简介 利用栈结构实现八皇后问题。 八皇后问题19世纪著名的数学家高斯于1850年提出的。 他的问题是: 在8*8的棋盘上放置8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列、同一斜线上。 请设计算法打印所有可能的摆放方法。 提示: 1、可以使用递归或非递归两种方法实现 2、实现一个关键算法: 判断任意两个皇后是否在同一行、同一列和同一斜线上 2.2存储结构 存储结构: 栈(递归) 2.3关键算法分析 【设计思想】 由于八皇后问题,可以分解成算法相同的子问题,所以使用递归的方法 【伪代码】 1、输入皇后个数n 2、k=1 3、判断k是否大于n 3.1是: 打印一组可能 3.2否: 循环行位置1~n 判断该位置是否符合要求,若符合记录q[k]的坐标y值 k+1重复3 2.4源代码 #include usingnamespacestd; constintStackSize=8;定义栈的最大高度 intans=0;初始化摆放方案计数器 template classSeqStack定义顺序栈模板类 { public: SeqStack(){top=-1;}构造函数,初始化空栈 voidPush(Tx);入栈 voidPop();出栈 voidPlaceQueen(introw);摆放8皇后的递归函数 boolJudgement();判断是否在同一行同一列同一斜线 voidOutput();打印棋盘 boolEmpty(){if(top==-1)returntrue;elsereturnfalse;};判别栈是否为空 private: Tdata[StackSize];定义数组 inttop;栈顶指针 }; template voidSeqStack : Push(Tx)入栈操作 { if(top>=StackSize-1)throw"error"; top++;栈顶指针上移 data[top]=x; } template voidSeqStack : Pop()出栈操作 { if(Empty())throw"error"; top--;栈顶指针下移 } template voidSeqStack : PlaceQueen(introw)在栈顶放置符合条件的值的操作,即摆放皇后 { for(intcol=0;col { Push(col); if(Judgement())判断摆放皇后的位置是否安全 { if(row PlaceQueen(row+1); else { ans++;解数加1 Output();打印成功的棋盘 } } Pop();若不符合条件则出栈 } } template boolSeqStack : Judgement() { for(inti=0;i if(data[top]==data[i]||(abs(data[top]-data[i]))==(top-i))判断是否在同一列同一斜线 returnfalse; returntrue; } template voidSeqStack : Output()将栈的数组形式打印成棋盘形式 { cout<<"NO."< "< for(inti=0;i { for(intj=0;j cout<<"-";不放置处打印“-” cout<<"Q";放置处打印“Q” for(intj=StackSize-1;j>data[i];j--) cout<<"-"; cout< } cout< } voidmain() { SeqStack Queen.PlaceQueen(0);从栈底开始赋值 cout<<"thetotalnumberofsolutionsis: "< } 3约瑟夫环 3.1问题简介 在整个课程设计中,我主要负责的是约瑟夫问题中链表中的出列的操作算法的设计。 用循环单链表表示编号为1,2…n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。 一开始输入一个正整数作为报数的上限值turn,从第一个人开始按顺时针方向自1开始顺序报数(即从第一个结点开始指针向后移动),报到turn-1时(即指针指向turn-1个结点时)停止,他的下一位出列,将他的下一位密码作为新的turn值,从出列的人的的顺时针方向上的下一个开始重新从1报数,如此下去,直至链表中只剩一位(即一个结点)退出循环,并所有人的编号按出列顺序输出。 在实现的过程中定义i表示报数的循环次数,因为每次循环都会有一个人出列且只剩一个人时结束循环,所以i<=number-1。 定义j表示所报的数,在j等于turn(报数上限)-1之前随着报数的进行,把指向头结点的指针p随着j增加的方向依次后移。 当j等于turn-1时,让p所指向结点的下一位出列。 用指针s表示要出列的人的结点,则出列后删除结点s(即free(s))。 按出列的顺序输出出列人的编号。 3.2数据结构描述 typedefstructLNode{ intdata; intcode; structLNode*next; }node,*linklist;单链表解决约瑟夫问题时储存结点信息 在单循环链表中进行出列的操作,方便、快捷、易理解。 链表中的结点及其指针域、数值域之间的联系与各种赋值与转换使得出列操作的思路变得清晰简单。 3.3程序源代码 #include { node*-1;i++) { p->data=1;将每个节点的值赋为1,表示该节点的人未被提出 p->next=newnode;节点指针指向新创建的节点 p=p->next; } p->data=1; p->next=)(节点起始位置,总共要显示人数) { node*q; q=;i++) { cout< q=q->next; } cout< } ***************************************************************** 函数功能: 报数踢人 ***************************************************************** voidDone(node*,intm,intk) {(节点起始位置,总人数,报数,提出人数) node*p; p=);显示每次报数后的情况 } } ***************************************************************** 函数功能: 主函数 ***************************************************************** voidmain() { node*,l; cout<<"请分别输入总人数N,每次报数M,及踢出L个人: "; cin>>n>>m>>l; );头结点指向初始化好的循环链表 Done(,m,l);开始报数踢人 } 4表达式求值 4.1需求分析 设计一个算术表达式四则运算的程序,要求完成包括加、减、乘、除运算,包含括号的基本整数表达式的运算。 在这里运算数可以1位长度,也可以多位长度。 在运算之后输出的正确运算结果,输入表达式后演示在求值中运算数栈内的栈顶数据变化过程,最后得到运算结果。 (1)输入: 3*(7-2)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 强烈推荐 通讯录 管理 皇后 问题 约瑟夫 表达式 求值 毕业论文 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)