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

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

一、题目要求

二、需求分析

三、设计步骤/编写代码

四、上机/运行结果

五、总结

一、题目要求

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

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏owent

给客户端写得LRU缓存

由于我们的客户端的元素和资源比较多,cocos框架的各种库质量参差不齐,导致了有些地方加载速度实在很慢。并且没有一个统一的内存管理机制导致了整个内存占用不太好控...

1141
来自专栏沃趣科技

按 host 分组统计视图 | 全方位认识 sys 系统库

在上一篇《配置表 | 全方位认识 sys 系统库》中,我们介绍了sys 系统库的配置表,但实际上我们大部分人大多数时候并不需要去修改配置表,直接使用sys 系统...

1664
来自专栏彭湖湾的编程世界

【npm】伙计,给我来一杯package.json!不加糖

前言:夜深了,我熬了一锅热气腾腾的package.json,给大家端上来,希望大家喜欢 json和JS对象的区别 package.json,顾名思义,它是一个j...

2016
来自专栏坚毅的PHP

进程、线程、轻量级进程、协程和go中的Goroutine 那些事儿

电话面试被问到go的协程,曾经的军伟也问到过我协程。虽然用python时候在Eurasia和eventlet里了解过协程,但自己对协程的概念也就是轻量级线程,还...

4923
来自专栏专业duilib使用+业余界面开发

mysql5.7 安装,服务启动失败无data目录处理

2443
来自专栏开发与安全

套接字socket 的地址族和类型、工作原理、创建过程

注:本分类下文章大多整理自《深入分析linux内核源代码》一书,另有参考其他一些资料如《linux内核完全剖析》、《linux c 编程一站式学习》等,只是为...

28111
来自专栏杨建荣的学习笔记

海量数据迁移之使用分区并行切分导入(r2笔记79天)

在之前的章节中讨论过怎么把一个很大的分区表切分为若干的dump文件,在数据加载的时候能够同时做基于每个分区的数据导入,如果有些分区比较大,有几十个dump文件,...

3637
来自专栏达摩兵的技术空间

vue项目实践003

通过本问将看到我在vue的项目中,进行的一系列的项目优化,然后看到不同的维度将这些点进行分类。

1392
来自专栏kl的专栏

java解析xlxs、xls文件的利器sep4J

今天分享一个解析xls文件的项目,封装了Apache poi工具,想学习源码的可以看下面项目地址。此项目提供了强大的数据映射api接口,支持xls行数据映射到j...

3555
来自专栏大内老A

《WCF技术剖析》博文系列汇总[持续更新中]

近半年以来,一直忙于我的第一本WCF专著《WCF技术剖析(卷1)》的写作,一直无暇管理自己的Blog。在《WCF技术剖析(卷1)》写作期间,对WCF又有了新的感...

1768

扫码关注云+社区

领取腾讯云代金券