今天研究了一下手机通信录管理系统(C语言)

题目:手机通信录管理系统

一、题目要求

二、需求分析

三、设计步骤/编写代码

四、上机/运行结果

五、总结

一、题目要求

  模拟手机通信录管理系统,实现对手机中的通信录进行管理操作。功能要求:

    (1)查看功能:A:办公,B:个人,C:商务

    (2)增加联系人:录入新数据(姓名,电话,分类,邮箱:weiyang,153********,个人,[email protected])

    (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<1||n>5)
{
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 ()
main ()
{
menu ();
}

  2、功能模块设计

    (1)查看模块

     原始数据只有一类,为个人通讯录信息,Name: person.txt。单独看各数据信息,姓名,分类,电话,邮箱都是字符型,可以采用字符型数组。

要考虑的问题是:一个人的记录从文件中读出来后以什么形式存放?似乎也很容易想到:可以采用结构体的形式。这样把个人通信信息的姓名、电话号码等作为结构体成员不就可以把一个人的信息作为一个整体来处理

了吗?如果要存放若干个人的信息就用结构体数组

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"};    

    per[N]中N为所有记录人的个数,程序中采用宏定义的方式,可以随时在源程序宏定义中改,本程序宏定义#define N 15。同时还定义三种分类:办公类、个人类、商务类。

/***************查看功能**************/
 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();
}

    (2)增加模块

     该模块的功能是:能录入新数据每个结点包括:姓名,电话号码,分类(办公类、个人类、商务类),电子邮件。当录入重复的姓名和电话号码时,则提示数据录入重复并取消录入;当通讯录中超过15条信息时,存储空间已满,不能再录入新数据;录入的新数据能按递增的顺序自动进行条目编号。   

/**************增加功能*********/
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,e_mile);
   fseek(fp,0,2);
  fprintf(fp,"\n%s %s %s %s",name,phone,classify,email);          }
   fclose(fp); menu(); 

    (3)修改模块

      该模块的功能是:根据选中某人的姓名查找此人的通讯记录,并提示用户修改记录的哪部分信息(姓名,电话,分类,电子邮件)。

/****************修改功能************/
void modify()
 {
 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("\nModify by=>\n\n  1).name 2).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("e_mile");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 ();
 }

    (4)删除模块

     该模块的功能是按用户输入个人的姓名删除此人的全部信息。做法是保存未被删除的所有信息,即实现功能,并且自动调整后续条目的编号。这样比起删除一般做法较为简单。

/******************删除功能****************/
 void del()
 {
 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();
} 

    (5)显示模块     

/****************显示功能***************/
  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();
}

    (6)公共函数

      每个模块都会用到的公共函数。加载函数 load()。如下程序用于加载所有记录,并可以返回所有记录的个数。

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].emai); email);
 }
fclose(fp);
 return(i);
}

  四、上机/运行结果

    1、数据        

Lic  11111111 A  [email protected]
WangH 22222222 A [email protected]
XvX 33333333 A [email protected]
ZhaoL 44444444 B [email protected]
ChenG 55555555 B [email protected]
ZhangP 66666666 C [email protected]
YangW 77777777 C [email protected]
LiX 88888888 C [email protected]
ZhangR 99999999 C [email protected]

    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 ();
}

时间: 2024-10-26 04:20:12

今天研究了一下手机通信录管理系统(C语言)的相关文章

锐动视频SDK在金融业务加密双录管理系统通用解决方案

为了更好地保障消费者的合法权益,银监会和保监会提出了要求,在银行.保险从业人员销售理财产品或代理其他机构销售产品时,同期进行录音录像,确保销售人员按程序.按规定介绍产品,以便购买者更清楚地了解产品的性质和自身享有的权利.承担的责任和风险. 加密双录管理系统的设计主要就是为了配合银行.证券及保险机构业务部门达到银监会.保监会提出"双录"措施要求.整套系统完全采用自有研发的视频多端核心技术实现,分为前端应用系统和后端文件上传管理系统两个部分. 一.前端应用系统(提供两种解决方案) 1.全定

研究一下,手机边充电边用到底好不好

