C语言通讯录3.docx
《C语言通讯录3.docx》由会员分享,可在线阅读,更多相关《C语言通讯录3.docx(13页珍藏版)》请在冰点文库上搜索。
C语言通讯录3
一系统功能和原始数据
⑴通讯录信息和数据格式
⑵程序功能
二程序总体设计
⑴数据结构
⑵模块划分
三功能块函数设计和调试
(1)/*菜单*/
(2)/*添加条目*/
(3)/*输出学生信息*/
(4)/*查找信息1.按姓名*/
(5)/*删除信息*/
(6)/*文件信息输出到链表*/
四输出结果
五归纳总结
(1)开发经验
(2)感想和心得体会
(3)设计中尚存的不足之处
(4)实训中遇到的问题及解决方法
一. 系统功能和原始数据
⑴通讯录信息和数据格式
姓名 单位 地址邮箱电话
⑵程序功能
<1>输入记录<2>显示全部记录<3>查找记录<4>删除记录<5>插入记录<6>保存文件<>7读入文件<8>按序号显示记录<9>按姓名排序<10>快速查找记录
二.程序总体设计
⑴ 数据结构
依据给定的通讯录信息和数据格式,链表结点必须用结构实现。
结构类型的层次结构:
structTelephone
{
charnumber[200];
charname[20];
charoff[20];
charaddrass[20];
charmail[20];
chartelephone[20];
structTelephone*next;
};⑵模块划分
主函数
main()
TEL*head=NULL;
voidMenu();/*菜单*/
voidCrease();/*添加条目*/
voidprint();/*输出条目*/
voidSearch();/*查找条目(按姓名)*/
voidDelate();/*删除信息*/
voidSave();/*保存到文件*/
voidOpen();/*打开文件*/
voidChange();/*修改信息*/
voidArrange();/*排序*/
voidmain()
{
charch;
Open();/*打开文件*/
while
(1)
{
Menu();/*显示菜单*/
scanf("%c",&ch);
switch(ch)
{
case'1':
Crease();/*添加条目*/
break;
case'2':
Search();/*查找条目1.按姓名*/
break;
case'3':
Change();/*修改信息*/
print();
break;
case'4':
Delate();/*删除信息*/
print();/*输出删除后的结果*/
break;
case'5':
print();/*输出条目*/
break;
case'0':
Save();/*保存并释放内存*/
exit(0);/*退出*/
break;
default:
printf("选择错误!
");
break;
}
}
}三.功能块函数设计和调试
(1)/*菜单*/
voidMenu()
{
printf("\n*****************通讯录系统*****************\n");
printf("\t1.录入。
\n");
printf("\t2.按姓名查询\n");
printf("\t3.修改信息\n");
printf("\t4.删除\n");
printf("\t5.输出\n");
printf("\t0.保存并退出!
\n");
printf("*************************************************\n");
printf("\t请选择:
");
}
(2)/*添加条目*/
voidCrease()
{
TEL*p1=NULL,*p2=NULL;
p1=(TEL*)malloc(sizeof(TEL));/*申请结点*/
printf("输入编号:
");
scanf("%s",p1->number);
printf("输入姓名:
");/*添加信息*/
scanf("%s",p1->name);
printf("输入单位:
");
scanf("%s",p1->off);
printf("输入地址:
");
scanf("%s",p1->addrass);
printf("输入邮箱:
");
scanf("%s",p1->mail);
printf("输入电话:
");
scanf("%s",p1->telephone);
p1->next=NULL;/*保存到链表*/
if(head==NULL)
{
head=(TEL*)malloc(sizeof(TEL));/*申请空间*/
head->next=p1;
}
else
{
for(p2=head;p2->next!
=NULL;p2=p2->next);/*找到结点尾*/
p2->next=p1;
}
printf("此信息已添加!
");
}
(3)/*输出学生信息*/
voidprint()
{
TEL*p=NULL;
if(head==NULL)
{
printf("此通讯录中无记录,请输入记录后在使用本功能!
\n");
return;
}
printf("**************通讯录系统*********************\n");/*输出信息*/
printf("编号\t姓名\t单位\t地址\t邮箱\t电话\n");
for(p=head->next;p!
=NULL;p=p->next)
printf("%s\t%s\t%s\t%s\t%s\t%s\n",p->number,p->name,p->off,p->addrass,p->mail,p->telephone);
}
(4)/*查找信息1.按姓名*/
voidSearch()
{
TEL*p;
charfindname[20];
printf("请输入要查找的姓名:
");
scanf("%s",findname);
printf("**************通讯录系统*********************\n");
printf("编号\t姓名\t单位\t地址\t邮箱\t电话\n");
for(p=head;p!
=NULL;p=p->next)
{
if(strcmp(p->name,findname)==0)
printf("%s\t%s\t%s\t%s\t%s\t%s\n",p->number,p->name,p->off,p->addrass,p->mail,p->telephone);
}
}
(5)/*删除信息*/
voidDelate()
{
charfindname[20];/*先查找后删除*/
TEL*p=head,*pr;
printf("输入要删除的姓名:
");
scanf("%s",findname);
if(head->next==NULL)
{
printf("空链表!
\n");
return;
}
while((strcmp(p->name,findname)!
=0)&&p->next!
=NULL)
{
pr=p;
p=p->next;
}
if(strcmp(findname,p->name)==0)/*输出删除信息*/
{
printf("%s\t%s\t%s\t%s\t%s\t%s\n",p->number,p->name,p->off,p->addrass,p->mail,p->telephone);
if(p==head->next)
head->next=p->next;
else
pr->next=p->next;
free(p);
printf("此信息已删除!
");
}
elseprintf("无此信息!
\n");
}
voidSave()/*保存链表信息到文件并释放内存空间*/
{
TEL*p=NULL;
FILE*fp;
char*Book="books.txt";
if(head==NULL)
{
printf("\n记录为空!
\n");
return;
}
else
p=head->next;
if((fp=fopen(Book,"wb+"))==NULL)
{
printf("\n打不开文件!
\n");
return;
}
while(p!
=NULL)/*保存信息*/
{
fwrite(p,sizeof(TEL),1,fp);
p=p->next;
}
printf("保存完毕!
\n");
fclose(fp);
/*****释放链表空间*****/
for(;head->next!
=NULL;)
{
p=head->next;
head->next=head->next->next;
free(p);
}
free(head);
}
(6)/*文件信息输出到链表*/
voidOpen()
{
FILE*fp;
TEL*p1=NULL,*p2=NULL,*temp=NULL;
if((fp=fopen("books.txt","rb+"))==NULL)
{
printf("\n****************通讯录******************\n");
return;
}
head=(TEL*)malloc(sizeof(TEL));
head->next=NULL;
temp=p2=head;
while(!
feof(fp))/*循环读取*/
{
p1=(TEL*)malloc(sizeof(TEL));
temp=p2;
p2->next=p1;
p2=p1;
fread(p1,sizeof(TEL),1,fp);
}
temp->next=NULL;
fclose(fp);/*关闭文件*/
}
voidChange()
{
TEL*p;
charname[20];
printf("输入要修改人的姓名:
");
scanf("%s",name);
for(p=head->next;p!
=NULL;p=p->next)
{
if(strcmp(p->name,name)==0)
{printf("**************通讯录系统*********************\n");
printf("编号\t姓名\t单位\t地址\t邮箱\t电话\n");
printf("%s\t%s\t%s\t%s\t%s\t%s\n",p->number,p->name,p->off,p->addrass,p->mail,p->telephone);
printf("输入要修改的内容:
\n");
printf("输入编号:
");
scanf("%s",p->number);
printf("输入姓名:
");
scanf("%s",p->name);
printf("输入单位:
");
scanf("%s",p->off);
printf("输入地址:
");
scanf("%s",p->addrass);
printf("输入邮箱:
");
scanf("%s",p->mail);
printf("输入电话:
");
scanf("%s",p->telephone);
}
elseprintf("无此信息!
\n");
}
}
四输出结果
5、归纳总结
5.1开发经验
通过对本题目的开发,体会到要掌握以下几点内容。
●大程序的设计风格。
按“自顶向下,逐步细化,模块化”的方法进行程序设计。
●编写主函数,并进行测试与调试。
当被调函数又需要调用其他函数时,也要遵循逐步细化的原则。
C语言提供丰富的库函数,编程序时要善于使用库函数,避免不必要的劳动。
●定义函数时,应选好参数的个数和数据类型。
5.2实训中遇到的问题及解决方法
在实训过程中,我遇到许多的问题,比如有些语句有语法错误,表达式不正确,或缺少等。
或者是没有申明某些变量。
这些都比较容易解决。
通过查阅课本和请教同学,在经过WIN-TV编译,知道哪有错误就改一下就行。
5.3设计中尚存的不足之处
关于这次的程序,也有挺多不足的地方。
首先,我觉得程序还不够完善,比如没有排序前和排序后的学生记录输出结果显示和程序没能增加更多的学生呢成绩记录,也就不能查询更多的学生成绩情况,甚至有些地方有点乱;其次,;最后,就是该程序界面不够美观大方。
5.4感想和心得体会
1.用模块化设计方法,将各子功能设计成函数,
可以先将各子函数先用主函数调试成功后,
再将各子函数连接成完整的程序源代码,
运用模块化程序设计的思想对于大的工程项目有很大益处,
并且是已成为一种行业规则,练习函数的实现将有助于未来的挑战和机遇。
2.通过这次实训,我感触甚深,要把所学的理论知识运用于解决实际问题不仅要付出艰辛的劳动,还得要有科学的方法和坚持不懈的努力。
加上我们只是学了一个学期的c语言,我们所学的知识还不足以独立编写程序代码。
但是我认为只要我们认真的去学去做,我们会受益非浅。
这次实训让我进一步理解了“编程是什么”,“如何去编程”,“编程的目的又是什么”,……发现自己的知识竟是如此贫乏,顿时感到了压力的存在,从而也激发了我的学习热情。
它会成为我今后不断进取、永不懈怠的动力。
在整个实训过程中,老师给了我很大的帮助,使我由不了解怎样运用数组到逐渐懂得数组的构造及掌握数组结构。
而且我能够坚持虚心的向老师以及同学请教问题。
它使我明白了虚心好学的重要性,更让我懂得了如何跟老师同学去相处、去沟通。
没有老师和同学们的无私帮助,我不可能圆满完成这次实训任务。
非常感谢帮助过我的所有老师和同学们,在此,谨向他们一并表示感谢!
我开始喜欢这个程序设计了,尤其觉得它是很有挑战性的,是对知识点扎实程度的考察,也是对个人能力的考察,还是对个人化毅力的考验。
它让我明白做任何事都不应该轻易放弃。
这样的课程设计,既有利于教学,又可以教会学生书本以外的很多知识。
现在我对它越来越感兴趣,今后我会更加关注C语言程序,把C语言学好。
希望老师以后多多指导,给予一定的帮助!