通讯录管理系统
许在魁
0101010
2010210338
一.实验要求:设计一个通信录由以下几项数据信息构成:
数据项 类型
姓名 字符串
地址 字符串
邮政编码 字符串
电话号码 字符串
试为通信录数据定义类型和定义通信录变量, 实现功能:存取、显示、删除记录、查询记录等功能。
2、要求:界面友好,易于操作.
二.总体设计
1.编写目的:
根据需求分析文档,初步提出问题的解决方案,以及软件系统的体系结构和数据结构的设计方案并写出书面文档总体设计说明书,为下一步进行详细设计做准备。
2.总体设计:
该程序可以按功能进行模块划分,其模块图如下:
1
3.数据结构设计:
本程序定义了结构体s_message,用于存放联系人的基本信息。这里仅有3个于联系人有关的字段, 读者可以按照需要拓展相关字段。
struct s_message {
char name[20]; char address[50]; char code[15]; char tel[15]; }s[MAX];
其中字段的值的含义如下。 *name[20]:保存联系人的姓名 *address[50]: *code[15]:保存联系人的邮政编码
2
*tel[15]:保存联系人的电话号码
三.详细解说各模块
1.输入记录模块:输入记录模块主要完成将数据存入数组中的工作。在此通信管理系统中,记录可以从以文本形式存储的数据文件中读入就,也可以从键盘输入记录。记录由与联系人有关的信息构成。当从文件中读入记录时,它就是在以记录为单位存储的数据文件中,将记录逐条复制到结构体类型的数组元素中。
2.查询记录模块:查询记录模块主要完成在数组中查找满足相关条件的记录。在此通信管理系统中用户可以按照联系人的姓名在数组中进行查找。若找到该记录,则打印出此记录的信息;否则,将打印出未找到该记录的提示信息。
3.修改记录模块:修改记录模块主要完成对记录的维护。一般而言,系统进行了这些操作之后,需要将修改的记录存入源数据文件
4.输出记录模块:输出记录模块主要完成两个任务:第一,它实现对记录的存盘操作,即将数组中各元素中存储的记录信息写入数据文件中;第二,它实现将数组中存储的记录信息在屏幕上打印出来。
四.程序设计与体会
通过近一个学期的查阅资料,通过相互之间的讨论和交流,在实践中互相弥补不足,更重要的是许多一个人无法解决的问题,在与同学的探讨下,该程序变的简单,清晰,从而把问题轻易地解决。
此次的程序最开始是去网上找的,可错误太多, 要一个个调试还不如自己写。回过头还是得从书本入手,看了两天的书大概明白了程序的主要结构和语言。但尝试写的时候却碰到很多问题,比如要调用什么函数,参数该怎么设置等等。无奈,又去课外书上找。没想到,竟在《C语言课程设计案例精编》上发现类似的程序。经过仔细的查看和研究,仿照书上的案例,结合一步步上机调试,终于完成这次的课程设计。
在此次课程设计周中,我学到最大的就是:刚学写程序的人要仔细研究每一个案例,还要多写程序,更应该和同学们一起交流,在交流中发现问题,再结局问题。在程序编写方面,我依然存在很多的不足。对函数语言的运用等都不是很明确,在接下来的时间里,我一定会勤写程序,勤与同学、老师交流。在每一次的尝试中发掘自己不足的地方,真对薄弱环节下狠功。努力在大学期间完成所学,灵活运用所学的C语言及其他高级语言解决实际上呢搞活中的问题。
3
五.程序的源代码清单
#include<stdio.h>
#include<string.h> //字符串处理//
#include<conio.h>
#define MY1 printf("\n姓名 地址 邮政编码 电话\t")
#define
printf("\n%s %4s %s %s\n",s[i].name,s[i].address,s[i].code,s[i].tel) #define MAX 20
int i;
int sum;
/*时间结构体类型*/
struct s_message
{
char name[20];
char address[50];
char code[15];
char tel[15];
}s[MAX];
/*保存通讯录信息*/
void save_message(int sum)
{
int i;
FILE *fp; //声明fp是指针,用来指向FILE类型的对象//
if((fp=fopen("D:\\s.txt","wb"))==NULL)
{
printf("文件有误!\n");
return;
}
for (i=0;i<sum;i++)
{
if(fwrite(&s[i],sizeof(struct s_message),1,fp)!=1) //fwite写一个数据块//
printf("writing file is wrong!\n");
}
fclose(fp);
}
/*读取通讯录信息*/
int read_message()
{
FILE *fp;
int i=0;
if((fp=fopen("D:\\s.txt","rb"))==NULL) MY2
4
{
printf("\n\n***********暂时无任何库存信息,按回车键进入主菜单选择基本信息的录入!***********\n");
return 0;
}
while(feof(fp)==0) /*feof(fp)有两个返回值:如果遇到文件结束,函数feof(fp)的值为1,否则为0。*/
{
if(fread(&s[i],sizeof(struct s_message),1,fp)!=1) //fread是读入一个数据块//
break;
i++;
}
fclose(fp); //关闭文件//
return(i);
}
/*输入通讯录信息*/
putin_message()
{
int i=0,m=0;
printf("\n\n***********输入联系人信息****************\n\n");
printf("输入要输入的联系人的个数(m<MAX)\n");
scanf("%d",&m);
for(i=sum;i<sum+m;i++)
{
printf("\n 姓名:");
scanf("%s",s[i].name);
printf("\n 地址:");
scanf("%s",s[i].address);
printf("\n 邮政编码:");
scanf("%s",s[i].code);
printf("\n 电话:");
scanf("%s",s[i].tel);
}
printf("\n***********************联系人信息输入完毕**********************\n");
sum+=m;
printf("\n 按回车键返回主菜单!");
getch();
/*从控制台读取一个字符,但不显示在屏幕上,即会等待你按下任意键,再继续执行下面的语句,所在头文件为#include<conio.h>*/
return 0;
}
/*输出通讯录信息模块*/
void putout_message()
5
{
int i=0;
printf("\n*****************************通讯录**********************\n\n"); for(i=0;i<sum;i++)
{
MY1;
MY2;
printf("\n\n");
}
printf("按回车键返回主菜单!");
getch();
}
/*添加联系人信息*/
insert_message()
{
int i=sum,flag=0,j=0,v=0;
char choice;
printf("\n\n**********添加一个联系人信息***********\n");
do
{
printf("\n姓名:");
scanf("%s",&s[i].name);
for(j=0;j<sum;j++)
if(s[i].name==s[j].name)
v=1;
if(v==1)
printf("the name is already existed");
break;
if(s[i].name==0) break;
printf("\n 地址:");
scanf("%s",s[i].address);
printf("\n 邮政编码:");
scanf("%d",s[i].code);
printf("\n 电话:");
scanf("%s",s[i].tel);
printf("\n 要继续吗? (Y/N)");
choice=getch();
if(choice=='y'||choice=='Y')
{
printf("\n 继续!\n");
flag=1;
}
else flag=0;
6
i++;
sum++;
}while(flag==1);
printf(" 按回车键返回主菜单!");
getch();
return 0;
}
/*修改联系人信息*/
revise_message()
{
int i=0,choice1;
char revise_name[20],flag=0;
char choice2,m=0;
printf("\n 输入要修改的联系人的姓名:"); scanf("%s",&revise_name);
for(i=0;i<sum;i++)
{
if(strcmp(s[i].name,revise_name)==0)
{
m=1;
printf("\n 你要修改哪一项?\n");
printf("\n 1.姓名\n");
printf("\n 2.地址\n");
printf("\n 3.邮政编码\n");
printf("\n 4.电话\n");
printf("请选择:");
scanf("%d",&choice1);
switch(choice1)
{
case 1: printf("\n 输入修改后的名片姓名:"); scanf("%s",s[i].name);break;
case 2: printf("\n 输入修改后的地址:"); scanf("%s",s[i].address);break;
case 3: printf("\n 输入修改后的邮政编码:"); scanf("%d",s[i].code);break;
case 4: printf("\n 输入修改后的电话:"); scanf("%s",s[i].tel);break;
}
}
}
if(m==0)
printf("无该联系人信息!");
7
printf("\n \n 要继续吗?(Y/N)");
choice2=getch();
if(choice2=='y'||choice2=='Y')
{
printf("\n 继续!\n");
flag=1;
}
else
flag=0;
while(flag==1);
printf(" 按回车键返回主菜单!");
getch();
return 0;
}
/*查询(按姓名)*/
int inquire_name()
{
int i=0,r=0;
char inquire_name[20];
printf("\n 输入要查询的联系人的姓名:");
scanf("%s",inquire_name);
for(i=0;i<sum;i++)
{
if(strcmp(s[i].name,inquire_name)==0)
r=1;
}
if(r==0)
printf("无该联系人信息!!!\n");
for(i=0;i<sum;i++)
if(strcmp(s[i].name,inquire_name)==0)
{
printf("\n **********联系人信息**********\n"); MY1;
MY2;
}
printf(" 按任意键返回主菜单!");
getch();
return 0;
}
8
/*删除(按姓名)*/
int delete_name()
{
int i=0,m=0,k=0,flag; char choice;
char de_name[20];
do
{
printf("\n 输入要删除的联系人的姓名:");
scanf("%s",de_name); for(i=0;i<sum;i++)
{
if(strcmp(s[i].name,de_name)!=0) break;
}
for(i=0;i<sum;i++)
{
if(strcmp(s[i].name,de_name)==0)
{
m=i;
for(i=m+1;i<sum;i++)
s[i-1]=s[i];
}
}
sum=sum-1;
printf("\n 此联系人的信息已被删除**********\n"); printf("\n 要继续删除吗?(Y/N)");
choice=getch();
if(choice=='y'||choice=='Y')
{
printf("\n 继续!\n");
k++;
flag=1;
}
else flag=0;
}while(flag==1);
printf(" 按任意键返回主菜单!");
getch();
return 0;
}
/*主函数*/
9
void main()
{
int choice;
sum=read_message();
{
do
{
printf("\n\n********************************************************************************\n");
printf("\n\n**************************欢迎您进入通讯录管理系统******************************\n\n");
printf("********************************************************************************\n");
printf(" 1.录入联系人信息\n\n");
printf(" 2.输出联系人信息\n\n");
printf(" 3.修改联系人信息\n\n");
printf(" 4.查询联系人信息\n\n");
printf(" 5.删除联系人信息\n\n");
printf(" 0.退出系统\n\n");
printf(" 请选择(0-5):");
scanf("%d",&choice);
switch(choice)
{
case 1:putin_message();save_message(sum);break;
case 2:putout_message();break;
case 3:revise_message();save_message(sum);break;
case 4:inquire_name();break;
case 5:delete_name();save_message(sum);break;
case 0:break;
}
}
while(choice!=0);
save_message(sum);
printf("联系人信息被保存!\n");
}
}
六.程序运行结果
1.菜单主界面:运行代码,进入菜单主界面
10
2.输入记录:选择第一项,录入几个名片信息
;
11
3.显示记录如下:输入完名片后,返回主菜单,进入选项2,显示刚才输入的几个名片
;
4.返回主菜单,进入选项3修改名片,按照菜单操作后再返回查看已修改的名片; 12
5.返回主菜单,进入选项4,输入你要查询的名片的姓名,显示在屏幕上 13
6.返回主菜单,进入选项5,输入你要删除的名片的姓名,操作后显示删除完毕
; 14
7.退出系统. 15