资源描述
c语言程序设计通讯录标准管理系统
根据题目要求,通讯录保存在文件中,要提供文件的输入和输出功能;还有就是要提供通讯录添加(个人信息包括姓名、学号、年龄、住址、电子邮件等)、删除、显示、修改等基本功能。
系统总体设计是信息的输入、信息的编辑和退出。系统功能模块如下:
1. 添加通讯录;
2. 输出通讯录;
3. 查找通讯录;
4. 修改通讯录;
5. 删除通讯录;
6. 退出通讯录;
,所以要添加信息。用键盘逐个输入通讯录里联系人的信息。
Y
N
开始
新建联系人
是否继续添加联系人?
结束
。
开始
输出所有联系人信息
结束
。
开始
按姓名查找
按号码查找
结束
,然后 其作出修改。开始
输入姓名查找联系人
选择要修改的信息
是否继续修改其它联系人
结束
Y
N
。还可以集体删除通讯录中的联系人。
开始
删除单人
按姓名删除
按电话删除
删除集体
结束
。
#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;
******************");
}
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<NO;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<NO;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<NO;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<NO;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<NO-1;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<NO;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<NO-1;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("","b"))==0)
{
printf("\n\n\n\n\n\t\t\t 电话簿文件不存在");
if ((fp=fopen("","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("","wb"))==0)
{
printf("\n\t\t文件打开失败!\n");
}
for (i=0;i<NO;i++)
{
if (fwrite(&contact[i],sizeof(struct record),1,fp)!=1)
{
printf("\n\t\t写入文件错误!\n");
}
}
printf("\n\t\t已成功保存至文件!\n");
fclose(fp);
}
本程序中大量使用了结构体和结构体数组,系统的功能模块都是使用子函数完成的,子函数中也存在大量结构体数组。
:
。我就以新建菜单的例子来说,按1以后输入系列信息即可:
因为程序过大,所以遇到了很多问题,特别是最后的文件的导入和导出一直没搞好,最后是到网上找到了相关的模块,做了些参考才完成的。不过这个程序中大部分子函数定义明确,可以看书,上网查资料一遍一遍尝试着去写,虽然很麻烦,但断断续续的还是可以完成的。
在这短时间的编写过程中我对c语言有啦更进一步的认识和了解。此次编程过程的经验和知识肯定能促进我以后的学习,对我的帮助是很多的,无论是学到的知识还是经验。
在程序的编写过程中学习了很多对函数运用的方法,其中真的遇到了很多困难,还是慢慢坚持下来了。程序写完后也感到了很兴奋和快乐,毕竟有了个结果。当然因为其中个别模块的程序是参考其他资料写的,所以有些地方还需要我进一步去学习和巩固,以便于查漏补缺。
展开阅读全文