“通讯录”代码的阅读、分析和运行

*软件工程综合实践专题  第一次作业

*软件来源:徐明煜

*软件内容:“通讯录”

一. 他人的程序:

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

struct Tel

{

       char num[4];

       char name[13];

       char phone1[25];

       char mail[20];

       char address[23];

}tel[30];

int size=10;

int main()

{

       void add();

       void del(struct Tel *p);

       void change();

       void px();

       void search();

       int scan();

       int save();

       int n;

       printf("1---加入一个新电话号码\n2---删除一个电话号码\n3---修改功能\n4---排序功能\n5---查询功能\n0---退出\n请选择:");

       scanf("%d",&n);

       switch(n)

       {

              case 1:add();break;

              case 2:del(tel);break;

              case 3:change();break;

              case 4:px();break;

              case 5:search();break;

              case 0: return 0;

              default: printf("输入有误");break;

       }

       system("pause");

       return 0;

}

void add()

{

       scan();

       char name1[20],a[12];

       int i;

       struct Tel *p=tel;

       printf("输入你要添加号码的人的名字");

    scanf("%s",name1);

    printf("输入你要添加的号码");

       scanf("%s",a);

       for(i=0;i<size;i++,p++)

       {

              if(strcmp(name1,p->name)==0)

              {

                     strcat(p->phone1,a);

                     break;

              }

       }

       if(save())

       {

              display();

              printf("添加成功\n");

       }     

       else

              printf("添加失败\n");

      

    fflush(stdin);

}

void del(struct Tel *p)

{

       scan();

       int i;

       char a[20];

       printf("请输入你想要删除电话的人名:");

       scanf("%s",a);

       for(p=tel;p<=tel+size-1;p++)

       {

              if(strcmp((*p).name,a)==0)

                     for(i=0;i<12;i++)

                            p->phone1[i]=' ';

       }

       if(save())

       {

              display();

              printf("删除成功\n");

       }     

       else

              printf("删除失败\n");

      

    fflush(stdin);        

}

/*void display()

{

       FILE *fp;

       char ch;

       char *file_path = "phone.txt";

       if((fp=fopen(file_path,"r"))!=NULL)

       {

           while((ch=fgetc(fp))!=EOF)

                     printf("%c",ch);

           fclose(fp);      

       }

       else

       {

              printf("error");

              exit(0);

       }     

       printf("\n");   

}*/

void change()

{

       scan();

       struct Tel *p=tel;

       int n;

       char str[30],a[10];

       printf("请输入修改者序号:");

       scanf("%d",&n);

       printf("请输入修改名称:");

       scanf("%s",a);

       printf("\n");

       printf("请输入修改内容:");

       scanf("%s",str);

       p=p+n-1;

       if(n<=size)

       {

              if(strcmp(a,"name")==0)

              {

                     memset(&p->name,0,sizeof(p->name));

                     strcpy(p->name,str);

              }            

              else if(strcmp(a,"phone1")==0)

              {

                     memset(&p->phone1,0,sizeof(p->phone1));

                     strcpy(p->phone1,str);

              }     

              else if(strcmp(a,"mail")==0)

              {

                     memset(&p->mail,0,sizeof(p->mail));

                     strcpy(p->mail,str);

              }                   

              else if(strcmp(a,"address")==0)

              {

                     memset(&p->address,0,sizeof(p->address));

                     strcpy(p->address,str);

              }     

              else

                     printf("error\n");

       }

       else

              printf("error\n");

       if(save())

       {

              display();

              printf("修改成功\n");

       }     

       else

              printf("修改失败\n");

      

    fflush(stdin);        

}

void px()

{

 void pxtele();

 void pxname();

 scan();

 char s[5];

 int n,i;

 printf("请选择排序方式(tele/name):");

 scanf("%s",s);

 printf("\n");

 if(strcmp("tele",s)==0)

    pxtele();

 else if(strcmp("name",s)==0)

    pxname();

 

}

void pxtele()

{

 struct Tel t;

 int i,j,k;

 for(j=0;j<size-1;j++)

    {

 k=j;

    for(i=j+1;i<size;i++)

        if(strcmp(tel[i].phone1,tel[k].phone1)<0)

            k=i;

    if(k!=j)

    {

    t=tel[j];

    tel[j]=tel[k];

    tel[k]=t;

    }     

    }

 if(save())

 {

  display();

  printf("排序成功\n");

 }

 else

  printf("排序失败\n");

    fflush(stdin);

}

