C语言课程设计指导书

上传人:痛*** 文档编号:156900902 上传时间:2022-09-28 格式:DOC 页数:44 大小:240.50KB
返回 下载 相关 举报
C语言课程设计指导书_第1页
第1页 / 共44页
C语言课程设计指导书_第2页
第2页 / 共44页
C语言课程设计指导书_第3页
第3页 / 共44页
点击查看更多>>
资源描述
C语言课程设计指导书一、【实验目的】培养学生综合利用C语言进行程序设计的能力,主要是培养学生利用系统提供的标准函数进行创新设计。二、【实验条件】在安装Windows2000、DOS和TC环境的微机机房进行。三、【实验内容】1. add添加好友信息2. revice修改好友信息 3. delete删除一个好友信息 4.name 按名字查找一个好友信息 5.birthday按生日查找一个好友信息电子通讯录功能如下:Functionchoose1.Read2.Append3.Delete4.Search5.Saveandexit6.Quit说明:上图是电子通讯录的主菜单,利用它,将能够轻松地录入一个朋友的电话号码,通讯地址和出生日期,而且它还提供了检索和删除功能。在后面还将提供按生日先后排序的功能,这些都有助于该通讯录的管理。四、【实验准备】指导教师由任课教师或本专业教师和工程技术人员担任。指导教师在课程设计开始前一个月下发课程设计指导书,学生根据个人情况选定自己的课题。选定题目后查找资料、准备设计材料。五、【设计思想:】1用顺序表设计电子通讯录的结构为了表示较为复杂的数据内容,一般用结构这种数据类型,第一步就是在结构中定义所需要的各项信息。一般的通讯录都包括姓名,性别,出生年月,通讯地址和联系电话这几项,而在这几项中,出生年月又包括年份,月份和日期三项,通讯地址包括邮编和家庭地址二项,我们把这些联系较为紧密的内容又用单独的结构表示,这样就产生了电子通讯录的基本结构:structaddr/*通讯地址结构定义*/charpost_num10;/*邮编*/charaddr40;/*家庭地址*/;structbirth/*出生年月结构定义*/intyear;/*年份*/intmonth;/*月份*/intday;/*日期*/;structfriend/*电子通讯录结构定义*/intnumber;/*序号*/charname20/*姓名*/charsex;/*性别*/structbirthbirth;/*出生年月*/structaddraddr;/*通信地址*/chartelephone13;/*联系电话*/;定义的主结构friend包含了前述的五项内容name,sex,和telephone分别代表了姓名,性别和联系电话。为了让结构中的各项组分更加清晰,定义了二个小结构birth和addr分别代表出生年月和通讯地址,因此实际上friend包含了8项内容。有了结构定义后,我们可以很轻松地构造出电子通讯录的主体:stryctfriendfriends50;采用一维数组friends50,正是用到了顺序表这种最简单的数据结构来表示问题。2.增添电子通讯录中的内容对于电子通讯录这样一张顺序表来说,内容的录入是必不可少的操作。由于采用的是顺序存储结构。这项工作很简单,只需要在把输入的信息按顺序放在空的friends数组元素中即可。函数Data_Input完成了信息的录入工作:voidData_input(intj)friendsj.number=j;printf(nnntNo%drecord,j);printf(nntName:);/*读入姓名*/scanf(%s,friendsj.name);printf(ntSex(m/f):);/*读入姓别*/scanf(%c,&friendsj.sex);printf(ntbirthday:);/*读入出生年月*/printf(nttyear:);scanf(%d,&friendsj.birth.year);printf(nttmonth);scanf(%d,&friendsj.birth.month);printf(nttday);scanf(%d,&friendsj.birth.day);printf(ntPostnumber:);/*读入邮编*/scanf(%s,friendsj.addr.post_num);printf(ntAddress:);/*读入家庭地址*/scanf(%s,friendsj.addr.addr);printf(nttelephone:);/*读入联系电话*/scanf(%s,friendsj.telephone);录入完毕后典型的一份信息如下所示:NO:1Name:张三Sex:mBirthday(y/m/d):1980512Postnum:100034Address:BeijingUniversityTele:(010)620052003.电子通讯录记录的维护(插入与删除)在实际使用中,数据资料输入后,还需要不断的更新和维护操作,最常见的是数据的插入与删除。作为顺序表来说,如何在插入与删除数据资料后仍然能保持原有数据之间的关系,是需要考虑的关键问题。电子通讯录的插入算法如下:printf(ntInsertNo:);/*录入插入位置*/scanf(%d,&k);for(j=i+1;jk;j-)/*插入位置后的元素顺序后移*/strcpy(friendsj.name,friendsj-1.name);/*交换元素内容*/friendsj.sex=friendsj+1.sex;friendsj.birth.year=friendsj-1.birth.year;friendsj.birth.month=friendsj-1.birth.month;friendsj.birth.day=friendsj-1.birth.day;strcpy(friendsj.addr.post_num,friendsj-1.addr.post_num);strcpy(friendsj.addr.addr,friendsj-1.addr.addr);strcpy(friendsj.telephone,friendsj-1.telephone);Data_Input(k);/*插入位置上填入待插入元素*/i+;/*总元素个数增1*/删除算法如下:printf(ntDeleteNo:);/*读入删除位置*/scanf(%d,&k);for(j=k;ji;j+)/*删除位置前的元素顺序前移*/strcpy(frindsj.name,frindsj+1.name);friendsj.sex=frindsj+1.sex;friendsj.birth.year=friendsj+1.birth.year;friendsj.birth.month=friendsj+1.birth.month;frindsj.birth.day=friendsj+1.birth.day;strcpy(friendsj.addr.post_num,friendsj+1.addr.post_num);strcpy(friendsj.addr.addr,friendsj+1.addr.addr);strcpy(friendsj.telephone,friendsj+1.telephone);i-;/*元素总数减1*/函数search的代码如下:search()printf(ntPleaseinputname:);/*提示输入要查询的姓名*/gets(search_name);for(j=1;j1)/*查询失败,给出提示信息*/printf(ntNosuchrecords);文件存盘代码如下FILE*fp;voidData_Save()intj;fp=fopen(friend.txt,w);/*c以可写方式打开或创建文件friend.txt*/for(j=1;j=i;j+)fwrite(&friendsj,sizeof(structfriend),1,fp);fclose(fp);处理有关的文件操作,最容易忽视的就是关闭文件的操作.如果不及时关闭,容易造成文件内容的丢失,或者占用大量的内存,导至程序的执行速度下降。从文件friend.txt读取记录的代码如下:voidData_Load()intj;longk;fp=fopen(friend.txt,r+t);/*打开文件friend.txt*/if(fp!=NULL)for(i=1;i50;i+)if(j=fgetc(fp)=EOF)/*判断是否到了文件尾*/return;k=i-1;fseek(fp,k*sizeof(structfriend),SEEK_SET);fread(&friendsi,sizeof(structfriend),1,fp);/*从文件中读一条记录*/else/*如果文件不存在*/fp=fopen(friend.txt,w);i=1;六、【总体设计】在前面五个步聚的基础上开始进行程序主函数的设计。主函数首先调用初始化函数Data_Load从已有文件friend.txt读取记录,如果是第一次使用,那么该文件不存在就创建一个新文件,接下来程序进入一个无限循环,首先用一系列printf语句打印出各功能的选择菜单,并提示按下数字键调用相应的功能。这里使用了switch分支结构来处理按键消息,这是一种典型的用法,当选择了quit菜单后,程序给出是否存盘的提示。/*-全部源代码如下-*/#include#include#include#include#includestructaddr/*通讯地址结构定义*/charpost_num10;/*邮编*/charaddr40;/*家庭地址*/;structbirth/*出生年月结构定义*/intyear;/*年份*/intmonth;/*月份*/intday;/*日期*/;structfriend1/*电子通讯录结构定义*/intnumber;/*序号*/charname20;/*姓名*/charsex;/*性别*/structbirthbirth;/*出生年月*/structaddraddr;/*通信地址*/chartelephone13;/*联系电话*/friends50;FILE*fp;inti;voidData_Load()intj;longk;fp=fopen(friend.txt,r+t);/*打开文件friend.txt*/if(fp!=NULL)for(i=1;i50;i+)j=fgetc(fp);if(j=EOF)/*判断是否到了文件尾*/return;k=i-1;fseek(fp,k*sizeof(structfriend1),SEEK_SET);fread(&friendsi,sizeof(structfriend1),1,fp);/*从文件中读取一条记录*/elsefp=fopen(friend.txt,w);i=1;voidData_Show(intj)/*打印记录的详细资料*/printf(nntNo:%3dn,friendsj.number);printf(ntBirthday(y/m/d):%4d%2d%2d,friendsj.birth.year,friendsj.birth.month,friendsj.birth.day);printf(ntPostnum:%-10s,friendsj.addr.post_num);printf(ntaddress:%-40s,friendsj.addr.addr);printf(ntTele%-13s,friendsj.telephone);voidData_Input(intj)/*记录插入函数*/fflush(stdin);friendsj.number=j;printf(nnntNo%drecord,j);printf(nntName:);/*读入姓名*/scanf(%s,friendsj.name); fflush(stdin);printf(ntSex(m/f):);/*读入性别*/scanf(%c,&friendsj.sex);printf(nt-birthday-);/*读入出生年月*/printf(ntyear:);scanf(%d,&friendsj.birth.year);printf(nttmonth:);scanf(%d,&friendsj.birth.month);printf(nttday:);scanf(%d,&friendsj.birth.day);printf(ntPost_number:);/*读入邮编*/scanf(%s,friendsj.addr.post_num);printf(ntAddress:);/*读入家庭地址*/scanf(%s,friendsj.addr.addr);printf(nttelephone:);/*读入联系电话*/scanf(%s,friendsj.telephone);voidData_Save()intj;fp=fopen(friend.txt,w);for(j=1;j=i;j+)fwrite(&friendsj,sizeof(structfriend1),1,fp);voidmain()intj,k;charch;char*search_name;clrscr();Data_Load();i-;doprintf(nnntFunctionchoose:); printf(nt1.Read); printf(nt2.Append); printf(nt3.Delete); printf(nt4.Search); printf(nt5.Insert); printf(nt6.SaveandExit); printf(nt7.Quit); printf(nn); printf(tChoice:); ch=getche(); switch(ch) case1:j=1;/*显示通讯录中的所有记录*/while(getch()!=0x1b&ji)printf(ntEndofe_noten); break;case2:/*增加通讯录中的记录*/while(getch()!=0x1b&i50)i+;Data_Input(i);if(i=50)printf(nte_noteisfilledn);break;case3:/*删除通讯录中的记录*/if(i1)printf(ntNorecordsn);break;printf(ntDeleteNo:);/*读入删除位置*/scanf(%d,&k);for(j=k;ji;j+)/*删除位置前的元素顺序前移*/strcpy(friendsj.name,friendsj+1.name);friendsj.sex=friendsj=1.sex;friendsj.birth.year=friendsj+1.birth.year;friendsj.birth.month=friendsj+1.birth.month;friendsj.birth.day=friendsj+1.birth.day;strcpy(friendsj.addr.post_num,friendsj+1.addr.post_num);strcpy(friendsj.addr.addr,friendsj+1.addr.addr);strcpy(friendsj.telephone,friendsj+1.telephone);i-;/*元素总数减1*/break;case4:/*通讯录查询功能*/printf(ntPleaseinputname:);gets(search_name);for(j=1;j1)/*查询失败*/printf(ntNosuchrecords);break;case5:printf(ntInsertNo:);/*录入插入位置*/scanf(%d,&k);for(j=i+1;jnext=NULL; rear-next=p; rear=p; 其中rear即为尾指针,而指针p指向新增的节点。算法的流程和上述完全一样。录入留言记录的函数代码如下所示:void Data_Input(struct record *p) struct data *d; struct time *t; front+; getdate(t); /*取系统时间*/ p-t_time.ti_hour=ti_hour; p-t_time.ti_min=ti_min; p-time.ti_sec=ti_sec; printf(nnnDate:%4d %2d %2d,p-t_date.da_year,p-t_date.da_mon,p-t_date.da_day); printf(nTime: %2d: %2d: %2d,p-t_time.ti_hour,p-t_time.ti_min,p-t_time.ti_sec); printf(nntPlease input record:); gets(p-event); /*输入留言内容*/ p-next=NULL; 上述函数中,采用了getdate()和gettime()两个函数用来获取系统的日期和时间。这两个函数只返回指向当前日期和时间的两个指针,还需要将值立即赋给留言记录中的结构成员。3、出队操作-留言记录的删除 和入队操作相反的是出队操作,即在队头将记录删除,这也是符合“先进先出”的原则的。 由于设置了头节点,因此出队操作显得非常简单。只需要修改头节点的指针域,让其指向第二个节点即可。而第一个节点则将其释放掉。其余节点,包括尾指针都不必做任何修改操作。 例如一个队列原本由头节点、节点1和节点2相链而成,执行出队操作时,相当于将头节点和节点1、节点1和节点2之间的两条链断开,而用断链将头节点和节点2链上,多出来的节点1将其释放掉。 典型的出队操作算法如下:void queue_delete(struct element head) struct element *temp; temp=head.next-next; head.next=temp; 在执行出队操作时,一定要记住需要将出队的节点释放。由于采用链式存储,事先无法估计需要多大的存销售市场空间,也不必去估计。每次新增一个节点时,都是调用内存分配函数为新节点申请一块内存,如下所示: p=malloc(sizeof(struct record)函数malloc开辟了一块大小为record 结构元素的内存区域,把掻向该区域的指针赋给指针p,这块内存单元的所有权就从系统转移到了指针p。当p指向的数据元素被删除(出队)时,一定要用如下方式将内存单 所有权还给系统: free(p); 函数free()的作用和malloc()刚好相反,它将指定的内存单元还给了系统。因为系统的内存单元是有限的,如果不及时释放占用的内存,会造成内存资源耗尽或由于内存的减少导致程序执行速度下降。4、记录的存取的读取void Data_Save(struct record *p) /*记录文件的存取*/ int j; fp=fopen(tele_rec.txt,w); /*以可写方式打开记录文件*/ while(p!=NULL) /*若未到队尾,徨将记录存储到文件中*/ fwrite(p.sizeof(struct record),1,fp); p=p-next; fclose(fp); /*关闭指定的文件*/struct event *Data_Load() /*从记录文件中读取记录*/ long k; struct record *p,*q; p=event_head.next; fp=fopen(tele_rec.txt,r+t); /*以读方式打开记录文件*/ if(fp!=NULL) while(!feof(fp) /*依次读取记录并执行入队操作*/ fread(q,sizeof(struct record),1,fp); p-next=q; /*这里p为尾指针,q为指向新节点的指针*/ p=q; p-next=NULL; event_end=p; else fp=fopen(tele_rec.txt,w); /*若文件不存在,创建指定文件名的新文件*/ event_head.next=NULL; event_end=event_head.next; 六、【总体设计】在前面五个步聚的基础上开始进行程序主函数的设计。主函数首先调用初始化函数/*-留言簿代码如下-*/#include#include#includestruct record struct date t_date; /*定义留言日期*/ struct time t_time; /*定义留言时间*/ char event100; /*定义电话内容*/ struct record *next; /*指向下一个节点的指针*/event_head;struct record *event_end;int front;FILE *fp;void Data_Save(struct record *p) /*记录文件的存储*/ int j; fp=fopen(tele_rec.txt,w); /*以可写方式打开记录文件*/ while(p!=NULL) /*若未到队尾,循环将记录存储到文件中*/ fwrite(p,sizeof(struct record),1,fp); p=p-next; fclose(fp); /*关闭指定的记录文件*/struct event *Data_Load() /*从记录文件中读取记录*/ long k; struct record *p,*q; p=event_head.next; fp=fopen(tele_rec.txt,r+t); /*以读方式打开文件*/ if(fp!=NULL) while(!feof(fp) /*依次读入记录并执行入队操作*/ fread(q,sizeof(struct record),1,fp); p-next=q; /*这里p为尾指针,q为指向新节点的指针*/ p=q; p-next=NULL; event_end=p; else fp=fopen(tele_rec.txt,w); /*若该文件不存在,创建指定文件名的新文件*/ event_head.next=NULL; event_end=event_head.next; void Data_Input(struct record *p) struct data *d; struct time *t; front+; getdate(d);/*取系统日期*/p-t_date.da_year=d-da_year;p-t_date.da_mon=d-da_mon;p-t_date.da_day=d-da_day; gettime(t); /*取系统时间*/ p-t_time.ti_hour=t-ti_hour; p-t_time.ti_min=t-ti_min; p-time.ti_sec=t-ti_sec; printf(nnnDate:%4d %2d %2d,p-t_date.da_year,p-t_date.da_mon,p-t_date.da_day); printf(nTime: %2d: %2d: %2d,p-t_time.ti_hour,p-t_time.ti_min,p-t_time.ti_sec); printf(nntPlease input record:); gets(p-event); /*输入留言内容*/ p-next=NULL;void main() int j,k; char ch; char *search_name; struct record *p,*q; clrscr(); Date_Load(); do printf(nnntFunction choose:); printf(nt1.Read); printf(nt2.Append); printf(nt3.Delete); printf(nt4.Quit); printf(nn); printf(tChoice:); ch=getche(); switch(ch) case 1: /*阅读留言内容*/ if(front=rear) printf(ntNo records.); break; p=event_front-next; while(getch()!=0x1b&p!=NULL) Data_Show(p); p=p-next; break; case 2: /*添加留言记录*/ p=malloc(sizeof(struct record); Data_Input(p); event_end-next=p; event_end=p; while(getch()!=0x1b&(front+1)!=rear) p=malloc(sizeof(struct record); Data_Input(p); event_end-next=p; event_end=p; break; case 3: p=event_head.next; /*删除留言记录*/ event_head.next=p-next; free(p); exit(0); break; case 4: printf(ntDo you want to save e_note:(y/n); ch=getch(); char *search_name; struct record *p,*q; clrscr(); Date_Load(); do printf(nnntFunction choose:); printf(nt1.Read); printf(nt2.Append); printf(nt3.Delete); printf(nt4.Quit); printf(nn); printf(tChoice:); ch=getche(); switch(ch) case 1: /*阅读留言内容*/ if(front=rear) printf(ntNo records.); break; p=event_front-next; while(getch()!=0x1b&p!=NULL) Data_Show(p); p=p-next; break; case 2: /*添加留言记录*/ p=malloc(sizeof(struct record); Data_Input(p); event_end-next=p; event_end=p; while(getch()!=0x1b&(front+1)!=rear) p=malloc(sizeof(struct record); Data_Input(p); event_end-next=p; event_end=p; break; case 3: p=event_head.next; /*删除留言记录*/ event_head.next=p-next; free(p); exit(0); break; case 4: printf(ntDo you want to save e_note:(y/n); ch=getch();if(ch=y) Data_Save(event_head.next); fclose(fp);
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 管理文书 > 施工组织


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!