C语言程序设计--通讯录
通讯录管理系统
- 问题定义与描述
1.1问题定义
创建一个学生通讯录管理系统。系统中每个学生信息包括学号、姓名、性别、出生日期、家庭地址、学号、电话、QQ。程序的运行效果如下图所示,选择任意菜单后,实现相应功能。
图1.1 学生通讯录管理系统功能需求
1.2问题描述
在问题定义与描述阶段要考虑题目的可行性和需求分析,接下来进入开发阶段,完成系统设计和系统实现的任务。
2、系统设计
总体设计
采用模块化的程序设计方法,即将较大的任务按照一定的原则分为一个个较小的任务,然后分别设计各个小任务。需要注意的是划分出来的模块应该相对独立但又相关,且容易理解。可以用模块化层次结构图(即模块图)来分析其任务的划分,一般从上到下进行,最上面一层是主模块,下面各层是其上一层模块的逐步细化描述。
2.1主要功能模块
添加:添加通讯录记录。
显示:显示通讯录记录。
删除:删除通讯录记录。
查询:查询通讯录记录。
修改:修改通讯录记录。
保存:将信息保存到文件。
2.2数据结构设计
结构体
s struct addr /*通讯地址结构定义*/
{ char post_num[10]; /*邮编*/
char addr[40]; /*家庭地址*/
};
struct birth /*出生年月结构定义*/
{ int year; /*年份*/
int month; /*月份*/
int day; /*日期*/
};
struct friend1 /*电子通讯录结构定义*/
{ int number; /*序号*/
char name[20]; /*姓名*/
char sex; /*性别*/
struct birth birth; /*出生年月*/
struct addr addr; /*通信地址*/
char telephone[13]; /*联系电话*/
}friends[50];
FILE *fp;
int i;
2.3输入记录模块
输入记录模块主要实现将数据存入结构体中。,用户应选择2,调用Data_Inpu ()函数,进行朋友姓名、电话、地址、性别的输入,即完成在结构体中添加记录的操作。
2.4查询记录模块
查询记录模块主要实现了在结构体中按姓名查找满足相关条件的信息记录。在查询函数search()中,找到相同名字则打印出记录。
2.5删除记录模块
该操作完成删除指定姓名的记录,
输入要删除的序号,输入后调用函数若找到该记录,询问是否继续寻找相同姓名的记录。
2.6显示所有记录模块
该操作完成显示所有记录信息,它分两步完成。
第一步,按照数组中序号进行排序。
第二步,逐条显示出来。
3、系统实现
3.1 编码
3.1.1 部分程序源代码
#include<stdlib.h>
#include<string.h>
#include<conio.h>
#include<stdio.h>
#include<dos.h>
struct addr /*通讯地址结构定义*/
{ char post_num[10]; /*邮编*/
char addr[40]; /*家庭地址*/
};
struct birth /*出生年月结构定义*/
{ int year; /*年份*/
int month; /*月份*/
int day; /*日期*/
};
struct friend1 /*电子通讯录结构定义*/
{ int number; /*序号*/
char name[20]; /*姓名*/
char sex; /*性别*/
struct birth birth; /*出生年月*/
struct addr addr; /*通信地址*/
char telephone[13]; /*联系电话*/
}friends[50];
FILE *fp;
int i;
void Data_Show(int j) /*打印记录的详细资料*/
{
printf("\n\n\tNo:%3d\n",friends[j].number);
printf("\n\tBirthday(y/m/d):%4d%2d%2d",friends[j].birth.year,friends[j].birth.month,friends[j].birth.day);
printf("\n\tPostnum:%-10s",friends[j].addr.post_num);
printf("\n\taddress:%-40s",friends[j].addr.addr);
printf("\n\tTele%-13s",friends[j].telephone);
}
void Data_Input(int j) /*记录插入函数*/
{
fflush(stdin);
friends[j].number=j;
printf("\n\n\n\tNo %d record",j);
printf("\n\n\tName:"); /*读入姓名*/
scanf("%s",friends[j].name);
fflush(stdin);
printf("\n\tSex(m/f):"); /*读入性别*/
scanf("%c",&friends[j].sex);
printf("\n\t---birthday---"); /*读入出生年月*/
printf("\n\tyear:");
scanf("%d",&friends[j].birth.year);
printf("\n\t\tmonth:");
scanf("%d",&friends[j].birth.month);
printf("\n\t\tday:");
scanf("%d",&friends[j].birth.day);
printf("\n\tPost_number:"); /*读入邮编*/
scanf("%s",friends[j].addr.post_num);
printf("\n\tAddress:"); /*读入家庭地址*/
scanf("%s",friends[j].addr.addr);
printf("\n\ttelephone:"); /*读入联系电话*/
scanf("%s",friends[j].telephone);
printf("y/n");
if( getch()=='n')
main();
}
void Data_Save()
{
int j;
fp=fopen("friend.txt","w");
for(j=1;j<=i;j++)
{ fwrite(&friends[j],sizeof(struct friend1),1,fp);
}
}
void main()
{
int j,k;
char ch;
char *search_name;
clrscr();
Data_Load();
i--;
do
{ printf("\n\n\n\tFunction choose:");
printf("\n\t1.Read");
printf("\n\t2.Append");
printf("\n\t3.Delete");
printf("\n\t4.Search");
printf("\n\t5.Insert");
printf("\n\t6.Save and Exit");
printf("\n\t7.Quit");
printf("\n\n");
printf("\tChoice:");
ch=getche();
switch(ch)
{ case '1': j=1; /*显示通讯录中的所有记录*/
while(getch()!=0x1b&&j<=i) Data_Show(j++);
if(j>i) printf("\n\tEnd of e_note\n");
break;
case '2': /*增加通讯录中的记录*/
while(getch()!=0x1b&&i<50)
{ i++;
Data_Input(i);
}
if(i==50)printf("\n\te_note is filled\n");
break;
case '3': /*删除通讯录中的记录*/
if(i<1)
{ printf("\n\tNo records\n");
break;
}
printf("\n\tDelete No:"); /*读入删除位置*/
scanf("%d",&k);
for(j=k;j<i;j++) /*删除位置前的元素顺序前移*/
{ strcpy(friends[j].name,friends[j+1].name);
friends[j].sex=friends[j=1].sex;
friends[j].birth.year=friends[j+1].birth.year;
friends[j].birth.month=friends[j+1].birth.month;
friends[j].birth.day=friends[j+1].birth.day;
strcpy(friends[j].addr.post_num,friends[j+1].addr.post_num);
strcpy(friends[j].addr.addr,friends[j+1].addr.addr);
strcpy(friends[j].telephone,friends[j+1].telephone);
}
i--; /*元素总数减1*/
break;
case '4': /*通讯录查询功能*/
printf("\n\tPlease input name:");
gets(search_name);
for(j=1;j<=i;j++)
{
if(strcmp(search_name,friends[j].name)==0) /*比较字符串*/
{ Data_Show(j); /*查询成功,打印记录结束循环*/
break;
}
}
if(j>1) /*查询失败*/
printf("\n\t No such records") ;
break;
case '5':
printf("\n\tInsert No:"); /*录入插入位置*/
scanf("%d",&k);
for(j=i+1;j<k;j++) /*插入位置后的元素顺序后移*/
{ strcpy(friends[j].name,friends[j-1].name); /*交换元素内容*/
friends[j].sex=friends[j-1].sex;
friends[j].birth.year=friends[j-1].birth.year;
friends[j].birth.month=friends[j-1].birth.month;
friends[j].birth.day=friends[j-1].birth.day;
strcpy(friends[j].addr.post_num,friends[j-1].addr.post_num);
strcpy(friends[j].addr.addr,friends[j-1].addr.addr);
strcpy(friends[j].telephone,friends[j-1].telephone);
}
Data_Input(k);
i++;
break;
case '6': Data_Save();
exit(0); break;
case '7': printf("\n\tDo you want to save e_note:(y/n)");
ch=getch();
if(ch=='y') Data_Save();
fclose(fp);
exit(0);
default: printf("Please choose num 1-4\n"
);
}
}while(1);
}
3.1.2 主函数main()
main()函数主要实现了对整个程序的运行控制,以及相关功能模块的调用。
void main()
{
int j,k;
char ch;
char *search_name;
clrscr();
Data_Load();
i--;
do
{ printf("\n\n\n\tFunction choose:");
printf("\n\t1.Read");
printf("\n\t2.Append");
printf("\n\t3.Delete");
printf("\n\t4.Search");
printf("\n\t5.Insert");
printf("\n\t6.Save and Exit");
printf("\n\t7.Quit");
printf("\n\n");
printf("\tChoice:");
ch=getche();
switch(ch)
{ case '1': j=1; /*显示通讯录中的所有记录*/
while(getch()!=0x1b&&j<=i) Data_Show(j++);
if(j>i) printf("\n\tEnd of e_note\n");
break;
case '2': /*增加通讯录中的记录*/
while(getch()!=0x1b&&i<50)
{ i++;
Data_Input(i);
}
if(i==50)printf("\n\te_note is filled\n");
break;
case '3': /*删除通讯录中的记录*/
if(i<1)
{ printf("\n\tNo records\n");
break;
}
printf("\n\tDelete No:"); /*读入删除位置*/
scanf("%d",&k);
for(j=k;j<i;j++) /*删除位置前的元素顺序前移*/
{ strcpy(friends[j].name,friends[j+1].name);
friends[j].sex=friends[j=1].sex;
friends[j].birth.year=friends[j+1].birth.year;
friends[j].birth.month=friends[j+1].birth.month;
friends[j].birth.day=friends[j+1].birth.day;
strcpy(friends[j].addr.post_num,friends[j+1].addr.post_num);
strcpy(friends[j].addr.addr,friends[j+1].addr.addr);
strcpy(friends[j].telephone,friends[j+1].telephone);
}
i--; /*元素总数减1*/
break;
case '4': /*通讯录查询功能*/
printf("\n\tPlease input name:");
gets(search_name);
for(j=1;j<=i;j++)
{
if(strcmp(search_name,friends[j].name)==0) /*比较字符串*/
{ Data_Show(j); /*查询成功,打印记录结束循环*/
break;
}
}
if(j>1) /*查询失败*/
printf("\n\t No such records") ;
break;
case '5':
printf("\n\tInsert No:"); /*录入插入位置*/
scanf("%d",&k);
for(j=i+1;j<k;j++) /*插入位置后的元素顺序后移*/
{ strcpy(friends[j].name,friends[j-1].name); /*交换元素内容*/
friends[j].sex=friends[j-1].sex;
friends[j].birth.year=friends[j-1].birth.year;
friends[j].birth.month=friends[j-1].birth.month;
friends[j].birth.day=friends[j-1].birth.day;
strcpy(friends[j].addr.post_num,friends[j-1].addr.post_num);
strcpy(friends[j].addr.addr,friends[j-1].addr.addr);
strcpy(friends[j].telephone,friends[j-1].telephone);
}
Data_Input(k);
i++;
break;
case '6': Data_Save();
exit(0); break;
case '7': printf("\n\tDo you want to save e_note:(y/n)");
ch=getch();
if(ch=='y') Data_Save();
fclose(fp);
exit(0);
default: printf("Please choose num 1-4\n"
);
}
}while(1);
}
3.1.3 主菜单界面
用户进入通讯录系统时,需要显示主菜单,提示用户进行选择,完成相应任务。此代码被main()函数调用。
void main()
{
printf("\n\t1.Read");
printf("\n\t2.Append");
printf("\n\t3.Delete");
printf("\n\t4.Search");
printf("\n\t5.Insert");
printf("\n\t6.Save and Exit");
printf("\n\t7.Quit");
printf("\n\n");
printf("\tChoice:");
ch=getche();
switch(ch)
3.1.4读取文件中的记录
检查文件是否存在,建立student.txt文档,用于保存通讯录中的记录。
void Data_Load()
{ int j;
long k;
fp=fopen("friend.txt","r+t"); /*打开文件friend.txt*/
if(fp!=NULL)
{ for(i=1;i<50;i++)
{ j=fgetc(fp);
if(j==EOF) /*判断是否到了文件尾*/
return;
k=i-1;
fseek(fp,k*sizeof(struct friend1),SEEK_SET);
fread(&friends[i],sizeof(struct friend1),1,fp);/*从文件中读取一条记录
*/
}
}
else
{ fp=fopen("friend.txt","w");
i=1;
}
}
}3.1.5 显示所有记录
由于记录显示操作经常进行,所以将这部分由独立的函数来完成,减少代码的重复。排序后更加方便查找所需要的朋友信息,为用户减少不必要的麻烦。
case '1': j=1; /*显示通讯录中的所有记录*/
while(getch()!=0x1b&&j<=i)
Data_Show(j++);
if(j>i) printf("\n\tEnd of e_note\n");
break;
3.1.6 删除学生记录
在删除操作中,系统会按用户要求先找到该学生记录,然后从将后一条记录覆盖过来。
case '3': /*删除通讯录中的记录*/
if(i<1)
{ printf("\n\tNo records\n");
break;
}
printf("\n\tDelete No:"); /*读入删除位置*/
scanf("%d",&k);
for(j=k;j<i;j++) /*删除位置前的元素顺序前移*/
{ strcpy(friends[j].name,friends[j+1].name);
friends[j].sex=friends[j=1].sex;
friends[j].birth.year=friends[j+1].birth.year;
friends[j].birth.month=friends[j+1].birth.month;
friends[j].birth.day=friends[j+1].birth.day;
strcpy(friends[j].addr.post_num,friends
[j+1].addr.post_num);
strcpy(friends[j].addr.addr,friends[j+1].addr.addr);
strcpy(friends[j].telephone,friends[j+1].telephone);
}
i--; /*元素总数减1*/
break;
3.1.7查找学生记录
当通讯记录较多的时候,全部罗列出所有记录太浪费精力,查找则能精确快速的完成这项工作。
case '4': /*通讯录查询功能*/
printf("\n\tPlease input name:");
gets(search_name);
for(j=1;j<=i;j++)
{
if(strcmp(search_name,friends[j].name)==0) /*比较字符串
*/
{ Data_Show(j); /*查询成功,打印记录结束循环*/
break;
}
}
if(j>1) /*查询失败*/
printf("\n\t No such records") ;
break;
3.1.8 插入记录
插入通讯录中的朋友详细信息。
case '5':
printf("\n\tInsert No:"); /*录入插入位置*/
scanf("%d",&k);
for(j=i+1;j<k;j++) /*插入位置后的元素顺序后移*/
{ strcpy(friends[j].name,friends[j-1].name); /*交换元素内
容*/
friends[j].sex=friends[j-1].sex;
friends[j].birth.year=friends[j-1].birth.year;
friends[j].birth.month=friends[j-1].birth.month;
friends[j].birth.day=friends[j-1].birth.day;
strcpy(friends[j].addr.post_num,friends[j-
1].addr.post_num);
strcpy(friends[j].addr.addr,friends[j-1].addr.addr);
strcpy(friends[j].telephone,friends[j-1].telephone);
}
Data_Input(k);
i++;
break;
3.1.9写入记录到文件中。
将所输入的朋友信息保存到frieng.txt中,防止信息丢失。
void Data_Input(int j) /*记录插入函数*/
{
fflush(stdin);
friends[j].number=j;
printf("\n\n\n\tNo %d record",j);
printf("\n\n\tName:"); /*读入姓名*/
scanf("%s",friends[j].name);
fflush(stdin);
printf("\n\tSex(m/f):"); /*读入性别*/
scanf("%c",&friends[j].sex);
printf("\n\t---birthday---"); /*读入出生年月*/
printf("\n\tyear:");
scanf("%d",&friends[j].birth.year);
printf("\n\t\tmonth:");
scanf("%d",&friends[j].birth.month);
printf("\n\t\tday:");
scanf("%d",&friends[j].birth.day);
printf("\n\tPost_number:"); /*读入邮编*/
scanf("%s",friends[j].addr.post_num);
printf("\n\tAddress:"); /*读入家庭地址*/
scanf("%s",friends[j].addr.addr);
printf("\n\ttelephone:"); /*读入联系电话*/
scanf("%s",friends[j].telephone);
printf("y/n");
if( getch()=='n')
main();
}
4程序测试与系统维护
4.1测试主菜单界面
主界面如图4.1
图4.1主界面
4.2测试添加界面
进入添加界面,如图4.2。
图4.2添加界面
4.3测试显示界面
进入显示界面,如图4.3。
图4.3显示界面
4.4测试删除界面
进入删除界面,如图4.4。
图4.4删除界面
4.5测试查询界面
进入查询界面,如图4.5。
图4.5查询界面
4.6测试修改界面
进入修改界面,如图4.6。
图4.6修改界面
4.7测试保存界面
进入保存界面,如图4.7。
图4.7保存界面
需要完整的资料以及源程序可在我的资源里下载。
需要完整的资料可在我的资源里下载,也可以加入我的纷传圈子,里面有资源压缩包的百度网盘下载地址及提取码。
纷传 点击用微信打开即可,过程有点繁琐请见谅。
C语言程序设计--通讯录相关推荐
- c语言通讯录二分查找,C语言程序设计 通讯录程序.doc
<C语言程序设计 通讯录程序.doc>由会员分享,可在线阅读,更多相关<C语言程序设计 通讯录程序.doc(28页珍藏版)>请在人人文库网上搜索. 1.目录:课 程 设 计 任 ...
- c语言通讯录按字母排序,c语言程序设计通讯录.docx
长江大学工程技术学院C语言课程设计实习报告 通讯录管理系统 学生姓名:吴正杰学 号:201461031 序 号:19 专业班级:计科61031 指导老师:刘旨阳 报告日期:2015\7\6 需求分析 ...
- C语言程序设计 | 通讯录管理系统
通讯录可以用来存储个人的信息,每个人的信息包括:姓名.性别.年龄.电话.住址.而一个通讯录的管理系统,应该至少具备增.删.查.改等几项功能,并要对其进行拓展. 所以我们要实现的功能如下: 添加联系人信 ...
- c语言程序设计课程设计通讯录,《C语言程序设计》课程设计-通讯录系统(42页)-原创力文档...
<C语言程序设计>课程设计 学 学 号:________ 姓 名:____ 指导教师:_________ 完成日期:2010.07.03 ______________学校______系__ ...
- C语言程序设计:可存储的通讯录
前言:本章没有使用链表! C语言从入门到精通(鹏哥带你C语言从入门到精通,谭浩强C语言教程C语言程序设计C语言修仙C语言考研计算机二级专升本C语言期末突软考二级C语言考研C语言C语言)_哔哩哔哩_bi ...
- c语言程序设计中北大学,《中北大学软件学院2013届C语言程序设计实训题目.doc...
<中北大学软件学院2013届C语言程序设计实训题目 C语言程序课程设计题目 (孟龙)题目1:年历显示 功能要求: 输入一个年份,输出是在屏幕上显示该年的日历.假定输入的年份在1940-2040年 ...
- c语言高斯白序列x,C语言程序设计程设计指导书(晓庄).doc
C语言程序设计程设计指导书(晓庄) C语言程序设计 课程设计任务书 南京晓庄学院数学与信息技术学院 2011-9-20 一.C语言程序设计课程设计的目的说明 1)复习巩固C语言的基础知识,进一步加深对 ...
- 浙大版《C语言程序设计(第3版)》题目集总表
浙大版<C语言程序设计(第3版)>题目总集 更新中 浙大版<C语言程序设计(第3版)> 练习2-17 生成3的乘方表 练习2-18 求组合数 习题2-1 求整数均值 习题2-2 ...
- c语言程序设计韦良芬答案,论高职院校《C语言程序设计》的教学改革
本文总结了作者多年来从事C语言教学的经验,对教育大众化背景下的C语言教学所遇到的问题进行了反思.在总结教学经验并针对高职教育特点的基础上,提出C语言程序设计课程教学改革的多项方案措施. 维普资讯 ht ...
最新文章
- ffmpeg-20160526-git-bin
- (转载)php array_merge 和 两数组相加区别
- Xss-labs闯关总结
- 全志A33-串口的使用
- VOIP,PSTN,ISDN
- 排序算法之冒泡排序(JAVA)
- Linux openJDK执行javac编译java文件提示command not found
- java synchronized讨论
- RapidMiner介绍与实践(二)贝叶斯分类器
- python数据建模与预测_Python建模复习:预测型数据挖掘
- 自走棋服务器没有响应,从爆火到凉凉,多多自走棋宣布停服,加入腾讯属于无奈?...
- 程序员常用资源工具集合(建议收藏)
- Oracle12c设置PDB企业管理器登录端口
- MATLAB画心形立体图
- Office的Ctrl C,Ctrl V使用过多?一起看看python如何处理
- Bioinformatics生物信息专业相关网址
- 初始化MYSQL时的几个问题
- 机器学习实战——数据探索之数据泄露(Data Leakage)
- 小米平板如何开启位置服务器,小米平板的权限管理在哪里
- 学什么编程语言最有前途?