C语言课程设计.docx
- 文档编号:11395618
- 上传时间:2023-05-31
- 格式:DOCX
- 页数:30
- 大小:64.81KB
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;i printf("\n"); } voidmain() { inta[10]; ptin(a,10); printf("处理前"); ptout(a,10); pr(a,10); printf("处理后"); ptout(a,10); } 2.将一组字符串按字典顺序输出。 (通过函数调用完成) 程序源代码: #include #include voidpaixu(char*a[],intn) { inti,j; char*b; for(i=0;i { for(j=i+1;j if(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;i printf("%s",t[i]); printf("\n"); } 3.有两个链表a和b,结点中包含学号和姓名。 编写函数delete,从a链表中删去与b链表中有相同学号的结点。 程序源代码: #include #include #defineN3 typedefstructstudent { 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; 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! =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=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;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++; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 课程设计
![提示](https://static.bingdoc.com/images/bang_tan.gif)