版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
./C语言程序设计实训报告课程名称C语言程序设计实训课题名称通讯录管理专业软件工程班级K软件151学号姓名指导教师2016年1月1日汽车工业学院科技学院C语言程序设计实训任务书课程名称C语言程序设计实训课题通讯录管理专业班级软件工程学生学号指导老师审批一、设计容与设计要求1.设计容:设计课题:通讯录管理一、问题描述:该设计实现对通讯录得管理功能,具体包括从键盘输入通讯录的信息、从指定的文件中读入通讯录的信息、按查询通讯录的信息、按分类查询通讯录的信息、删除指定的通讯录的信息、将通讯录信息保存在指定的文件中等。二、功能要求:能从键盘输入通讯录的信息〔增加,输入时需要能检查该的通讯录的记录是否已经存在,如果存在,需要询问是否是覆盖还是增加,需要判断输入的类型是否存在能从指定的文件中读入通讯录的信息能按查询通讯录的信息能按分类查询通讯录的信息能删除指定的通讯录的信息能将通讯录信息保存在指定的文件中所有数据符合实际应用要求2.设计要求:1设计正确,方案合理。2界面友好,使用方便。3程序精炼,结构清晰。4上机演示。3.设计报告要求:课程设计报告格式如下:1正文的格式:一级标题用3号黑体,二级标题用四号宋体加粗,正文用小四号宋体,行距为22。2正文的容:课题的主要功能、课题的功能模块的划分、主要功能的实现、程序调试、总结、附件〔所有程序的源代码,要求对程序写出必要的注释。3课程设计报告装订顺序:封面、任务书、目录、正文、评分、程序清单附件。二、进度安排星期时间班级容地点二6:30-8:30K软件151熟悉课题的任务和要求,查阅相关资料,做好编码准备2601三6:30-8:30K软件151程序编码、调试2601四6:30-8:30K软件151程序编码、调试和测试,书写报告2601日6:30-8:30K软件151答辩、检查、验收、提交设计报告2601汽车工业学院科技学院2015年12月20日目录TOC\o"1-1"\u1系统需求分析62概要设计63详细设计64系统测试75 课程设计总结91系统需求分析本系统首先设计出了主函数,然后根据去要实现的功能分别设计,添加、显示、删除、查找、修改功能的子函数。在现实的函数设计过程中首先运用文件的读取等必要的知识通过把文件的容读取到存然后打印出来。添加函数在设计时通过申请一片空间,然后通过指针将需要添加进去,从而实现添加功能。删除函数的设计是首先从文件找到要删除的人,然后通过写一个实现删除目的的for循环将人从存里面删除,然后在用写的方式打开文件,将存的信息写入文件,实现删除。查找也是先打开文件,用一个字符串对比的方法找出用户要查找的人,然后打印出来。修改也大体和删除相同。2概要设计系统功能模块图:主菜单主菜单退出修改添加查询删除退出修改添加查询删除输入编号,重新输入编号、姓名、电话号码输入姓名编号、姓名、电话号码编号、姓名、电话号码输入编号,重新输入编号、姓名、电话号码输入姓名编号、姓名、电话号码编号、姓名、电话号码3详细设计3.1数据结构本系统主要采用链表结构类型来表示储存在"通讯录管理系统"中的信息。其中,链表结点由四个分量构成:编号、联系人、、指向该结构体的指针。3.2主菜单模块:本系统设置了5个子功能菜单,5个子功能的设计描述如下。通讯录信息的输入。可以一次输入多个通讯成员的信息,建立通讯录。该功能由insert<>函数实现。通讯录信息的显示。可以查看通讯录中所有的通讯录成员记录。该功能由output<>函数实现。通讯录信息的保存。可以将输入的通讯录成员的信息进行保存。该功能由save<>函数实现。通信记录的删除。可以对通讯录中不再需要的信息进行删除。该功能由del<>函数实现。〔要彻底删除,必须要删除counter.txt和通讯录.txt中的容。如下图:通信记录的修改。可以将通讯录中的联系成员的信息进行修改,并保存。该功能由modify<>函数实现。通信记录的查找。可以通过3种方式进行对通讯信息进行查找。该功能由found<found_code<>、found_name<>、found_tele<>>函数实现。structtele//定义数据结构{ charcode[8];//编号 charname[20];// chartele[16];//};/*********************函数声明********************/voidcreat<>;//创建通讯录voidload<>;//加载数据voidmenu<>;//菜单显示voidchoose_1<int>;//选择功能voidinsert<>;//1、通讯录信息的输入voidoutput<>;//2、通讯录信息的显示voidsave<>;//3、通讯录信息的保存voiddel<>;//4、通信记录的删除voidmodify<>;//5、通信记录的修改voidfound<>;//6、记录的查找〔3种方式voidchoose_2<int>;//选择查询的方式voidfound_code<>;//6.1、按编号查询voidfound_name<>;//6.2、按查询voidfound_tele<>;//6.3、按查询voidquit<>;//7、退出系统3.3添加模块此模块为添加信息模块,添加后再调用保存所添加的数据,支持多条信息的添加。开始开始从0~6调用insert函数从0~6调用insert函数k=1?YNk=1?返回主菜单保存调用save函数返回主菜单保存调用save函数结束结束[程序]/*************************通讯信息录入函数**********************//**************将函数写入存中,由person[N]数组保存着**********/voidinsert<>{ structtele*p; system<"cls">; p=<structtele*>malloc<sizeof<structtele>>;//将动态分配的存首地址赋给p printf<"\n\n\n\n\n\n">; printf<"\t*******************************\n\n">; printf<"\t编号:">; scanf<"%s",p->code>; strcpy<person[counter+1].code,p->code>; printf<"\t:">; scanf<"%s",p->name>; strcpy<person[counter+1].name,p->name>; printf<"\t:">; scanf<"%s",p->tele>; strcpy<person[counter+1].tele,p->tele>; printf<"\n\t************************************">; counter++; free<p>;//释放空间 getchar<>; getchar<>; system<"cls">; menu<>;}3.4显示模块此模块为显示所有记录,流程图如下:选择显示功能选择显示功能显示所有记录显示所有记录返回主菜单返回主菜单[程序]/**********************通讯信息显示函数****************************//***********从存中将数据显示在屏幕上,不用打开文件***************/voidoutput<>{ inti=1; system<"cls">; if<counter> { for<i=0;i<=counter;i++> printf<"\n\t%-8s%-20s%-16s\n",person[i].code,person[i].name,person[i].tele>; printf<"\t">; } else printf<"\n\n\n\n\n\t\t记录为空,请输入联系人信息!">; getchar<>; getchar<>; system<"cls">; menu<>;}3.5删除模块此模块先利用查找模块找到所要删除的信息,然后根据用户的选择来确定是否删除信息,此种调用到save函数。其流程图如下:开始开始输入要删除信息的姓名输入要删除信息的姓名是否找到信息YN是否找到信息没有找到信息显示找到的信息没有找到信息显示找到的信息是否删除是否删除YN提示未删除删除成功提示未删除删除成功结束结束[程序]/***************************信息删除函数***************************/voiddel<>//根据删除,根据显示选择要删除的容{ intk=1; intc=0; charm; charnamekey[20]; system<"cls">; printf<"\n\n\n\n\n\n\t\t\t请输入要删除的:">; scanf<"%s",namekey>; while<k<=counter> { if<!strcmp<namekey,person[k++].name>> { c=k-1; break; } } if<c> { printf<"\t\t\t已查到,记录为:\n\n\n">; printf<"\t%-10s%-20s%-20s\n",person[0].code,person[0].name,person[0].tele>; printf<"\t%-10s%-20s%-20s\n",person[c].code,person[c].name,person[c].tele>; printf<"\n\n\t\t\t确定要删除吗?<Y/N>:">; scanf<"%s",&m>; if<m=='y'||m=='Y'> { if<c==counter> { strcpy<person[counter].code,"\0">; strcpy<person[counter].name,"\0">; strcpy<person[counter].tele,"\0">; counter--; } else { for<k=c;k<=counter;k++>//后面的信息将前面的信息覆盖掉 { strcpy<person[k].code,person[k+1].code>; strcpy<person[k].code,person[k+1].name>; strcpy<person[k].code,person[k+1].tele>; } strcpy<person[counter].code,"\0">;//最后的信息为空 strcpy<person[counter].name,"\0">; strcpy<person[counter].tele,"\0">; counter--; } printf<"\t\t\t删除成功!">; getchar<>; getchar<>; system<"cls">; save<>;//用sava〔函数将删除后的信息重新保存 menu<>; } else { system<"cls">; menu<>; } } else { printf<"\n\t\t\t对不起没有此人记录!">; getchar<>; getchar<>; system<"cls">; menu<>; } }4系统测试4.1菜单显示主菜单具有所有函数的功能实现的选择功能,通过主菜单的操作进入各个功能。主菜单主要由主函数提供,其功能由子函数实现。运行结果如下图所示:4.2添加在主菜单界面,用户输入1并回车,然后按照提示建立通讯录,分别输入通讯录成员的编号,,,运行结果如下图所示:4.3显示在主菜单下,用户输入2并回车,可以查看通讯录中所有成员信息。运行结果如下图所示:课程设计总结通过这次的课程设计,我对很多的函数有了新的认识,也学会了很多,学会了运用多种函数,我也明白了编写软件的基本过程和方法。在这个过程中我学会了很多平时编程不会使用的函数,还有编写的方法。特别是文件的开启和关闭,读与写,总的来说,这次课程设计让我受益匪浅啊!其实在编写软件的过程中也遇到了很多的困难,每一个自定义函数都是经过多次的调试和改正错误,曾经想过要放弃的,但是为了完成这个任务还是拼命的坚持了下来,毫不畏惧困难才是真正的我,还有就是编写和改错的过程中受到许多同学的帮助,在一番折腾之后,我总算是顺利的完成了这次的《通讯录管理》的程序设计。虽然在调试程序的过程中,遇到过很多很多的困难,但是当软件调试成功时那种喜悦的感觉没有什么东西可以代替。在程序的编写过程中我发现我自己有很多的知识漏洞和缺陷,以至于编写完后,一经过编译,发现了好多的错误,所以我需要进一步的来完善我自己。在这几天的编写过程中,对我而言,我的C语言是有了很大的进步和了解。在此次的编写过程中,我知道和掌握了很多的经验,它们肯定是能够促进我学习的。此次的课程设计不仅给了我很多很好的经验,也让我体会到了失败时的焦虑、无助和难受,当然我更喜欢成功后的兴奋和喜悦咯~~~啦啦啦~~~附录:源程序代码:#include<stdio.h>#include<stdlib.h>#include<string.h>#include<conio.h>#defineN35//改变N的值,就可以改变记录的联系人个数structtele//定义数据结构{ charcode[8];//编号 charname[20];// chartele[16];//};/*********************定义全局变量*********************/FILE*fp;//文件指针structteleperson[N];//记录联系人信息intcounter;//统计记录个数〔联系人个数/*********************函数声明********************/voidcreat<>;//创建通讯录voidload<>;//加载数据voidmenu<>;//菜单显示voidchoose_1<int>;//选择功能voidinsert<>;//1、通讯录信息的输入voidoutput<>;//2、通讯录信息的显示voidsave<>;//3、通讯录信息的保存voiddel<>;//4、通信记录的删除voidmodify<>;//5、通信记录的修改voidfound<>;//6、记录的查找〔3种方式voidchoose_2<int>;//选择查询的方式voidfound_code<>;//6.1、按编号查询voidfound_name<>;//6.2、按查询voidfound_tele<>;//6.3、按查询voidquit<>;//7、退出系统/***********************MAIN函数*******************/intmain<>{system<"cls">;//清屏 creat<>;//为程序创建文件 fp=fopen<"counter.txt","r">;//r只读〔打开 fscanf<fp,"%d",&counter>;//将数据赋值给counter fclose<fp>;//关闭打开的文件 load<>;//数据装载至存中 menu<>; return0;}/***********************创建通讯录******************/voidcreat<>{ if<<fp=fopen<"通讯录.txt","r">>==NULL>//r只读〔打开 { fp=fopen<"通讯录.txt","w">;//w为只写建立一个新的文件 fprintf<fp,"%-10s%-20s%-20s\n","编号","","">;//写入基本信息person[0] fclose<fp>; } if<<fp=fopen<"counter.txt","r">>==NULL>//r只读〔打开 { fp=fopen<"counter.txt","w">; fprintf<fp,"%d",0>;//写入初值〔自有文件新建时才有 fclose<fp>; }}voidload<>{ inti; if<<fp=fopen<"通讯录.txt","r">>!=NULL>//r只读〔打开,打开文件成功 for<i=0;i<=counter;i++> fscanf<fp,"%s%s%s",person[i].code,person[i].name,person[i].tele>;//将文件中的信息加载到存中,供操作使用 else printf<"打开文件失败!\n">; fclose<fp>;}/*************************界面菜单显示函数************************/voidmenu<>{ intk; printf<"\n">;printf<"\n">; printf<"\t*********************************************\n">; printf<"\t**********MENU*************\n">; printf<"\t*********************************************\n">; printf<"\t**********1、通讯录信息的输入:**********\n">; printf<"\t**********2、通讯录信息的显示:**********\n">; printf<"\t**********3、通讯录信息的保存:**********\n">; printf<"\t**********4、通信记录的删除:************\n">; printf<"\t**********5、通信记录的修改:************\n">; printf<"\t**********6、通信记录的查找:************\n">; printf<"\t**********0、退出系统:************\n">; printf<"\t*********************************************\n">; printf<"\tNowPleaseEnteryourchoose<0-6>:">; scanf<"%d",&k>; choose_1<k>;}/***************************函数功能选择函数***************************/voidchoose_1<intk>{ switch<k> { case1:insert<>;break; case2:output<>;break;case3:save<>;system<"cls">;printf<"\n\n\n\n\n\n\n\n\n\n\t\t\t\t保存成功!">; getchar<>;getchar<>;system<"cls">;menu<>;break; case4:del<>;break; case5:modify<>;break; case6:found<>;break; case0:quit<>;break; default:;break; }}/*******************************OK******************************//*************************通讯信息录入函数**********************//**************将函数写入存中,由person[N]数组保存着**********/voidinsert<>{ structtele*p; system<"cls">; p=<structtele*>malloc<sizeof<structtele>>;//将动态分配的存首地址赋给p printf<"\n\n\n\n\n\n">; printf<"\t*******************************\n\n">; printf<"\t编号:">; scanf<"%s",p->code>; strcpy<person[counter+1].code,p->code>; printf<"\t:">; scanf<"%s",p->name>; strcpy<person[counter+1].name,p->name>; printf<"\t:">; scanf<"%s",p->tele>; strcpy<person[counter+1].tele,p->tele>; printf<"\n\t************************************">; counter++; free<p>;//释放空间 getchar<>; getchar<>; system<"cls">; menu<>;}/**********************通讯信息显示函数****************************//***********从存中将数据显示在屏幕上,不用打开文件***************/voidoutput<>{ inti=1; system<"cls">; if<counter> { for<i=0;i<=counter;i++> printf<"\n\t%-8s%-20s%-16s\n",person[i].code,person[i].name,person[i].tele>; printf<"\t">; } else printf<"\n\n\n\n\n\t\t记录为空,请输入联系人信息!">; getchar<>; getchar<>; system<"cls">; menu<>;}/************保存、修改、删除只针存中的数组进行操作*************//************************通讯信息保存函数*************************/voidsave<>{ inti; system<"cls">; if<<fp=fopen<"counter.txt","w">>==NULL>//w只写覆盖原来的数据 { printf<"\n\n\n\t\t\t操作失败.">; exit<1>; } fprintf<fp,"%d",counter>;//向磁盘写入现在的值,即保存 fclose<fp>; if<<fp=fopen<"通讯录.txt","w">>!=NULL> fprintf<fp,"%s","\0">; fclose<fp>; if<<fp=fopen<"通讯录.txt","a">>!=NULL> for<i=0;i<=counter;i++> fprintf<fp,"%-10s%-20s%-20s",person[i].code,person[i].name,person[i].tele>; fclose<fp>; system<"cls">;}/***************************信息删除函数***************************/voiddel<>//根据删除,根据显示选择要删除的容{ intk=1; intc=0; charm; charnamekey[20]; system<"cls">; printf<"\n\n\n\n\n\n\t\t\t请输入要删除的:">; scanf<"%s",namekey>; while<k<=counter> { if<!strcmp<namekey,person[k++].name>> { c=k-1; break; } } if<c> { printf<"\t\t\t已查到,记录为:\n\n\n">; printf<"\t%-10s%-20s%-20s\n",person[0].code,person[0].name,person[0].tele>; printf<"\t%-10s%-20s%-20s\n",person[c].code,person[c].name,person[c].tele>; printf<"\n\n\t\t\t确定要删除吗?<Y/N>:">; scanf<"%s",&m>; if<m=='y'||m=='Y'> { if<c==counter> { strcpy<person[counter].code,"\0">; strcpy<person[counter].name,"\0">; strcpy<person[counter].tele,"\0">; counter--; } else { for<k=c;k<=counter;k++>//后面的信息将前面的信息覆盖掉 { strcpy<person[k].code,person[k+1].code>; strcpy<person[k].code,person[k+1].name>; strcpy<person[k].code,person[k+1].tele>; } strcpy<person[counter].code,"\0">;//最后的信息为空 strcpy<person[counter].name,"\0">; strcpy<person[counter].tele,"\0">; counter--; } printf<"\t\t\t删除成功!">; getchar<>; getchar<>; system<"cls">; save<>;//用sava〔函数将删除后的信息重新保存 menu<>; } else { system<"cls">; menu<>; } } else { printf<"\n\t\t\t对不起没有此人记录!">; getchar<>; getchar<>; system<"cls">; menu<>; } } /**************************信息修改函数*************************/ voidmodify<>//可以设定编号唯一,通过编号来确定记录位置,进而进行修改 { intk=1; charm; charcodekey[20]; system<"cls">; printf<"\n\n\t\t\t请输入要修改的编号:">; scanf<"%s",codekey>; while<k<=counter> { if<!strcmp<codekey,person[k].code>> break; k++; } if<k<=counter> { printf<"\n\t\t\t已查到,记录为:\n">; printf<"\n%-10s%-20s%-20s","编号","","">; printf<"\t\t\n%-10s%-20s%-20s\n",person[k].code,person[k].name,person[k].tele>; printf<"\t\t\t确定要修改吗?<Y/N>:">; scanf<"%s",&m>; if<m=='y'||m=='Y'> { printf<"\n\t\t\t请输入新的信息:\n\n">; printf<"\t******************************\n\n">; printf<"\t编号:">; scanf<"%s",person[k].code>; printf<"\t:">; scanf<"%s",person[k].name>; printf<"\t:">; scanf<"%s",person[k].tele>; printf<"\n\t**********************************">; printf<"\n\n\t\t\t修改成功!">; getchar<>; getchar<>; system<"cls">; save<>;//用sava〔函数将修改完后的信息立马保存 menu<>; } else { printf<"\n\n\t\t\t对不起,没有此人记录!">; getchar<>; getchar<>; system<"cls">; menu<>; } } } /*************************信息查询************************/ voidfound<>//调试合适 { intk; system<"cls">; printf<"\n">; printf<"\n">; printf<"\n\t\t************************************\n">; printf<"\n\t\t1、按编号查询:\n">; printf<"\n\t\t2、按查询:\n">; printf<"\n\t\t3、按查询:\n">; printf<"\n\t\t0、返回:\n">; printf<"\n\t\t***********************************\n\n">; printf<"\t\tPleaseEnterYourChoosenow:">; scanf<"%d",&k>; choose_2<k>; } voidchoose_2<intk> { switch<k> { case1:found_code<>;break; case2:found_name<>;break; case3:found_tele<>;break; case0:system<"cls">;menu<>;break; default:system<"cls">;menu<>;break; } system<"cls">; menu<>; } voidfound_code<>//按编号查询 { intk=0; charcodekey[8]; structtele*p; p=<structtele*>malloc<sizeof<structtele>>; printf<"\n\t\t请输入要查询的编号:">; scanf<"%s",codekey>; if<<fp=fopen<"通讯录.txt","r">>==NULL> { printf<"\n不能打开通讯录!\n">; exit<0>; } while<!feof<fp>>//当文件结束时,feof〔返回值为1 { fscanf<fp,"%s%s%s\n",p->code,p->name,p->tele>; if<!strcmp<codekey,p->code>> { k=1;break;//k=1,说明已经查到 } } if<k> { printf<"\n\t\t%-10s%-20s%-20s\n","编号","","">; printf<"\n\t\t%-10s%-20s%-20s",p->code,p->name,p->tele>; } else printf<"\n\t\t您查询的编号不存在!">; fclose<fp>; getchar<>; getchar<>; system<"cls">; } voidfound_name<>
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 二零二五年度快递分拣中心运营管理合同
- 二零二五年度充电桩设备租赁与售后服务合同3篇
- 人才培养深化合作合同版B版
- 二零二五年度教育机构学费贷款合同范本3篇
- 2025年车辆借用合同示范文本及注意事项4篇
- 二零二四年上海高校应届生落户合同解除经济补偿协议3篇
- 2025年度物流仓储园区场商位租赁与供应链管理合同4篇
- 2025年度茶楼与茶叶博物馆合作展示合同4篇
- 二零二五年度影视基地租赁场地安全管理与服务合同4篇
- 二零二五年度汽车代理销售服务合同示范文本4篇
- 图形创意(高职艺术设计)PPT完整全套教学课件
- VI设计辅助图形设计
- 浅谈小学劳动教育的开展与探究 论文
- 2023年全国4月高等教育自学考试管理学原理00054试题及答案新编
- 稀土配合物和量子点共掺杂构筑发光软材料及其荧光性能研究
- 河北省大学生调研河北社会调查活动项目申请书
- JJG 921-2021环境振动分析仪
- 中药炮制学-第五、六章
- 小儿高热惊厥精品课件
- 两段焙烧除砷技术简介 - 文字版(1)(2)课件
- 实习证明模板免费下载【8篇】
评论
0/150
提交评论