专栏首页测试开发架构之路今天研究了一下手机通信录管理系统(C语言)

今天研究了一下手机通信录管理系统(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 条评论
登录 后参与评论

相关文章

  • 验证 结构体指针与自增运算符

    #include <stdio.h> #include <stdlib.h> int main() { struct student { char *...

    互联网金融打杂
  • 为什么软件开发者不能测试自己编写的代码?

    概述:虽然软件开发者与软件测试人员的工作有很大不同,但是他们都在努力用各自的方式去实现提高软件性能的相同目标。软件测试不是一个简单的流程,它特立独行,并贯穿于整...

    互联网金融打杂
  • 软件测试行业趋势分析和思考

    软件测试行业趋势分析和思考 1   绪论 本文先对互联网对时代和社会变革进行了论述,然后再由互联网时代对软件工业模式变革进行了介绍,最后引出附属于软件工业的测试...

    互联网金融打杂
  • 一切都要从MyCat的配置说起

    用于定义逻辑库,name属性定义逻辑库的名字,sqlMaxLimit定义限制返回结果集的行数,如果-1表示关闭limit限制。

    用户7386338
  • python变量、语句

    mwangblog
  • 苹果与Google的文化之咒

    我们常说要居安思危。但是对于许多伟大的公司来说,最大的问题是他们看不到危机的存在。为什么会看不到危机?因为根深蒂固的文化已经让组织所有人都形成了一组基本的假设,...

    华章科技
  • Flex开发中使用Ant编译.mxml成.swf后,在.swf里使用Session的解决方法 博客分类: RIA FlexAntServl

    Flex开发中使用Ant编译.mxml成.swf后,在.swf里使用Session的解决方法

    阿敏总司令
  • 搭建 WPF 上的 UI 自动化测试框架

    简要说明 OEA 1.0-2.0 框架中,界面都是以 WPF 技术作为基础平台开发的。我们需要对开发出来的系统进行自动化测试,而 .NET 平台的自动化测试平...

    用户1172223
  • 软件测试的7个基本原则

    软件测试的原则是指帮助测试团队有效地利用他们的时间和精力来发现测试项目的隐藏bug的指导方针。从实际的实践和研究中,研究了以下 7 条软件测试的基本原则,以便测...

    软测小生
  • Appium系列|Appium测试框架完善(一)

    这个章节我们主要回来介绍下测试脚本批量执行,在实际项目过程中我们有可能需要指定测试脚本的执行顺序以及执行哪些测试脚本,这里我们会借助TestNG的suite来完...

    测试邦

扫码关注云+社区

领取腾讯云代金券