题目:手机通信录管理系统
一、题目要求
二、需求分析
三、设计步骤/编写代码
四、上机/运行结果
五、总结
一、题目要求
模拟手机通信录管理系统,实现对手机中的通信录进行管理操作。功能要求:
(1)查看功能:A:办公,B:个人,C:商务
(2)增加联系人:录入新数据(姓名,电话,分类,邮箱:weiyang,153********,个人,klyweiwei@163.com)
(3)修改功能:选中某人的姓名,可对其数据进行修改操作
(4)删除功能:选中某人姓名,可对此人的相应数据进行删除,并自动调整后续条目的编号。
二、需求分析
根据题目要求,由于通信录信息是存放在文件中,所以应提供文件的输入、输出等操作;在程序中需要浏览个人的信息,应提供显示、查找、增加、删除等操作;另外还应提供键盘式选择菜单实现功能选择。
三、设计步骤/编写代码
根据上面的需求分析,可以将这个系统的设计分为如下六大模块:查找、增加、修改、删除、显示、退出。如下图示:
1、详细步骤
主函数一般设计得比较简洁,只提供输入,处理和输出部分的函数调用。其中各功能模块用菜单方式选择。主函数流程图如下:
/***************菜单*****************/
void menu() /*主界面*/
{
int n,w1;/*变量n保存选择菜单数字,w判断输入的数字是否在功能菜单对应数字范围内*/
do { puts("\t\t**************MENU****************\n\n"); puts("\t\t\t\t 1. 查询成员资料");
puts("\t\t\t\t 2. 增加一位成员资料");
puts("\t\t\t\t 3. 修改一位成员资料");
puts("\t\t\t\t 4. 删除一位成员资料");
puts("\t\t\t\t 5. 成员总名单查看");
puts("\t\t\t\t 6. 退出系统"); puts("\n\n\t\t*********************************\n"); printf("请选择您要执行的功能(1-6):[ ]\b\b");
scanf("%d",&n);
if(n<||n>)
{
w1=;getchar();
}
else w1=;
}while(w1==);
switch(n)
{case :search();break; /*查看模块*/
case :add();break; /*增加模块*/
case :modify();break; /*修改模块*/
case :del();break; /*删除模块*/
case :browse();break; /*显示模块*/
case :exit(); /*退出*/
}
} /***************主函数****************/ main ()
main ()
{
menu ();
}
2、功能模块设计
(1)查看模块
原始数据只有一类,为个人通讯录信息,Name: person.txt。单独看各数据信息,姓名,分类,电话,邮箱都是字符型,可以采用字符型数组。
要考虑的问题是:一个人的记录从文件中读出来后以什么形式存放?似乎也很容易想到:可以采用结构体的形式。这样把个人通信信息的姓名、电话号码等作为结构体成员不就可以把一个人的信息作为一个整体来处理
了吗?如果要存放若干个人的信息就用结构体数组。
struct person
{
char name[];
char phone[];
char classify[];
char email[];
} per[N];
char A[]={"office"};
char B[]={"personal"};
char C[]={"business"};
per[N]中N为所有记录人的个数,程序中采用宏定义的方式,可以随时在源程序宏定义中改,本程序宏定义#define N 15。同时还定义三种分类:办公类、个人类、商务类。
/***************查看功能**************/
search()
{
void menu();
int n,j,k=-;
char p[];
n=load();
printf("\n\nClassify A:office\nClassify B:single\nClassify C:business\n\n Enter classify that you want to search! Classify:"); /*************输入要找的人的分类*********/
scanf("%s",p);
for(j=;j<n;j++)
if(strcmp(p,per[j].classify)==)
{ k=j;
printf("\n(%d).%s %s\n",j,per[j].name,per[j].phone);
}
if(k==-)
/**********如果要查找的分类不存在,则显示不存在**********/
{
printf("\n\nNO EXIST!");
}
menu();
}
(2)增加模块
该模块的功能是:能录入新数据每个结点包括:姓名,电话号码,分类(办公类、个人类、商务类),电子邮件。当录入重复的姓名和电话号码时,则提示数据录入重复并取消录入;当通讯录中超过15条信息时,存储空间已满,不能再录入新数据;录入的新数据能按递增的顺序自动进行条目编号。
/**************增加功能*********/
void add()
{
void menu();
int n,j;
FILE *fp;
char name[],classify[],email[];
char phone[];
n=load();
printf("\n\nThe name and phone of the person you want to add are:\n\n");
/******输入要增加人的姓名和电话号码******/ scanf("%s%s",name,phone); if((fp=fopen("person.txt","r+"))==NULL)
{
printf("\n\nCan not open!\n\n");
}
for(j=;j<n;j++)
{ if(strcmp(name,per[j].name)==&&strcmp(phone,per[j].phone)==)/*如果输入的姓名和电话已存在,则提示已存在*/
{
printf("\n\nThe message is exist!\n");break;
}
}
if(j==)
{
//if(j>=15)
printf("\n\nThe room is full!\n\n");/*如果记录多余15条,则提示空间已满*/
}
else
{
printf("\nOK!Put the classify and email:\n");
/****如果输入的是新信息,则继续输入这个人的分类和电子邮件*****/ scanf("%s%s",classify,e_mile);
fseek(fp,,);
fprintf(fp,"\n%s %s %s %s",name,phone,classify,email); }
fclose(fp); menu();
(3)修改模块
该模块的功能是:根据选中某人的姓名查找此人的通讯记录,并提示用户修改记录的哪部分信息(姓名,电话,分类,电子邮件)。
/****************修改功能************/
void modify()
{
int i,n,j,c;
char name[];
FILE *fp;
n=load();
printf("\n\nModify by name:\n");
/*****输入要修改人的姓名******/
scanf("%s",name);
if((fp=fopen("person.txt","r+"))==NULL)
{
printf("\n\nCan not open!\n\n");
}
for(j=;j<n;j++)
if(strcmp(name,per[j].name)==)
{
do
{
puts("\nModify by=>\n\n 1).name 2).phone: 3).classify: 4).email:");
printf("Whitch you needed?:[ ]\b\b");
/*******输入要修改的选项********/
scanf("%d",&c);
if(c>||c<)
{
puts("\nChioce error!Please again!");
getchar();
}
}
while(c>||c<);break;
}
do
{
switch(c)
{
case :printf("name");scanf("%s",per[j].name);break;
case :printf("phone");scanf("%s",per[j].phone);break; case :printf("classify");scanf("%s",per[j].classify);break; case :printf("e_mile");scanf("%s",per[j].email);break;
}
}
while(c<||c>);
if(j==n)
printf("\n\nThe name you want is not exist!\n");
for(i=;i<n;i++)
fprintf(fp,"%s %s %s%s\n",per[i].name,per[i].phone,per[i].classify,per[i].email); fclose(fp);
menu ();
}
(4)删除模块
该模块的功能是按用户输入个人的姓名删除此人的全部信息。做法是保存未被删除的所有信息,即实现功能,并且自动调整后续条目的编号。这样比起删除一般做法较为简单。
/******************删除功能****************/
void del()
{
int i,j,n;
FILE *fp;
char name[];
n=load();
printf("\n\nDel by name:");
/******输入要删除人的姓名********/
scanf("%s",name);
if((fp=fopen("person.txt","w"))==NULL)
{
printf("\n\nCan not open!\n\n");
}
for(j=;j<n;j++)
if(strcmp(name,per[j].name)==)
break;
for(i=;i<n;i++) if(i!=j)
/********删除选项,并自动调整其他所有选项*************/ fprintf(fp,"%s%s%s%s\n",per[i].name,per[i].phone,per[i].classify,per[i].email);
fclose(fp);
menu();
}
(5)显示模块
/****************显示功能***************/
void browse()
{
void menu();
int n,i;
n=load();
for(i=;i<n;i++)
{
printf("\n(%d).%s-%s-%s-%s\n",i,per[i].name,per[i].phone,per[i].classify,per[i].email);
}
menu();
}
(6)公共函数
每个模块都会用到的公共函数。加载函数 load()。如下程序用于加载所有记录,并可以返回所有记录的个数。
int load()/**********加载函数**********/
/***********加载所有记录,并且可以返回所有记录的个数********/
{
FILE *fp;
int i;
if((fp=fopen("person.txt","r"))==NULL)
{
printf("\nCannot open file\n");
return ;
}
for(i=;!feof(fp);i++) {
fscanf(fp,"%s%s%s%s",&per[i].name,&per[i].phone,&per[i].classify,&per[i].emai); email);
}
fclose(fp);
return(i);
}
四、上机/运行结果
1、数据
Lic 11111111 A Lic@126.com
WangH 22222222 A WangH@126.com
XvX 33333333 A XvX@126.com
ZhaoL 44444444 B ZhaoL@126.com
ChenG 55555555 B ChenG@126.com
ZhangP 66666666 C ZhangP@126.com
YangW 77777777 C YangW@126.com
LiX 88888888 C LiX@126.com
ZhangR 99999999 C ZhangR@126.com
2、编译、运行
3、结果
(1)主菜单函数
(2)查看模块
输入C
(3)增加模块
。。。
。。。
有兴趣的同学可以测试一下。
五、总结
学以致用,经过上次的电话面试,我下决心一定要把通信录研究透彻。
注意事项:本代码用Dev C++编译。
附录:源代码
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define N 15
struct person
{
char name[10];
char phone[11];
char classify[10];
char email[20];
}per[N];
char A[]={"office"};
char B[]={"personal"};
char C[]={"business"};
int load()//**********加载函数**********/
/***********加载所有记录,并且可以返回所有记录的个数********/
{
FILE *fp;
int i;
if((fp=fopen("person.txt","r"))==NULL)
{
printf("\nCannot open file\n");
return 0;
}
for(i=0;!feof(fp);i++)
fscanf(fp,"%s%s%s%s",&per[i].name,&per[i].phone,&per[i].classify,&per[i].email);
fclose(fp);
return(i);
}
/***************查看功能**************/
search()
{
void menu();
int n,j,k=-1;
char p[10];
n=load();
printf("\n\nClassify A:office\nClassify B:single\nClassify C:business\n\n Enter classify that you want to search! Classify:"); /*************输入要找的人的分类*********/
scanf("%s",p);
for(j=0;j<n;j++)
if(strcmp(p,per[j].classify)==0)
{
k=j;
printf("\n(%d).%s %s\n",j,per[j].name,per[j].phone);
}
if(k==-1)
/**********如果要查找的分类不存在,则显示不存在**********/ {
printf("\n\nNO EXIST!");
}
menu();
}
/**************增加功能*********/
void add()
{
void menu(); int n,j;
FILE *fp;
char name[10],classify[10],email[20];
char phone[11];
n=load();
printf("\n\nThe name and phone of the person you want to add are:\n\n");
/******输入要增加人的姓名和电话号码******/
scanf("%s%s",name,phone);
if(!(fp=fopen("person.txt","r+"))==NULL)
{
printf("\n\nCan not open!\n\n");
}
for(j=0;j<n;j++)
{ if(strcmp(name,per[j].name)==0&&strcmp(phone,per[j].phone)==0)/*如果输入的姓名和电话已存在,则提示已存在*/
{
printf("\n\nThe message is exist!\n");break;
}
}
if(j==15)
{
//if(j>=15)
printf("\n\nThe room is full!\n\n");/*如果记录多余15条,则提示空间已满*/
}
else
{
printf("\nOK!Put the classify and email:\n");
/****如果输入的是新信息,则继续输入这个人的分类和电子邮件*****/ scanf("%s%s",classify,email);
fseek(fp,0,2);
fprintf(fp,"\n%s %s %s %s",name,phone,classify,email); }
fclose(fp);
menu();
}
/****************修改功能************/
void modify()
{
void menu() ;
int i,n,j,c; char name[10];
FILE *fp;
n=load();
printf("\n\nModify by name:\n");
/*****输入要修改人的姓名******/
scanf("%s",name);
if((fp=fopen("person.txt","r+"))==NULL)
{
printf("\n\nCan not open!\n\n");
}
for(j=0;j<n;j++)
if(strcmp(name,per[j].name)==0)
{
do
{ puts("\nModifyby=>\n\n1).name2).phone:3).classify:4).email:"); printf("Whitch you needed?:[ ]\b\b");
/*******输入要修改的选项********/
scanf("%d",&c);
if(c>4||c<1)
{
puts("\nChioce error!Please again!");
getchar();
}
}
while(c>8||c<1);break;
}
do
{ switch(c)
{
case 1:printf("name");scanf("%s",per[j].name);break;
case 2:printf("phone");scanf("%s",per[j].phone);break;
case 3:printf("classify");scanf("%s",per[j].classify);break;
case 4:printf("email");scanf("%s",per[j].email);break;
}
}
while(c<1||c>4);
if(j==n) printf("\n\nThe name you want is not exist!\n"); for(i=0;i<n;i++)
fprintf(fp,"%s %s %s %s\n",per[i].name,per[i].phone,per[i].classify,per[i].email);
fclose(fp);
menu ();
}
/******************删除功能****************/
void del() {
void menu();
int i,j,n;
FILE *fp;
char name[10];
n=load();
printf("\n\nDel by name:");
/******输入要删除人的姓名********/
scanf("%s",name);
if((fp=fopen("person.txt","w"))==NULL)
{
printf("\n\nCan not open!\n\n");
}
for(j=0;j<n;j++)
if(strcmp(name,per[j].name)==0)
break;
for(i=0;i<n;i++) if(i!=j)
/********删除选项,并自动调整其他所有选项*************/
fprintf(fp,"%s%s%s%s\n",per[i].name,per[i].phone,per[i].classify,per[i].email);
fclose(fp);
menu();
}
/****************显示功能***************/
void browse() {
void menu();
int n,i;
n=load();
for(i=0;i<n;i++) {
printf("\n(%d).%s-%s-%s-%s\n",i,per[i].name,per[i].phone,per[i].classify,per[i].email);
}
menu();
}
/***************菜单*****************/
void menu()
{
int n,w1;/*变量n保存选择菜单数字,w判断输入的数字是否在功能菜单对应数字范围内*/
do
{
puts("\t\t**********通讯录主界面**********\n\n");
puts("\t\t\t\t 1. 查询成员资料"); puts("\t\t\t\t 2. 增加一位成员资料");
puts("\t\t\t\t 3. 修改一位成员资料"); puts("\t\t\t\t 4. 删除一位成员资料");
puts("\t\t\t\t 5. 成员总名单查看");
puts("\t\t\t\t 6. 退出系统"); puts("\n\n\t\t*********************************\n"); printf("Choice your number(1-6):[ ]\b\b"); scanf("%d",&n); if(n<1||n>6)
{w1=1;getchar();}
else w1=0;
}
while(w1==1);
switch(n)
{
case 1:search();break; /*查看模块*/
case 2:add();break; /*增加模块*/
case 3:modify();break; /*修改模块*/
case 4:del();break; /*删除模块*/
case 5:browse();break; /*显示模块*/
case 6:exit(0); /*退出*/
}
}
/***************主函数****************/
main ()
{
menu ();
}
今天研究了一下手机通信录管理系统(C语言)的更多相关文章
-
非智能手机通信录备份并还原至Android智能手机方法
随着智能手机早已深入普通用户的生活,2-3线城市的用户也逐渐从使用非智能机换成使用智能机.最近便遇见了这样一个转移通讯录的需求.之前使用的手机型号是BBK K201,通信录中绝大部分保存在了手机中,最 ...
-
锐动视频SDK在金融业务加密双录管理系统通用解决方案
为了更好地保障消费者的合法权益,银监会和保监会提出了要求,在银行.保险从业人员销售理财产品或代理其他机构销售产品时,同期进行录音录像,确保销售人员按程序.按规定介绍产品,以便购买者更清楚地了解产品的性 ...
-
通信录列表+复杂Adapter分析
概述 最近写论文之余玩起了github,发现有个citypicker挺不错的,高仿了美团城市选择和定位的一些功能 地址链接 效果图如下: 自己手动写了一遍优化了一些内容,学到了一些姿势,下面对其中一些 ...
-
黎活明8天快速掌握android视频教程--22_访问通信录中的联系人和添加联系人
Android系统中联系人的通讯录的contentProvide是一个单独的apk,显示在界面的contact也是一个独立的apk,联系人apk通过contentProvide访问底层的数据库. 现在 ...
-
(五)backbone - DEMO - 通信录改造之使用requirejs
DEMO介绍是 DEMO通信录的扩展,使用requirejs模块化整合 大体实现 • model文件 model/contact.js define(function (){ // user cont ...
-
管理Android通信录
Android提供了Contacts应用程序来管理联系人,并且Android系统还为联系人管理提供了ContentProvider,这就同意其他应用程序以ContentResolver来管理联系人数据 ...
-
iphone手机怎么录屏 两种方法任你挑选
iphone手机怎么录屏呢?苹果手机拥有独特的Airlay镜像投屏,AirPlay的工作原理是当iPhone或IPAD与支持AirPlay技术的硬件,比如Apple TV等设备处在同一个wife的情况 ...
-
iOS:通信录(完成)(18-01-18更)
1.读取通信录 1).9.0以前:AddressBook 2).9.0以后:Contacts 2.调用通信录UI(不弄) 1).9.0以前:AddressBookUI 2).9.0以后:Contact ...
-
研究实验1_搭建一个精简的C语言开发环境(包含部分经典的前言)
综合研究: 在这部分内容中,将启示我们如何进行独立研究和深度思考(一定要注意这一点,相应的调整自己的学习思想).同时使我们: (1)认识到汇编语言对于深入理解其他领域知识的 ...
随机推荐
-
Shell基础学习小结
0 shell基础概念 Shell是解释性语言,使用脚本编程语言的好处是,它们多半运行在比编译型语言还高的层级,能够轻易处理文件与目录之类的对象:缺点是它们的效率通常不如编译型语言.Shell命令有本 ...
-
大视野3562 [SHOI2014]神奇化合物
http://www.lydsy.com/JudgeOnline/problem.php?id=3562 //Accepted 6020 kb 1012 ms //由于题目的特殊要求:然而,令科学家们 ...
-
jQuery iframe之间相互调用
,子iframe内调用父类函数方法: window.parent.func(); ,子Iframe中获取父界面的元素: $("#xx", window.parent.documen ...
-
java-String基础篇
一.String字符串理解 java字符串类,包含了字符串的值和实现字符串相关操作的一些方法 1.String字符串可分静态字符串和动态字符串 静态初始化字符串:String s1 = "h ...
-
Warning: Invalid argument supplied for foreach()
经常对提交过来的数据进行双重循环,但是为空时会报错:Warning: Invalid argument supplied for foreach() 如下解决即可:foreach($data[$i] ...
-
python xpath
提取Item 选择器介绍 我们有很多方法从网站中提取数据.Scrapy 使用一种叫做 XPath selectors的机制,它基于 XPath表达式.如果你想了解更多selectors和其他机制你可以 ...
-
使用Git简单笔记
这里只是作为简单的笔记整理,第一次使用的推荐先看一下廖大的教程,内容很多很细,可以边看边练.看不懂的地方先记着.争取七七八八看下来. ================================= ...
-
Java基础---Java---面试题---交通灯管理系统(面向对象、枚举)
交通灯管理系统的项目需求: 模拟实现十字路口的交通灯管理系统逻辑,具体需求如下: 1.异步随机生成按照各个路线行驶的车辆 例如: 由南向而来去往北向的车辆-----直行车辆 由西向而来去往南 ...
-
Python_程序实现发红包
发红包 200块钱 20个红包 将200块随机分成20份 基础版本: import random ret = random.sample(range(1, 200 * 100), 19) ret = ...
-
任意输入一串字符串,求该字符串中字符的出现次数并打印出来,如输入“bcaba”输出:b 2 c 1 a 2
前言:其实我还是有点不懂,有点郁闷了,算了直接把代码放上去把. 方法一: Scanner input=new Scanner(System.in); System.out.println(" ...