作者:iamlaosong 手机边充电边用到底好不好?百度了一下这个问题,结果大部分答案都是不好,往小了说,缩短电池寿命,往大了说电池爆炸.辐射增加等等,那么,情况到底怎样呢,我们分析一下: 1.从日常使用的经验来看:第一,笔记本也可以边用边充电,在进行大运算量时,电流也会突然加大,笔记本为啥就没事?第二,当手机通过数据线连接到电脑时,也会充电,也会对手机存储器进行操作,难道不是边充电边用?其三,充电的时候,手机并没有关机,程序依然在运行,即便我们不做任何操作,操作系统难道不工作? 2.从电路原

管理Android通信录

Android提供了Contacts应用程序来管理联系人,并且Android系统还为联系人管理提供了ContentProvider,这就同意其他应用程序以ContentResolver来管理联系人数据. 关于ContentProvider.ContentResolver和Uri具体解释大家能够參考http://blog.csdn.net/fengyuzhengfan/article/details/37743963.这里就不在过多的陈述了. 先送上实例执行效果图: 在对联系人进行操作之前,先让我

PLC如何和手机通信

PLC如何和手机通信,从而可以及时的了解PLC各个参数 一.如果报警点数不多,可以选用DTP-RE+B短信测控终端.可以直接接PLC的开关量输出,简单设置,完成短信发送 二.如果点数很多,可以借助组态软件来处理,先通过组态软件将PLC的数据采集上来处理,需要发短信的时候触发组态专用终端DTP-S09C. 三.方案说明(如有疑问请加QQ1752498741) 1. 短信测控终端简介:<DTP_RE+系列一体化短信测控报警终端使用说明>2. 短信PLC方案说明: <PLC收发短信的方案-RE

使用第三方框架RHAddressBook来获取通信录

官方地址:https://github.com/heardrwt/RHAddressBook 1.安装配置:http://rheard.com/blog/using-static-ios-libraries/ 主要步骤 http://rheard.com/skitch/UsingStaticLibraries1-20121104-223027.png http://rheard.com/skitch/UsingStaticLibraries2-20121104-223532.png http:/

蓝牙模块与手机通信

1.通信前必须具备东西: (1)  蓝牙串口模块: (2)  安卓系统并带有蓝牙的手机: (3)  串口调试软件: (4)  蓝牙测试软件: 配置蓝牙串口模块: 这里把蓝牙串口模块配置成从机模式,具体设置过程如下: (1)  让蓝牙串口模块进入命令设置状态,具体操作是:按着模块上唯一的按键不放,用USB接口给模块上电,这时正确的情景是模块上的LED灯是长亮几秒后熄灭再循环的.如果出现灯快速闪烁的情况,证明模块并未进入命令设置状态,断电重复上述操作即可. (2)  将模块通过串口线与电脑连接:成功

(五)backbone - DEMO - 通信录改造之使用requirejs

DEMO介绍是 DEMO通信录的扩展,使用requirejs模块化整合 大体实现 • model文件 model/contact.js 1 define(function (){ 2 // user contact 3 var Contact = (function(){ 4 var _c = Backbone.Model.extend({ 5 defaults: { 6 name: '小强', 7 email: '小强@无敌.com' 8 }, 9 // validate user name

哪种安卓手机游戏录屏更好?

安卓手机录屏软件大家都知道很多,关于安卓录屏软件很多人都找不到可以录制游戏的软件.有的手机自带录屏软件,而有些手机不带录屏软件,想用手机录制游戏全过程,却不知所措,针对大家的烦恼,小编也是精挑细选的找出了这样一款神奇的软件,想知道是什么软件吗?来一起接着看下去. 录屏大师http://www.xunjieshipin.com/download-airscreen 安卓录屏软件http://www.pc6.com/softview/SoftView_600540.html 软件介绍: 迅捷录屏大师

iphone手机怎么录屏 两种方法任你挑选

iphone手机怎么录屏呢?苹果手机拥有独特的Airlay镜像投屏,AirPlay的工作原理是当iPhone或IPAD与支持AirPlay技术的硬件,比如Apple TV等设备处在同一个wife的情况下,iPhone或IPAD就会触发AirPlay功能.我们可以通过在电脑上安装支持AirPlay的软件来间接实现这个功能! 使用工具:手机&网络 方法一:手机自带屏幕录制 1.打开iphone手机,进入设置,选择控制中心: 2.在控制中心中,选择自定控制: 3.在自定控制,选择屏幕录制,点击左侧的添