资源描述
实验报告
实验名称:学生通信录管理系统
实验项目性质:综合性、设计性
所涉与课程:C语言课程设计
计划学时:实验学时4
一、实验目的
综合考察学生本学期对C语言的掌握程度。
二、实验容
1.编写一个可以把学生信息写入文件的函数creact(),采用动态链表。
2.编写一个可以增加新成员的函数add1()。
3编写一个可以查询确定学生的函数search1()。
4编写一个可以删除确定学生的函数del1()。
5编写一个可以修改确定学生的函数modify1()。
6编写一个可以打开通信录的函数open1( )。
附录:search1函数调用searchnum和searchname函数,分别为按学号和按名字查询。
del函数调用delname和deltel函数,分别为按名字和按删除。
modify1函数调用modifynum和modifyname函数,分别为按学号和按名字找到修改。
open1函数调用sorttel和sortname函数,分别为按和按名字从小到大的顺序打开。
三、实验(设计)仪器设备和材料清单
1.硬件:PC机
2.软件:Turbo C 2.0/Turbo C++ 3.0
四、实验要求
设计一个《学生通讯录管理系统》,在动态链表程序的基础上,设计要求如下
(必须使用结构体和动态链表等数据结构)
1建立文件
存储文件使用指定文件名或默认文件名;
可以不保存输入记录,但需要确认是否保存输入记录
如果已有文件,只能在其后追加;
新增记录可以不存入原文件中,以可以用原来的文件覆盖存的容;
可以将多个个文件记录合并到一个文件中;
2文件的存取和显示
可以单独存取文件;
可以随时显示存中记录的全部容;
可以直接存取默认文件或指定文件;
3删除记录
可以按“”或“”方式删除记录并更新存链表容;
能给出被删除的信息,输出没有找到的信息;
如果已经是空表,上出时应给出信息并返回主菜单;
如果没有要删除的信息,输出没有找到的信息;
删除操作仅限于存,只有执行记录时,才能覆盖原记录;
4查询记录
可以按“”或“”或“宿舍”方式查询记录
能给出查询记录的信息;
如果查询的信息不存在,输出没有找到的信息;
5 整体功能
a可以随时检索、删除、或增加新记录,保存或取消新的记录
b使可由16位字符和数字的混合编码组成
c使可由18位字符和数字组成
d将输出信息加上输出信息信息栏,例如
性别年龄生日宿舍
四 1234 男 21 7月1日东二333
e使用菜单实现功能的正确的选择
f 所有节点信息都是动态生成。
6测试程序
应列出测试大纲对程序进行测试;
应保证测试用例测试到程序的各种边缘情况
五、实验步骤与结果测试
A、主函数
主函数
提供可选择的功能
1
2
3
4
5
6
0
创建
增加
查找
删除
修改
打开
退出
按名字、按学号
按、按名字
按名字、按学号
按、按名字
程序清单:
void main()
{
int i;
end:
printf(" |----------------------------------------|\n");
printf(" | 1.ceate new file |\n");
printf(" | 2.add information |\n");
printf(" | 3.search |\n"); printf(“ | 4.telect |\n");
printf(" | 5.modify |\n");
printf(" | 6.open |\n");
printf(" | 0.register |\n");
printf(" |---------------------------------------|\n");
printf("input your choice(0-6):\n");
scanf("%d",&i);
if(i==1)
{creat1(); goto end;}
if(i==2)
{add1(); goto end;}
if(i==3)
{search1(); goto end;}
if(i==4)
{del1(); goto end;}
if(i==5)
{modify1(); goto end;}
if(i==6)
{open1(); goto end;}
exit(0);
}
B、创建:void create()
开始
动态申请内存
输入学号
学号不为0
输入其他信息
动态申请内存并输入学号
结束链表的建立
存入文件
结束
程序清单:
void creat1()
{
FILE *fp;
char i;
struct student *p1,*p2,*head;
n=0;
p1=p2=(struct student *)malloc(LEN);
printf("\nenter NO.:\n");
scanf("%d",&p1->num);
while(p1->num!=0)
{
printf("enter name:\n");
scanf("%s",p1->name);
printf("enter tel:\n");
scanf("%s",p1->tel);
do{
printf("enter sex:\n");
getchar();
scanf("%c",&p1->sex);
}while(p1->sex!='f'&&p1->sex!='F'&&p1->sex!='m'&&p1->sex!='M');
do{
printf("enter age:\n");
scanf("%d",&p1->age);
}while(p1->age<=0||p1->age>=150);
printf("enter birthday:\n");
scanf("%s",p1->bir);
printf("enter address:\n");
scanf("%s",p1->add);
n=n+1;
if(n==1)head=p1;
else p2->next=p1;
p2=p1;
p1=(struct student *)malloc(LEN);
printf("enter NO.:\n");
scanf("%d",&p1->num);
}
p2->next=NULL;
printf("\nsave them or no(y/n)\n");
do{printf("input choice\n");
getchar();
scanf("%c",&i);}while(i!='y'&&i!='Y'&&i!='n'&&i!='N');
if(i=='y'||i=='Y')
{
p1=head;
if((fp=fopen(FILENAME,"wb"))==NULL)
{
printf("cannot open file\n");
return;
}
if(p1!=NULL)
do{
if(fwrite(p1,sizeof(struct student),1,fp)!=1)
{
printf("file write error\n");
fclose(fp);
break;
}
p1=p1->next;
}while(p1!=NULL);
fclose(fp);
}
}
C、增加 void add1()
设计思路和创建新通信录一样,只是文件的打开方式是“a”,即以追加的方式打开。
程序清单:
void add1()
{
FILE *fp;
char i;
struct student *p1,*p2,*head;
n=0;
p1=p2=(struct student *)malloc(LEN);
printf("\nenter NO.:\n");
scanf("%d",&p1->num);
while(p1->num!=0)
{
printf("enter name:\n");
scanf("%s",p1->name);
printf("enter tel:\n");
scanf("%s",p1->tel);
printf("enter sex:\n");
getchar();
scanf("%c",&p1->sex);
printf("enter age:\n");
scanf("%d",&p1->age);
printf("enter birthday:\n");
scanf("%s",p1->bir);
printf("enter address:\n");
scanf("%s",p1->add);
n=n+1;
if(n==1)head=p1;
else p2->next=p1;
p2=p1;
p1=(struct student *)malloc(LEN);
printf("enter NO.:\n");
scanf("%d",&p1->num);
}
p2->next=NULL;
printf("\nsave them or no(y/n)\n");
do{printf("input choice\n");
getchar();
scanf("%c",&i);}while(i!='y'&&i!='Y'&&i!='n'&&i!='N');
if(i=='y'||i=='Y')
{
p1=head;
if((fp=fopen(FILENAME,"a"))==NULL)
{
printf("cannot open file\n");
return;
}
if(p1!=NULL)
do{
if(fwrite(p1,sizeof(struct student),1,fp)!=1)
{
printf("file write error\n");
fclose(fp);
break;
}
p1=p1->next;
}while(p1!=NULL);
fclose(fp);
}
}
D、查找 void search()
开始
选择按名字或按学号查找
按名字择调用
Searchname()
按学号择调用
Searchnum()
结束
开始
查找符合节点
找到则输出该节点内容
找不到输出“not find”
结束
重建链表
输入名字( )
程序清单:
1、
void search1()
{
int i;
printf("please input your choice(0-2)");
printf(" |------------------------------------------------------|\n");
printf(" | 1.search in NO. |\n");
printf(" | 2.search in name |\n");
printf(" | 0.register |\n");
printf(" |------------------------------------------------------|\n");
do{
printf("input your choice");
scanf("%d",&i);
}while(i!='1'&&i!='2'&i!='0');
switch(i)
{
case'1': searchnum(); break;
case'2': searchname(); break;
default: exit(0);
}
}
2、
void searchname()
{
struct student *p1,*p2,*head;
char name[16];
head=recreat();
printf("enter the student's name:\n");
scanf("%d",name);
for(p1=head;p1->next!=NULL;p1=p1->next)
if(strcmp(p1->name,name)==0)
{
printf(,"%d\t%s\t%s\t%c\t%d\t%s\t%s\n",
p1->num,p1->name,p1->tel,p1->sex,
p1->age,p1->bir,p1->add);
}
}
3、
void searchnum()
{
struct student *p1,*p2,*head;
int num;
head=recreat();
printf("enter the student's NO.:\n");
scanf("%d",&num);
for(p1=head;p1->next!=NULL;p1=p1->next)
if(p1->num==num)
{
printf(,"%d\t%s\t%s\t%c\t%d\t%s\t%s\n",
p1->num,p1->name,p1->tel,p1->sex,
p1->age,p1->bir,p1->add);
}
}
17 / 17
展开阅读全文