《c语言-课程设计-大学论文.doc》由会员分享,可在线阅读,更多相关《c语言-课程设计-大学论文.doc(24页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、课 程 设 计 报 告课程名称 C语言程序设计 课题名称 通讯录管理系统 专 业 汽车服务 班 级 0901班 学 号 200902180114 姓 名 伏铄臻 指导教师 王宁 陈多 2010年9月12日湖南工程学院课 程 设 计 任 务 书课程名称 C语言程序设计 课 题 通讯录管理系统 专业班级 汽车服务0901 学生姓名 伏铄臻 学 号 200902180114 指导老师 王宁 陈多 审 批 王宁 陈多 任务书下达日期 2010年 9月 12 日任务完成日期 2010年 9月 13日通讯录管理系统一、 通讯录管理系统要求分析及其主要功能1、问题描述:通过该系统实现对通讯录信息进行录入、显
2、示、修改、删除、插入、排序、保存等操作的管理。2、功能要求:1)、本系统采用一个包含N个数据的结构体数组,每个数据的结构应当包括:编号、姓名、电话号码。2)本系统显示这样的菜单:请选择系统功能项:a. 通讯信息录入b. 通讯信息显示c. 通讯信息保存d. 通讯信息删除e. 通讯信息修改f. 通讯信息查询(1) 按编号查询(2) 按姓名查询(3) 按电话号码查询g. 退出系统3)、执行一个具体的功能之后,程序将重新显示菜单。4)、将通讯信息保存到文件中。3、算法提示:1)、数据结构:结构体类型数组2)、数据库结构:下表构成该系统的基本数据库。 编号姓名电话号码charchar Char4、测试数
3、据:纪录数205、其它 对该系统有兴趣的同可以在实现上述基本功能后,完 善系统的其它功能二、 功能模块的划分系统功能模块图: 主菜单录入显示 删除 修改 保存 查询 C查询 hacha查询 编号查询姓名查询电话查询录入:可以添加通讯录记录,依次输入编号、姓名、电话号码后,会提示是否继续添加。显示:可以以横排形式输出所有通讯录里的记录删除:输入欲删除的那个人的名字后,会自动删除他(她)的记录内容查询:可以选择用姓名、电话、编号三种方式查询修改:输入欲修改的那个人的名字后,再依次输入编号、姓名、年龄、电话号码、即可完成修改保存:,输入文件名(带后缀名)后,即可将通讯录信息保存到文件三、 主要功能的
4、实现 一 详细设计u 主函数 voide main( )通过主函数main()利用无限次循环结构for(;)和switch()结构实现各函数的调用。系统根据数字选项来调用函数。u 菜单选择函数 int menu_select( )这是一个无参函数,主要实现“功能选择”的界面,在这个界面里有显示系统的九大功能,根据每个功能前面的序号进行选择。等执行完每一个函数功能后,再自行返回该函数。u 输入记录函数 int Input( )这是一个无参函数,用数组函数输入所需记录人员的信息。用字符sign来标记是否将继续记录输入信息。 u 显示记录函数Display( );此函数利用for循环从输入第一个人的
5、信息至最后一个人的信息全都显示出来。使用if语句。 u 删除记录函数Delete_a_record( )用比较字符串处理函数strcmp( )逐一比较输入的字符串,是否相同,无相同,则显示无此人,若输入的字符串和s【】中的某一个相同,则用函数strcpy(),只取字符串1的地址,即删去了字符串2的内容,从而删除记录。流程图如图一。u 查询记录函数Query_a_record( )该函数先用while循环来判断查询方式是否正确,再用if语句来判断输入的m的值,从而选择查询方式。如姓名查询,同样用strcmp( )函数将输入的姓名与s【】比较,若匹配则显示此人信息,不匹配则显示无此人。其它查询方式
6、类似。流程图如图二所示。输入删除的姓名输出“通讯录没有此人”删除该记录YN输入查询的名称判断是否有此人判断是否有此 人输出“通讯录中没此人”显示此人所有信息YN开始开始结束结束图一图二 u 修改数据函数Change( )该函数先是调用strcmp()函数进行匹配,若无匹配显示无此人,若有则对该人的信息通过scanf()重新记录,即对该人信息进行修改。 开始输入修改的姓名判断是否有此人输出“通讯录中无此人”依次输入修改的内容YN结束u 保存数据函数WritetoText(pe,n)通过文件指针来保存所要保存的文件。四、程序调试程序调试与分析在程序运行前总有一些错误或警告,最开始显示主菜单函数后,
7、当进入其他功能项时主菜单在TC屏幕上消失,后了解到用system(“cs)可以控该现象使主菜单一直显示。与此相似的还有system(“pause”)都是 有关的函数。文件的保存没有涉及了解,经过查寻料了解到(fp=fopen(filename,w)=NULL 这句话是说打开文件, 打开只写文件,若文件存在则文件长度为0,即该文件消失,若文件不存在则建立该文件。而fprintf是写数据到打开的文件中,调试过程中经常因排版不太整齐而多次去修改,Printf和字符所在宽度影响排版。在通讯信息查询这一模块中,特别是对按编号查询这一项与电话查询和姓名查询不一样不能用strcmp( )函数配对查找因为没有
8、留意字符串数组来定义数编号。运行时程序出现了错误后经该正将子符串数组改为字符型。程序虽能运行但按编号查询时运行结果不能正常输出查询信息还自动终止程序。经过再次检测原来是最基本scanf( )函程序数中取地址的&没有写。当加上程序正常运行。测试:1)显示的主菜单界面在开始由于录入界面通讯信息显示在函数中写成了保存而出现下面界面,经过修改后正确显示。2)录入界面:在录入的时候经常因为按下ENTER键太快,而导致一些信息的录入损失,后检测是因为编号的查询方式有误导致,修改后无次现象,程序正常运行。3)显示界面:由于受字符串的宽度影响,姓名过长时导致年龄不能对齐显示,增加域宽后此现象可避免。4)删除界
9、面:5)查询界面:以姓名查询方式为例:由于程序在编号查询时的程序代码编写错误,程序虽然能运行,但是按编号查询时显示无此人,经过对程序的修改最终正常运行。6)修改界面:7)保存界面:8)退出系统:五、 总结在这一次C语言别课程设计,通过对程序的设计进一步提高了自己对程序的认识,也收获了各方面许多东西在课程设计方面,加深了已有知识的了解和巩固,如对字符串处理函数的认识,对for循环与while循环的认识与使用。更加了解了自己的模糊概念,在此次程序设计中清晰明了。像reture语句,在此次设计中可以了解到可以将整个函数赋给n,即将return中的返回值赋给n。了解到一些新的知识,如与系统有关的函数s
10、ystem( )。还有文件的保存,以前从未涉及的知识这次得以扩充。还有有重新体会到了文档的编版,受益匪浅。不仅在学习方面在与同学合作过程中体会到了同学间合作的快乐。在设计过程中相互请教,相互讨论如何使程序正确运行。经不断的合作修改终将程序运行出来。不仅如此,我还在老师要求的基础上,参考其它资料,在此次设计中对于信息的录入还添加了年龄这一信息的记录,完善程序。同时让我体会到在电脑上一个简单的记录运行之后所付出的努力,可想而之,复杂的运行操作后会有更大更复杂的一系列程序构成。让我体会到程序的博大精深和奥妙无穷。在刚开始接受这个程序设计课题时,原本以为自己什么也不会做,但随着对其它程序的理解,和对相
11、关资料的查找了解,慢慢的加深了对该课题的了解与掌握,直至和大家一起把程序运行出来。同时发现了许多缺点,一不小心就出现错误。像scanf()函数的使用,既然忘了写&,而且越简单却越难找出错误,所以一定要细心,而且要有耐心。总之,这次程序设计使我得到了巨大的收获。六、 附件1) 主要原程序代码/*10.3.2源程序*/*头文件(.h)*/#include stdio.h /*I/O函数*/#include stdlib.h /*标准库函数*/#include string.h/*字符串函数*/#include ctype.h /*字符操作函数*/#define M 50 /*定义常数表示记录数*/
12、typedef struct /*定义数据结构*/ char name20; /*姓名*/ char units30; /*单位*/ char tele10; /*电话*/ADDRESS;/*以下是函数原型*/int enter(ADDRESS t); /*输入记录*/void list(ADDRESS t,int n); /*显示记录*/void search(ADDRESS t,int n); /*按姓名查找显示记录*/int delete(ADDRESS t,int n); /*删除记录*/int add(ADDRESS t,int n); /*插入记录*/void save(ADDRE
13、SS t,int n); /*记录保存为文件*/int load(ADDRESS t); /*从文件中读记录*/void display(ADDRESS t); /*按序号查找显示记录*/void sort(ADDRESS t,int n); /*按姓名排序*/void qseek(ADDRESS t,int n); /*快速查找记录*/void copy(); /*文件复制*/void print(ADDRESS temp); /*显示单条记录*/int find(ADDRESS t,int n,char *s) ; /*查找函数*/int menu_select(); /*主菜单函数*/*
14、主函数开始*/main() int i; ADDRESS adrM; /*定义结构体数组*/ int length; /*保存记录长度*/ clrscr(); /*清屏*/ for(;)/*无限循环*/ switch(menu_select() /*调用主菜单函数,返回值整数作开关语句的条件*/ case 0:length=enter(adr);break;/*输入记录*/ case 1:list(adr,length);break; /*显示全部记录*/ case 2:search(adr,length);break; /*查找记录*/ case 3:length=delete(adr,le
15、ngth);break; /*删除记录*/ case 4:length=add(adr,length); break; /*插入记录*/ case 5:save(adr,length);break; /*保存文件*/ case 6:length=load(adr); break; /*读文件*/ case 7:display(adr);break; /*按序号显示记录*/ case 8:sort(adr,length);break; /*按姓名排序*/ case 9:qseek(adr,length);break; /*快速查找记录*/ case 10:copy();break; /*复制文件
16、*/ case 11:exit(0); /*如返回值为11则程序结束*/ /*菜单函数,函数返回值为整数,代表所选的菜单项*/menu_select() char s80; int c; gotoxy(1,25);/*将光标定为在第25行,第1列*/ printf(press any key enter menu.n);/*提示压任意键继续*/ getch(); /*读入任意字符*/ clrscr(); /*清屏*/ gotoxy(1,1); printf(*MENU*nn); printf( 0. Enter recordn); printf( 1. List the filen); pri
17、ntf( 2. Search record on namen); printf( 3. Delete a recordn); printf( 4. add record n); printf( 5. Save the filen); printf( 6. Load the filen); printf( 7. display record on ordern); printf( 8. sort to make new filen); printf( 9. Quick seek recordn); printf( 10. copy the file to new filen); printf(
18、11. Quitn); printf(*n); do printf(n Enter you choice(011):); /*提示输入选项*/ scanf(%s,s); /*输入选择项*/ c=atoi(s); /*将输入的字符串转化为整型数*/ while(c11); /*选择项不在011之间重输*/ return c; /*返回选择项,主程序根据该数调用相应的函数*/*输入记录,形参为结构体数组,函数值返回类型为整型表示记录长度*/int enter(ADDRESS t) int i,n; char *s; clrscr(); /*清屏*/ printf(nplease input num
19、 n); /*提示信息*/ scanf(%d,&n); /*输入记录数*/ printf(please input record n); /*提示输入记录*/ printf(name unit telephonen); printf(-n); for(i=0;in;i+) scanf(%s%s%s,ti.name,ti.units,ti.tele); /*输入记录*/ printf(-n); return n; /*返回记录条数*/*显示记录,参数为记录数组和记录条数*/void list(ADDRESS t,int n) int i; clrscr(); printf(nn*ADDRESS*
20、n); printf(name unit telephonen); printf(-n); for(i=0;in-1) /*如果整数i值大于n-1,说明没找到*/ printf(not foundn); else print(ti); /*找到,调用显示函数显示记录*/*显示指定的一条记录*/void print(ADDRESS temp) clrscr(); printf(nn*n); printf(name unit telephonen); printf(-n); printf(%-20s%-30s%-10sn,temp.name,temp.units,temp.tele); print
21、f(*end*n);/*查找函数,参数为记录数组和记录条数以及姓名s */int find(ADDRESS t,int n,char *s) int i; for(i=0;in-1) /*如果in-1超过了数组的长度*/ printf(no found not deletedn); /*显示没找到要删除的记录*/ else print(ti); /*调用输出函数显示该条记录信息*/ printf(Are you sure delete it(1/0)n); /*确认是否要删除*/ scanf(%d,&ch); /*输入一个整数0或1*/ if(ch=1) /*如果确认删除整数为1*/ for(
22、j=i+1;j=i;j-) /*从最后一个结点开始向后移动一条*/ strcpy(tj+1.name,tj.name); /*当前记录的姓名拷贝到后一条*/ strcpy(tj+1.units,tj.units); /*当前记录的单位拷贝到后一条*/ strcpy(tj+1.tele,tj.tele); /*当前记录的电话拷贝到后一条*/ strcpy(ti.name,temp.name); /*将新插入记录的姓名拷贝到第i个位置*/ strcpy(ti.units,temp.units); /*将新插入记录的单位拷贝到第i个位置*/ strcpy(ti.tele,temp.tele); /*
23、将新插入记录的电话拷贝到第i个位置*/ n+; /*记录数加1*/ return n; /*返回记录数*/*保存函数,参数为结构体数组和记录数*/void save(ADDRESS t,int n) int i; FILE *fp; /*指向文件的指针*/ if(fp=fopen(record.txt,wb)=NULL) /*打开文件,并判断打开是否正常*/ printf(can not open filen);/*没打开*/ exit(1); /*退出*/ printf(nSaving filen); /*输出提示信息*/ fprintf(fp,%d,n); /*将记录数写入文件*/ fpr
24、intf(fp,rn); /*将换行符号写入文件*/ for(i=0;in;i+) fprintf(fp,%-20s%-30s%-10s,ti.name,ti.units,ti.tele);/*格式写入记录*/ fprintf(fp,rn); /*将换行符号写入文件*/ fclose(fp);/*关闭文件*/ printf(*save success*n); /*显示保存成功*/*读入函数,参数为结构体数组*/int load(ADDRESS t) int i,n; FILE *fp; /*指向文件的指针*/ if(fp=fopen(record.txt,rb)=NULL)/*打开文件*/ p
25、rintf(can not open filen); /*不能打开*/ exit(1); /*退出*/ fscanf(fp,%d,&n); /*读入记录数*/ for(i=0;i=0&idn) /*判断序号是否在记录范围内*/ fseek(fp,(id-1)*sizeof(ADDRESS),1); /*移动文件指针到该记录位置*/ print(tid); /*调用输出函数显示该记录*/ printf(rn); else printf(no %d number record!n ,id); /*如果序号不合理显示信息*/ fclose(fp); /*关闭文件*/*排序函数,参数为结构体数组和记录
26、数*/void sort(ADDRESS t,int n) int i,j,flag; ADDRESS temp; /*临时变量做交换数据用*/ for(i=0;in;i+) flag=0; /*设标志判断是否发生过交换*/ for(j=0;j0) /*比较大小*/ flag=1; strcpy(temp.name,tj.name); /*交换记录*/ strcpy(temp.units,tj.units); strcpy(temp.tele,tj.tele); strcpy(tj.name,tj+1.name); strcpy(tj.units,tj+1.units); strcpy(tj.
27、tele,tj+1.tele); strcpy(tj+1.name,temp.name); strcpy(tj+1.units,temp.units); strcpy(tj+1.tele,temp.tele); if(flag=0)break; /*如果标志为0,说明没有发生过交换循环结束*/ printf(sort sucess!n); /*显示排序成功*/*快速查找,参数为结构体数组和记录数*/void qseek(ADDRESS t,int n) char s20; int l,r,m; printf(nPlease sort before qseek!n); /*提示确认在查找之前,记
28、录是否已排序*/ printf(please enter name for qseekn); /*提示输入*/ scanf(%s,s); /*输入待查找的姓名*/ l=0;r=n-1; /*设置左边界与右边界的初值*/ while(l=r) /*当左边界=右边界时*/ m=(l+r)/2; /*计算中间位置*/ if(strcmp(tm.name,s)=0) /*与中间结点姓名字段做比较判是否相等*/ print(tm); /*如果相等,则调用print函数显示记录信息*/ return ; /*返回*/ if(strcmp(tm.name,s)r) /*如果左边界大于右边界时*/ print
29、f(not foundn); /*显示没找到*/*复制文件*/void copy() char outfile20; /*目标文件名*/ int i,n; ADDRESS tempM; /*定义临时变量*/ FILE *sfp,*tfp; /*定义指向文件的指针*/ clrscr();/*清屏*/ if(sfp=fopen(record.txt,rb)=NULL) /*打开记录文件*/ printf(can not open filen); /*显示不能打开文件信息*/ exit(1); /*退出*/ printf(Enter outfile name,for example c:f1te.t
30、xt:n); /*提示信息*/ scanf(%s,outfile); /*输入目标文件名*/ if(tfp=fopen(outfile,wb)=NULL) /*打开目标文件*/ printf(can not open filen); /*显示不能打开文件信息*/ exit(1); /*退出*/ fscanf(sfp,%d,&n); /*读出文件记录数*/ fprintf(tfp,%d,n);/*写入目标文件数*/ fprintf(tfp,rn); /*写入换行符*/ for(i=0;in;i+) fscanf(sfp,%20s%30s%10sn,tempi.name,tempi.units,
31、tempi.tele); /*读入记录*/ fprintf(tfp,%-20s%-30s%-10sn,tempi.name, tempi.units,tempi.tele); /*写入记录*/ fprintf(tfp,rn); /*写入换行符*/ fclose(sfp); /*关闭源文件*/ fclose(tfp); /*关闭目标文件*/ printf(you have success copy file!n); /*显示复制成功*/ 2) 参考文献1、C语言程序设计教程,谭浩强,张基温 清华大学出版社,20062、C程序设计题解与上机指导,谭浩强,清华大学出版社,20063、零起点一本通 天合教育 电子科技大学出版社,20094、C语言实用程序荟萃,西安电子科技大学出版社,19935、C语言函数手册,机械工业出版社,19996、C语言的实际应用,安徽科学技术