C语言课程设计*名:***学号:************班级:061092指导教师:***2011 年 6 月25 日目录第一章:实习内容1.1实习内容简介 (2)1.2程序代号说明 (3)第二章:程序流程图第三章:函数模块介绍3.1读取文件、存储文件 (6)3.2 管理系统模块 (8)3.3 恢复区系统模块 (12)3.4 功能展示 (12)第四章:实习总结 (16)第五章:实习体会 (17)附录:参考文献 (19)源代码 (19)第一章:实习内容1.1实习内容简介题目:学生通讯录管理系统要求:1.可实现信息的添加、删除,可按学号、姓名查询;2.学生信息必须包含学号、姓名、学院、专业、籍贯。
地址、电话号码;3.必须有注释。
日期:2011年6月20日至27日,共8个半天。
地点:信息楼301指导老师:曹雪莲完成情况:1.程序可完成信息的添加,可按学号、姓名分别查询;2.程序可按姓名、学号分别删除,并在删除前显示删除学生的全部信息;按姓名删除,若出现同名情况,会依次出现系统提示是否删除,可选择删除或跳过;3.在程序文件夹中有一“学生信息库”的txt文件,可查看学生系统里全部学生信息;4.设置有一个恢复区系统,可输出、查询删除的信息,并在可同文件夹中“删除信息库”的txt文件中查看删除信息;总体结构如下:1.2程序代号说明此外,局部变量的含义比较固定:第二章:程序流程图程序流程图:本次实习我的思路就是,先从二进制文件中读取信息,形成链表,对链表进行基本操作,如输出、添加、删除、查找。
程序结束时将链表保存在二进制文件和文本文件中。
管理系统流程图:运行管理系统部分时,先从文件“information.xls”中读取数据(若无该文件则创建文件),构建链表;后续操作都是对于链表进行操作,如添加、查找、删除、输出等;离开该部分时则保存链表里的信息到已存在的“information.xls”,并以ASCII形式存储至“学生信息库.txt”,方便检查。
恢复区系统流程图:恢复区系统思路与管理系统思路类似,连函数调用都是一样的,二进制文件名为“dinformation.xls”,文本文件名为“删除信息库.txt”。
具体函数模块功能将在第三章中具体介绍。
第三章:函数模块介绍程序分为管理系统和恢复区系统两部分和读取文件、存储文件四部分,以下分别介绍。
3.1读取文件、存储文件读取文件该函数模块(程序名为creat)于管理系统或恢复区系统运行前运行,目的是读取二进制文件信息,构建链表;若无目标文件,则创建文件。
返回值为头指针。
函数主体为:struct stu *p1,*p2;struct stu *head;while(fread(&(p1->inf),LEN,1,fp))//读取数据{n=n+1;//若读取数据成功节点数加一if(n==1) head=p1;//给头结点赋值else p2->next=p1;//加新的结构体p2=p1;p1=(struct stu *)malloc(LENS);}fclose(fp);p2->next=NULL;//尾结点处指针置0return(head);存储文件该函数模块分为两部分,以二进制形式存储链表信息(程序名为save)和以文本形式存储(程序名为txtsave)。
二进制形式文件是为了读取文件,优点是快速;文本文件是为了方便检查,优点是明确可见。
无返回值。
二进制形式存储程序为:void save(struct stu *head,char filename[20])//存储链表信息{FILE *fp;struct stu *p;p=head;fp=fopen(filename,"wb");//以二进制方式打开文件while((p!=NULL)&&fwrite(&(p->inf),LEN,1,fp))//写入文件{p=p->next;}fclose(fp);}//其中head为链表头指针,filename为存储文件名,在主函数中已有定义。
存储在文本文件程序为:void txtsave(struct stu *head,char filename[20])//以文本形式将链表输入文件FILE *fp;struct stu *p;p=head;fp=fopen(filename,"w");//以文本形式打开while(p!=NULL)//链表不到尽头不停止{fprintf(fp,"%ld",(p->inf).num);//向文本文件中写入数据fprintf(fp,"%10s",(p->inf).name);fprintf(fp,"%10s",(p->inf).academy);fprintf(fp,"%10s",(p->inf).majoy);fprintf(fp,"%10s",(p->inf).province);fprintf(fp,"%10s",(p->inf).address);fprintf(fp,"%20s\n",(p->inf).phone);p=p->next;}}3.2管理系统模块管理系统(名为system)主要有四个函数功能部分,分别为添加、删除、查找、输出,以下依次介绍:添加该模块函数名为add,无返回值,参数为链表头指针,功能为向已建立的链表中从键盘上输入信息。
函数主体为:struct stu *p1,*p2;//建立结构体指针p2=head;p1=(struct stu *)malloc(LENS);//输入信息printf("\n学号(输入数值请小于32756):");scanf("%d",&((p1->inf).num));printf("\n姓名:");scanf("%s",(p1->inf).name);printf("\n学院:");scanf("%s",(p1->inf).academy);printf("\n专业:");scanf("%s",(p1->inf).majoy);printf("\n省份:");scanf("%s",(p1->inf).province);printf("\n地址:");scanf("%s",(p1->inf).address);printf("\n电话号码:");scanf("%s",(p1->inf).phone);while((p2->next)!=NULL)//移动指针到链表尾{p2=p2->next;}p2->next=p1; //移动指针p2=p1;p2->next=NULL;删除函数名为delet,返回值为指向结构体的链表头指针,参数为链表头指针,可按姓名和学号删除。
若按姓名删除时,为防止同名情况,则查询到一个目标,就显示出信息,并提示是否删除。
1.按学号查找的函数主体为:printf("请输入拟删除学生学号:\n");long snum=0;scanf("%ld",&snum);struct stu *p1,*p2;p1=head;while(snum!=p1->inf.num&&p1->next!=NULL)//p1指向的学号不是要找的节点,并且后面还有节点{ p2=p1;p1=p1->next;}//p1后移if(snum==p1->inf.num)//找到目标{print1(p1);deletinput(p1);//print1()为输出相应指针指向的节点信息deletinput()为向恢复区系统链表输入信息的函数,在后续3.3中会提及if(p1==head) head=p1->next;//若p1指向头节点,将第二个节点位置赋予headelse p2->next=p1->next;//否则将下一结点位置赋给前一节点位置n--;}else printf("该学生不存在");return(head);2.按姓名查找(包含同名情况):int select=0,count=0;//selet选择删除与否,count代表删除次数char sname[20];//定义要搜的名字struct stu *p1,*p2;p1=head,p2=head;printf("请输入学生姓名:\n");scanf("%s",sname);//输入学号while(p1!=NULL)//历遍链表{if(strcmp(sname,p1->)==0) //与目标名字是否一致,相同为0{print1(p1);//若符合姓名条件,显示信息printf("删除该生信息?\n删除选1\n按其它键不删除\n");//保证达到目标姓名时显示学生信息,可选择不删除scanf("%d",&select);if(select!=1){p2=p1;p1=p1->next;continue;}//不删除就再次循环else{n--;deletinput(p1);count++;//删除数加一if(p1==head) head=p1->next;//删除信息else p2->next=p1->next;//更改指针,绕过目标}}p2=p1;p1=p1->next;}if(count==0) printf("该生信息不存在");//若未删除则视为未发现目标学生 return(head);查找函数名为search,参数为链表头指针,无返回值。
其中查找可按姓名与学号进行查找,若找到目标即出现在屏幕;若出现同名情况,则依次显示。
查找与删除函数语句类似,但是删除要求目标的前一个节点的指针与目标节点的指针都能知道;而查找要求则低多了。
因为这个原因,在加上我是先写的查找,所以删除中未调用查找函数。
按学号查找函数主体如下:long snum;//定义要查询学号变量printf("请输入学号:\n");scanf("%ld",&snum);//输入学号while(p!=NULL)//历遍链表{p=search_num(p,snum);//此为调用函数,效果是查找到与目标相同的信息然后返回相应指针if(p!=NULL) print1(p);//若查找到目标,输出else break;p=p->next;//传递指针,继续}按姓名查找函数主体如下:char sname[20];//定义要查询姓名的变量printf("请输入姓名:\n");scanf("%s",sname);//输入姓名while(p!=NULL){p=search_name(p,sname);//与上文中search_num类似,返回同名目标的指针if(p!=NULL) print1(p);//若查找到目标,输出else break;p=p->next;//传递指针}输出函数名为print,参数为链表头指针head,无返回值。