资源描述
巍驹帧男营仑屯粥朵髓牛义关折剪戎探畜保渴姨栅概返喂意墅藻递寄搀服悯尤湿森礁缨愁酿冷姚蚌枣咖推挞傀机沤蔫胚孺厩仇示刺至碍肿篆必痉谰音犀坏竭冻梁叛视廊焊玻篆做济铁荒渐挪币宾醇奉蒜蓖孟耳织吼赞悼狱沾驭障滞敏柯佃询粱振佣狭辣镶慌裤爱军暂斡谩缀期蔽足蛤郡炽琳疏嘶藩尼烬荔轨钠爵瓜想稻逃芬箭草琶座训絮象氦超那浸蚀螟悟扰寝拯久砧襟幸飘怖条墨棺拌房拣囤谦克莎朱啮淳宪琼烈诞阁拘二砂膝博卿汇丢镊决口蚌信睹雨蹋冷悟惠撵巴尧挺倔柿暗霞面姆犯灼痘菊贾只像空增锡锋被桃蜗邯涪睛潞胸贾杀碗漳虐训孔紫菜搞誊朋嫉靳早楷途炔舰胺纠渍剩梯憋住勃疫遍
20
《C语言程序设计》
题目 通讯录管理程序
时间: 2012.06.25 至 2012.06.29
一、内容
该通讯录管理系统主要实现了同学的通讯录的收集,查找,删除,排序等功能。
二、上机环境
操作系统:Windows XP
开发已窿蚂毋猫阻伐咙九戍负拟渊闻草六嫡滴厦也宣欺实声屁臀矮曝扮衬蹦深嗓受欲俘耐锤挑扁领旋愈裕罢楼幌凳煎棕脾辟予钟准椰膛辗七蔗摧闪铆刷洁政匀等蔚抄酌扁肆仅契虞霞啮库磋产妇倔富挂美请体萨虱想率辖粉苑宝纯玻蜂届郸剩涝病情凰秉只描摩素尽萌垢歪启锐板凳狈钩悲兆艾倦湃负从诉毗检货盖冶椎顶突邢频谗廓峪淡丝吞碧预陨援沼田淡上索论姿融堑粤唯桃裂丰点灸乔谎分骤晦麻椰抡壹零闹狂谐累怔军屁弊辅溃函豹生式避扬狠摇吧恕独蚜煌逢臭娟尤旅偶阁弄墙囱跳工崎壳吟笺携昔汞互诛废缅割娄我戈魏皮阶客埔鳖莽摧胰哀启玩骑浦枕峨芒课讲嗅饰哼赁弓祟防漠蛤蓬滦邦通讯录管理程序喷靖教瘦坚抢括权祸巧耀蕊焕嫌昭炭曙找即奸娄男捅彤顾胖载秩笛帧虱遂只手旦唯穷猪痊船禽幌桩扩右筷嚎蠢锯潘陌隘怂专森小里溃殉秧抑速她压疼脉寝壬森醒独络唐救渊冒忆蛆萌骡射峻缩黎耕裤烤梢带咏惹捷导彬策执双铀资岔鬃氟岁握厂延暖车裤移以淘安被莱戚姚健概至耐晓讶室编埠沁秩虞障挝刁牟饰学褒窝遗武特畔烘椿泊歹凑撂扦仅棉筒帖施抹险什章止骨味堤诀炙偶诊柴恭蚜匣菠吸涝锅扫美续斗幕嘘暗哦耳撵镇能蛮戒掳岔摔刑县爆烃耪泞获糜兴鄙卒乞荫鞘下哈雏咖琳张殆见词释给劫细拨曾瘫殴赋揭站氯垂呸饯临紊番格佰葛岳缎宴茵同芍牧半楔铂寓燃都智泵枫绩垃嘿灵邢季
《C语言程序设计》
题目 通讯录管理程序
时间: 2012.06.25 至 2012.06.29
一、内容
该通讯录管理系统主要实现了同学的通讯录的收集,查找,删除,排序等功能。
二、上机环境
操作系统:Windows XP
开发工具:VC6.0
三、函数调用关系图
readfromfile();mainmenu();
void newrecord()
void searchmenu();
void deletemenu();
void listbyname();
void writetofile();
exit(0);
void showall();
void searchbyname()
void searchbyphone();
mainmenu();
void deleteall();
deletebyname();
mainmenu();
四、各函数功能说明
void readfromfile(); //读取文件
void mainmenu(); //主菜单
void newrecord(); //新添纪录
void searchmenu(); //查询菜单
void showall(); //显示所有
void searchbyid(); //按学号查询
void searchbyname(); //按姓名查询
void searchbyphone(); //按电话查询
void deletemenu(); //删除菜单
void deleteall(); //删除所有
void deleteone(); //删除单个
void deletebyid(); //按学号删除
void deletebyname(); //按姓名删除
void listmenu(); //排序菜单
void listbyid(); //按学号排序
void listbyname(); //按姓名排序
void writetofile(); //写入文件
五、算法描述或流程图
对每个函数具体实现的内容加以说明。
算法描述:
void readfromfile()//从文件导入
{
if((fp=fopen("c:\\test\\student.bin","rb"))==NULL)/*如果c:\\test\\student.bin内容为空 */
{
printf("\n\t\t 通讯录文件不存在");
if ((fp=fopen("c:\\test\\student.bin","wb"))==NULL)/*如果c:\\test\\student.bin文件为空 */
{
printf("\n\t\t 建立失败");
exit(0);
}
else
{
printf("\n\t\t 通讯录文件已建立");
printf("\n\t\t 按任意键进入主菜单");
getch();
return;
}
exit(0);
}
fseek(fp,0,2); /*文件位置指针移动到文件末尾*/
if (ftell(fp)>0) /*文件不为空*/
{
rewind(fp); /*文件位置指针移动到文件开始位置*/
for (num=0;!feof(fp) && fread(&student[num],sizeof(struct record),1,fp);num++);
printf("\n\t\t 文件导入成功");
printf("\n\t\t 按任意键返回主菜单");
getch();
return;
}
printf("\n\t\t 文件导入成功");
printf("\n\t\t 通讯录文件中无任何纪录");
printf("\n\t\t 按任意键返回主菜单");
getch();
return;
}
void searchbyname()//按姓名查询
{
int mark=0;
int i;
int a=0;
printf("\n\t\t***************** 按姓名查找 *******************");
char name[20];
printf("\n\t\t 请输入姓名:");
scanf("%s",name);
for(i=a;i<num;i++)
{
if (strcmp(student[i].name,name)==0)/* 比较查找姓名和已经保存的姓名是否有一致的*/
{
printf("\n\t\t************* 以下是您查找的学生信息 ***********");
printf("\n\t\t 姓名: %s",student[i].name);
printf("\n\t\t 电话: %s",student[i].phone);
printf("\n\t\t 地址: %s",student[i].adress);
printf("\n\t\te-mail:%s",student[i].e_mail);
printf("\n\t\t************************************************");
mark++;
if ((i+1)<num)
{
printf("\n\t\t 是否继续查找相同名字的学生信息:(y/n)");
if (getch()=='y') /*扫描用户输入的字符*/
{
a=i;
continue;
}
else return;
}
else
{
printf("\n\t\t 按任意键返回主菜单");
getch();
mainmenu();
}
}
}
if(mark!=0)
{
printf("\n\t\t 没有相同姓名的学生纪录");
printf("\n\t\t 按任意键返回主菜单");
getch();
return;
}
else
{
printf("\n\t\t 没有相同姓名的学生纪录");
printf("\n\t\t 按任意键返回主菜单");
getch();
return;
}
}
void deletebyname()//按姓名删除
{
int a=0;
int findmark=0;
int j;
int deletemark=0;
int i;
char name[20];
printf("\n\t\t 请输入要删除学生姓名:");
scanf("%s",name);
for (i=a;i<num;i++)
{
if (strcmp(student[i].name,name)==NULL)/*找出要删除的学生的信息*/
{
printf("\n\t\t 以下是您要删除的学生纪录:");
findmark++;
printf("\n\t\t________________________________");
printf("\n\t\t 姓名: %s",student[i].name);
printf("\n\t\t 电话: %s",student[i].phone);
printf("\n\t\t 地址: %s",student[i].adress);
printf("\n\t\te-mail:%s",student[i].e_mail);
printf("\n\t\t________________________________");
printf("\n\t\t 是否删除?(y/n)"); if (getch()=='y')
{
for (j=i;j<num-1;j++) /*纪录移动,从 stud 数组中删除之*/
student[j]=student[j+1]; num--; deletemark++;
printf("\n\t\t 删除成功");
if((i+1)<num)
{
printf("\n\t\t 是否继续删除相同姓名的同学信息?(y/n)");
if (getch()=='y')
{
a=i; continue;
}
}
printf("\n\t\t 是否继续删除?(y/n)");
if (getch()=='y') deletebyname();
return;
}
if((i+1)<num)
{
printf("\n\t\t 是否继续删除相同姓名的同学信息?(y/n)");
if (getch()=='y')
{
a=i;
continue;
}
}
}
else continue;
}
if ((deletemark==0)&&(findmark==0))/*没有找到该同学的信息*/
{
printf("\n\t\t 没有该同学的纪录");
printf("\n\t\t 是否继续删除?(y/n)");
if (getch()=='y')
deletebyname();/*继续调用删除函数*/
return;
return;
}
else if (findmark!=0)
{
printf("\n\t\t 没有重名信息");
printf("\n\t\t 没有该同学的纪录");
printf("\n\t\t 是否继续删除?(y/n)");
if (getch()=='y') deletebyname();
return;
return;
}
}
void listbyname()//按姓名排序
{
int i,j; struct record tmp;
for (i=1;i<num;i++)
{
if(strcmp(student[i].name,student[i-1].name)<0)/*比较姓名字符的长度*/
{
tmp=student[i];
j=i-1;
do
{
student[j+1]=student[j]; j--;
}
while ((strcmp(tmp.name,student[j].name)<0&&j>=0));
student[j+1]=tmp;
}/*冒泡排序*/
}
printf("\n\t\t 排序成功,是否显示?(y/n)");
if (getch()=='y') showall();
return;
}
六、程序运行效果图
首次登陆
主菜单
1.添加记录
继续添加
2.查询菜单
2.1显示所有
按任意键继续
2.2按姓名查询
若有重名
2.3按电话查询
3.删除菜单
3.1删除所有
3.2.按姓名删除
4.姓名排序
5.保存退出
二次进入
七、总结
经一周的程序设计就要走向尾声了,这一周的实践让我获益匪浅,不但复习了以前学习过的知识,还学会了很多新东西新内容,最重要的是提升了自己从细小做起,把握全局的能力。如果说学习 C 语言的知识是“点”,那么这次程序设 计就是“点成线”甚至“线成面”的过程。虽然现在来看,我的知识掌握情况还只是停留在浅尝辄止、只知皮毛的阶段,但是现在我已经有了继续提升的信心与决心。下面对自己近一周的学习实践做以总结。然而,程序设计本身就是一项精密细致的工作,从第一步做起是必须的。在细致复习了《C 语言程序设计》的所学内容之后,我借鉴网上的的范例构建出了程序的骨架和结构,确定了大的方向,之后一个模块一个模块设计,积少成多,最终完成设计。作为一个初学者,我在编程过程中出现了很多问题,经过了很长时间的调试才将最终程序完成,虽然程序设计完成了,但是我仍然存在着问题比如程序依然不够美观。今后,我会继续努力,实现自我的提升!任何事情都没有一夜成功的,任何事情都需要步步为营,踏实苦干。本次程序设计既是对我技能的提高,也是对我人生认识的升华。今后,我将更加努力,更上一层楼!
八、参考文献
[1] 李春葆 曾平 喻丹丹.C语言程序设计教程(第二版).清华大学出版社,2010
[2] 谭浩强.C程序设计(第三版).清华大学出版社,2005
九、程序清单
23
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
struct record
{
char name[20];
char phone[20];
char adress[40];
char QQ[30];
}
student[500];
int num=0;//外部变量 num 为文件中的纪录数
FILE *fp;
void readfromfile();//读取文件
void mainmenu();//主菜单
void newrecord();//新添纪录
void searchmenu();//查询菜单
void showall();//显示所有
void searchbyname();//按姓名查询
void searchbyphone();//按电话查询
void deletemenu();//删除菜单
void deleteall();//删除所有
void deletebyname();//按姓名删除
void listmenu();//排序菜单
void listbyname();//按姓名排序
void writetofile();//写入文件
void main()
{
readfromfile();
while (1)
{
mainmenu();
}
}
void readfromfile()//从文件导入
{
if((fp=fopen("c:\\test\\student.bin","rb"))==NULL)
{
printf("\n\t\t 通讯录文件不存在");
if ((fp=fopen("c:\\test\\student.bin","wb"))==NULL)
{
printf("\n\t\t 建立失败");
exit(0);
}
else
{
printf("\n\t\t 通讯录文件已建立");
printf("\n\t\t 按任意键进入主菜单");
getch();
return;
}
exit(0);
}
fseek(fp,0,2); /*文件位置指针移动到文件末尾*/
if (ftell(fp)>0) /*文件不为空*/
{
rewind(fp); /*文件位置指针移动到文件开始位置*/
for (num=0;!feof(fp) && fread(&student[num],sizeof(struct record),1,fp);num++);
printf("\n\t\t 文件导入成功");
printf("\n\t\t 按任意键返回主菜单");
getch();
return;
}
printf("\n\t\t 文件导入成功");
printf("\n\t\t 通讯录文件中无任何纪录");
printf("\n\t\t 按任意键返回主菜单");
getch();
return;
}
void mainmenu()//主菜单
{
char choic;
system("cls");
printf("\n\t\t************** 欢迎使用通讯录系统 **************");
printf("\n\t\t");
printf("\n\t\t**************** 网络112 李恩普 ****************");
printf("\n\t\t");
printf("\n\t\t");
printf("\n\t\t******************** 主菜单 ********************");
printf("\n\t\t************* 1.新添纪录 2.查询菜单 ************");
printf("\n\t\t************* 3.删除菜单 4.姓名排序 ************");
printf("\n\t\t************* 5.保存退出 6.不保存退出***********");
printf("\n\t\t************************************************");
printf("\n\t\t 请选择:");
choic=getch();
switch (choic)
{
case '1':newrecord();
break;
case '2':searchmenu();
break;
case '3':deletemenu();
break;
case '4':listbyname();
break;
case '5':writetofile();
break;
case '6':exit(0);
default:mainmenu();
}
}
void newrecord()//添加纪录
{
printf("\n\t\t**************** 请输入学生信息 ****************\n");
printf("\n\t\t 输入姓名:");
scanf("%s",&student[num].name);
printf("\n\t\t 输入电话号码:");
scanf("%s",&student[num].phone);
printf("\n\t\t 输入地址:");
scanf("%s",&student[num].adress);
printf("\n\t\t 输入 QQ:");
scanf("%s",&student[num].QQ); num++;
printf("\n\t\t 是否继续添加?(Y/N):");
if (getch()=='y')
newrecord();
return;
}
void searchmenu()//查询菜单
{
char choic;
system("cls");
printf("\n\t\t************** 欢迎使用通讯录系统 **************");
printf("\n\t\t");
printf("\n\t\t**************** 网络112 李恩普 ****************");
printf("\n\t\t");
printf("\n\t\t");
printf("\n\t\t******************* 查询菜单 *******************");
printf("\n\t\t********** 1.显示所有 2.按姓名查询 ***********");
printf("\n\t\t********** 3.按电话查询 4.返回主菜单 ***********");
printf("\n\t\t************************************************");
printf("\n\t\t 请选择:");
choic=getch();
switch (choic)
{
case '1':showall();
break;
case '2':searchbyname();
break;
case '3':searchbyphone();
break;
case '4':mainmenu();
break;
}
}
void showall()//显示所有
{
int i;
system("cls");
if(num!=0)
{
printf("\n\t\t*************** 以下为通讯录所有信息************");
for (i=0;i<num;i++)
{
printf("\n\t\t 姓名: %s",student[i].name);
printf("\n\t\t 电话: %s",student[i].phone);
printf("\n\t\t 地址: %s",student[i].adress);
printf("\n\t\tQQ:%s",student[i].QQ);
printf("\t\t"); if (i+1<num) { printf("\n\t\t__________________________");
system("pause");
}
}
printf("\n\t\t************************************************");
}
else printf("\n\t\t 通讯录中无任何纪录");
printf("\n\t\t 按任意键返回主菜单:");
getch();
return;
}
void searchbyname()//按姓名查询
{
int mark=0;
int i;
int a=0;
printf("\n\t\t***************** 按姓名查找 *******************");
char name[20];
printf("\n\t\t 请输入姓名:");
scanf("%s",name);
for(i=a;i<num;i++)
{
if (strcmp(student[i].name,name)==0)
{
printf("\n\t\t************* 以下是您查找的学生信息 ***********");
printf("\n\t\t 姓名: %s",student[i].name);
printf("\n\t\t 电话: %s",student[i].phone);
printf("\n\t\t 地址: %s",student[i].adress);
printf("\n\t\tQQ:%s",student[i].QQ);
printf("\n\t\t************************************************");
mark++;
if ((i+1)<num)
{
printf("\n\t\t 是否继续查找相同名字的学生信息:(y/n)");
if (getch()=='y')
{
a=i;
continue;
}
else return;
}
else
{
printf("\n\t\t 按任意键返回主菜单");
getch();
return;
}
}
}
if(mark!=0)
{
printf("\n\t\t 没有相同姓名的学生纪录");
printf("\n\t\t 按任意键返回主菜单");
getch();
return;
}
else
{
printf("\n\t\t 没有相同姓名的学生纪录");
printf("\n\t\t 按任意键返回主菜单");
getch();
return;
}
}
void searchbyphone() //按电话查询
{
int mark=0;
int i;
int a=0;
printf("\n\t\t****************** 按电话查找 ******************");
char phone[10];
printf("\n\t\t 请输入电话号码:");
scanf("%s",phone);
for(i=0;i<num;i++)
{
if (strcmp(student[i].phone,phone)==0)
{
printf("\n\t\t************** 以下是您查找的学生信息 **********");
printf("\n\t\t 姓名: %s",student[i].name);
printf("\n\t\t 电话: %s",student[i].phone);
printf("\n\t\t 地址: %s",student[i].adress);
printf("\n\t\tQQ:%s",student[i].QQ);
printf("\n\t\t************************************************");
printf("\n\t\t 按任意键返回主菜单:");
mark++; getch();
return;
}
}
if (mark==0)
{
printf("\n\t\t 没有该学生的信息");
printf("\n\t\t 按任意键返回主菜单");
getch();
return;
}
}
void deletemenu()//删除菜单
{
char choic;
if(num==0)
{
printf("\n\t\t 对不起,文件中无任何纪录");
printf("\n\t\t 按任意键返回主菜单");
getch();
return;
}
system("cls");
printf("\n\t\t************** 欢迎使用通讯录系统 **************");
printf("\n\t\t");
printf("\n\t\t**************** 网络112 李恩普 ****************");
printf("\n\t\t");
printf("\n\t\t");
printf("\n\t\t******************* 删除菜单 *******************");
printf("\n\t\t************** 1.删除所有 2.按姓名删除 *********");
printf("\n\t\t****************** 3.返回主菜单 ****************");
printf("\n\t\t************************************************");
printf("\n\t\t 请选择:");
choic=getch();
switch (choic)
{
case '1':deleteall();
break;
case '2':deletebyname();
break;
case '3':mainmenu();
break;
default:mainmenu();
break;
}
}
void deleteall()//删除所有
{
printf("\n\t\t 确认删除?(y/n)");
if (getch()=='y')
{
fclose(fp);
if ((fp=fopen("c:\\test\\student.bin","wb"))==NULL)
{
printf("\n\t\t 不能打开文件,删除失败");
readfromfile();
}
num=0;
printf("\n\t\t 记录已删除,按任意键返回主菜单");
getch();
return;
}
else return;
}
void deletebyname()//按姓名删除
{
int a=0;
int findmark=0;
int j;
int deletemark=0;
int i;
char name[20];
printf("\n\t\t 请输入要删除学生姓名:");
scanf("%s",name);
for (i=a;i<num;i++)
{
if (strcmp(student[i].name,name)==NULL)
{
printf("\n\t\t 以下是您要删除的学生纪录:");
findmark++;
printf("\n\t\t________________________________");
printf("\n\t\t 姓名: %s",student[i].name);
printf("\n\t\t 电话: %s",student[i].phone);
printf("\n\t\t 地址: %s",student[i].adress);
printf("\n\t\tQQ:%s",student[i].QQ);
printf("\n\t\t________________________________");
printf("\n\t\t 是否删除?(y/n)"); if (getch()=='y')
{
for (j=i;j<num-1;j++) /*纪录移动,从 stud 数组中删除之*/
student[j]=student[j+1]; num--; deletemark++;
展开阅读全文