void pxname()

{

 struct Tel t;

 int i,j,k;

 for(j=0;j<size-1;j++)

    {

 k=j;

    for(i=j+1;i<size;i++)

        if(strcmp(tel[i].name,tel[k].name)<0)

            k=i;

    if(k!=j)

    {

    t=tel[j];

    tel[j]=tel[k];

    tel[k]=t;

    }     

    }

 if(save())

 {

  display();

  printf("排序成功\n");

 }

 else

  printf("排序失败\n");

    fflush(stdin);

}

void search()

{

       void searchname();

       void searchphone();

       scan();

       int n;

       printf("1---按姓名查询\n2---按电话查询\n");

       scanf("%d",&n);

       switch(n)

       {

              case 1:searchname();break;

              case 2:searchphone();break;

              default: printf("输入有误");break;

       }

}

void searchname()

{

       struct Tel *p=tel;

       int i,flag;

       char str[14];

       printf("请输入要查询内容:");

       scanf("%s",str);

       for(i=0;i<size;i++,p++)

       {

              if(strcmp(p->name,str)==0)

              {

                     flag=1;

                     break;

              }     

              else

                     flag=0;

       }

       if(flag)

              printf("%s\t%s\t%s\t%s\t%s\n",p->num,p->name,p->phone1,p->mail,p->address);

       else

              printf("查询错误!\n");

}

void searchphone()

{

       struct Tel *p=tel;

       int i,flag;

       char str[12];

       printf("请输入要查询内容:");

       scanf("%s",str);

       for(i=0;i<size;i++,p++)

       {

              if(strcmp(p->phone1,str)==0)

              {

                     flag=1;

                     break;

              }

              else

                     flag=0;

       }

       if(flag)

              printf("%s\t%s\t%s\t%s\t%s\n",p->num,p->name,p->phone1,p->mail,p->address);

       else

              printf("查询错误!\n");

}

int scan()

{

       FILE *fp;

       struct Tel *p=tel;

       int i;

       char *file_path = "phone.txt";

       fp=fopen(file_path,"r");

       if(fp==NULL)

       {

              printf("文件打开失败\n");

              return 0;

       }     

       else

       {

              for(i=0;i<size;i++,p++)

                     fscanf(fp,"%s\t%s\t%s\t%s\t%s\n",p->num,p->name,p->phone1,p->mail,p->address);

              fclose(fp);

              return 1;

       }     

}

int save()

{

       struct Tel *p=tel;

       FILE *fp;

       int i;

       char *file_path = "phone.txt";

       fp=fopen(file_path,"w+");

       if(fp==NULL)

       {

              printf("文件打开失败\n");

              return 0;

       }     

       else

       {

              for(i=0;i<size;i++,p++)

                     fprintf(fp,"%s\t%s\t%s\t%s\t%s\n",p->num,p->name,p->phone1,p->mail,p->address);

              fclose(fp);

              return 1;

       }     

}

 

 

二.理解(注释)并增加显示功能(红字):

/*该程序的主要功能为电话号码的增加和删除、显示所有通讯录信息、修改、排序、查询信息等,通讯录的初始信息保存在“phone.txt”中,各个功能的函数通过读写“phone.txt”实现*/

#include <stdio.h>           //该程序主要实现通讯录的基本功能

#include <stdlib.h>

#include <string.h>

 

struct Tel                    //结构体

{

  char num[4];

  char name[13];

  char phone1[25];

  char mail[20];

  char address[23];

}tel[30];

 

int size=10;

void display();

 

int main()                  //主函数

{

  void add();                //调用各个功能的函数

  void del(struct Tel *p);

  void change();

  void px();

  void search();

  int scan();

  int save();

  int n;

  printf("1---加入一个新电话号码\n2---删除一个电话号码\n3---显示所有电话号码\n4---修改功能\n5---排序功能\n6---查询功能\n0---退出\n请选择:");

  scanf("%d",&n);                               //输出菜单界面

  switch(n)                                         //switch,case语句,实现不同功能的选择

  {

         case 1:add();break;

         case 2:del(tel);break;

         case 3:display();break;

         case 4:change();break;

         case 5:px();break;

         case 6:search();break;

         case 0: return 0;

         default: printf("输入有误");break;

  }

  system("pause");           //暂停窗口

  return 0;

}

 

void add()               //功能1:加入新的电话号码

