计算机技术基础(C语言) 课程设计指导书.doc_第1页
计算机技术基础(C语言) 课程设计指导书.doc_第2页
计算机技术基础(C语言) 课程设计指导书.doc_第3页
计算机技术基础(C语言) 课程设计指导书.doc_第4页
计算机技术基础(C语言) 课程设计指导书.doc_第5页
已阅读5页,还剩51页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

计算机技术基础(C语言)课程设计指导书目录前言2设计一3设计二12设计三19设计四20设计五21设计六22设计七23设计八24设计九25设计十26设计十一27设计十二28报告样文29C语言图形函数38 前言课程设计是课程教学中的一项重要内容,是完成教学计划达到教学目标的重要环节,是教学计划中综合性较强的实践教学环节,它对帮助学生全面牢固地掌握课堂教学内容、培养学生的实践和实际动手能力、提高学生全面素质具有很重要。本实验指导书的主旨是:辅助非计算机专业的学生进行计算机技术基础课程设计。本课程的课程设计实际是非计算机应用专业学生学习完计算机技术基础课程后,进行的一次全面的综合训练,其目的在于加深对计算机程序设计思路和基本知识的理解,掌握运用软件开发的基本方法。按课程设计指导书提供的课题,学生可以根据自己的情况和实验的基本需求独立完成设计,标有“可选”的部分可根据设计时间的安排及工作量的大小适当选择。也可选用其他课题或组成设计小组,分模块进行,共同协作完成一个课题的设计任务。要求书写详细的设计说明书,对复杂的代码段和程序段,应画出程序流程图。设计完成后,必须提交设计报告,软件数据盘。由指导教师按优秀、良好、中等、及格和不及格五级分制评定成绩。成绩不及格者不能获得学分,其余可获得1.5学分。严禁相互抄袭。设计一 电子通讯录一、【实验目的】培养学生综合利用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,);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.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+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,); 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+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-even

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论