c语言程序设计通讯录管理系统
1. 需求分析
根据题目要求,通讯录保存在文件中,要提供文件的输入和输出功能;还有就是要提供通讯录添加(个人信息包括姓名、学号、年龄、住址、电子邮件等)、删除、显示、修改等基本功能。
2. 概要设计
系统总体设计是信息的输入、信息的编辑和退出。系统功能模块如下: 1. 添加通讯录; 2. 输出通讯录; 3. 查找通讯录; 4. 修改通讯录; 5. 删除通讯录; 6. 退出通讯录;
3. 详细设计
1. 通讯录里无信息,所以要添加信息。用键盘逐个输入通讯录里联系人的信息。
2. 输出通讯录用于让使用者观看通讯录里所有的信息。
3. 查找通讯录是让使用者可以通过电话或姓名来查找通讯录里的联系人。
4. 修改通讯录是让使用者通过姓名查找到通讯录里的联系人,然后
其作出修改。
5. 删除通讯录是用来按照联系人的姓名或电话来单独删除通讯录中一些不想要的联系人。还可以集体删除通讯录中的联系人。
6. 退出通讯录系统。
4. 主要源程序代码
#include #include #include #include
struct record {
char name[20]; char age[20]; char phone[20]; char adress[40]; char number[30]; char e_mail[20]; }contact[500]; int NO=0; FILE *fp;
void mainmenu(); void newrecord(); void browsemenu(); void searchmenu();
void searchname(); void searchphone(); void modifymenu(); void deletemenu(); void deleteall(); void deletesingle(); void deletename(); void deletephone(); int loadfile(); void savefile();
void main()
{printf("\n\t\t :)欢迎使用通讯录管理系统beta"); printf("\n\t\t文件导入中……请稍后……\n\n\n\n\n"); system("cls"); loadfile(); while (1) {
mainmenu(); } }
void mainmenu() {
char choice;
system("cls");
printf("\n\t\t******************** 主菜单 ********************"); printf("\n\t\t****************** 1-新建菜单 ******************"); printf("\n\t\t****************** 2-浏览菜单 ******************"); printf("\n\t\t****************** 3-查找菜单 ******************"); printf("\n\t\t****************** 4-修改菜单 ******************"); printf("\n\t\t****************** 5-删除菜单 ******************"); printf("\n\t\t****************** 6-退 出 ******************");
printf("\n\t\t************************************************"); printf("\n\t\t请选择:"); choice=getch(); switch (choice) {
case '1':newrecord();break; case '2':browsemenu();break; case '3':searchmenu();;break; case '4':modifymenu();break; case '5':deletemenu();break;
case '6':exit(0); default:mainmenu(); } }
void newrecord()
{
printf("\n\t\t**************** 请输入联系人信息 ****************\n"); printf("\n\t\t输入姓名:"); scanf("%s",&contact[NO].name); printf("\n\t\t输入年龄:"); scanf("%s",&contact[NO].age); printf("\n\t\t输入电话号码:"); scanf("%s",&contact[NO].phone); printf("\n\t\t输入家庭住址:"); scanf("%s",&contact[NO].adress); printf("\n\t\t输入学号:"); scanf("%s",&contact[NO].number); printf("\n\t\t输入电子邮件:"); scanf("%s",&contact[NO].e_mail); NO++;
savefile();
printf("\n\t\t是否继续添加?(y/n):"); if (getch()=='y') newrecord(); return; }
void browsemenu() {
int i;
system("cls");
if(NO!=0) {
printf("\n\t\t*************** 以下为通讯录所有信息************"); for (i=0;i
{
printf("\n\t\t姓 名: %s",contact[i].name); printf("\n\t\t年 龄: %s",contact[i].age); printf("\n\t\t联系电话: %s",contact[i].phone); printf("\n\t\t家庭住址: %s",contact[i].adress); printf("\n\t\t 学 号: %s",contact[i].number); printf("\n\t\t电子邮件: %s",contact[i].e_mail); printf("\t\t");
if (i+1
{
printf("\n\t\t__________________________"); system("pause"); } }
printf("\n\t\t************************************************"); } else
printf("\n\t\t通讯录中无任何纪录"); printf("\n\t\t按任意键返回主菜单:"); getch(); return; }
void searchmenu()
{
char choice; system("cls");
printf("\n\t\t******************* 查找菜单 *******************"); printf("\n\t\t***************** 1-按姓名查找 *****************"); printf("\n\t\t***************** 2-按电话查找 *****************"); printf("\n\t\t***************** 3-返回主菜单 *****************"); printf("\n\t\t************************************************"); printf("\n\t\t请选择:"); choice=getch(); switch (choice)
{
case '1':searchname();break; case '2':searchphone();break; case '3':mainmenu();break; } }
void searchname() {
int mark=0; int i; int a=0;
char name[20];
printf("\n\t\t***************** 按姓名查找 *******************"); printf("\n\t\t请输入姓名:"); scanf("%s",name); for(i=a;i
{
if (strcmp(contact[i].name,name)==0) {
printf("\n\t\t************ 以下是您查找的联系人信息 **********"); printf("\n\t\t姓 名: %s",contact[i].name); printf("\n\t\t年 龄: %s",contact[i].age); printf("\n\t\t联系电话: %s",contact[i].phone); printf("\n\t\t家庭住址: %s",contact[i].adress); printf("\n\t\t 学 号: %s",contact[i].number); printf("\n\t\t电子邮件: %s",contact[i].e_mail);
printf("\n\t\t************************************************"); printf("\n\t\t按任意键返回主菜单:"); mark++; getch(); return; return;
} }
if(mark==0)
{printf("\n\t\t没有该姓名的联系人纪录"); printf("\n\t\t按任意键返回主菜单"); getch(); return; } }
void searchphone() {
int mark=0; int i;
int a=0;
char phone[10];
printf("\n\t\t****************** 按电话查找 ******************"); printf("\n\t\t请输入电话:"); scanf("%s",phone); for(i=0;i
if (strcmp(contact[i].phone,phone)==0) {
printf("\n\t\t************* 以下是您查找的联系人信息 *********"); printf("\n\t\t姓 名: %s",contact[i].name); printf("\n\t\t年 龄: %s",contact[i].age); printf("\n\t\t联系电话: %s",contact[i].phone); printf("\n\t\t家庭住址: %s",contact[i].adress);
printf("\n\t\t 学 号:%s",contact[i].number); printf("\n\t\t电子邮件: %s",contact[i].e_mail);
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 modifymenu() { int mark=0; int i,k; int a=0; int t=0; char choice; char name[20];
struct record modify; system("cls");
printf("\n\t\t请输入您要修改的姓名:"); scanf("%s",name); for(i=a;i
{
if (strcmp(contact[i].name,name)==0)
{ k=i;mark=1; modify=contact[i];
printf("\n\t\t********** 以下是您将修改的联系人信息 **********"); printf("\n\t\t姓 名: %s",contact[i].name); printf("\n\t\t年 龄: %s",contact[i].age); printf("\n\t\t联系电话: %s",contact[i].phone); printf("\n\t\t家庭住址: %s",contact[i].adress); printf("\n\t\t 学 号: %s",contact[i].number); printf("\n\t\t电子邮件: %s",contact[i].e_mail); printf("\n\t\t是否继续?y/n"); if(getch()=='n') modifymenu();
else
{printf("\n\t\t选择您要修改的选项:"); printf("\n\t\t\t(1).姓 名");
printf("\n\t\t\t(2).年 龄");
printf("\n\t\t\t(3).联系电话");
printf("\n\t\t\t(4).家庭住址"); printf("\n\t\t\t(5). 学 号");
printf("\n\t\t\t(6).电子邮件");
printf("\n\t\t\t(7).返 回"); printf("\n\t\t请选择: ");
choice=getch(); switch(choice)
{ case '1': printf("姓 名:"); scanf("%s",contact[i].name); break;
case '2': printf("年 龄:"); scanf("%s",contact[i].age); break; case '3': printf("联系电话:"); scanf("%s",contact[i].phone); break; case '4': printf("家庭住址:"); scanf("%s",contact[i].adress); break;
case '5': printf(" 学 号:"); scanf("%s",contact[i].number); break; case '6': printf("电子邮件:"); scanf("%s",contact[i].e_mail); break; case '7': mainmenu(); break; default: modifymenu();
}
printf("\n\t\t您的修改结果为:"); printf("\n\t\t姓 名: %s",contact[i].name);
printf("\n\t\t年 龄: %s",contact[i].age); printf("\n\t\t联系电话: %s",contact[i].phone); printf("\n\t\t家庭住址: %s",contact[i].adress);
printf("\n\t\t 学号: %s",contact[i].number); printf("\n\t\t电子邮件: %s",contact[i].e_mail); printf("\n\t\t确认修改?y/n");
if(getch()=='n')
{contact[i]=modify;
printf("\n\t\t修改未保存!");
}
else printf("\n\t\t修改成功!");
savefile();mark=0;
printf("\n\t\t是否继续修改?(y/n)"); if (getch()=='y') modifymenu(); } } }
if (mark==0) {
printf("\n\t\t没有该联系人的纪录");
printf("\n\t\t是否继续修改?(y/n)");
if (getch()=='y')
modifymenu();
}
return;
}
void deletemenu()
{
char choice;
if(NO==0)
{
printf("\n\t\t对不起,文件中无任何纪录");
printf("\n\t\t按任意键返回主菜单");
getch();
return;
}
system("cls");
printf("\n\t\t******************* 删除菜单 *******************");
printf("\n\t\t****************** 1-删除所有 ******************");
printf("\n\t\t****************** 2-删除单个 ******************");
printf("\n\t\t***************** 3-返回主菜单 *****************");
printf("\n\t\t************************************************");
printf("\n\t\t请选择:");
choice=getch();
switch(choice)
{
case '1':deleteall();break;
case '2':deletesingle();break;
case '3':mainmenu();break;
default:mainmenu();
}
}
void deleteall()
{
printf("\n\t\t确认删除?(y/n)");
if (getch()=='y')
{
if ((fp=fopen("contact","w"))==0)
{
printf("\n\t\t不能打开文件,删除失败");
loadfile();
}
NO=0;
printf("\n\t\t纪录已删除,按任意键返回主菜单");
getch();
fclose(fp);
return;
}
else
return;
}
void deletesingle()
{
char choice;
printf("\n\t\t\t1-按姓名删除");
printf("\n\t\t\t2-按号码删除");
printf("\n\t\t\t3-返回删除菜单");
printf("\n\t\t请选择:");
choice=getch();
switch (choice)
{
case '1':deletename();break;
case '2':deletephone();break;
case '3':deletemenu();break;
}
}
void deletename()
{
int i,j;
int mark=0;
char name[20];
printf("\n\t\t请输入要删除联系人姓名:");
scanf("%s",name);
if(NO==0)
{
printf("\n\t\t对不起,文件中无任何纪录");
printf("\n\t\t按任意键返回主菜单");
getch();
return;
}
for (i=0;i
{
if (strcmp(contact[i].name,name)==0)
{
printf("\n\t\t以下是您要删除的联系人纪录:");
printf("\n\t\t姓 名: %s",contact[i].name);
printf("\n\t\t年 龄: %s",contact[i].age);
printf("\n\t\t联系电话: %s",contact[i].phone);
printf("\n\t\t家庭住址: %s",contact[i].adress);
printf("\n\t\t 学号: %s",contact[i].number);
printf("\n\t\t电子邮件: %s",contact[i].e_mail);
printf("\n\t\t是否删除?(y/n)");
if (getch()=='y')
{
for (j=i;j
contact[j]=contact[j+1];
NO--;
mark++;
printf("\n\t\t删除成功");
savefile();
printf("\n\t\t是否继续删除?(y/n)");
if (getch()=='y')
deletename();
return;
}
else
return;
}
continue;
}
if (mark==0)
{
printf("\n\t\t没有该联系人的纪录");
printf("\n\t\t是否继续删除?(y/n)");
if (getch()=='y')
deletename();
return;
}
}
void deletephone()
{
int i,j;
int mark=0;
char phone[20];
printf("\n\t\t请输入要删除联系电话:");
scanf("%s",phone);
if(NO==0)
printf("\n\t\t对不起,文件中无任何纪录");
printf("\n\t\t按任意键返回主菜单");
getch();
return;
}
for (i=0;i
{
if (strcmp(contact[i].phone,phone)==0)
{
printf("\n\t\t以下是您要删除的联系人纪录:");
printf("\n\t\t姓 名: %s",contact[i].name);
printf("\n\t\t年 龄: %s",contact[i].age);
printf("\n\t\t联系电话: %s",contact[i].phone);
printf("\n\t\t家庭住址: %s",contact[i].adress);
printf("\n\t\t 学号: %s",contact[i].number);
printf("\n\t\t电子邮件: %s",contact[i].e_mail);
printf("\n\t\t是否删除?(y/n)");
if (getch()=='y')
{
for (j=i;j
contact[j]=contact[j+1];
NO--;
mark++;
printf("\n\t\t删除成功");
savefile();
printf("\n\t\t是否继续删除?(y/n)");
if (getch()=='y')
deletephone();
return;
}
else
return;
}
continue;
}
if (mark==0)
{
printf("\n\t\t没有该联系人的纪录");
printf("\n\t\t是否继续删除?(y/n)");
if (getch()=='y')
deletephone();
return;
}
int loadfile()
{
int NO=0;
FILE *fp;
if((fp=fopen("contact.txt","b"))==0)
{
printf("\n\n\n\n\n\t\t\t 电话簿文件不存在");
if ((fp=fopen("contact.txt","wb"))==0)
{
printf("\n\t\t\t\t建立失败");
exit(0);
}
else
{
printf("\n\t\t\t 电话簿已建立");
printf("\n\t\t\t 按任意键进入主菜单");
getch();
return(NO);
}
exit(0);
}
fseek(fp,0,2);
if (ftell(fp)>0)
{
rewind(fp);
for (NO=0;!feof(fp) && fread(&contact[NO],sizeof(struct record),1,fp);NO++);
printf("\n\n\n\n\t\t\t\t :)文件导入成功");
printf("\n\t\t\t\t 按任意键返回主菜单");
getch();
return(NO);
}
printf("\n\n\n\n\t\t\t :)文件导入成功");
printf("\n\t\t\t电话簿文件中无任何纪录");
printf("\n\t\t\t 按任意键返回主菜单");
getch();
return(NO);
}
void savefile()
{
int i;
if ((fp=fopen("student.txt","wb"))==0)
printf("\n\t\t文件打开失败!\n");
}
for (i=0;i
{
if (fwrite(&contact[i],sizeof(struct record),1,fp)!=1)
{
printf("\n\t\t写入文件错误!\n");
}
}
printf("\n\t\t已成功保存至文件!\n");
fclose(fp);
}
本程序中大量使用了结构体和结构体数组,系统的功能模块都是使用子函数完成的,子函数中也存在大量结构体数组。
5. 调试分析过程描述
1. 软件进入界面后按任意键进入主菜单
:
2. 就可以按照主菜单的提示进行操作了。我就以新建菜单的例子来说,按1以后输入系列信息即可:
因为程序过大,所以遇到了很多问题,特别是最后的文件的导入和导出一直没搞好,最后是到网上找到了相关的模块,做了些参考才完成的。不过这个程序中大部分子函数定义明确,可以看书,上网查资料一遍一遍尝试着去写,虽然很麻烦,但断断续续的还是可以完成的。
6. 课程设计小结
在这短时间的编写过程中我对c 语言有啦更进一步的认识和了解。此次编程过程的经验和知识肯定能促进我以后的学习,对我的帮助是很多的,无论是学到的知识还是经验。
在程序的编写过程中学习了很多对函数运用的方法,其中真的遇到了很多困难,还是慢慢坚持下来了。程序写完后也感到了很兴奋和快乐,毕竟有了个结果。当然因为其中个别模块的程序是参考其他资料写的,所以有些地方还需要我进一步去学习和巩固,以便于查漏补缺。