{

  scan();

  char name1[20],a[12];

  int i;

  struct Tel *p=tel;

  printf("输入你要添加号码的人的名字");

    scanf("%s",name1);

    printf("输入你要添加的号码");

  scanf("%s",a);                                                  //该功能主要实现对已存在的联系人添加其电话号码

  for(i=0;i<size;i++,p++)

  {

         if(strcmp(name1,p->name)==0)

         {

                strcat(p->phone1,a);

                break;

         }

  }

  if(save())

  {

         display();

         printf("添加成功\n");

  }     

  else

         printf("添加失败\n");

 

    fflush(stdin);   

}

 

void del(struct Tel *p)                                    //功能2:删除一个电话号码

{

  scan();

  int i;

  char a[20];

  printf("请输入你想要删除电话的人名:");

  scanf("%s",a);

  for(p=tel;p<=tel+size-1;p++)                      //删除已存在联系人的电话号码

  {

         if(strcmp((*p).name,a)==0)

                for(i=0;i<12;i++)

                       p->phone1[i]=' ';

  }

  if(save())

  {

         display();

         printf("删除成功\n");

  }     

  else

         printf("删除失败\n");

 

    fflush(stdin);          

}

 

void display()                                           //调取文件并显示文件中的所有信息

{

  FILE *fp;

  char ch;

  char *file_path = "phone.txt";

  if((fp=fopen(file_path,"r"))!=NULL)                     //打开文件成功

  {

      while((ch=fgetc(fp))!=EOF)

                printf("%c",ch);

      fclose(fp);      

  }

  else                                                                     //打开文件失败

  {

         printf("error");

         exit(0);

  }     

  printf("\n");   

}

 

void change()                                                             //修改电话簿中的信息

{

  scan();

  struct Tel *p=tel;

  int n;

  char str[30],a[10];

  printf("请输入修改者序号:");

  scanf("%d",&n);

  printf("请输入修改名称:");

  scanf("%s",a);

  printf("\n");

  printf("请输入修改内容:");

  scanf("%s",str);

  p=p+n-1;

  if(n<=size)

  {

         if(strcmp(a,"name")==0)

         {

                memset(&p->name,0,sizeof(p->name));

                strcpy(p->name,str);

         }            

         else if(strcmp(a,"phone1")==0)

         {

                memset(&p->phone1,0,sizeof(p->phone1));

                strcpy(p->phone1,str);

         }     

         else if(strcmp(a,"mail")==0)

         {

                memset(&p->mail,0,sizeof(p->mail));

                strcpy(p->mail,str);

         }                   

         else if(strcmp(a,"address")==0)

         {

                memset(&p->address,0,sizeof(p->address));

                strcpy(p->address,str);

         }     

         else

                printf("error\n");

  }

  else

         printf("error\n");

  if(save())

  {

         display();

         printf("修改成功\n");

  }     

  else

         printf("修改失败\n");

 

    fflush(stdin);          

}

void px()                                                                       //排序

{

 void pxtele();

 void pxname();

 scan();

 char s[5]; 

 int n,i;

 printf("请选择排序方式(tele/name):");

 scanf("%s",s);

 printf("\n");

 if(strcmp("tele",s)==0)                                               //根据电话号码由小到大排序

    pxtele();

 else if(strcmp("name",s)==0)                                   //根据名字的首字母排序

    pxname();

 

}

void pxtele()

{

 struct Tel t;

 int i,j,k;

 for(j=0;j<size-1;j++)

    {

 k=j;

    for(i=j+1;i<size;i++)

        if(strcmp(tel[i].phone1,tel[k].phone1)<0)      //选择排序

            k=i;

    if(k!=j)

    {

    t=tel[j];

    tel[j]=tel[k];

    tel[k]=t;

    }     

    }

 if(save())

 {

  display();

  printf("排序成功\n");

 }

 else

  printf("排序失败\n");

    fflush(stdin);

}

void pxname()

{

 struct Tel t;

 int i,j,k;

 for(j=0;j<size-1;j++)

    {

 k=j;

    for(i=j+1;i<size;i++)

        if(strcmp(tel[i].name,tel[k].name)<0)        //选择排序

            k=i;

    if(k!=j)

    {

    t=tel[j];

    tel[j]=tel[k];

    tel[k]=t;

    }     

    }

 if(save())

 {

  display();

  printf("排序成功\n");

 }

 else

  printf("排序失败\n");

    fflush(stdin);

}

 

void search()                                                       //查询

