C语言课程设计.docx
《C语言课程设计.docx》由会员分享,可在线阅读,更多相关《C语言课程设计.docx(30页珍藏版)》请在冰豆网上搜索。
C语言课程设计
华北水利水电学院
课程设计报告书
2012——2013学年
第二学期
环节名称:
高级语言课程设计(C语言)
专业班级:
信息与计算科学专业165班
姓名:
孙志攀
学号:
201216511
院、系:
数学与信息科学学院
指导教师:
海燕
必做题
1.输入10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。
写3个函数:
①求最小数、最大数的位置;②进行对换处理③主函数
程序源代码:
#include
voidptin(int*p,intn)
{
inti;
printf("请输入%d个整数:
",n);
for(i=0;i}voidpr(int*p,intn){inti,*max,*min;max=min=p;for(i=1;i{if(*max<*(p+i))max=p+i;if(*min>*(p+i))min=p+i;}i=*min;*min=*p;*p=i;i=*max;*max=*(p+n-1);*(p+n-1)=i;}voidptout(int*p,intn){inti;printf("输出%d个数:\n",n);for(i=0;iprintf("\n");}voidmain(){inta[10];ptin(a,10);printf("处理前");ptout(a,10);pr(a,10);printf("处理后");ptout(a,10);}2.将一组字符串按字典顺序输出。(通过函数调用完成)程序源代码:#include#includevoidpaixu(char*a[],intn){inti,j;char*b;for(i=0;i{for(j=i+1;jif(strcmp(a[i],a[j])>0){b=a[i];a[i]=a[j];a[j]=b;}}}voidmain(){inti,n=10;charc[10][20];char*t[10];printf("请输入十个字符串:");for(i=0;i{scanf("%s",c[i]);t[i]=c[i];}paixu(t,n);printf("按字典顺序排列,结果为:");for(i=0;iprintf("%s",t[i]);printf("\n");}3.有两个链表a和b,结点中包含学号和姓名。编写函数delete,从a链表中删去与b链表中有相同学号的结点。程序源代码:#include#include#defineN3typedefstructstudent{intnum;charname[20];structstudent*next;}STU;STU*create(){inti;STU*p,*head=NULL,*tail=head;for(i=0;i{p=(STU*)malloc(sizeof(STU));scanf("%d%s",&p->num,p->name);p->next=NULL;if(p->num<0){free(p);break;}if(head==NULL)head=p;elsetail->next=p;tail=p;}returnhead;}voidoutput(STU*p){while(p!=NULL){printf("%d\t%s\n",p->num,p->name);p=p->next;}}STU*del(STU*a,STU*b){STU*head,*p1,*p2;p1=p2=head=a;//让p1、p2、head结点指向链表a的头部while(b!=NULL){p1=p2=head;//每次循环前让p1、p2始终指向删除后链表的头部while(p1!=NULL){if(b->num==p1->num)//学号相同,删除结点信息if(p1==head)//如果删除的是头结点,则头结点位置要后移{head=p1->next;free(p1);p1=p2=head;}else//如果删除的是中间结点{p2->next=p1->next;free(p1);p1=p2->next;}else//学号不同,则p1,p2指针依次后移{p2=p1;p1=p1->next;}}b=b->next;}returnhead;}intmain(intargc,char*argv[]){STU*a,*b,*c;printf("\n请输入链表a的信息格式(学号姓名):\n");a=create();printf("\n请输入链表b的信息格式(学号姓名):\n");b=create();c=del(a,b);printf("\n经过删除后,a链表信息为:\n");output(c);return0;}程序的运行结果(I/O窗口截图)选做题(任选其一)1、电话簿管理系统一、需求分析设计一个电话簿管理系统,使之提供以下功能:(1)新建信息功能(2)查询信息功能(3)添加信息功能(4)修改信息功能(5)删除信息功能需求说明:(1)电话信息包括姓名(规定字节数为15)、电话号码(规定字节数为15)和工作单位(最大字节数为30)等信息。(2)录入的信息要求存入文件,并可以通过读取数据文件进行查询、修改、删除等基本操作。(3)对电话簿中的信息应能够分别按序号和姓名两种方式进行查询,并返回所有符合条件的信息。(4)修改、删除、添加等操作要求可以按照序号和姓名两种方式进行,并返回操作后的信息。(5)所设计的通讯系统要求以菜单方式工作,为用户提供清晰的使用提示,根据用户的选择进行各种处理。(6)需设计主控制菜单程序(menu()函数),实现菜单选择模块。(7)该系统中的各个子功能均需通过相应的自定义函数进行实现。二、总体设计初步提出解决方案,以及系统的体系结构和数据结构的设计方案,并写出书面总体设计说明书。(1)设计主控制菜单程序(menu()函数),实现菜单选择模块。①输出功能菜单(包括新建、读取文件、添加、查询、修改、删除、浏览、排序等)。②按提示信息选择功能菜单,并输出返回值。(2)设计New()函数,实现新建数据文件功能。(3)设计Load()函数,实现文件读取功能,若文件不存在,则返回New(),进入新建数据文件。(4)设计Add()函数,实现信息添加功能,分别录入序号、姓名、电话和工作单位。若序号已存在,则重新输入。(5)设计Qur()函数,实现信息查询功能,通过设计提示菜单,实现按序号和姓名两种方式查询。(6)设计Modify()函数,实现信息修改功能,在修改前,首先显示所有信息,然后通过序号实现修改。(7)设计Del()函数,实现信息删除功能,通过设计提示菜单,实现序号和姓名两种方式进行删除。(8)设计Sort()函数,实现信息排序功能,通过设计提示菜单,实现按序号和姓名两种方式进行排序。(9)设计Disp()函数,实现信息浏览功能。(10)设计Save()函数,实现信息保存功能,将新建或读取的文件,在退出程序后进行保存。三、详细设计给出主要流程图(1)系统功能模块图:主菜单新建文件读取文件添加通讯录查询通讯录修改通讯录删除通讯录排序通讯录浏览通讯录新建:可以新建文件,新建文件自己输入文件名字.txt。读取:通过成功读取可以在文件中实现以下功能。添加:可以添加通讯录,依次输入序号、姓名、电话、工作单位,会提示推出。查询:可以选择用序号、姓名的方式查询。修改:输入欲修改的那个人的信息,通过输入序号和姓名来修改通讯录信息。删除:输入欲删除的那个人的序号或姓名,来删除信息。排序:可以通过序号排序,或者通过姓名的拼音排序来排序。浏览:可以通过序号、姓名浏览通讯录。(2)工作流程图1、添加通讯录开始i=0Sign!=’n’&&sign!=’N’输入信息return(n+1)结束2.查询通讯录开始输入查询的姓名判断通讯录中是否有此人输出“通讯录中没有此人”显示该人所有记录结束3.删除通讯录4.修改通讯录开始输入查询的姓名判断通讯录中是否有此人输出“通讯录中没有此人”依次输入修改的内容结束开始输入查询的姓名判断通讯录中是否有此人输出“通讯录中没有此人”显示该人所有记录结束5.浏览通讯录开始inti:i=1i输入一个记录i++结束四、编写代码程序源代码:#include#include#include#defineN200#defineHEADER1"*********************电话簿***********************\n"#defineHEADER2"|序号|姓名|电话|工作单位|\n"#defineHEADER3"|--------|--------|--------|------------|\n"#defineFORMAT"|%-8d|%-14s|%-17s|%-22s|\n"#defineDATAp->num,p->name,p->telnumber,p->units#defineEND"------------------------------------------------------\n"typedefstructteldir{intnum;charname[15];chartelnumber[15];charunits[30];}TEL;typedefstructpointer_info{TEL*pHead;intcount;charfname[15];intsaveflag;}PI;voidmenu(){system("cls");printf("通讯录管理系统\n");printf("**************MENU*********************\n");printf("****1.新建文件***\n");printf("****2.读取文件***\n");printf("****3.添加通讯录***\n");printf("****4.查询通讯录***\n");printf("****5.修改通讯录***\n");printf("****6.删除通讯录***\n");printf("****7.排序通讯录***\n");printf("****8.浏览通讯录***\n");printf("****0.退出***\n");printf("***************************************\n");printf("\n");}voidSwap(TEL*p1,TEL*p2){TELstmp;stmp=*p1;*p1=*p2;*p2=stmp;}voidprintheader(){printf(HEADER1);printf(HEADER2);printf(HEADER3);}voidLoad(PI*pi){FILE*fp;TEL*p=pi->pHead;charfname[15];printf("请输入要加载的文件名:");scanf("%s",fname);strcat(fname,".txt");strcpy(pi->fname,fname);fp=fopen(pi->fname,"rb");if(fp==NULL){printf("\n==>无法打开文件!请新建数据文件!\n");return;}pi->count=0;pi->saveflag=0;while(!feof(fp)){if(fread(p,sizeof(TEL),1,fp)){pi->count++;p++;}}printf("成功读取数据文件!",fname);printf("\n请选择(0-8):");fclose(fp);}voidDisp(PI*pi){inti;TEL*p;FILE*fp=NULL;fp=fopen(pi->fname,"r");if(fp==NULL){printf("\nError!\n");return;}menu();p=pi->pHead;if(pi->count==0){printf("无记录!");printf("\n请选择(0-8):");return;}printheader();for(i=1;i<=pi->count;i++){printf(FORMAT,DATA);printf(HEADER3);p++;}}voidSort(PI*pi){inti,j;intsel;TEL*p;FILE*fp=NULL;fp=fopen(pi->fname,"rb+");if(fp==NULL){printf("\nError!\n");return;}system("cls");printf("**************************\n");printf("**1.按序号排序**\n");printf("**2.按姓名排序**\n");printf("**按任意键返回主菜单**\n");printf("\n请选择(1or2):");scanf("%d",&sel);if(sel!=1&&sel!=2){system("cls");menu();printf("请选择(0-8):");return;}if(sel==1){for(i=1;i<=pi->count-1;i++){p=pi->pHead;for(j=1;j<=pi->count-i;j++,p++){if(p->num>(p+1)->num)Swap(p,p+1);}}pi->saveflag=1;}elseif(sel==2){for(i=1;i<=pi->count-1;i++){p=pi->pHead;for(j=1;j<=pi->count-i;j++,p++){if(strcmp(p->name,(p+1)->name)>0)Swap(p,p+1);}}}Disp(pi);printf("请选择(0-8):");}voidDel(PI*pi){intsel;intnum;charname[15];TEL*p;inti;FILE*fp=NULL;fp=fopen(pi->fname,"rb+");if(fp==NULL){printf("\nError!\n");return;}p=pi->pHead;menu();Disp(pi);printf("**************************\n");printf("***1.按序号删除***\n");printf("***2.按姓名删除***\n");printf("***按任意键返回主菜单***\n");printf("\n请选择(1or2):");scanf("%d",&sel);if(sel!=1&&sel!=2){system("cls");menu();printf("请选择(0-8):");return;}if(sel==1){printf("请输入要删除记录的序号:");scanf("%d",&num);for(i=1;i<=pi->count;i++){if(num==p->num)break;p++;}if(i>pi->count){printf("无此人!\n");printf("请选择(0-8):");return;}elseif(i==pi->count){pi->count--;pi->saveflag=1;printf("记录成功删除!\n");}else{memcpy(p,p+1,(pi->pHead+pi->count-p)*sizeof(TEL));pi->count--;pi->saveflag=1;printf("记录成功删除!\n");}}elseif(sel=2){printf("请输入要删除的姓名:");scanf("%s",name);for(i=1;i<=pi->count;i++){if(!strcmp(name,p->name))break;p++;}if(i>pi->count){printf("无此人!\n");menu();printf("请选择(0-8):");return;}elseif(i==pi->count){pi->count--;pi->saveflag=1;printf("记录成功删除!\n");}else{memcpy(p,p+1,(pi->pHead+pi->count-p)*sizeof(TEL));pi->count--;pi->saveflag=1;printf("记录成功删除!\n");}}fclose(fp);printf("请选择(0-8):");}voidModify(PI*pi){intnum,i;TEL*p;FILE*fp=NULL;fp=fopen(pi->fname,"r");if(fp==NULL){printf("\nError!\n");return;}p=pi->pHead;menu();Disp(pi);printf("请输入要修改的序号:");scanf("%d",&num);for(i=1;icount;i++){if(num==p->num)break;p++;}if(i>pi->count){printf("无此人!\n");printf("请选择(0-8):");return;}else{printf("请输入正确的序号:(输入0返回菜单)");scanf("%d",&num);if(num!=0)p->num=num;else{menu();printf("请选择(0-8):");return;}printf("请输入正确的姓名:");scanf("%s",p->name);printf("请输入正确的电话:");scanf("%s",p->telnumber);printf("请输入正确的工作单位:");scanf("%s",p->units);pi->saveflag=1;}printf("请选择(0-8):");fclose(fp);}voidQur(PI*pi){intsel,i,num;TEL*p;charname[15];FILE*fp=NULL;fp=fopen(pi->fname,"r");if(fp==NULL){printf("\nError!\n");return;}p=pi->pHead;menu();printf("**************************\n");printf("***1.按序号查询***\n");printf("***2.按姓名查询***\n");printf("***按任意键返回主菜单***\n");printf("\n请选择(1or2):");scanf("%d",&sel);if(sel!=1&&sel!=2){system("cls");menu();printf("请选择(0-8):");return;}if(sel==1){printf("请输入要查询记录的序号:");scanf("%d",&num);for(i=1;i<=pi->count;i++){if(num==p->num)break;p++;}
}
voidpr(int*p,intn)
inti,*max,*min;
max=min=p;
for(i=1;i{if(*max<*(p+i))max=p+i;if(*min>*(p+i))min=p+i;}i=*min;*min=*p;*p=i;i=*max;*max=*(p+n-1);*(p+n-1)=i;}voidptout(int*p,intn){inti;printf("输出%d个数:\n",n);for(i=0;iprintf("\n");}voidmain(){inta[10];ptin(a,10);printf("处理前");ptout(a,10);pr(a,10);printf("处理后");ptout(a,10);}2.将一组字符串按字典顺序输出。(通过函数调用完成)程序源代码:#include#includevoidpaixu(char*a[],intn){inti,j;char*b;for(i=0;i{for(j=i+1;jif(strcmp(a[i],a[j])>0){b=a[i];a[i]=a[j];a[j]=b;}}}voidmain(){inti,n=10;charc[10][20];char*t[10];printf("请输入十个字符串:");for(i=0;i{scanf("%s",c[i]);t[i]=c[i];}paixu(t,n);printf("按字典顺序排列,结果为:");for(i=0;iprintf("%s",t[i]);printf("\n");}3.有两个链表a和b,结点中包含学号和姓名。编写函数delete,从a链表中删去与b链表中有相同学号的结点。程序源代码:#include#include#defineN3typedefstructstudent{intnum;charname[20];structstudent*next;}STU;STU*create(){inti;STU*p,*head=NULL,*tail=head;for(i=0;i{p=(STU*)malloc(sizeof(STU));scanf("%d%s",&p->num,p->name);p->next=NULL;if(p->num<0){free(p);break;}if(head==NULL)head=p;elsetail->next=p;tail=p;}returnhead;}voidoutput(STU*p){while(p!=NULL){printf("%d\t%s\n",p->num,p->name);p=p->next;}}STU*del(STU*a,STU*b){STU*head,*p1,*p2;p1=p2=head=a;//让p1、p2、head结点指向链表a的头部while(b!=NULL){p1=p2=head;//每次循环前让p1、p2始终指向删除后链表的头部while(p1!=NULL){if(b->num==p1->num)//学号相同,删除结点信息if(p1==head)//如果删除的是头结点,则头结点位置要后移{head=p1->next;free(p1);p1=p2=head;}else//如果删除的是中间结点{p2->next=p1->next;free(p1);p1=p2->next;}else//学号不同,则p1,p2指针依次后移{p2=p1;p1=p1->next;}}b=b->next;}returnhead;}intmain(intargc,char*argv[]){STU*a,*b,*c;printf("\n请输入链表a的信息格式(学号姓名):\n");a=create();printf("\n请输入链表b的信息格式(学号姓名):\n");b=create();c=del(a,b);printf("\n经过删除后,a链表信息为:\n");output(c);return0;}程序的运行结果(I/O窗口截图)选做题(任选其一)1、电话簿管理系统一、需求分析设计一个电话簿管理系统,使之提供以下功能:(1)新建信息功能(2)查询信息功能(3)添加信息功能(4)修改信息功能(5)删除信息功能需求说明:(1)电话信息包括姓名(规定字节数为15)、电话号码(规定字节数为15)和工作单位(最大字节数为30)等信息。(2)录入的信息要求存入文件,并可以通过读取数据文件进行查询、修改、删除等基本操作。(3)对电话簿中的信息应能够分别按序号和姓名两种方式进行查询,并返回所有符合条件的信息。(4)修改、删除、添加等操作要求可以按照序号和姓名两种方式进行,并返回操作后的信息。(5)所设计的通讯系统要求以菜单方式工作,为用户提供清晰的使用提示,根据用户的选择进行各种处理。(6)需设计主控制菜单程序(menu()函数),实现菜单选择模块。(7)该系统中的各个子功能均需通过相应的自定义函数进行实现。二、总体设计初步提出解决方案,以及系统的体系结构和数据结构的设计方案,并写出书面总体设计说明书。(1)设计主控制菜单程序(menu()函数),实现菜单选择模块。①输出功能菜单(包括新建、读取文件、添加、查询、修改、删除、浏览、排序等)。②按提示信息选择功能菜单,并输出返回值。(2)设计New()函数,实现新建数据文件功能。(3)设计Load()函数,实现文件读取功能,若文件不存在,则返回New(),进入新建数据文件。(4)设计Add()函数,实现信息添加功能,分别录入序号、姓名、电话和工作单位。若序号已存在,则重新输入。(5)设计Qur()函数,实现信息查询功能,通过设计提示菜单,实现按序号和姓名两种方式查询。(6)设计Modify()函数,实现信息修改功能,在修改前,首先显示所有信息,然后通过序号实现修改。(7)设计Del()函数,实现信息删除功能,通过设计提示菜单,实现序号和姓名两种方式进行删除。(8)设计Sort()函数,实现信息排序功能,通过设计提示菜单,实现按序号和姓名两种方式进行排序。(9)设计Disp()函数,实现信息浏览功能。(10)设计Save()函数,实现信息保存功能,将新建或读取的文件,在退出程序后进行保存。三、详细设计给出主要流程图(1)系统功能模块图:主菜单新建文件读取文件添加通讯录查询通讯录修改通讯录删除通讯录排序通讯录浏览通讯录新建:可以新建文件,新建文件自己输入文件名字.txt。读取:通过成功读取可以在文件中实现以下功能。添加:可以添加通讯录,依次输入序号、姓名、电话、工作单位,会提示推出。查询:可以选择用序号、姓名的方式查询。修改:输入欲修改的那个人的信息,通过输入序号和姓名来修改通讯录信息。删除:输入欲删除的那个人的序号或姓名,来删除信息。排序:可以通过序号排序,或者通过姓名的拼音排序来排序。浏览:可以通过序号、姓名浏览通讯录。(2)工作流程图1、添加通讯录开始i=0Sign!=’n’&&sign!=’N’输入信息return(n+1)结束2.查询通讯录开始输入查询的姓名判断通讯录中是否有此人输出“通讯录中没有此人”显示该人所有记录结束3.删除通讯录4.修改通讯录开始输入查询的姓名判断通讯录中是否有此人输出“通讯录中没有此人”依次输入修改的内容结束开始输入查询的姓名判断通讯录中是否有此人输出“通讯录中没有此人”显示该人所有记录结束5.浏览通讯录开始inti:i=1i输入一个记录i++结束四、编写代码程序源代码:#include#include#include#defineN200#defineHEADER1"*********************电话簿***********************\n"#defineHEADER2"|序号|姓名|电话|工作单位|\n"#defineHEADER3"|--------|--------|--------|------------|\n"#defineFORMAT"|%-8d|%-14s|%-17s|%-22s|\n"#defineDATAp->num,p->name,p->telnumber,p->units#defineEND"------------------------------------------------------\n"typedefstructteldir{intnum;charname[15];chartelnumber[15];charunits[30];}TEL;typedefstructpointer_info{TEL*pHead;intcount;charfname[15];intsaveflag;}PI;voidmenu(){system("cls");printf("通讯录管理系统\n");printf("**************MENU*********************\n");printf("****1.新建文件***\n");printf("****2.读取文件***\n");printf("****3.添加通讯录***\n");printf("****4.查询通讯录***\n");printf("****5.修改通讯录***\n");printf("****6.删除通讯录***\n");printf("****7.排序通讯录***\n");printf("****8.浏览通讯录***\n");printf("****0.退出***\n");printf("***************************************\n");printf("\n");}voidSwap(TEL*p1,TEL*p2){TELstmp;stmp=*p1;*p1=*p2;*p2=stmp;}voidprintheader(){printf(HEADER1);printf(HEADER2);printf(HEADER3);}voidLoad(PI*pi){FILE*fp;TEL*p=pi->pHead;charfname[15];printf("请输入要加载的文件名:");scanf("%s",fname);strcat(fname,".txt");strcpy(pi->fname,fname);fp=fopen(pi->fname,"rb");if(fp==NULL){printf("\n==>无法打开文件!请新建数据文件!\n");return;}pi->count=0;pi->saveflag=0;while(!feof(fp)){if(fread(p,sizeof(TEL),1,fp)){pi->count++;p++;}}printf("成功读取数据文件!",fname);printf("\n请选择(0-8):");fclose(fp);}voidDisp(PI*pi){inti;TEL*p;FILE*fp=NULL;fp=fopen(pi->fname,"r");if(fp==NULL){printf("\nError!\n");return;}menu();p=pi->pHead;if(pi->count==0){printf("无记录!");printf("\n请选择(0-8):");return;}printheader();for(i=1;i<=pi->count;i++){printf(FORMAT,DATA);printf(HEADER3);p++;}}voidSort(PI*pi){inti,j;intsel;TEL*p;FILE*fp=NULL;fp=fopen(pi->fname,"rb+");if(fp==NULL){printf("\nError!\n");return;}system("cls");printf("**************************\n");printf("**1.按序号排序**\n");printf("**2.按姓名排序**\n");printf("**按任意键返回主菜单**\n");printf("\n请选择(1or2):");scanf("%d",&sel);if(sel!=1&&sel!=2){system("cls");menu();printf("请选择(0-8):");return;}if(sel==1){for(i=1;i<=pi->count-1;i++){p=pi->pHead;for(j=1;j<=pi->count-i;j++,p++){if(p->num>(p+1)->num)Swap(p,p+1);}}pi->saveflag=1;}elseif(sel==2){for(i=1;i<=pi->count-1;i++){p=pi->pHead;for(j=1;j<=pi->count-i;j++,p++){if(strcmp(p->name,(p+1)->name)>0)Swap(p,p+1);}}}Disp(pi);printf("请选择(0-8):");}voidDel(PI*pi){intsel;intnum;charname[15];TEL*p;inti;FILE*fp=NULL;fp=fopen(pi->fname,"rb+");if(fp==NULL){printf("\nError!\n");return;}p=pi->pHead;menu();Disp(pi);printf("**************************\n");printf("***1.按序号删除***\n");printf("***2.按姓名删除***\n");printf("***按任意键返回主菜单***\n");printf("\n请选择(1or2):");scanf("%d",&sel);if(sel!=1&&sel!=2){system("cls");menu();printf("请选择(0-8):");return;}if(sel==1){printf("请输入要删除记录的序号:");scanf("%d",&num);for(i=1;i<=pi->count;i++){if(num==p->num)break;p++;}if(i>pi->count){printf("无此人!\n");printf("请选择(0-8):");return;}elseif(i==pi->count){pi->count--;pi->saveflag=1;printf("记录成功删除!\n");}else{memcpy(p,p+1,(pi->pHead+pi->count-p)*sizeof(TEL));pi->count--;pi->saveflag=1;printf("记录成功删除!\n");}}elseif(sel=2){printf("请输入要删除的姓名:");scanf("%s",name);for(i=1;i<=pi->count;i++){if(!strcmp(name,p->name))break;p++;}if(i>pi->count){printf("无此人!\n");menu();printf("请选择(0-8):");return;}elseif(i==pi->count){pi->count--;pi->saveflag=1;printf("记录成功删除!\n");}else{memcpy(p,p+1,(pi->pHead+pi->count-p)*sizeof(TEL));pi->count--;pi->saveflag=1;printf("记录成功删除!\n");}}fclose(fp);printf("请选择(0-8):");}voidModify(PI*pi){intnum,i;TEL*p;FILE*fp=NULL;fp=fopen(pi->fname,"r");if(fp==NULL){printf("\nError!\n");return;}p=pi->pHead;menu();Disp(pi);printf("请输入要修改的序号:");scanf("%d",&num);for(i=1;icount;i++){if(num==p->num)break;p++;}if(i>pi->count){printf("无此人!\n");printf("请选择(0-8):");return;}else{printf("请输入正确的序号:(输入0返回菜单)");scanf("%d",&num);if(num!=0)p->num=num;else{menu();printf("请选择(0-8):");return;}printf("请输入正确的姓名:");scanf("%s",p->name);printf("请输入正确的电话:");scanf("%s",p->telnumber);printf("请输入正确的工作单位:");scanf("%s",p->units);pi->saveflag=1;}printf("请选择(0-8):");fclose(fp);}voidQur(PI*pi){intsel,i,num;TEL*p;charname[15];FILE*fp=NULL;fp=fopen(pi->fname,"r");if(fp==NULL){printf("\nError!\n");return;}p=pi->pHead;menu();printf("**************************\n");printf("***1.按序号查询***\n");printf("***2.按姓名查询***\n");printf("***按任意键返回主菜单***\n");printf("\n请选择(1or2):");scanf("%d",&sel);if(sel!=1&&sel!=2){system("cls");menu();printf("请选择(0-8):");return;}if(sel==1){printf("请输入要查询记录的序号:");scanf("%d",&num);for(i=1;i<=pi->count;i++){if(num==p->num)break;p++;}
if(*max<*(p+i))max=p+i;
if(*min>*(p+i))min=p+i;
i=*min;*min=*p;*p=i;
i=*max;*max=*(p+n-1);*(p+n-1)=i;
voidptout(int*p,intn)
printf("输出%d个数:
\n",n);
for(i=0;iprintf("\n");}voidmain(){inta[10];ptin(a,10);printf("处理前");ptout(a,10);pr(a,10);printf("处理后");ptout(a,10);}2.将一组字符串按字典顺序输出。(通过函数调用完成)程序源代码:#include#includevoidpaixu(char*a[],intn){inti,j;char*b;for(i=0;i{for(j=i+1;jif(strcmp(a[i],a[j])>0){b=a[i];a[i]=a[j];a[j]=b;}}}voidmain(){inti,n=10;charc[10][20];char*t[10];printf("请输入十个字符串:");for(i=0;i{scanf("%s",c[i]);t[i]=c[i];}paixu(t,n);printf("按字典顺序排列,结果为:");for(i=0;iprintf("%s",t[i]);printf("\n");}3.有两个链表a和b,结点中包含学号和姓名。编写函数delete,从a链表中删去与b链表中有相同学号的结点。程序源代码:#include#include#defineN3typedefstructstudent{intnum;charname[20];structstudent*next;}STU;STU*create(){inti;STU*p,*head=NULL,*tail=head;for(i=0;i{p=(STU*)malloc(sizeof(STU));scanf("%d%s",&p->num,p->name);p->next=NULL;if(p->num<0){free(p);break;}if(head==NULL)head=p;elsetail->next=p;tail=p;}returnhead;}voidoutput(STU*p){while(p!=NULL){printf("%d\t%s\n",p->num,p->name);p=p->next;}}STU*del(STU*a,STU*b){STU*head,*p1,*p2;p1=p2=head=a;//让p1、p2、head结点指向链表a的头部while(b!=NULL){p1=p2=head;//每次循环前让p1、p2始终指向删除后链表的头部while(p1!=NULL){if(b->num==p1->num)//学号相同,删除结点信息if(p1==head)//如果删除的是头结点,则头结点位置要后移{head=p1->next;free(p1);p1=p2=head;}else//如果删除的是中间结点{p2->next=p1->next;free(p1);p1=p2->next;}else//学号不同,则p1,p2指针依次后移{p2=p1;p1=p1->next;}}b=b->next;}returnhead;}intmain(intargc,char*argv[]){STU*a,*b,*c;printf("\n请输入链表a的信息格式(学号姓名):\n");a=create();printf("\n请输入链表b的信息格式(学号姓名):\n");b=create();c=del(a,b);printf("\n经过删除后,a链表信息为:\n");output(c);return0;}程序的运行结果(I/O窗口截图)选做题(任选其一)1、电话簿管理系统一、需求分析设计一个电话簿管理系统,使之提供以下功能:(1)新建信息功能(2)查询信息功能(3)添加信息功能(4)修改信息功能(5)删除信息功能需求说明:(1)电话信息包括姓名(规定字节数为15)、电话号码(规定字节数为15)和工作单位(最大字节数为30)等信息。(2)录入的信息要求存入文件,并可以通过读取数据文件进行查询、修改、删除等基本操作。(3)对电话簿中的信息应能够分别按序号和姓名两种方式进行查询,并返回所有符合条件的信息。(4)修改、删除、添加等操作要求可以按照序号和姓名两种方式进行,并返回操作后的信息。(5)所设计的通讯系统要求以菜单方式工作,为用户提供清晰的使用提示,根据用户的选择进行各种处理。(6)需设计主控制菜单程序(menu()函数),实现菜单选择模块。(7)该系统中的各个子功能均需通过相应的自定义函数进行实现。二、总体设计初步提出解决方案,以及系统的体系结构和数据结构的设计方案,并写出书面总体设计说明书。(1)设计主控制菜单程序(menu()函数),实现菜单选择模块。①输出功能菜单(包括新建、读取文件、添加、查询、修改、删除、浏览、排序等)。②按提示信息选择功能菜单,并输出返回值。(2)设计New()函数,实现新建数据文件功能。(3)设计Load()函数,实现文件读取功能,若文件不存在,则返回New(),进入新建数据文件。(4)设计Add()函数,实现信息添加功能,分别录入序号、姓名、电话和工作单位。若序号已存在,则重新输入。(5)设计Qur()函数,实现信息查询功能,通过设计提示菜单,实现按序号和姓名两种方式查询。(6)设计Modify()函数,实现信息修改功能,在修改前,首先显示所有信息,然后通过序号实现修改。(7)设计Del()函数,实现信息删除功能,通过设计提示菜单,实现序号和姓名两种方式进行删除。(8)设计Sort()函数,实现信息排序功能,通过设计提示菜单,实现按序号和姓名两种方式进行排序。(9)设计Disp()函数,实现信息浏览功能。(10)设计Save()函数,实现信息保存功能,将新建或读取的文件,在退出程序后进行保存。三、详细设计给出主要流程图(1)系统功能模块图:主菜单新建文件读取文件添加通讯录查询通讯录修改通讯录删除通讯录排序通讯录浏览通讯录新建:可以新建文件,新建文件自己输入文件名字.txt。读取:通过成功读取可以在文件中实现以下功能。添加:可以添加通讯录,依次输入序号、姓名、电话、工作单位,会提示推出。查询:可以选择用序号、姓名的方式查询。修改:输入欲修改的那个人的信息,通过输入序号和姓名来修改通讯录信息。删除:输入欲删除的那个人的序号或姓名,来删除信息。排序:可以通过序号排序,或者通过姓名的拼音排序来排序。浏览:可以通过序号、姓名浏览通讯录。(2)工作流程图1、添加通讯录开始i=0Sign!=’n’&&sign!=’N’输入信息return(n+1)结束2.查询通讯录开始输入查询的姓名判断通讯录中是否有此人输出“通讯录中没有此人”显示该人所有记录结束3.删除通讯录4.修改通讯录开始输入查询的姓名判断通讯录中是否有此人输出“通讯录中没有此人”依次输入修改的内容结束开始输入查询的姓名判断通讯录中是否有此人输出“通讯录中没有此人”显示该人所有记录结束5.浏览通讯录开始inti:i=1i输入一个记录i++结束四、编写代码程序源代码:#include#include#include#defineN200#defineHEADER1"*********************电话簿***********************\n"#defineHEADER2"|序号|姓名|电话|工作单位|\n"#defineHEADER3"|--------|--------|--------|------------|\n"#defineFORMAT"|%-8d|%-14s|%-17s|%-22s|\n"#defineDATAp->num,p->name,p->telnumber,p->units#defineEND"------------------------------------------------------\n"typedefstructteldir{intnum;charname[15];chartelnumber[15];charunits[30];}TEL;typedefstructpointer_info{TEL*pHead;intcount;charfname[15];intsaveflag;}PI;voidmenu(){system("cls");printf("通讯录管理系统\n");printf("**************MENU*********************\n");printf("****1.新建文件***\n");printf("****2.读取文件***\n");printf("****3.添加通讯录***\n");printf("****4.查询通讯录***\n");printf("****5.修改通讯录***\n");printf("****6.删除通讯录***\n");printf("****7.排序通讯录***\n");printf("****8.浏览通讯录***\n");printf("****0.退出***\n");printf("***************************************\n");printf("\n");}voidSwap(TEL*p1,TEL*p2){TELstmp;stmp=*p1;*p1=*p2;*p2=stmp;}voidprintheader(){printf(HEADER1);printf(HEADER2);printf(HEADER3);}voidLoad(PI*pi){FILE*fp;TEL*p=pi->pHead;charfname[15];printf("请输入要加载的文件名:");scanf("%s",fname);strcat(fname,".txt");strcpy(pi->fname,fname);fp=fopen(pi->fname,"rb");if(fp==NULL){printf("\n==>无法打开文件!请新建数据文件!\n");return;}pi->count=0;pi->saveflag=0;while(!feof(fp)){if(fread(p,sizeof(TEL),1,fp)){pi->count++;p++;}}printf("成功读取数据文件!",fname);printf("\n请选择(0-8):");fclose(fp);}voidDisp(PI*pi){inti;TEL*p;FILE*fp=NULL;fp=fopen(pi->fname,"r");if(fp==NULL){printf("\nError!\n");return;}menu();p=pi->pHead;if(pi->count==0){printf("无记录!");printf("\n请选择(0-8):");return;}printheader();for(i=1;i<=pi->count;i++){printf(FORMAT,DATA);printf(HEADER3);p++;}}voidSort(PI*pi){inti,j;intsel;TEL*p;FILE*fp=NULL;fp=fopen(pi->fname,"rb+");if(fp==NULL){printf("\nError!\n");return;}system("cls");printf("**************************\n");printf("**1.按序号排序**\n");printf("**2.按姓名排序**\n");printf("**按任意键返回主菜单**\n");printf("\n请选择(1or2):");scanf("%d",&sel);if(sel!=1&&sel!=2){system("cls");menu();printf("请选择(0-8):");return;}if(sel==1){for(i=1;i<=pi->count-1;i++){p=pi->pHead;for(j=1;j<=pi->count-i;j++,p++){if(p->num>(p+1)->num)Swap(p,p+1);}}pi->saveflag=1;}elseif(sel==2){for(i=1;i<=pi->count-1;i++){p=pi->pHead;for(j=1;j<=pi->count-i;j++,p++){if(strcmp(p->name,(p+1)->name)>0)Swap(p,p+1);}}}Disp(pi);printf("请选择(0-8):");}voidDel(PI*pi){intsel;intnum;charname[15];TEL*p;inti;FILE*fp=NULL;fp=fopen(pi->fname,"rb+");if(fp==NULL){printf("\nError!\n");return;}p=pi->pHead;menu();Disp(pi);printf("**************************\n");printf("***1.按序号删除***\n");printf("***2.按姓名删除***\n");printf("***按任意键返回主菜单***\n");printf("\n请选择(1or2):");scanf("%d",&sel);if(sel!=1&&sel!=2){system("cls");menu();printf("请选择(0-8):");return;}if(sel==1){printf("请输入要删除记录的序号:");scanf("%d",&num);for(i=1;i<=pi->count;i++){if(num==p->num)break;p++;}if(i>pi->count){printf("无此人!\n");printf("请选择(0-8):");return;}elseif(i==pi->count){pi->count--;pi->saveflag=1;printf("记录成功删除!\n");}else{memcpy(p,p+1,(pi->pHead+pi->count-p)*sizeof(TEL));pi->count--;pi->saveflag=1;printf("记录成功删除!\n");}}elseif(sel=2){printf("请输入要删除的姓名:");scanf("%s",name);for(i=1;i<=pi->count;i++){if(!strcmp(name,p->name))break;p++;}if(i>pi->count){printf("无此人!\n");menu();printf("请选择(0-8):");return;}elseif(i==pi->count){pi->count--;pi->saveflag=1;printf("记录成功删除!\n");}else{memcpy(p,p+1,(pi->pHead+pi->count-p)*sizeof(TEL));pi->count--;pi->saveflag=1;printf("记录成功删除!\n");}}fclose(fp);printf("请选择(0-8):");}voidModify(PI*pi){intnum,i;TEL*p;FILE*fp=NULL;fp=fopen(pi->fname,"r");if(fp==NULL){printf("\nError!\n");return;}p=pi->pHead;menu();Disp(pi);printf("请输入要修改的序号:");scanf("%d",&num);for(i=1;icount;i++){if(num==p->num)break;p++;}if(i>pi->count){printf("无此人!\n");printf("请选择(0-8):");return;}else{printf("请输入正确的序号:(输入0返回菜单)");scanf("%d",&num);if(num!=0)p->num=num;else{menu();printf("请选择(0-8):");return;}printf("请输入正确的姓名:");scanf("%s",p->name);printf("请输入正确的电话:");scanf("%s",p->telnumber);printf("请输入正确的工作单位:");scanf("%s",p->units);pi->saveflag=1;}printf("请选择(0-8):");fclose(fp);}voidQur(PI*pi){intsel,i,num;TEL*p;charname[15];FILE*fp=NULL;fp=fopen(pi->fname,"r");if(fp==NULL){printf("\nError!\n");return;}p=pi->pHead;menu();printf("**************************\n");printf("***1.按序号查询***\n");printf("***2.按姓名查询***\n");printf("***按任意键返回主菜单***\n");printf("\n请选择(1or2):");scanf("%d",&sel);if(sel!=1&&sel!=2){system("cls");menu();printf("请选择(0-8):");return;}if(sel==1){printf("请输入要查询记录的序号:");scanf("%d",&num);for(i=1;i<=pi->count;i++){if(num==p->num)break;p++;}
printf("\n");
voidmain()
inta[10];
ptin(a,10);
printf("处理前");
ptout(a,10);
pr(a,10);
printf("处理后");
2.将一组字符串按字典顺序输出。
(通过函数调用完成)
voidpaixu(char*a[],intn)
inti,j;
char*b;
for(i=0;i{for(j=i+1;jif(strcmp(a[i],a[j])>0){b=a[i];a[i]=a[j];a[j]=b;}}}voidmain(){inti,n=10;charc[10][20];char*t[10];printf("请输入十个字符串:");for(i=0;i{scanf("%s",c[i]);t[i]=c[i];}paixu(t,n);printf("按字典顺序排列,结果为:");for(i=0;iprintf("%s",t[i]);printf("\n");}3.有两个链表a和b,结点中包含学号和姓名。编写函数delete,从a链表中删去与b链表中有相同学号的结点。程序源代码:#include#include#defineN3typedefstructstudent{intnum;charname[20];structstudent*next;}STU;STU*create(){inti;STU*p,*head=NULL,*tail=head;for(i=0;i{p=(STU*)malloc(sizeof(STU));scanf("%d%s",&p->num,p->name);p->next=NULL;if(p->num<0){free(p);break;}if(head==NULL)head=p;elsetail->next=p;tail=p;}returnhead;}voidoutput(STU*p){while(p!=NULL){printf("%d\t%s\n",p->num,p->name);p=p->next;}}STU*del(STU*a,STU*b){STU*head,*p1,*p2;p1=p2=head=a;//让p1、p2、head结点指向链表a的头部while(b!=NULL){p1=p2=head;//每次循环前让p1、p2始终指向删除后链表的头部while(p1!=NULL){if(b->num==p1->num)//学号相同,删除结点信息if(p1==head)//如果删除的是头结点,则头结点位置要后移{head=p1->next;free(p1);p1=p2=head;}else//如果删除的是中间结点{p2->next=p1->next;free(p1);p1=p2->next;}else//学号不同,则p1,p2指针依次后移{p2=p1;p1=p1->next;}}b=b->next;}returnhead;}intmain(intargc,char*argv[]){STU*a,*b,*c;printf("\n请输入链表a的信息格式(学号姓名):\n");a=create();printf("\n请输入链表b的信息格式(学号姓名):\n");b=create();c=del(a,b);printf("\n经过删除后,a链表信息为:\n");output(c);return0;}程序的运行结果(I/O窗口截图)选做题(任选其一)1、电话簿管理系统一、需求分析设计一个电话簿管理系统,使之提供以下功能:(1)新建信息功能(2)查询信息功能(3)添加信息功能(4)修改信息功能(5)删除信息功能需求说明:(1)电话信息包括姓名(规定字节数为15)、电话号码(规定字节数为15)和工作单位(最大字节数为30)等信息。(2)录入的信息要求存入文件,并可以通过读取数据文件进行查询、修改、删除等基本操作。(3)对电话簿中的信息应能够分别按序号和姓名两种方式进行查询,并返回所有符合条件的信息。(4)修改、删除、添加等操作要求可以按照序号和姓名两种方式进行,并返回操作后的信息。(5)所设计的通讯系统要求以菜单方式工作,为用户提供清晰的使用提示,根据用户的选择进行各种处理。(6)需设计主控制菜单程序(menu()函数),实现菜单选择模块。(7)该系统中的各个子功能均需通过相应的自定义函数进行实现。二、总体设计初步提出解决方案,以及系统的体系结构和数据结构的设计方案,并写出书面总体设计说明书。(1)设计主控制菜单程序(menu()函数),实现菜单选择模块。①输出功能菜单(包括新建、读取文件、添加、查询、修改、删除、浏览、排序等)。②按提示信息选择功能菜单,并输出返回值。(2)设计New()函数,实现新建数据文件功能。(3)设计Load()函数,实现文件读取功能,若文件不存在,则返回New(),进入新建数据文件。(4)设计Add()函数,实现信息添加功能,分别录入序号、姓名、电话和工作单位。若序号已存在,则重新输入。(5)设计Qur()函数,实现信息查询功能,通过设计提示菜单,实现按序号和姓名两种方式查询。(6)设计Modify()函数,实现信息修改功能,在修改前,首先显示所有信息,然后通过序号实现修改。(7)设计Del()函数,实现信息删除功能,通过设计提示菜单,实现序号和姓名两种方式进行删除。(8)设计Sort()函数,实现信息排序功能,通过设计提示菜单,实现按序号和姓名两种方式进行排序。(9)设计Disp()函数,实现信息浏览功能。(10)设计Save()函数,实现信息保存功能,将新建或读取的文件,在退出程序后进行保存。三、详细设计给出主要流程图(1)系统功能模块图:主菜单新建文件读取文件添加通讯录查询通讯录修改通讯录删除通讯录排序通讯录浏览通讯录新建:可以新建文件,新建文件自己输入文件名字.txt。读取:通过成功读取可以在文件中实现以下功能。添加:可以添加通讯录,依次输入序号、姓名、电话、工作单位,会提示推出。查询:可以选择用序号、姓名的方式查询。修改:输入欲修改的那个人的信息,通过输入序号和姓名来修改通讯录信息。删除:输入欲删除的那个人的序号或姓名,来删除信息。排序:可以通过序号排序,或者通过姓名的拼音排序来排序。浏览:可以通过序号、姓名浏览通讯录。(2)工作流程图1、添加通讯录开始i=0Sign!=’n’&&sign!=’N’输入信息return(n+1)结束2.查询通讯录开始输入查询的姓名判断通讯录中是否有此人输出“通讯录中没有此人”显示该人所有记录结束3.删除通讯录4.修改通讯录开始输入查询的姓名判断通讯录中是否有此人输出“通讯录中没有此人”依次输入修改的内容结束开始输入查询的姓名判断通讯录中是否有此人输出“通讯录中没有此人”显示该人所有记录结束5.浏览通讯录开始inti:i=1i输入一个记录i++结束四、编写代码程序源代码:#include#include#include#defineN200#defineHEADER1"*********************电话簿***********************\n"#defineHEADER2"|序号|姓名|电话|工作单位|\n"#defineHEADER3"|--------|--------|--------|------------|\n"#defineFORMAT"|%-8d|%-14s|%-17s|%-22s|\n"#defineDATAp->num,p->name,p->telnumber,p->units#defineEND"------------------------------------------------------\n"typedefstructteldir{intnum;charname[15];chartelnumber[15];charunits[30];}TEL;typedefstructpointer_info{TEL*pHead;intcount;charfname[15];intsaveflag;}PI;voidmenu(){system("cls");printf("通讯录管理系统\n");printf("**************MENU*********************\n");printf("****1.新建文件***\n");printf("****2.读取文件***\n");printf("****3.添加通讯录***\n");printf("****4.查询通讯录***\n");printf("****5.修改通讯录***\n");printf("****6.删除通讯录***\n");printf("****7.排序通讯录***\n");printf("****8.浏览通讯录***\n");printf("****0.退出***\n");printf("***************************************\n");printf("\n");}voidSwap(TEL*p1,TEL*p2){TELstmp;stmp=*p1;*p1=*p2;*p2=stmp;}voidprintheader(){printf(HEADER1);printf(HEADER2);printf(HEADER3);}voidLoad(PI*pi){FILE*fp;TEL*p=pi->pHead;charfname[15];printf("请输入要加载的文件名:");scanf("%s",fname);strcat(fname,".txt");strcpy(pi->fname,fname);fp=fopen(pi->fname,"rb");if(fp==NULL){printf("\n==>无法打开文件!请新建数据文件!\n");return;}pi->count=0;pi->saveflag=0;while(!feof(fp)){if(fread(p,sizeof(TEL),1,fp)){pi->count++;p++;}}printf("成功读取数据文件!",fname);printf("\n请选择(0-8):");fclose(fp);}voidDisp(PI*pi){inti;TEL*p;FILE*fp=NULL;fp=fopen(pi->fname,"r");if(fp==NULL){printf("\nError!\n");return;}menu();p=pi->pHead;if(pi->count==0){printf("无记录!");printf("\n请选择(0-8):");return;}printheader();for(i=1;i<=pi->count;i++){printf(FORMAT,DATA);printf(HEADER3);p++;}}voidSort(PI*pi){inti,j;intsel;TEL*p;FILE*fp=NULL;fp=fopen(pi->fname,"rb+");if(fp==NULL){printf("\nError!\n");return;}system("cls");printf("**************************\n");printf("**1.按序号排序**\n");printf("**2.按姓名排序**\n");printf("**按任意键返回主菜单**\n");printf("\n请选择(1or2):");scanf("%d",&sel);if(sel!=1&&sel!=2){system("cls");menu();printf("请选择(0-8):");return;}if(sel==1){for(i=1;i<=pi->count-1;i++){p=pi->pHead;for(j=1;j<=pi->count-i;j++,p++){if(p->num>(p+1)->num)Swap(p,p+1);}}pi->saveflag=1;}elseif(sel==2){for(i=1;i<=pi->count-1;i++){p=pi->pHead;for(j=1;j<=pi->count-i;j++,p++){if(strcmp(p->name,(p+1)->name)>0)Swap(p,p+1);}}}Disp(pi);printf("请选择(0-8):");}voidDel(PI*pi){intsel;intnum;charname[15];TEL*p;inti;FILE*fp=NULL;fp=fopen(pi->fname,"rb+");if(fp==NULL){printf("\nError!\n");return;}p=pi->pHead;menu();Disp(pi);printf("**************************\n");printf("***1.按序号删除***\n");printf("***2.按姓名删除***\n");printf("***按任意键返回主菜单***\n");printf("\n请选择(1or2):");scanf("%d",&sel);if(sel!=1&&sel!=2){system("cls");menu();printf("请选择(0-8):");return;}if(sel==1){printf("请输入要删除记录的序号:");scanf("%d",&num);for(i=1;i<=pi->count;i++){if(num==p->num)break;p++;}if(i>pi->count){printf("无此人!\n");printf("请选择(0-8):");return;}elseif(i==pi->count){pi->count--;pi->saveflag=1;printf("记录成功删除!\n");}else{memcpy(p,p+1,(pi->pHead+pi->count-p)*sizeof(TEL));pi->count--;pi->saveflag=1;printf("记录成功删除!\n");}}elseif(sel=2){printf("请输入要删除的姓名:");scanf("%s",name);for(i=1;i<=pi->count;i++){if(!strcmp(name,p->name))break;p++;}if(i>pi->count){printf("无此人!\n");menu();printf("请选择(0-8):");return;}elseif(i==pi->count){pi->count--;pi->saveflag=1;printf("记录成功删除!\n");}else{memcpy(p,p+1,(pi->pHead+pi->count-p)*sizeof(TEL));pi->count--;pi->saveflag=1;printf("记录成功删除!\n");}}fclose(fp);printf("请选择(0-8):");}voidModify(PI*pi){intnum,i;TEL*p;FILE*fp=NULL;fp=fopen(pi->fname,"r");if(fp==NULL){printf("\nError!\n");return;}p=pi->pHead;menu();Disp(pi);printf("请输入要修改的序号:");scanf("%d",&num);for(i=1;icount;i++){if(num==p->num)break;p++;}if(i>pi->count){printf("无此人!\n");printf("请选择(0-8):");return;}else{printf("请输入正确的序号:(输入0返回菜单)");scanf("%d",&num);if(num!=0)p->num=num;else{menu();printf("请选择(0-8):");return;}printf("请输入正确的姓名:");scanf("%s",p->name);printf("请输入正确的电话:");scanf("%s",p->telnumber);printf("请输入正确的工作单位:");scanf("%s",p->units);pi->saveflag=1;}printf("请选择(0-8):");fclose(fp);}voidQur(PI*pi){intsel,i,num;TEL*p;charname[15];FILE*fp=NULL;fp=fopen(pi->fname,"r");if(fp==NULL){printf("\nError!\n");return;}p=pi->pHead;menu();printf("**************************\n");printf("***1.按序号查询***\n");printf("***2.按姓名查询***\n");printf("***按任意键返回主菜单***\n");printf("\n请选择(1or2):");scanf("%d",&sel);if(sel!=1&&sel!=2){system("cls");menu();printf("请选择(0-8):");return;}if(sel==1){printf("请输入要查询记录的序号:");scanf("%d",&num);for(i=1;i<=pi->count;i++){if(num==p->num)break;p++;}
for(j=i+1;jif(strcmp(a[i],a[j])>0){b=a[i];a[i]=a[j];a[j]=b;}}}voidmain(){inti,n=10;charc[10][20];char*t[10];printf("请输入十个字符串:");for(i=0;i{scanf("%s",c[i]);t[i]=c[i];}paixu(t,n);printf("按字典顺序排列,结果为:");for(i=0;iprintf("%s",t[i]);printf("\n");}3.有两个链表a和b,结点中包含学号和姓名。编写函数delete,从a链表中删去与b链表中有相同学号的结点。程序源代码:#include#include#defineN3typedefstructstudent{intnum;charname[20];structstudent*next;}STU;STU*create(){inti;STU*p,*head=NULL,*tail=head;for(i=0;i{p=(STU*)malloc(sizeof(STU));scanf("%d%s",&p->num,p->name);p->next=NULL;if(p->num<0){free(p);break;}if(head==NULL)head=p;elsetail->next=p;tail=p;}returnhead;}voidoutput(STU*p){while(p!=NULL){printf("%d\t%s\n",p->num,p->name);p=p->next;}}STU*del(STU*a,STU*b){STU*head,*p1,*p2;p1=p2=head=a;//让p1、p2、head结点指向链表a的头部while(b!=NULL){p1=p2=head;//每次循环前让p1、p2始终指向删除后链表的头部while(p1!=NULL){if(b->num==p1->num)//学号相同,删除结点信息if(p1==head)//如果删除的是头结点,则头结点位置要后移{head=p1->next;free(p1);p1=p2=head;}else//如果删除的是中间结点{p2->next=p1->next;free(p1);p1=p2->next;}else//学号不同,则p1,p2指针依次后移{p2=p1;p1=p1->next;}}b=b->next;}returnhead;}intmain(intargc,char*argv[]){STU*a,*b,*c;printf("\n请输入链表a的信息格式(学号姓名):\n");a=create();printf("\n请输入链表b的信息格式(学号姓名):\n");b=create();c=del(a,b);printf("\n经过删除后,a链表信息为:\n");output(c);return0;}程序的运行结果(I/O窗口截图)选做题(任选其一)1、电话簿管理系统一、需求分析设计一个电话簿管理系统,使之提供以下功能:(1)新建信息功能(2)查询信息功能(3)添加信息功能(4)修改信息功能(5)删除信息功能需求说明:(1)电话信息包括姓名(规定字节数为15)、电话号码(规定字节数为15)和工作单位(最大字节数为30)等信息。(2)录入的信息要求存入文件,并可以通过读取数据文件进行查询、修改、删除等基本操作。(3)对电话簿中的信息应能够分别按序号和姓名两种方式进行查询,并返回所有符合条件的信息。(4)修改、删除、添加等操作要求可以按照序号和姓名两种方式进行,并返回操作后的信息。(5)所设计的通讯系统要求以菜单方式工作,为用户提供清晰的使用提示,根据用户的选择进行各种处理。(6)需设计主控制菜单程序(menu()函数),实现菜单选择模块。(7)该系统中的各个子功能均需通过相应的自定义函数进行实现。二、总体设计初步提出解决方案,以及系统的体系结构和数据结构的设计方案,并写出书面总体设计说明书。(1)设计主控制菜单程序(menu()函数),实现菜单选择模块。①输出功能菜单(包括新建、读取文件、添加、查询、修改、删除、浏览、排序等)。②按提示信息选择功能菜单,并输出返回值。(2)设计New()函数,实现新建数据文件功能。(3)设计Load()函数,实现文件读取功能,若文件不存在,则返回New(),进入新建数据文件。(4)设计Add()函数,实现信息添加功能,分别录入序号、姓名、电话和工作单位。若序号已存在,则重新输入。(5)设计Qur()函数,实现信息查询功能,通过设计提示菜单,实现按序号和姓名两种方式查询。(6)设计Modify()函数,实现信息修改功能,在修改前,首先显示所有信息,然后通过序号实现修改。(7)设计Del()函数,实现信息删除功能,通过设计提示菜单,实现序号和姓名两种方式进行删除。(8)设计Sort()函数,实现信息排序功能,通过设计提示菜单,实现按序号和姓名两种方式进行排序。(9)设计Disp()函数,实现信息浏览功能。(10)设计Save()函数,实现信息保存功能,将新建或读取的文件,在退出程序后进行保存。三、详细设计给出主要流程图(1)系统功能模块图:主菜单新建文件读取文件添加通讯录查询通讯录修改通讯录删除通讯录排序通讯录浏览通讯录新建:可以新建文件,新建文件自己输入文件名字.txt。读取:通过成功读取可以在文件中实现以下功能。添加:可以添加通讯录,依次输入序号、姓名、电话、工作单位,会提示推出。查询:可以选择用序号、姓名的方式查询。修改:输入欲修改的那个人的信息,通过输入序号和姓名来修改通讯录信息。删除:输入欲删除的那个人的序号或姓名,来删除信息。排序:可以通过序号排序,或者通过姓名的拼音排序来排序。浏览:可以通过序号、姓名浏览通讯录。(2)工作流程图1、添加通讯录开始i=0Sign!=’n’&&sign!=’N’输入信息return(n+1)结束2.查询通讯录开始输入查询的姓名判断通讯录中是否有此人输出“通讯录中没有此人”显示该人所有记录结束3.删除通讯录4.修改通讯录开始输入查询的姓名判断通讯录中是否有此人输出“通讯录中没有此人”依次输入修改的内容结束开始输入查询的姓名判断通讯录中是否有此人输出“通讯录中没有此人”显示该人所有记录结束5.浏览通讯录开始inti:i=1i输入一个记录i++结束四、编写代码程序源代码:#include#include#include#defineN200#defineHEADER1"*********************电话簿***********************\n"#defineHEADER2"|序号|姓名|电话|工作单位|\n"#defineHEADER3"|--------|--------|--------|------------|\n"#defineFORMAT"|%-8d|%-14s|%-17s|%-22s|\n"#defineDATAp->num,p->name,p->telnumber,p->units#defineEND"------------------------------------------------------\n"typedefstructteldir{intnum;charname[15];chartelnumber[15];charunits[30];}TEL;typedefstructpointer_info{TEL*pHead;intcount;charfname[15];intsaveflag;}PI;voidmenu(){system("cls");printf("通讯录管理系统\n");printf("**************MENU*********************\n");printf("****1.新建文件***\n");printf("****2.读取文件***\n");printf("****3.添加通讯录***\n");printf("****4.查询通讯录***\n");printf("****5.修改通讯录***\n");printf("****6.删除通讯录***\n");printf("****7.排序通讯录***\n");printf("****8.浏览通讯录***\n");printf("****0.退出***\n");printf("***************************************\n");printf("\n");}voidSwap(TEL*p1,TEL*p2){TELstmp;stmp=*p1;*p1=*p2;*p2=stmp;}voidprintheader(){printf(HEADER1);printf(HEADER2);printf(HEADER3);}voidLoad(PI*pi){FILE*fp;TEL*p=pi->pHead;charfname[15];printf("请输入要加载的文件名:");scanf("%s",fname);strcat(fname,".txt");strcpy(pi->fname,fname);fp=fopen(pi->fname,"rb");if(fp==NULL){printf("\n==>无法打开文件!请新建数据文件!\n");return;}pi->count=0;pi->saveflag=0;while(!feof(fp)){if(fread(p,sizeof(TEL),1,fp)){pi->count++;p++;}}printf("成功读取数据文件!",fname);printf("\n请选择(0-8):");fclose(fp);}voidDisp(PI*pi){inti;TEL*p;FILE*fp=NULL;fp=fopen(pi->fname,"r");if(fp==NULL){printf("\nError!\n");return;}menu();p=pi->pHead;if(pi->count==0){printf("无记录!");printf("\n请选择(0-8):");return;}printheader();for(i=1;i<=pi->count;i++){printf(FORMAT,DATA);printf(HEADER3);p++;}}voidSort(PI*pi){inti,j;intsel;TEL*p;FILE*fp=NULL;fp=fopen(pi->fname,"rb+");if(fp==NULL){printf("\nError!\n");return;}system("cls");printf("**************************\n");printf("**1.按序号排序**\n");printf("**2.按姓名排序**\n");printf("**按任意键返回主菜单**\n");printf("\n请选择(1or2):");scanf("%d",&sel);if(sel!=1&&sel!=2){system("cls");menu();printf("请选择(0-8):");return;}if(sel==1){for(i=1;i<=pi->count-1;i++){p=pi->pHead;for(j=1;j<=pi->count-i;j++,p++){if(p->num>(p+1)->num)Swap(p,p+1);}}pi->saveflag=1;}elseif(sel==2){for(i=1;i<=pi->count-1;i++){p=pi->pHead;for(j=1;j<=pi->count-i;j++,p++){if(strcmp(p->name,(p+1)->name)>0)Swap(p,p+1);}}}Disp(pi);printf("请选择(0-8):");}voidDel(PI*pi){intsel;intnum;charname[15];TEL*p;inti;FILE*fp=NULL;fp=fopen(pi->fname,"rb+");if(fp==NULL){printf("\nError!\n");return;}p=pi->pHead;menu();Disp(pi);printf("**************************\n");printf("***1.按序号删除***\n");printf("***2.按姓名删除***\n");printf("***按任意键返回主菜单***\n");printf("\n请选择(1or2):");scanf("%d",&sel);if(sel!=1&&sel!=2){system("cls");menu();printf("请选择(0-8):");return;}if(sel==1){printf("请输入要删除记录的序号:");scanf("%d",&num);for(i=1;i<=pi->count;i++){if(num==p->num)break;p++;}if(i>pi->count){printf("无此人!\n");printf("请选择(0-8):");return;}elseif(i==pi->count){pi->count--;pi->saveflag=1;printf("记录成功删除!\n");}else{memcpy(p,p+1,(pi->pHead+pi->count-p)*sizeof(TEL));pi->count--;pi->saveflag=1;printf("记录成功删除!\n");}}elseif(sel=2){printf("请输入要删除的姓名:");scanf("%s",name);for(i=1;i<=pi->count;i++){if(!strcmp(name,p->name))break;p++;}if(i>pi->count){printf("无此人!\n");menu();printf("请选择(0-8):");return;}elseif(i==pi->count){pi->count--;pi->saveflag=1;printf("记录成功删除!\n");}else{memcpy(p,p+1,(pi->pHead+pi->count-p)*sizeof(TEL));pi->count--;pi->saveflag=1;printf("记录成功删除!\n");}}fclose(fp);printf("请选择(0-8):");}voidModify(PI*pi){intnum,i;TEL*p;FILE*fp=NULL;fp=fopen(pi->fname,"r");if(fp==NULL){printf("\nError!\n");return;}p=pi->pHead;menu();Disp(pi);printf("请输入要修改的序号:");scanf("%d",&num);for(i=1;icount;i++){if(num==p->num)break;p++;}if(i>pi->count){printf("无此人!\n");printf("请选择(0-8):");return;}else{printf("请输入正确的序号:(输入0返回菜单)");scanf("%d",&num);if(num!=0)p->num=num;else{menu();printf("请选择(0-8):");return;}printf("请输入正确的姓名:");scanf("%s",p->name);printf("请输入正确的电话:");scanf("%s",p->telnumber);printf("请输入正确的工作单位:");scanf("%s",p->units);pi->saveflag=1;}printf("请选择(0-8):");fclose(fp);}voidQur(PI*pi){intsel,i,num;TEL*p;charname[15];FILE*fp=NULL;fp=fopen(pi->fname,"r");if(fp==NULL){printf("\nError!\n");return;}p=pi->pHead;menu();printf("**************************\n");printf("***1.按序号查询***\n");printf("***2.按姓名查询***\n");printf("***按任意键返回主菜单***\n");printf("\n请选择(1or2):");scanf("%d",&sel);if(sel!=1&&sel!=2){system("cls");menu();printf("请选择(0-8):");return;}if(sel==1){printf("请输入要查询记录的序号:");scanf("%d",&num);for(i=1;i<=pi->count;i++){if(num==p->num)break;p++;}
if(strcmp(a[i],a[j])>0)
b=a[i];
a[i]=a[j];
a[j]=b;
inti,n=10;
charc[10][20];
char*t[10];
printf("请输入十个字符串:
");
for(i=0;i{scanf("%s",c[i]);t[i]=c[i];}paixu(t,n);printf("按字典顺序排列,结果为:");for(i=0;iprintf("%s",t[i]);printf("\n");}3.有两个链表a和b,结点中包含学号和姓名。编写函数delete,从a链表中删去与b链表中有相同学号的结点。程序源代码:#include#include#defineN3typedefstructstudent{intnum;charname[20];structstudent*next;}STU;STU*create(){inti;STU*p,*head=NULL,*tail=head;for(i=0;i{p=(STU*)malloc(sizeof(STU));scanf("%d%s",&p->num,p->name);p->next=NULL;if(p->num<0){free(p);break;}if(head==NULL)head=p;elsetail->next=p;tail=p;}returnhead;}voidoutput(STU*p){while(p!=NULL){printf("%d\t%s\n",p->num,p->name);p=p->next;}}STU*del(STU*a,STU*b){STU*head,*p1,*p2;p1=p2=head=a;//让p1、p2、head结点指向链表a的头部while(b!=NULL){p1=p2=head;//每次循环前让p1、p2始终指向删除后链表的头部while(p1!=NULL){if(b->num==p1->num)//学号相同,删除结点信息if(p1==head)//如果删除的是头结点,则头结点位置要后移{head=p1->next;free(p1);p1=p2=head;}else//如果删除的是中间结点{p2->next=p1->next;free(p1);p1=p2->next;}else//学号不同,则p1,p2指针依次后移{p2=p1;p1=p1->next;}}b=b->next;}returnhead;}intmain(intargc,char*argv[]){STU*a,*b,*c;printf("\n请输入链表a的信息格式(学号姓名):\n");a=create();printf("\n请输入链表b的信息格式(学号姓名):\n");b=create();c=del(a,b);printf("\n经过删除后,a链表信息为:\n");output(c);return0;}程序的运行结果(I/O窗口截图)选做题(任选其一)1、电话簿管理系统一、需求分析设计一个电话簿管理系统,使之提供以下功能:(1)新建信息功能(2)查询信息功能(3)添加信息功能(4)修改信息功能(5)删除信息功能需求说明:(1)电话信息包括姓名(规定字节数为15)、电话号码(规定字节数为15)和工作单位(最大字节数为30)等信息。(2)录入的信息要求存入文件,并可以通过读取数据文件进行查询、修改、删除等基本操作。(3)对电话簿中的信息应能够分别按序号和姓名两种方式进行查询,并返回所有符合条件的信息。(4)修改、删除、添加等操作要求可以按照序号和姓名两种方式进行,并返回操作后的信息。(5)所设计的通讯系统要求以菜单方式工作,为用户提供清晰的使用提示,根据用户的选择进行各种处理。(6)需设计主控制菜单程序(menu()函数),实现菜单选择模块。(7)该系统中的各个子功能均需通过相应的自定义函数进行实现。二、总体设计初步提出解决方案,以及系统的体系结构和数据结构的设计方案,并写出书面总体设计说明书。(1)设计主控制菜单程序(menu()函数),实现菜单选择模块。①输出功能菜单(包括新建、读取文件、添加、查询、修改、删除、浏览、排序等)。②按提示信息选择功能菜单,并输出返回值。(2)设计New()函数,实现新建数据文件功能。(3)设计Load()函数,实现文件读取功能,若文件不存在,则返回New(),进入新建数据文件。(4)设计Add()函数,实现信息添加功能,分别录入序号、姓名、电话和工作单位。若序号已存在,则重新输入。(5)设计Qur()函数,实现信息查询功能,通过设计提示菜单,实现按序号和姓名两种方式查询。(6)设计Modify()函数,实现信息修改功能,在修改前,首先显示所有信息,然后通过序号实现修改。(7)设计Del()函数,实现信息删除功能,通过设计提示菜单,实现序号和姓名两种方式进行删除。(8)设计Sort()函数,实现信息排序功能,通过设计提示菜单,实现按序号和姓名两种方式进行排序。(9)设计Disp()函数,实现信息浏览功能。(10)设计Save()函数,实现信息保存功能,将新建或读取的文件,在退出程序后进行保存。三、详细设计给出主要流程图(1)系统功能模块图:主菜单新建文件读取文件添加通讯录查询通讯录修改通讯录删除通讯录排序通讯录浏览通讯录新建:可以新建文件,新建文件自己输入文件名字.txt。读取:通过成功读取可以在文件中实现以下功能。添加:可以添加通讯录,依次输入序号、姓名、电话、工作单位,会提示推出。查询:可以选择用序号、姓名的方式查询。修改:输入欲修改的那个人的信息,通过输入序号和姓名来修改通讯录信息。删除:输入欲删除的那个人的序号或姓名,来删除信息。排序:可以通过序号排序,或者通过姓名的拼音排序来排序。浏览:可以通过序号、姓名浏览通讯录。(2)工作流程图1、添加通讯录开始i=0Sign!=’n’&&sign!=’N’输入信息return(n+1)结束2.查询通讯录开始输入查询的姓名判断通讯录中是否有此人输出“通讯录中没有此人”显示该人所有记录结束3.删除通讯录4.修改通讯录开始输入查询的姓名判断通讯录中是否有此人输出“通讯录中没有此人”依次输入修改的内容结束开始输入查询的姓名判断通讯录中是否有此人输出“通讯录中没有此人”显示该人所有记录结束5.浏览通讯录开始inti:i=1i输入一个记录i++结束四、编写代码程序源代码:#include#include#include#defineN200#defineHEADER1"*********************电话簿***********************\n"#defineHEADER2"|序号|姓名|电话|工作单位|\n"#defineHEADER3"|--------|--------|--------|------------|\n"#defineFORMAT"|%-8d|%-14s|%-17s|%-22s|\n"#defineDATAp->num,p->name,p->telnumber,p->units#defineEND"------------------------------------------------------\n"typedefstructteldir{intnum;charname[15];chartelnumber[15];charunits[30];}TEL;typedefstructpointer_info{TEL*pHead;intcount;charfname[15];intsaveflag;}PI;voidmenu(){system("cls");printf("通讯录管理系统\n");printf("**************MENU*********************\n");printf("****1.新建文件***\n");printf("****2.读取文件***\n");printf("****3.添加通讯录***\n");printf("****4.查询通讯录***\n");printf("****5.修改通讯录***\n");printf("****6.删除通讯录***\n");printf("****7.排序通讯录***\n");printf("****8.浏览通讯录***\n");printf("****0.退出***\n");printf("***************************************\n");printf("\n");}voidSwap(TEL*p1,TEL*p2){TELstmp;stmp=*p1;*p1=*p2;*p2=stmp;}voidprintheader(){printf(HEADER1);printf(HEADER2);printf(HEADER3);}voidLoad(PI*pi){FILE*fp;TEL*p=pi->pHead;charfname[15];printf("请输入要加载的文件名:");scanf("%s",fname);strcat(fname,".txt");strcpy(pi->fname,fname);fp=fopen(pi->fname,"rb");if(fp==NULL){printf("\n==>无法打开文件!请新建数据文件!\n");return;}pi->count=0;pi->saveflag=0;while(!feof(fp)){if(fread(p,sizeof(TEL),1,fp)){pi->count++;p++;}}printf("成功读取数据文件!",fname);printf("\n请选择(0-8):");fclose(fp);}voidDisp(PI*pi){inti;TEL*p;FILE*fp=NULL;fp=fopen(pi->fname,"r");if(fp==NULL){printf("\nError!\n");return;}menu();p=pi->pHead;if(pi->count==0){printf("无记录!");printf("\n请选择(0-8):");return;}printheader();for(i=1;i<=pi->count;i++){printf(FORMAT,DATA);printf(HEADER3);p++;}}voidSort(PI*pi){inti,j;intsel;TEL*p;FILE*fp=NULL;fp=fopen(pi->fname,"rb+");if(fp==NULL){printf("\nError!\n");return;}system("cls");printf("**************************\n");printf("**1.按序号排序**\n");printf("**2.按姓名排序**\n");printf("**按任意键返回主菜单**\n");printf("\n请选择(1or2):");scanf("%d",&sel);if(sel!=1&&sel!=2){system("cls");menu();printf("请选择(0-8):");return;}if(sel==1){for(i=1;i<=pi->count-1;i++){p=pi->pHead;for(j=1;j<=pi->count-i;j++,p++){if(p->num>(p+1)->num)Swap(p,p+1);}}pi->saveflag=1;}elseif(sel==2){for(i=1;i<=pi->count-1;i++){p=pi->pHead;for(j=1;j<=pi->count-i;j++,p++){if(strcmp(p->name,(p+1)->name)>0)Swap(p,p+1);}}}Disp(pi);printf("请选择(0-8):");}voidDel(PI*pi){intsel;intnum;charname[15];TEL*p;inti;FILE*fp=NULL;fp=fopen(pi->fname,"rb+");if(fp==NULL){printf("\nError!\n");return;}p=pi->pHead;menu();Disp(pi);printf("**************************\n");printf("***1.按序号删除***\n");printf("***2.按姓名删除***\n");printf("***按任意键返回主菜单***\n");printf("\n请选择(1or2):");scanf("%d",&sel);if(sel!=1&&sel!=2){system("cls");menu();printf("请选择(0-8):");return;}if(sel==1){printf("请输入要删除记录的序号:");scanf("%d",&num);for(i=1;i<=pi->count;i++){if(num==p->num)break;p++;}if(i>pi->count){printf("无此人!\n");printf("请选择(0-8):");return;}elseif(i==pi->count){pi->count--;pi->saveflag=1;printf("记录成功删除!\n");}else{memcpy(p,p+1,(pi->pHead+pi->count-p)*sizeof(TEL));pi->count--;pi->saveflag=1;printf("记录成功删除!\n");}}elseif(sel=2){printf("请输入要删除的姓名:");scanf("%s",name);for(i=1;i<=pi->count;i++){if(!strcmp(name,p->name))break;p++;}if(i>pi->count){printf("无此人!\n");menu();printf("请选择(0-8):");return;}elseif(i==pi->count){pi->count--;pi->saveflag=1;printf("记录成功删除!\n");}else{memcpy(p,p+1,(pi->pHead+pi->count-p)*sizeof(TEL));pi->count--;pi->saveflag=1;printf("记录成功删除!\n");}}fclose(fp);printf("请选择(0-8):");}voidModify(PI*pi){intnum,i;TEL*p;FILE*fp=NULL;fp=fopen(pi->fname,"r");if(fp==NULL){printf("\nError!\n");return;}p=pi->pHead;menu();Disp(pi);printf("请输入要修改的序号:");scanf("%d",&num);for(i=1;icount;i++){if(num==p->num)break;p++;}if(i>pi->count){printf("无此人!\n");printf("请选择(0-8):");return;}else{printf("请输入正确的序号:(输入0返回菜单)");scanf("%d",&num);if(num!=0)p->num=num;else{menu();printf("请选择(0-8):");return;}printf("请输入正确的姓名:");scanf("%s",p->name);printf("请输入正确的电话:");scanf("%s",p->telnumber);printf("请输入正确的工作单位:");scanf("%s",p->units);pi->saveflag=1;}printf("请选择(0-8):");fclose(fp);}voidQur(PI*pi){intsel,i,num;TEL*p;charname[15];FILE*fp=NULL;fp=fopen(pi->fname,"r");if(fp==NULL){printf("\nError!\n");return;}p=pi->pHead;menu();printf("**************************\n");printf("***1.按序号查询***\n");printf("***2.按姓名查询***\n");printf("***按任意键返回主菜单***\n");printf("\n请选择(1or2):");scanf("%d",&sel);if(sel!=1&&sel!=2){system("cls");menu();printf("请选择(0-8):");return;}if(sel==1){printf("请输入要查询记录的序号:");scanf("%d",&num);for(i=1;i<=pi->count;i++){if(num==p->num)break;p++;}
scanf("%s",c[i]);
t[i]=c[i];
paixu(t,n);
printf("按字典顺序排列,结果为:
for(i=0;iprintf("%s",t[i]);printf("\n");}3.有两个链表a和b,结点中包含学号和姓名。编写函数delete,从a链表中删去与b链表中有相同学号的结点。程序源代码:#include#include#defineN3typedefstructstudent{intnum;charname[20];structstudent*next;}STU;STU*create(){inti;STU*p,*head=NULL,*tail=head;for(i=0;i{p=(STU*)malloc(sizeof(STU));scanf("%d%s",&p->num,p->name);p->next=NULL;if(p->num<0){free(p);break;}if(head==NULL)head=p;elsetail->next=p;tail=p;}returnhead;}voidoutput(STU*p){while(p!=NULL){printf("%d\t%s\n",p->num,p->name);p=p->next;}}STU*del(STU*a,STU*b){STU*head,*p1,*p2;p1=p2=head=a;//让p1、p2、head结点指向链表a的头部while(b!=NULL){p1=p2=head;//每次循环前让p1、p2始终指向删除后链表的头部while(p1!=NULL){if(b->num==p1->num)//学号相同,删除结点信息if(p1==head)//如果删除的是头结点,则头结点位置要后移{head=p1->next;free(p1);p1=p2=head;}else//如果删除的是中间结点{p2->next=p1->next;free(p1);p1=p2->next;}else//学号不同,则p1,p2指针依次后移{p2=p1;p1=p1->next;}}b=b->next;}returnhead;}intmain(intargc,char*argv[]){STU*a,*b,*c;printf("\n请输入链表a的信息格式(学号姓名):\n");a=create();printf("\n请输入链表b的信息格式(学号姓名):\n");b=create();c=del(a,b);printf("\n经过删除后,a链表信息为:\n");output(c);return0;}程序的运行结果(I/O窗口截图)选做题(任选其一)1、电话簿管理系统一、需求分析设计一个电话簿管理系统,使之提供以下功能:(1)新建信息功能(2)查询信息功能(3)添加信息功能(4)修改信息功能(5)删除信息功能需求说明:(1)电话信息包括姓名(规定字节数为15)、电话号码(规定字节数为15)和工作单位(最大字节数为30)等信息。(2)录入的信息要求存入文件,并可以通过读取数据文件进行查询、修改、删除等基本操作。(3)对电话簿中的信息应能够分别按序号和姓名两种方式进行查询,并返回所有符合条件的信息。(4)修改、删除、添加等操作要求可以按照序号和姓名两种方式进行,并返回操作后的信息。(5)所设计的通讯系统要求以菜单方式工作,为用户提供清晰的使用提示,根据用户的选择进行各种处理。(6)需设计主控制菜单程序(menu()函数),实现菜单选择模块。(7)该系统中的各个子功能均需通过相应的自定义函数进行实现。二、总体设计初步提出解决方案,以及系统的体系结构和数据结构的设计方案,并写出书面总体设计说明书。(1)设计主控制菜单程序(menu()函数),实现菜单选择模块。①输出功能菜单(包括新建、读取文件、添加、查询、修改、删除、浏览、排序等)。②按提示信息选择功能菜单,并输出返回值。(2)设计New()函数,实现新建数据文件功能。(3)设计Load()函数,实现文件读取功能,若文件不存在,则返回New(),进入新建数据文件。(4)设计Add()函数,实现信息添加功能,分别录入序号、姓名、电话和工作单位。若序号已存在,则重新输入。(5)设计Qur()函数,实现信息查询功能,通过设计提示菜单,实现按序号和姓名两种方式查询。(6)设计Modify()函数,实现信息修改功能,在修改前,首先显示所有信息,然后通过序号实现修改。(7)设计Del()函数,实现信息删除功能,通过设计提示菜单,实现序号和姓名两种方式进行删除。(8)设计Sort()函数,实现信息排序功能,通过设计提示菜单,实现按序号和姓名两种方式进行排序。(9)设计Disp()函数,实现信息浏览功能。(10)设计Save()函数,实现信息保存功能,将新建或读取的文件,在退出程序后进行保存。三、详细设计给出主要流程图(1)系统功能模块图:主菜单新建文件读取文件添加通讯录查询通讯录修改通讯录删除通讯录排序通讯录浏览通讯录新建:可以新建文件,新建文件自己输入文件名字.txt。读取:通过成功读取可以在文件中实现以下功能。添加:可以添加通讯录,依次输入序号、姓名、电话、工作单位,会提示推出。查询:可以选择用序号、姓名的方式查询。修改:输入欲修改的那个人的信息,通过输入序号和姓名来修改通讯录信息。删除:输入欲删除的那个人的序号或姓名,来删除信息。排序:可以通过序号排序,或者通过姓名的拼音排序来排序。浏览:可以通过序号、姓名浏览通讯录。(2)工作流程图1、添加通讯录开始i=0Sign!=’n’&&sign!=’N’输入信息return(n+1)结束2.查询通讯录开始输入查询的姓名判断通讯录中是否有此人输出“通讯录中没有此人”显示该人所有记录结束3.删除通讯录4.修改通讯录开始输入查询的姓名判断通讯录中是否有此人输出“通讯录中没有此人”依次输入修改的内容结束开始输入查询的姓名判断通讯录中是否有此人输出“通讯录中没有此人”显示该人所有记录结束5.浏览通讯录开始inti:i=1i输入一个记录i++结束四、编写代码程序源代码:#include#include#include#defineN200#defineHEADER1"*********************电话簿***********************\n"#defineHEADER2"|序号|姓名|电话|工作单位|\n"#defineHEADER3"|--------|--------|--------|------------|\n"#defineFORMAT"|%-8d|%-14s|%-17s|%-22s|\n"#defineDATAp->num,p->name,p->telnumber,p->units#defineEND"------------------------------------------------------\n"typedefstructteldir{intnum;charname[15];chartelnumber[15];charunits[30];}TEL;typedefstructpointer_info{TEL*pHead;intcount;charfname[15];intsaveflag;}PI;voidmenu(){system("cls");printf("通讯录管理系统\n");printf("**************MENU*********************\n");printf("****1.新建文件***\n");printf("****2.读取文件***\n");printf("****3.添加通讯录***\n");printf("****4.查询通讯录***\n");printf("****5.修改通讯录***\n");printf("****6.删除通讯录***\n");printf("****7.排序通讯录***\n");printf("****8.浏览通讯录***\n");printf("****0.退出***\n");printf("***************************************\n");printf("\n");}voidSwap(TEL*p1,TEL*p2){TELstmp;stmp=*p1;*p1=*p2;*p2=stmp;}voidprintheader(){printf(HEADER1);printf(HEADER2);printf(HEADER3);}voidLoad(PI*pi){FILE*fp;TEL*p=pi->pHead;charfname[15];printf("请输入要加载的文件名:");scanf("%s",fname);strcat(fname,".txt");strcpy(pi->fname,fname);fp=fopen(pi->fname,"rb");if(fp==NULL){printf("\n==>无法打开文件!请新建数据文件!\n");return;}pi->count=0;pi->saveflag=0;while(!feof(fp)){if(fread(p,sizeof(TEL),1,fp)){pi->count++;p++;}}printf("成功读取数据文件!",fname);printf("\n请选择(0-8):");fclose(fp);}voidDisp(PI*pi){inti;TEL*p;FILE*fp=NULL;fp=fopen(pi->fname,"r");if(fp==NULL){printf("\nError!\n");return;}menu();p=pi->pHead;if(pi->count==0){printf("无记录!");printf("\n请选择(0-8):");return;}printheader();for(i=1;i<=pi->count;i++){printf(FORMAT,DATA);printf(HEADER3);p++;}}voidSort(PI*pi){inti,j;intsel;TEL*p;FILE*fp=NULL;fp=fopen(pi->fname,"rb+");if(fp==NULL){printf("\nError!\n");return;}system("cls");printf("**************************\n");printf("**1.按序号排序**\n");printf("**2.按姓名排序**\n");printf("**按任意键返回主菜单**\n");printf("\n请选择(1or2):");scanf("%d",&sel);if(sel!=1&&sel!=2){system("cls");menu();printf("请选择(0-8):");return;}if(sel==1){for(i=1;i<=pi->count-1;i++){p=pi->pHead;for(j=1;j<=pi->count-i;j++,p++){if(p->num>(p+1)->num)Swap(p,p+1);}}pi->saveflag=1;}elseif(sel==2){for(i=1;i<=pi->count-1;i++){p=pi->pHead;for(j=1;j<=pi->count-i;j++,p++){if(strcmp(p->name,(p+1)->name)>0)Swap(p,p+1);}}}Disp(pi);printf("请选择(0-8):");}voidDel(PI*pi){intsel;intnum;charname[15];TEL*p;inti;FILE*fp=NULL;fp=fopen(pi->fname,"rb+");if(fp==NULL){printf("\nError!\n");return;}p=pi->pHead;menu();Disp(pi);printf("**************************\n");printf("***1.按序号删除***\n");printf("***2.按姓名删除***\n");printf("***按任意键返回主菜单***\n");printf("\n请选择(1or2):");scanf("%d",&sel);if(sel!=1&&sel!=2){system("cls");menu();printf("请选择(0-8):");return;}if(sel==1){printf("请输入要删除记录的序号:");scanf("%d",&num);for(i=1;i<=pi->count;i++){if(num==p->num)break;p++;}if(i>pi->count){printf("无此人!\n");printf("请选择(0-8):");return;}elseif(i==pi->count){pi->count--;pi->saveflag=1;printf("记录成功删除!\n");}else{memcpy(p,p+1,(pi->pHead+pi->count-p)*sizeof(TEL));pi->count--;pi->saveflag=1;printf("记录成功删除!\n");}}elseif(sel=2){printf("请输入要删除的姓名:");scanf("%s",name);for(i=1;i<=pi->count;i++){if(!strcmp(name,p->name))break;p++;}if(i>pi->count){printf("无此人!\n");menu();printf("请选择(0-8):");return;}elseif(i==pi->count){pi->count--;pi->saveflag=1;printf("记录成功删除!\n");}else{memcpy(p,p+1,(pi->pHead+pi->count-p)*sizeof(TEL));pi->count--;pi->saveflag=1;printf("记录成功删除!\n");}}fclose(fp);printf("请选择(0-8):");}voidModify(PI*pi){intnum,i;TEL*p;FILE*fp=NULL;fp=fopen(pi->fname,"r");if(fp==NULL){printf("\nError!\n");return;}p=pi->pHead;menu();Disp(pi);printf("请输入要修改的序号:");scanf("%d",&num);for(i=1;icount;i++){if(num==p->num)break;p++;}if(i>pi->count){printf("无此人!\n");printf("请选择(0-8):");return;}else{printf("请输入正确的序号:(输入0返回菜单)");scanf("%d",&num);if(num!=0)p->num=num;else{menu();printf("请选择(0-8):");return;}printf("请输入正确的姓名:");scanf("%s",p->name);printf("请输入正确的电话:");scanf("%s",p->telnumber);printf("请输入正确的工作单位:");scanf("%s",p->units);pi->saveflag=1;}printf("请选择(0-8):");fclose(fp);}voidQur(PI*pi){intsel,i,num;TEL*p;charname[15];FILE*fp=NULL;fp=fopen(pi->fname,"r");if(fp==NULL){printf("\nError!\n");return;}p=pi->pHead;menu();printf("**************************\n");printf("***1.按序号查询***\n");printf("***2.按姓名查询***\n");printf("***按任意键返回主菜单***\n");printf("\n请选择(1or2):");scanf("%d",&sel);if(sel!=1&&sel!=2){system("cls");menu();printf("请选择(0-8):");return;}if(sel==1){printf("请输入要查询记录的序号:");scanf("%d",&num);for(i=1;i<=pi->count;i++){if(num==p->num)break;p++;}
printf("%s",t[i]);
3.有两个链表a和b,结点中包含学号和姓名。
编写函数delete,从a链表中删去与b链表中有相同学号的结点。
#defineN3
typedefstructstudent
intnum;
charname[20];
structstudent*next;
}STU;
STU*create()
STU*p,*head=NULL,*tail=head;
for(i=0;i{p=(STU*)malloc(sizeof(STU));scanf("%d%s",&p->num,p->name);p->next=NULL;if(p->num<0){free(p);break;}if(head==NULL)head=p;elsetail->next=p;tail=p;}returnhead;}voidoutput(STU*p){while(p!=NULL){printf("%d\t%s\n",p->num,p->name);p=p->next;}}STU*del(STU*a,STU*b){STU*head,*p1,*p2;p1=p2=head=a;//让p1、p2、head结点指向链表a的头部while(b!=NULL){p1=p2=head;//每次循环前让p1、p2始终指向删除后链表的头部while(p1!=NULL){if(b->num==p1->num)//学号相同,删除结点信息if(p1==head)//如果删除的是头结点,则头结点位置要后移{head=p1->next;free(p1);p1=p2=head;}else//如果删除的是中间结点{p2->next=p1->next;free(p1);p1=p2->next;}else//学号不同,则p1,p2指针依次后移{p2=p1;p1=p1->next;}}b=b->next;}returnhead;}intmain(intargc,char*argv[]){STU*a,*b,*c;printf("\n请输入链表a的信息格式(学号姓名):\n");a=create();printf("\n请输入链表b的信息格式(学号姓名):\n");b=create();c=del(a,b);printf("\n经过删除后,a链表信息为:\n");output(c);return0;}程序的运行结果(I/O窗口截图)选做题(任选其一)1、电话簿管理系统一、需求分析设计一个电话簿管理系统,使之提供以下功能:(1)新建信息功能(2)查询信息功能(3)添加信息功能(4)修改信息功能(5)删除信息功能需求说明:(1)电话信息包括姓名(规定字节数为15)、电话号码(规定字节数为15)和工作单位(最大字节数为30)等信息。(2)录入的信息要求存入文件,并可以通过读取数据文件进行查询、修改、删除等基本操作。(3)对电话簿中的信息应能够分别按序号和姓名两种方式进行查询,并返回所有符合条件的信息。(4)修改、删除、添加等操作要求可以按照序号和姓名两种方式进行,并返回操作后的信息。(5)所设计的通讯系统要求以菜单方式工作,为用户提供清晰的使用提示,根据用户的选择进行各种处理。(6)需设计主控制菜单程序(menu()函数),实现菜单选择模块。(7)该系统中的各个子功能均需通过相应的自定义函数进行实现。二、总体设计初步提出解决方案,以及系统的体系结构和数据结构的设计方案,并写出书面总体设计说明书。(1)设计主控制菜单程序(menu()函数),实现菜单选择模块。①输出功能菜单(包括新建、读取文件、添加、查询、修改、删除、浏览、排序等)。②按提示信息选择功能菜单,并输出返回值。(2)设计New()函数,实现新建数据文件功能。(3)设计Load()函数,实现文件读取功能,若文件不存在,则返回New(),进入新建数据文件。(4)设计Add()函数,实现信息添加功能,分别录入序号、姓名、电话和工作单位。若序号已存在,则重新输入。(5)设计Qur()函数,实现信息查询功能,通过设计提示菜单,实现按序号和姓名两种方式查询。(6)设计Modify()函数,实现信息修改功能,在修改前,首先显示所有信息,然后通过序号实现修改。(7)设计Del()函数,实现信息删除功能,通过设计提示菜单,实现序号和姓名两种方式进行删除。(8)设计Sort()函数,实现信息排序功能,通过设计提示菜单,实现按序号和姓名两种方式进行排序。(9)设计Disp()函数,实现信息浏览功能。(10)设计Save()函数,实现信息保存功能,将新建或读取的文件,在退出程序后进行保存。三、详细设计给出主要流程图(1)系统功能模块图:主菜单新建文件读取文件添加通讯录查询通讯录修改通讯录删除通讯录排序通讯录浏览通讯录新建:可以新建文件,新建文件自己输入文件名字.txt。读取:通过成功读取可以在文件中实现以下功能。添加:可以添加通讯录,依次输入序号、姓名、电话、工作单位,会提示推出。查询:可以选择用序号、姓名的方式查询。修改:输入欲修改的那个人的信息,通过输入序号和姓名来修改通讯录信息。删除:输入欲删除的那个人的序号或姓名,来删除信息。排序:可以通过序号排序,或者通过姓名的拼音排序来排序。浏览:可以通过序号、姓名浏览通讯录。(2)工作流程图1、添加通讯录开始i=0Sign!=’n’&&sign!=’N’输入信息return(n+1)结束2.查询通讯录开始输入查询的姓名判断通讯录中是否有此人输出“通讯录中没有此人”显示该人所有记录结束3.删除通讯录4.修改通讯录开始输入查询的姓名判断通讯录中是否有此人输出“通讯录中没有此人”依次输入修改的内容结束开始输入查询的姓名判断通讯录中是否有此人输出“通讯录中没有此人”显示该人所有记录结束5.浏览通讯录开始inti:i=1i输入一个记录i++结束四、编写代码程序源代码:#include#include#include#defineN200#defineHEADER1"*********************电话簿***********************\n"#defineHEADER2"|序号|姓名|电话|工作单位|\n"#defineHEADER3"|--------|--------|--------|------------|\n"#defineFORMAT"|%-8d|%-14s|%-17s|%-22s|\n"#defineDATAp->num,p->name,p->telnumber,p->units#defineEND"------------------------------------------------------\n"typedefstructteldir{intnum;charname[15];chartelnumber[15];charunits[30];}TEL;typedefstructpointer_info{TEL*pHead;intcount;charfname[15];intsaveflag;}PI;voidmenu(){system("cls");printf("通讯录管理系统\n");printf("**************MENU*********************\n");printf("****1.新建文件***\n");printf("****2.读取文件***\n");printf("****3.添加通讯录***\n");printf("****4.查询通讯录***\n");printf("****5.修改通讯录***\n");printf("****6.删除通讯录***\n");printf("****7.排序通讯录***\n");printf("****8.浏览通讯录***\n");printf("****0.退出***\n");printf("***************************************\n");printf("\n");}voidSwap(TEL*p1,TEL*p2){TELstmp;stmp=*p1;*p1=*p2;*p2=stmp;}voidprintheader(){printf(HEADER1);printf(HEADER2);printf(HEADER3);}voidLoad(PI*pi){FILE*fp;TEL*p=pi->pHead;charfname[15];printf("请输入要加载的文件名:");scanf("%s",fname);strcat(fname,".txt");strcpy(pi->fname,fname);fp=fopen(pi->fname,"rb");if(fp==NULL){printf("\n==>无法打开文件!请新建数据文件!\n");return;}pi->count=0;pi->saveflag=0;while(!feof(fp)){if(fread(p,sizeof(TEL),1,fp)){pi->count++;p++;}}printf("成功读取数据文件!",fname);printf("\n请选择(0-8):");fclose(fp);}voidDisp(PI*pi){inti;TEL*p;FILE*fp=NULL;fp=fopen(pi->fname,"r");if(fp==NULL){printf("\nError!\n");return;}menu();p=pi->pHead;if(pi->count==0){printf("无记录!");printf("\n请选择(0-8):");return;}printheader();for(i=1;i<=pi->count;i++){printf(FORMAT,DATA);printf(HEADER3);p++;}}voidSort(PI*pi){inti,j;intsel;TEL*p;FILE*fp=NULL;fp=fopen(pi->fname,"rb+");if(fp==NULL){printf("\nError!\n");return;}system("cls");printf("**************************\n");printf("**1.按序号排序**\n");printf("**2.按姓名排序**\n");printf("**按任意键返回主菜单**\n");printf("\n请选择(1or2):");scanf("%d",&sel);if(sel!=1&&sel!=2){system("cls");menu();printf("请选择(0-8):");return;}if(sel==1){for(i=1;i<=pi->count-1;i++){p=pi->pHead;for(j=1;j<=pi->count-i;j++,p++){if(p->num>(p+1)->num)Swap(p,p+1);}}pi->saveflag=1;}elseif(sel==2){for(i=1;i<=pi->count-1;i++){p=pi->pHead;for(j=1;j<=pi->count-i;j++,p++){if(strcmp(p->name,(p+1)->name)>0)Swap(p,p+1);}}}Disp(pi);printf("请选择(0-8):");}voidDel(PI*pi){intsel;intnum;charname[15];TEL*p;inti;FILE*fp=NULL;fp=fopen(pi->fname,"rb+");if(fp==NULL){printf("\nError!\n");return;}p=pi->pHead;menu();Disp(pi);printf("**************************\n");printf("***1.按序号删除***\n");printf("***2.按姓名删除***\n");printf("***按任意键返回主菜单***\n");printf("\n请选择(1or2):");scanf("%d",&sel);if(sel!=1&&sel!=2){system("cls");menu();printf("请选择(0-8):");return;}if(sel==1){printf("请输入要删除记录的序号:");scanf("%d",&num);for(i=1;i<=pi->count;i++){if(num==p->num)break;p++;}if(i>pi->count){printf("无此人!\n");printf("请选择(0-8):");return;}elseif(i==pi->count){pi->count--;pi->saveflag=1;printf("记录成功删除!\n");}else{memcpy(p,p+1,(pi->pHead+pi->count-p)*sizeof(TEL));pi->count--;pi->saveflag=1;printf("记录成功删除!\n");}}elseif(sel=2){printf("请输入要删除的姓名:");scanf("%s",name);for(i=1;i<=pi->count;i++){if(!strcmp(name,p->name))break;p++;}if(i>pi->count){printf("无此人!\n");menu();printf("请选择(0-8):");return;}elseif(i==pi->count){pi->count--;pi->saveflag=1;printf("记录成功删除!\n");}else{memcpy(p,p+1,(pi->pHead+pi->count-p)*sizeof(TEL));pi->count--;pi->saveflag=1;printf("记录成功删除!\n");}}fclose(fp);printf("请选择(0-8):");}voidModify(PI*pi){intnum,i;TEL*p;FILE*fp=NULL;fp=fopen(pi->fname,"r");if(fp==NULL){printf("\nError!\n");return;}p=pi->pHead;menu();Disp(pi);printf("请输入要修改的序号:");scanf("%d",&num);for(i=1;icount;i++){if(num==p->num)break;p++;}if(i>pi->count){printf("无此人!\n");printf("请选择(0-8):");return;}else{printf("请输入正确的序号:(输入0返回菜单)");scanf("%d",&num);if(num!=0)p->num=num;else{menu();printf("请选择(0-8):");return;}printf("请输入正确的姓名:");scanf("%s",p->name);printf("请输入正确的电话:");scanf("%s",p->telnumber);printf("请输入正确的工作单位:");scanf("%s",p->units);pi->saveflag=1;}printf("请选择(0-8):");fclose(fp);}voidQur(PI*pi){intsel,i,num;TEL*p;charname[15];FILE*fp=NULL;fp=fopen(pi->fname,"r");if(fp==NULL){printf("\nError!\n");return;}p=pi->pHead;menu();printf("**************************\n");printf("***1.按序号查询***\n");printf("***2.按姓名查询***\n");printf("***按任意键返回主菜单***\n");printf("\n请选择(1or2):");scanf("%d",&sel);if(sel!=1&&sel!=2){system("cls");menu();printf("请选择(0-8):");return;}if(sel==1){printf("请输入要查询记录的序号:");scanf("%d",&num);for(i=1;i<=pi->count;i++){if(num==p->num)break;p++;}
p=(STU*)malloc(sizeof(STU));
scanf("%d%s",&p->num,p->name);
p->next=NULL;
if(p->num<0)
free(p);break;
if(head==NULL)
head=p;
else
tail->next=p;
tail=p;
returnhead;
voidoutput(STU*p)
while(p!
=NULL)
printf("%d\t%s\n",p->num,p->name);
p=p->next;
STU*del(STU*a,STU*b)
STU*head,*p1,*p2;
p1=p2=head=a;//让p1、p2、head结点指向链表a的头部
while(b!
p1=p2=head;//每次循环前让p1、p2始终指向删除后链表的头部
while(p1!
if(b->num==p1->num)//学号相同,删除结点信息
if(p1==head)//如果删除的是头结点,则头结点位置要后移
head=p1->next;
free(p1);
p1=p2=head;
else//如果删除的是中间结点
p2->next=p1->next;
p1=p2->next;
else//学号不同,则p1,p2指针依次后移
p2=p1;
p1=p1->next;
b=b->next;
intmain(intargc,char*argv[])
STU*a,*b,*c;
printf("\n请输入链表a的信息格式(学号姓名):
\n");
a=create();
printf("\n请输入链表b的信息格式(学号姓名):
b=create();
c=del(a,b);
printf("\n经过删除后,a链表信息为:
output(c);
return0;
程序的运行结果(I/O窗口截图)
选做题
(任选其一)
1、电话簿管理系统
一、需求分析
设计一个电话簿管理系统,使之提供以下功能:
(1)新建信息功能
(2)查询信息功能
(3)添加信息功能
(4)修改信息功能
(5)删除信息功能
需求说明:
(1)电话信息包括姓名(规定字节数为15)、电话号码(规定字节数为15)和工作单位(最大字节数为30)等信息。
(2)录入的信息要求存入文件,并可以通过读取数据文件进行查询、修改、删除等基本操作。
(3)对电话簿中的信息应能够分别按序号和姓名两种方式进行查询,并返回所有符合条件的信息。
(4)修改、删除、添加等操作要求可以按照序号和姓名两种方式进行,并返回操作后的信息。
(5)所设计的通讯系统要求以菜单方式工作,为用户提供清晰的使用提示,根据用户的选择进行各种处理。
(6)需设计主控制菜单程序(menu()函数),实现菜单选择模块。
(7)该系统中的各个子功能均需通过相应的自定义函数进行实现。
二、总体设计
初步提出解决方案,以及系统的体系结构和数据结构的设计方案,并写出书面总体设计说明书。
(1)设计主控制菜单程序(menu()函数),实现菜单选择模块。
①输出功能菜单(包括新建、读取文件、添加、查询、修改、删除、浏览、排序等)。
②按提示信息选择功能菜单,并输出返回值。
(2)设计New()函数,实现新建数据文件功能。
(3)设计Load()函数,实现文件读取功能,若文件不存在,则返回New(),进入新建数据文件。
(4)设计Add()函数,实现信息添加功能,分别录入序号、姓名、电话和工作单位。
若序号已存在,则重新输入。
(5)设计Qur()函数,实现信息查询功能,通过设计提示菜单,实现按序号和姓名两种方式查询。
(6)设计Modify()函数,实现信息修改功能,在修改前,首先显示所有信息,然后通过序号实现修改。
(7)设计Del()函数,实现信息删除功能,通过设计提示菜单,实现序号和姓名两种方式进行删除。
(8)设计Sort()函数,实现信息排序功能,通过设计提示菜单,实现按序号和姓名两种方式进行排序。
(9)设计Disp()函数,实现信息浏览功能。
(10)设计Save()函数,实现信息保存功能,将新建或读取的文件,在退出程序后进行保存。
三、详细设计给出主要流程图
(1)系统功能模块图:
主菜单
新建文件
读取文件
添加通讯录
查询通讯录
修改通讯录
删除通讯录
排序通讯录
浏览通讯录
新建:
可以新建文件,新建文件自己输入文件名字.txt。
读取:
通过成功读取可以在文件中实现以下功能。
添加:
可以添加通讯录,依次输入序号、姓名、电话、工作单位,会提示推出。
查询:
可以选择用序号、姓名的方式查询。
修改:
输入欲修改的那个人的信息,通过输入序号和姓名来修改通讯录信息。
删除:
输入欲删除的那个人的序号或姓名,来删除信息。
排序:
可以通过序号排序,或者通过姓名的拼音排序来排序。
浏览:
可以通过序号、姓名浏览通讯录。
(2)工作流程图
1、添加通讯录
开始
i=0
Sign!
=’n’&&sign!
=’N’
输入信息
return(n+1)
结束
2.查询通讯录
输入查询的姓名
判断通讯录中是否有此人
输出“通讯录中没有此人”
显示该人所有记录
3.删除通讯录
4.修改通讯录
依次输入修改的内容
5.浏览通讯录
inti:
i=1
i输入一个记录i++结束四、编写代码程序源代码:#include#include#include#defineN200#defineHEADER1"*********************电话簿***********************\n"#defineHEADER2"|序号|姓名|电话|工作单位|\n"#defineHEADER3"|--------|--------|--------|------------|\n"#defineFORMAT"|%-8d|%-14s|%-17s|%-22s|\n"#defineDATAp->num,p->name,p->telnumber,p->units#defineEND"------------------------------------------------------\n"typedefstructteldir{intnum;charname[15];chartelnumber[15];charunits[30];}TEL;typedefstructpointer_info{TEL*pHead;intcount;charfname[15];intsaveflag;}PI;voidmenu(){system("cls");printf("通讯录管理系统\n");printf("**************MENU*********************\n");printf("****1.新建文件***\n");printf("****2.读取文件***\n");printf("****3.添加通讯录***\n");printf("****4.查询通讯录***\n");printf("****5.修改通讯录***\n");printf("****6.删除通讯录***\n");printf("****7.排序通讯录***\n");printf("****8.浏览通讯录***\n");printf("****0.退出***\n");printf("***************************************\n");printf("\n");}voidSwap(TEL*p1,TEL*p2){TELstmp;stmp=*p1;*p1=*p2;*p2=stmp;}voidprintheader(){printf(HEADER1);printf(HEADER2);printf(HEADER3);}voidLoad(PI*pi){FILE*fp;TEL*p=pi->pHead;charfname[15];printf("请输入要加载的文件名:");scanf("%s",fname);strcat(fname,".txt");strcpy(pi->fname,fname);fp=fopen(pi->fname,"rb");if(fp==NULL){printf("\n==>无法打开文件!请新建数据文件!\n");return;}pi->count=0;pi->saveflag=0;while(!feof(fp)){if(fread(p,sizeof(TEL),1,fp)){pi->count++;p++;}}printf("成功读取数据文件!",fname);printf("\n请选择(0-8):");fclose(fp);}voidDisp(PI*pi){inti;TEL*p;FILE*fp=NULL;fp=fopen(pi->fname,"r");if(fp==NULL){printf("\nError!\n");return;}menu();p=pi->pHead;if(pi->count==0){printf("无记录!");printf("\n请选择(0-8):");return;}printheader();for(i=1;i<=pi->count;i++){printf(FORMAT,DATA);printf(HEADER3);p++;}}voidSort(PI*pi){inti,j;intsel;TEL*p;FILE*fp=NULL;fp=fopen(pi->fname,"rb+");if(fp==NULL){printf("\nError!\n");return;}system("cls");printf("**************************\n");printf("**1.按序号排序**\n");printf("**2.按姓名排序**\n");printf("**按任意键返回主菜单**\n");printf("\n请选择(1or2):");scanf("%d",&sel);if(sel!=1&&sel!=2){system("cls");menu();printf("请选择(0-8):");return;}if(sel==1){for(i=1;i<=pi->count-1;i++){p=pi->pHead;for(j=1;j<=pi->count-i;j++,p++){if(p->num>(p+1)->num)Swap(p,p+1);}}pi->saveflag=1;}elseif(sel==2){for(i=1;i<=pi->count-1;i++){p=pi->pHead;for(j=1;j<=pi->count-i;j++,p++){if(strcmp(p->name,(p+1)->name)>0)Swap(p,p+1);}}}Disp(pi);printf("请选择(0-8):");}voidDel(PI*pi){intsel;intnum;charname[15];TEL*p;inti;FILE*fp=NULL;fp=fopen(pi->fname,"rb+");if(fp==NULL){printf("\nError!\n");return;}p=pi->pHead;menu();Disp(pi);printf("**************************\n");printf("***1.按序号删除***\n");printf("***2.按姓名删除***\n");printf("***按任意键返回主菜单***\n");printf("\n请选择(1or2):");scanf("%d",&sel);if(sel!=1&&sel!=2){system("cls");menu();printf("请选择(0-8):");return;}if(sel==1){printf("请输入要删除记录的序号:");scanf("%d",&num);for(i=1;i<=pi->count;i++){if(num==p->num)break;p++;}if(i>pi->count){printf("无此人!\n");printf("请选择(0-8):");return;}elseif(i==pi->count){pi->count--;pi->saveflag=1;printf("记录成功删除!\n");}else{memcpy(p,p+1,(pi->pHead+pi->count-p)*sizeof(TEL));pi->count--;pi->saveflag=1;printf("记录成功删除!\n");}}elseif(sel=2){printf("请输入要删除的姓名:");scanf("%s",name);for(i=1;i<=pi->count;i++){if(!strcmp(name,p->name))break;p++;}if(i>pi->count){printf("无此人!\n");menu();printf("请选择(0-8):");return;}elseif(i==pi->count){pi->count--;pi->saveflag=1;printf("记录成功删除!\n");}else{memcpy(p,p+1,(pi->pHead+pi->count-p)*sizeof(TEL));pi->count--;pi->saveflag=1;printf("记录成功删除!\n");}}fclose(fp);printf("请选择(0-8):");}voidModify(PI*pi){intnum,i;TEL*p;FILE*fp=NULL;fp=fopen(pi->fname,"r");if(fp==NULL){printf("\nError!\n");return;}p=pi->pHead;menu();Disp(pi);printf("请输入要修改的序号:");scanf("%d",&num);for(i=1;icount;i++){if(num==p->num)break;p++;}if(i>pi->count){printf("无此人!\n");printf("请选择(0-8):");return;}else{printf("请输入正确的序号:(输入0返回菜单)");scanf("%d",&num);if(num!=0)p->num=num;else{menu();printf("请选择(0-8):");return;}printf("请输入正确的姓名:");scanf("%s",p->name);printf("请输入正确的电话:");scanf("%s",p->telnumber);printf("请输入正确的工作单位:");scanf("%s",p->units);pi->saveflag=1;}printf("请选择(0-8):");fclose(fp);}voidQur(PI*pi){intsel,i,num;TEL*p;charname[15];FILE*fp=NULL;fp=fopen(pi->fname,"r");if(fp==NULL){printf("\nError!\n");return;}p=pi->pHead;menu();printf("**************************\n");printf("***1.按序号查询***\n");printf("***2.按姓名查询***\n");printf("***按任意键返回主菜单***\n");printf("\n请选择(1or2):");scanf("%d",&sel);if(sel!=1&&sel!=2){system("cls");menu();printf("请选择(0-8):");return;}if(sel==1){printf("请输入要查询记录的序号:");scanf("%d",&num);for(i=1;i<=pi->count;i++){if(num==p->num)break;p++;}
输入一个记录
i++
四、编写代码
#defineN200
#defineHEADER1"*********************电话簿***********************\n"
#defineHEADER2"|序号|姓名|电话|工作单位|\n"
#defineHEADER3"|--------|--------|--------|------------|\n"
#defineFORMAT"|%-8d|%-14s|%-17s|%-22s|\n"
#defineDATAp->num,p->name,p->telnumber,p->units
#defineEND"------------------------------------------------------\n"
typedefstructteldir
charname[15];
chartelnumber[15];
charunits[30];
}TEL;
typedefstructpointer_info
TEL*pHead;
intcount;
charfname[15];
intsaveflag;
}PI;
voidmenu()
system("cls");
printf("通讯录管理系统\n");
printf("**************MENU*********************\n");
printf("****1.新建文件***\n");
printf("****2.读取文件***\n");
printf("****3.添加通讯录***\n");
printf("****4.查询通讯录***\n");
printf("****5.修改通讯录***\n");
printf("****6.删除通讯录***\n");
printf("****7.排序通讯录***\n");
printf("****8.浏览通讯录***\n");
printf("****0.退出***\n");
printf("***************************************\n");
voidSwap(TEL*p1,TEL*p2)
TELstmp;
stmp=*p1;
*p1=*p2;
*p2=stmp;
voidprintheader()
printf(HEADER1);
printf(HEADER2);
printf(HEADER3);
voidLoad(PI*pi)
FILE*fp;
TEL*p=pi->pHead;
printf("请输入要加载的文件名:
scanf("%s",fname);
strcat(fname,".txt");
strcpy(pi->fname,fname);
fp=fopen(pi->fname,"rb");
if(fp==NULL)
{printf("\n==>无法打开文件!
请新建数据文件!
return;
pi->count=0;
pi->saveflag=0;
while(!
feof(fp))
{if(fread(p,sizeof(TEL),1,fp))
{pi->count++;
p++;
printf("成功读取数据文件!
",fname);
printf("\n请选择(0-8):
fclose(fp);
voidDisp(PI*pi)
{inti;
TEL*p;
FILE*fp=NULL;
fp=fopen(pi->fname,"r");
{printf("\nError!
menu();
p=pi->pHead;
if(pi->count==0)
{printf("无记录!
printheader();
for(i=1;i<=pi->count;i++)
{printf(FORMAT,DATA);
voidSort(PI*pi)
{inti,j;
intsel;
fp=fopen(pi->fname,"rb+");
return;}
printf("**************************\n");
printf("**1.按序号排序**\n");
printf("**2.按姓名排序**\n");
printf("**按任意键返回主菜单**\n");
printf("\n请选择(1or2):
scanf("%d",&sel);
if(sel!
=1&&sel!
=2)
{system("cls");
printf("请选择(0-8):
if(sel==1)
{for(i=1;i<=pi->count-1;i++)
{p=pi->pHead;
for(j=1;j<=pi->count-i;j++,p++)
{if(p->num>(p+1)->num)
Swap(p,p+1);}
pi->saveflag=1;
elseif(sel==2)
{if(strcmp(p->name,(p+1)->name)>0)
Disp(pi);
voidDel(PI*pi)
{intsel;
printf("***1.按序号删除***\n");
printf("***2.按姓名删除***\n");
printf("***按任意键返回主菜单***\n");
{printf("请输入要删除记录的序号:
scanf("%d",&num);
{if(num==p->num)
break;
if(i>pi->count)
{printf("无此人!
elseif(i==pi->count)
{pi->count--;
printf("记录成功删除!
{memcpy(p,p+1,(pi->pHead+pi->count-p)*sizeof(TEL));
pi->count--;
elseif(sel=2)
{printf("请输入要删除的姓名:
scanf("%s",name);
{if(!
strcmp(name,p->name))
voidModify(PI*pi)
{intnum,i;
printf("请输入要修改的序号:
for(i=1;icount;i++)
{printf("请输入正确的序号:
(输入0返回菜单)");
if(num!
=0)
p->num=num;
{menu();
printf("请输入正确的姓名:
scanf("%s",p->name);
printf("请输入正确的电话:
scanf("%s",p->telnumber);
printf("请输入正确的工作单位:
scanf("%s",p->units);
voidQur(PI*pi)
{intsel,i,num;
printf("***1.按序号查询***\n");
printf("***2.按姓名查询***\n");
{printf("请输入要查询记录的序号:
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1