通讯录系统.docx
《通讯录系统.docx》由会员分享,可在线阅读,更多相关《通讯录系统.docx(19页珍藏版)》请在冰豆网上搜索。
通讯录系统
实训报告
题目:
通讯录系统
院系:
专业:
姓名:
学号:
指导教师:
日期:
桂林电子科技大学信息科技学院
通讯录系统
本题目设计目的是训练联系人的基本编程能力,了解管理信息系统的开发流程,熟悉C语言的文件和单链表的各种基本操作。
本程序中涉及结构体、单链表、文件等方面的知识。
掌握利用单链表存储结构实现对通讯录的原理,为进一步开发出高质量的信息系统打下坚实的基础学生通过课程设计加深理解课堂教学内容,要求在设计中逐步提高程序设计和调试能力。
1、问题定义
。
通讯录主要是为方便查询联系方式、通信地址而建立的。
要求建立一个包含多个同学信息的同学通讯录。
而此通讯录极大的方便了人们通讯录的查询,节省了很多时间,而且方便修改,姓名,地址,编号,年龄,邮箱都俱全,有编号可以把常联系人放于上面,非常方便,切与实际。
通讯录信息,信息至少包含编号、姓名、年龄、电话、通讯地址、电子邮箱等;能够提供添加、删除和修改通讯录信息的功能,能够提供安不同方式查询的功能;如按姓名或年龄、电话等查询,将通讯录保存在文件中,能够按表格方式输出通讯录信息
创建一个通讯录系统。
假设系统中每个联系人记录只包括学号,姓名,宿舍,性别,邮箱,地址,电话,QQ等信息。
程序的运行效果如下图所示,选择任意菜单后,实现相应功能。
图1.1通讯录系统功能需求
在问题定义阶段要考虑题目的可行性和需求分析,接下来进入开发阶段,完成系统设计和系统实现的任务。
2、系统设计
2.1总体设计
采用模块化的程序设计方法,即将较大的任务按照一定的原则分为一个个较小的任务,然后分别设计各个小任务。
需要注意的是划分出来的模块应该相对独立但又相关,且容易理解。
可以用模块化层次结构图(即模块图)来分析其任务的划分,一般从上到下进行,最上面一层是主模块,下面各层是其上一层模块的逐步细化描述。
本通讯录系统要求采用单链表实现,如图2.1所示,它由如下五大功能模块组成:
●输入记录模块。
完成将数据存入单链表的工作。
记录可以从以二进制形式存储的数据文件中读入,也可从键盘逐个输入联系人记录。
联系人记录由联系人的基本信息和成绩信息字段构成。
当从数据文件中读入记录时,也就是把在以记录为单位存储的数据文件中,将记录逐条复制到单链表中。
●查询记录模块。
完成在单链表中查找满足相关条件的联系人记录。
在此通讯录系统中,用户可以按照联系人的学号或姓名在单链表中进行查找。
若找到该联系人的记录,则返回指向该联系人的记录的指针。
否则返回一个值为NULL的空指针,并打印出未找到该联系人记录的提示信息。
●更新记录模块。
完成对联系人记录的维护。
在此通讯录系统中,它实现了对联系人记录的修改、删除、插入和排序操作,并将修改后的数据存入源数据文件。
●输出记录模块。
一是实现对联系人记录的存盘,即将记录写入数据文件中;二是实现将记录信息以表格的形式在屏幕上打印出来。
2.2详细设计
#include/*函数*/
#include/*其它说明*/
#include/*字符串函数*/
#defineBUFLEN100/*缓冲区大小*/
#defineLEN20/*学号和姓名最大字符数*/
#defineN100/*最大联系人个数*/
structrecord/*结构体*/
{charxuehao[LEN+1];/*1学号*/
charname[LEN+1];/*2姓名*/
intsushe;/*3宿舍*/
charsex[5];/*4性别*/
charyouxiang[LEN+1];/*5邮箱*/
chardizhi[30];/*6地址*/
chardianhua[LEN+1];/*7电话*/
charqq[30];/*8QQ*/
}stu[N];
intk=1,n,m;/*定义全局变量*/
voidreadfile();/*刷新函数声明*/
voidseek();/*查询函数声明*/
voidmodify();/*修改函数声明*/
voidinsert();/*增加函数声明*/
voiddel();/*删除函数声明*/
voiddisplay();/*显示函数声明*/
voidsave();/*保持函数声明*/
voidmenu();/*主菜单函数声明*/
voidmain()/*主函数*/
{readfile();printf("自动录入联系人信息完毕!
\n\n");
while(k)menu();
printf("改动信息以自动保存到文件liangxiren.txt上,请放心按回车键,便可关闭该窗口!
\n");
}
voidreadfile()/*0.刷新系统*/
{
char*p="liangxiren.txt";
FILE*fp;
inti=0;
if((fp=fopen("liangxiren.txt","r"))==NULL)
{printf("Openfile%serror!
Strikeanykeytoexit!
",p);
system("pause");
exit(0);
}
while(fscanf(fp,"%s%s%d%s%s%s%s%s",stu[i].xuehao,stu[i].name,&stu[i].sushe,
stu[i].sex,stu[i].youxiang,stu[i].dizhi,stu[i].dianhua,stu[i].qq)==8)
{i++;
i=i;
}
fclose(fp);
n=i;
}
voidseek()/*1.查找*/
{inti,item,flag;
chars1[21];/*以姓名和学号最长长度+1为准*/
printf("\t**********************\n");
printf("\t**********************\n");
printf("\t***--1.按学号查询--***\n");
printf("\t***--2.按姓名查询--***\n");
printf("\t***--3.退出本菜单--***\n");
printf("\t**********************\n");
printf("\t**********************\n");
while
(1)
{
printf("\t请选择子菜单编号:
");
scanf("%d",&item);
flag=0;
switch(item)
{
case1:
printf("请输入要查询的联系人的学号:
\n");
scanf("%s",s1);
for(i=0;iif(strcmp(stu[i].xuehao,s1)==0)
{
flag=1;
printf("学号姓名宿舍性别邮箱地址电话QQ\n");
printf("%2s%4s%5d%4s%9s%10s%10s%12s\n",stu[i].xuehao,stu[i].name,stu[i].sushe,
stu[i].sex,stu[i].youxiang,stu[i].dizhi,stu[i].dianhua,stu[i].qq);
}
if(flag==0)printf("该学号不存在!
\n");break;
case2:
printf("请输入要查询的联系人的姓名:
\n");
scanf("%s",s1);
for(i=0;iif(strcmp(stu[i].name,s1)==0)
{
flag=1;
printf("学号姓名宿舍性别邮箱地址电话QQ\n");
printf("--------------------------------------------------------------------\n");
printf("%2s%4s%5d%4s%9s%10s%10s%12s\n",stu[i].xuehao,stu[i].name,stu[i].sushe,
stu[i].sex,stu[i].youxiang,stu[i].dizhi,stu[i].dianhua,stu[i].qq);
}
if(flag==0)printf("该姓名不存在!
\n");break;
case3:
return;
default:
printf("请在1-3之间选择\n");
}
}
}
voidmodify()/*2.修改联系人信息*/
{inti,item,num;
charsex1[3],s1[LEN+1],s2[LEN+1];/*以姓名和学号最长长度+1为准*/
printf("请输入要修改的联系人的学号:
\n");
scanf("%s",s1);
for(i=0;iif(strcmp(stu[i].xuehao,s1)==0)/*比较字符串是否相等*/
num=i;
printf("------------------\n");
printf("1.修改姓名\n");
printf("2.修改宿舍\n");
printf("3.修改性别\n");
printf("4.修改邮箱\n");
printf("5.修改地址\n");
printf("6.修改电话\n");
printf("7.修改QQ\n");
printf("8.退出本菜单\n");
printf("------------------\n");
while
(1)
{printf("请选择子菜单编号:
");
scanf("%d",&item);
switch(item)
{case1:
printf("原来的姓名是%s\n",stu[num].name);
printf("请输入新的姓名:
");scanf("%s",s2);strcpy(stu[num].name,s2);break;
case2:
printf("原来的宿舍是%d\n",stu[num].sushe);
printf("请输入新的宿舍:
");scanf("%d",&stu[num].sushe);break;
case3:
printf("原来的性别是%s\n",stu[num].sex);
printf("请输入新的性别:
");scanf("%s",sex1);strcpy(stu[num].sex,sex1);break;
case4:
printf("原来的邮箱是%s\n",stu[num].youxiang);
printf("请输入新的邮箱:
");scanf("%s",s2);strcpy(stu[num].youxiang,s2);break;
case5:
printf("原来的地址是%s\n",stu[num].dizhi);
printf("请输入新的地址:
");scanf("%s",s2);strcpy(stu[num].dizhi,s2);break;case6:
printf("原来的电话是%s\n",stu[num].dianhua);
printf("请输入新的电话:
");scanf("%s",s2);strcpy(stu[num].dianhua,s2);break;
case7:
printf("原来的QQ是%s\n",stu[num].qq);
printf("请输入新的QQ:
");scanf("%s",s2);strcpy(stu[num].qq,s2);break;
case8:
return;
default:
printf("请在1-8之间选择\n");
}
}
}
voidsort()/*按学号排序*/
{inti,j,*p,*q,t;
chartemp[10];
for(i=0;i{for(j=n-1;j>i;j--)
if(strcmp(stu[j-1].xuehao,stu[j].xuehao)>0)
{strcpy(temp,stu[j-1].xuehao);strcpy(stu[j-1].xuehao,stu[j].xuehao);strcpy(stu[j].xuehao,temp);
strcpy(temp,stu[j-1].name);strcpy(stu[j-1].name,stu[j].name);strcpy(stu[j].name,temp);
strcpy(temp,stu[j-1].sex);strcpy(stu[j-1].sex,stu[j].sex);strcpy(stu[j].sex,temp);
strcpy(temp,stu[j-1].youxiang);strcpy(stu[j-1].youxiang,stu[j].youxiang);strcpy(stu[j].youxiang,tepm);
strcpy(temp,stu[j-1].dizhi);strcpy(stu[j-1].dizhi,stu[j].dizhi);strcpy(stu[j].dizhi,temp);
strcpy(temp,stu[j-1].dianhua);strcpy(stu[j-1].dianhua,stu[j].dianhua);strcpy(stu[j].dianhua,temp);
strcpy(temp,stu[j-1].qq);strcpy(stu[j-1].qq,stu[j].qq);strcpy(stu[j].qq,temp);
p=&stu[j-1].sushe;q=&stu[j].sushe;
t=*q;*q=*p;*p=t;
}
}
}
voidinsert()/*3.增加联系人*/
{inti=n,j,flag;
printf("请输入待增加的联系人数:
\n");
scanf("%d",&m);
do
{
flag=1;
while(flag)
{
flag=0;
printf("请输入第%d个联系人的学号:
\n",i+1);
scanf("%s",stu[i].xuehao);
for(j=0;j
if(strcmp(stu[i].xuehao,stu[j].xuehao)==0)
{
printf("已有该学号,请检查后重新录入!
\n");
flag=1;
break;/*退出该层循环,*/
}
}
printf("请输入第%d个联系人的姓名:
\n",i+1);scanf("%s",stu[i].name);
printf("请输入第%d个联系人的宿舍:
\n",i+1);scanf("%d",&stu[i].sushe);
printf("请输入第%d个联系人的性别:
\n",i+1);scanf("%s",stu[i].sex);
printf("请输入第%d个联系人的邮箱:
\n",i+1);scanf("%s",stu[i].youxiang);
printf("请输入第%d个联系人的地址:
\n",i+1);scanf("%s",stu[i].dizhi);
printf("请输入第%d个联系人的电话:
\n",i+1);scanf("%s",stu[i].dianhua);
printf("请输入第%d个联系人的QQ:
\n",i+1);scanf("%s",stu[i].qq);
if(flag==0){i=i;i++;}
}
while(in+=m;
sort();
}
voiddel()/*4.删除联系人*/
{inti,j,xx=0;
chars1[LEN+1];
system("cls");
printf("请输入要删除联系人的学号:
\n");
scanf("%s",s1);/*输入要删除的学号*/
for(i=0;iif(strcmp(stu[i].xuehao,s1)==0)/*把输入的学号和储存的进行对比*/
{
xx=1;
for(j=i;jstu[j]=stu[j+1];
}
if(xx==0)
printf("该学号不存在!
\n");
if(xx==1)
{
printf("删除成功,显示结果请选择菜单\n");
n--;/*把多余的最后一个联系人去掉*/
}
}
voiddisplay()/*5.显示所有联系人*/
{inti;
system("cls");
printf("《软件一班通讯录》\n");
printf("----------------------------------------------------------------------------\n");
printf("学号姓名宿舍性别邮箱地址电话QQ\n");
printf("----------------------------------------------------------------------------\n");
for(i=0;i{printf("%2s%4s%5d%4s%9s%10s%10s%12s\n",stu[i].xuehao,stu[i].name,stu[i].sushe,
stu[i].sex,stu[i].youxiang,stu[i].dizhi,stu[i].dianhua,stu[i].qq);
printf("----------------------------------------------------------------------------\n");
}
}
voidsave()/*保存信息*/
{inti;FILE*fp;
fp=fopen("liangxiren.txt","w");/*写入*/
for(i=0;i{fprintf(fp,"%s%s%d%s%s%s%s%s\n",stu[i].xuehao,stu[i].name,stu[i].sushe,
stu[i].sex,stu[i].youxiang,stu[i].dizhi,stu[i].dianhua,stu[i].qq);
}
fclose(fp);
}
voidmenu()/*界面*//*主界面*/
{printf("欢迎使用通讯录系统\n");
printf("**********************************************************\n");
printf("**********************************************************\n");
printf("******\n");
printf("***《系统主菜单》***\n");
printf("******\n");
printf("***************************************************\n");
printf("***1.查询联系人***2.修改联系人***\n");
printf("***************************************************\n");
printf("***3.增加联系人***4.删除联系人***\n");
printf("***************************************************\n");
printf("***5.显示通讯录***6.退出系统***\n");
printf("***************************************************\n");
printf("***************************************************\n");
printf("******\n");
printf("**********************************************************\n");
printf("**********************************************************\n");
printf("制作人:
梁赞文时间:
2012年6月28日\n");
printf("---------------------------------------------------------------------------------------\n");
printf("请选择菜单编号:
");
intchoice;scanf("%d",&choice);
switch(choice)
{case1:
seek();/*查询*/break;
case2:
modify();/*修改*/save();printf("系统以自动保存刚变动信息!
\n");readfile();
printf("自动刷新完毕!
\n");break;
case3:
insert();/*增加*/save();printf("系统以自动保存刚变动信息!
\n");readfile();
printf("自动刷新完毕!
\n");break;
case4:
del();/*删除*/save();printf("系统以自动保存刚变动信息!
\n");readfile();
printf("自动刷新完毕!
\n");break;
case5:
display();/*显示*/break;
case6:
k=0;/*退出*/break;
default:
printf("请在1-6之间选择\n");
}
}
3.2测试与调试
3.2.1概述
一般情况下,为解决一个问题所编写的程序代码较长,可能包括几百条甚至成千上万条语句。
在检查并排除所有语法错误后,还会有不易发现的逻辑错误,因此要对程序进行