{

  void searchname();

  void searchphone();

  scan();

  int n;

  printf("1---按姓名查询\n2---按电话查询\n");

  scanf("%d",&n);                                                 //输入1,按姓名查询 ;输入2,按电话查询

  switch(n)

  {

         case 1:searchname();break;

         case 2:searchphone();break;

         default: printf("输入有误");break;

  }

}

void searchname()                                                 //输入姓名,查询到该姓名的所有信息

{

  struct Tel *p=tel;

  int i,flag;

  char str[14];

  printf("请输入要查询内容:");

  scanf("%s",str);

  for(i=0;i<size;i++,p++)

  {

         if(strcmp(p->name,str)==0)

         {

                flag=1;

                break;

         }     

         else

                flag=0;

  }

  if(flag)

         printf("%s\t%s\t%s\t%s\t%s\n",p->num,p->name,p->phone1,p->mail,p->address);

  else

         printf("查询错误!\n");

}

 

void searchphone()                                                    //输入电话,查询该电话的所有信息

{

  struct Tel *p=tel;

  int i,flag;

  char str[12];

  printf("请输入要查询内容:");

  scanf("%s",str);

  for(i=0;i<size;i++,p++)

  {

         if(strcmp(p->phone1,str)==0)

         {

                flag=1;

                break;

         }

         else

                flag=0;

  }

  if(flag)

         printf("%s\t%s\t%s\t%s\t%s\n",p->num,p->name,p->phone1,p->mail,p->address);

  else

         printf("查询错误!\n");

}

 

int scan()

{

  FILE *fp;

  struct Tel *p=tel;

  int i;

  char *file_path = "phone.txt";

  fp=fopen(file_path,"r");                                       //读取文件“phone.txt”

  if(fp==NULL)

  {

         printf("文件打开失败\n");

         return 0;

  }     

  else

  {

         for(i=0;i<size;i++,p++)

                fscanf(fp,"%s\t%s\t%s\t%s\t%s\n",p->num,p->name,p->phone1,p->mail,p->address);

         fclose(fp);                                                            //关闭“phone.txt”

         return 1;

  }     

}

 

int save()

{

  struct Tel *p=tel;

  FILE *fp;

  int i;

  char *file_path = "phone.txt";

  fp=fopen(file_path,"w+");                                            //改写文件“phone.txt”

  if(fp==NULL)

  {

         printf("文件打开失败\n");

         return 0;

  }     

  else

  {

         for(i=0;i<size;i++,p++)

                fprintf(fp,"%s\t%s\t%s\t%s\t%s\n",p->num,p->name,p->phone1,p->mail,p->address);

         fclose(fp);

         return 1;

  }     

}

 

三.测试用例:

测试用例ID

场景

测试步骤

预期结果

备注

TC1

初始页面显示

运行程序

页面元素完整,显示与详细设计一致

 

TC2

加入一个新的电话号码

键盘输入1;

其次输入要添加号码者的姓名;最后输入要添加的电话号码

成功给指定者添加了新的号码

 

TC3

删除一个电话号码

键盘输入2;

其次输入要删除号码者的姓名;最后输入要删除的电话号码

成功删除了指定者的号码

 

TC4

显示所有的电话号码

键盘输入3

成功显示所有信息

 

TC5

修改电话簿中的内容

键盘输入4;输入需修改者的序号;输入修改内容(如name);最后输入要修改的信息

成功修改指定信息

 

TC6

根据电话或名字首字母排序

键盘输入5;

其次选择按电话或姓名排序

成功按照指定方式排序

 

TC7

查询电话簿中的信息

键盘输入6;

其次选择1或2;最后输入要查询的内容

成功查询到指定内容

 

TC8

退出程序

键盘输入0

成功退出程序

 

 四.心得体会:

1.了解了他人编写代码的思路和风格,理解、分析和改进了他人的代码;

2.巩固了C语言指针的用法以及用代码打开、读取、写入和关闭txt文件;

3.在他人的代码中加入了自己的思想,完善了功能,使其能更直观地显示出 结果;

4.自学并初步掌握了如何编写测试用例。

五.遇到的问题和解决办法:

遇到的问题:原来的代码功能不够完整,不能够直观地展现出每一次运行所产生的结果,影响使用者的体验。

解决办法:声明了函数display(),该函数通过代码改些文件中的内容并显示在窗口,且在每一个功能函数中调用显示函数display()。(详见第二点红字部分)

posted @ 2019-03-03 21:56  小机灵球  阅读(335)  评论(0编辑  收藏  举报