通讯录管理系统课程设计报告书(C语言)[1]

课程设计报告书

课程名称:     

班    级:         

学    号:          

姓    名:             

指导老师:               

通讯录管理系统

一.    需求分析

设计题目及要求

◆  建立通讯录信息,信息至少包含编号、姓名、年龄、电话、通讯地址、电子邮箱等;

◆  能够提供添加、删除和修改通讯录信息的功能;

◆  能够提供安不同方式查询的功能;如按姓名或年龄、电话等查询;

◆  将通讯录保存在文件中;

◆  能够按表格方式输出通讯录信息。

系统功能需求分析:

主要包含一下多种功能

添加:添加通讯录记录

显示:显示通讯录记录

删除:删除通讯录记录

查询:查询通讯录记录

修改:修改通讯录记录

保存:将信息保存到文件

二.    概要设计

系统功能模块图:

添加:可以添加通讯录记录,依次输入编号、姓名、年龄、电话号码、通讯地址、电子邮箱后,会提示是否继续添加。

显示:可以以表格形式输出所有通讯录里的记录

删除:输入欲删除的那个人的名字后,会自动删除他(她)的记录内容

查询:可以选择用姓名、电话、地址三种方式查询

修改:输入欲修改的那个人的名字后,再依次输入编号、姓名、年龄、电话号码、通讯地址、电子邮箱即可完成修改

保存:,输入文件名(带后缀名)后,即可将通讯录信息保存到文件

三.    详细设计

(1).通讯录:

typedef struct

       {

              char score;               /*编号*/

              char name[10];           /*姓名*/

              char num[15];            /*号码*/

              char email[20];                    /*邮箱*/

              char age[8];                         /*年龄*/

              char adds[20];                      /*住址*/

       }Person;

void main()                                         /*主函数*/

{

       int n=0;

       for(;;)

       {

              switch(menu_select())

              {

              case 1:

              printf("\n\t添加记录到通讯录\n");                         /*添加记录*/

              n=Input(pe,n);

              break;

              case 2:

              printf("\n\t\t\t    通讯录记录表\n");                      /*显示记录*/

              Display(pe,n);

              break;

             

              case 3:

              printf("\n\t从通讯录中删除记录\n");

              n=Delete_a_record(pe,n);                                                         /*删除记录*/

              printf("\t");

              system("pause");

              break;

              case 4:

              printf("\n\t在通讯录中查找记录\n");

              Query_a_record(pe,n);                                                             /*查找记录*/

              printf("\t");

              system("pause");

              break;

             

              case 5:

              printf("\n\t修改通讯录中的记录\n");

              Change(pe,n);                                                                       /*修改数据*/

              printf("\t");

              system("pause");

              break;

              case 6:

              printf("\n\t保存功能\n");

              WritetoText(pe,n);                                                               /*保存数据*/

              printf("\t");

              system("pause");

              break;

              case 0:

              printf("\n\t\t谢谢使用,再见!\n");                         /*结束程序*/

              printf("\n\t\t");

              system("pause");

              exit(0);

              }

       }

}

(2).工作流程图:

①添加:添加通讯录记录

②显示:显示通讯录记录

③删除:删除通讯录记录                                   ④查询:查询通讯录记录

先选择查询方式,以姓名查询方式为例

 


⑤修改:修改通讯录记录

四.    源程序代码

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

typedef struct

       {

              char score;               /*编号*/

              char name[10];            /*姓名*/

              char num[15];             /*号码*/

              char email[20];                    /*邮箱*/

              char age[8];                         /*年龄*/

              char adds[20];                      /*住址*/

       }Person;

Person pe[80];                       

int menu_select()

       {

              char c;

              do{

              system("cls");

              printf("\t\t *****通讯录***** \n");                              

              printf("\t\t┌───────┐\n");                  

              printf("\t\t│ 1. 添加记录  │\n");

              printf("\t\t│ 2. 显示记录  │\n");

              printf("\t\t│ 3. 删除记录  │\n");

              printf("\t\t│ 4. 查询记录  │\n");

              printf("\t\t│ 5. 修改记录  │\n");

              printf("\t\t│ 6. 保存记录  │\n");

              printf("\t\t│ 0. 退出程序  │\n");

              printf("\t\t└───────┘\n");

              printf("\t\t请您选择(0-6):");

              c=getchar(); 

              }while(c<'0'||c>'6');

              return(c-'0');

       }

int Input(Person per[],int n)

{

       int i=0;

       char sign,x[10];                      

       while(sign!='n'&&sign!='N')

       {

              printf("\t编号:");

              scanf("\t%d",&per[n+i].score);

              printf("\t姓名:");

              scanf("\t%s",per[n+i].name);

              printf("\t年龄:");

              scanf("\t%s",per[n+i].age);

              printf("\t电话号码:");

              scanf("\t%s",per[n+i].num);

              printf("\t通讯住址:");

              scanf("\t%s",per[n+i].adds);

              printf("\t电子邮箱:");

              scanf("\t%s",per[n+i].email);

              gets(x);  

              printf("\n\t是否继续添加?(Y/N)");

              scanf("\t%c",&sign);

              i++;

       }

       return(n+i);

}

void Display(Person per[],int n)                                         

{

       int i;

       printf("----------------------------------------------------------------------\n");                          /*格式*/

       printf("编号  姓名  年龄    电话号码     通讯地址        电子邮箱\n");

       printf("----------------------------------------------------------------------\n");

       for(i=1;i<n+1;i++)                                                           

       {

              printf("%-5d%-8s%-6s%-13s%-15s%-15s\n",per[i-1].score,per[i-1].name,per[i-1].age,per[i-1].num,per[i-1].adds,per[i-1].email);

              if(i>1&&i%10==0)                                                         

              {

                     printf("\t-----------------------------------\n");

                     printf("\t");

                     system("pause");

                     printf("\t-----------------------------------\n");

              }

       }

       printf("----------------------------------------------------------------------\n");

       system("pause");

}

int Delete_a_record(Person per[],int n)

{

       char s[20];

       int i=0,j;

       printf("\t请输入想删除记录中的名字:");

       scanf("%s",s);

       while(strcmp(per[i].name,s)!=0&&i<n) i++;

       if(i==n)

       {

              printf("\t通讯录中没有此人!\n");

              return(n);

       }

       for(j=i;j<n-1;j++)

       {

              strcpy(per[j].num,per[j+1].num);

              strcpy(per[j].name,per[j+1].name);

              strcpy(per[j].age,per[j+1].age);

              strcpy(per[j].adds,per[j+1].adds);

              strcpy(per[j].email,per[j+1].email);

              per[j].score=per[j+1].score;

       }

       printf("\t\t\t已经成功删除!\n");

       return(n-1);

}

void Query_a_record(Person per[],int n)

{

      

       int m;

       printf("\t\n请选择查询方式:\n");

    printf("\t┌──────┐\n");

    printf("\t│1------姓名 │\n");

    printf("\t│2------电话 │\n");

    printf("\t│3------地址 │\n");

    printf("\t│4------返回 │\n");

    printf("\t└──────┘\n");

    printf("请选择:");

    scanf("%d",&m);

    while(m!=1&&m!=2&&m!=3&&m!=4)

    {

              printf("输入错误,请重新选择:");

              scanf("%d",&m);

       }

       if(m==1)

       {

              char s[20];

              int i=0;

              printf("\t请输入想查询的姓名:");

              scanf("\t%s",s);

              while(strcmp(per[i].name,s)!=0&&i<n) i++;

              if(i==n)

              {

                     printf("\t通讯录中没有此人!\n");

                     return;

              }

              printf("\t此人编号: %d\n",per[i].score);

              printf("\t此人年龄: %s\n",per[i].age);

              printf("\t电话号码: %s\n",per[i].num);

              printf("\t通讯地址: %s\n",per[i].adds);

              printf("\t电子邮箱: %s\n",per[i].email);

       } ;

       if(m==2)

       {

              char s[20];

              int i=0;

              printf("\t请输入想查询的电话:");

              scanf("\t%s",s);

              while(strcmp(per[i].num,s)!=0&&i<n) i++;

              if(i==n)

              {

                     printf("\t通讯录中没有此人!\n");

                     return;

              }

              printf("\t此人编号: %d\n",per[i].score);

              printf("\t此人姓名: %s\n",per[i].name);

              printf("\t此人年龄: %s\n",per[i].age);

              printf("\t通讯地址: %s\n",per[i].adds);

              printf("\t电子邮箱: %s\n",per[i].email);

       } ;

       if(m==3)

       {

              char s[20];

              int i=0;

              printf("\t请输入想查询的地址:");

              scanf("\t%s",s);

              while(strcmp(per[i].adds,s)!=0&&i<n) i++;

              if(i==n)

              {

                     printf("\t通讯录中没有此人!\n");

                     return;

              }

              printf("\t此人编号: %d\n",per[i].score);

              printf("\t此人姓名: %s\n",per[i].name);

              printf("\t此人年龄: %s\n",per[i].age);

              printf("\t电话号码: %s\n",per[i].num);

              printf("\t电子邮箱: %s\n",per[i].email);

       } ;

}

void Change(Person per[],int n)

{

       char s[20];

       int i=0;

       printf("\t请输入想修改的记录中的名字:");

       scanf("%s",s);

       while(strcmp(per[i].name,s)!=0&&i<n) i++;

       if(i==n)

       {

              printf("\t通讯录中没有此人!\n");

              return;

       }

       printf("\t编号:");

       scanf("\t%d",&per[i].score);

       printf("\t姓名:");

       scanf("\t%s",per[i].name);

       printf("\t年龄:");

       scanf("\t%s",per[i].age);

       printf("\t电话号码:");

       scanf("\t%s",per[i].num);

       printf("\t通讯住址:");

       scanf("\t%s",per[i].adds);

       printf("\t电子邮箱:");

       scanf("\t%s",per[i].email);

       printf("\t修改成功!");

}

void WritetoText(Person per[],int n)            

{

       int i=0;

       FILE *fp;                                           /*定义文件指针*/

       char filename[20];                                  /*定义文件名*/

       printf("\t保存到文件\n");                          /*输入文件名*/

       printf("\t请输入所保存的文件名:");

       scanf("\t%s",filename);

       if((fp=fopen(filename,"w"))==NULL)                  

       {

              printf("\t无法打开文件\n");

              system("pause");

              return;

       }

       fprintf(fp,"******************************************通讯录******************************************\n");

       fprintf(fp,"编号     姓名   年龄      电话号码           通讯地址             电子邮箱\n");

       fprintf(fp,"------------------------------------------------------------------------------------------\n");

       while(i<n)

       {

              fprintf(fp,"%-3d\t%-6s\t%-3s\t%-13s\t%-20s\t%-20s\n",per[i].score,per[i].name,per[i].age,per[i].num,per[i].adds,per[i].email);

              i++;

       }

       fprintf(fp,"------------------------------------------------------------------------------------------\n");

       fprintf(fp,"***************************************共有%d条记录****************************************\n",n);

       fclose(fp);                                         /*关闭文件*/

       printf("保存成功!\n");

}

void main()                                         /*主函数*/

{

       int n=0;

       for(;;)

       {

              switch(menu_select())

              {

              case 1:

              printf("\n\t添加记录到通讯录\n");                         /*添加记录*/

              n=Input(pe,n);

              break;

              case 2:

              printf("\n\t\t\t    通讯录记录表\n");                      /*显示记录*/

              Display(pe,n);

              break;

             

              case 3:

              printf("\n\t从通讯录中删除记录\n");

              n=Delete_a_record(pe,n);                                                         /*删除记录*/

              printf("\t");

              system("pause");

              break;

              case 4:

              printf("\n\t在通讯录中查找记录\n");

              Query_a_record(pe,n);                                                             /*查找记录*/

              printf("\t");

              system("pause");

              break;

             

              case 5:

              printf("\n\t修改通讯录中的记录\n");

              Change(pe,n);                                                                       /*修改数据*/

              printf("\t");

              system("pause");

              break;

              case 6:

              printf("\n\t保存功能\n");

              WritetoText(pe,n);                                                               /*保存数据*/

              printf("\t");

              system("pause");

              break;

              case 0:

              printf("\n\t\t谢谢使用,再见!\n");                         /*结束程序*/

              printf("\n\t\t");

              system("pause");

              exit(0);

              }

       }

}

五.    测试数据及其结果分析

测试

1).显示的主菜单界面

2).添加界面:

3).显示界面:

4).删除界面:

删除后,通讯录里的显示记录:

5).查询界面:

以姓名查询方式为例:

6).修改界面:

修改后,通讯录里的显示记录:

7).保存界面:

tongxunlu.txt文件截图:

问题思考:

1.当我在进行删除、查询、修改、保存等功能时,以查询为例,输入名字按回车后,虽然会显示该人的所有记录,但是显示后,它马上自动消失了,还没来得及等我看内容。因此,向别人请教后,在一些地方加入了system("pause");这个语言,用来对某项操作完成后进行暂停。

2. 现在这个程序的界面个人感觉很清爽。但在最初,每次进行一项操作,运行窗口里的内容会一直保留着,感觉很杂乱,如下图(添加后,进行显示操作):

之后,我去网上寻求解决办法,知道可以使用system("cls");这一语句可以解决这个问题,最后,修改成功。

六.    课程设计总结

这次的程序实设计实验是对我们进入大学以来学习程序设计语言结果的一次大检验。自己动手,自己发现和解决问题。发现了自己的许多不足。平时没有掌握好的知识在这次实验中彻底暴露出来,经过不断思考,不断查阅资料和上机运行,解决其中大部分问题,当然还存在一些问题没有解决。我相信在以后的学习能够解决好它们。但是,收获还是不小的,我不仅对C的操作有了进一步的掌握,还了解到了程序设计的书写风格及其注释的格式。

当我选择通讯录这个题目时,一开始想运用大量链表及指针来完成,但是在慢慢琢磨之后,觉得这个不一定要用链表,于是改变了编程思路。当然还有不少文件的读写问题,不过还是通过不断测试之后顺利解决了。另外一点要说的就是这个程序用了很多的循环,因此对于循环的控制要十分小心,有时while和do-while的区别也是十分重要的。

还有一点体会就是,书上和老师教的内容是有限的,我们需要不断地靠自己去学习,向他人请教,了解和掌握更多的知识,这样我们才能编出更好的C程序。

总体来说,这次C语言程序设计实验还是比较成功的,虽然最终程序还存在一些不足,但能取得这样的成绩我还是比较高兴的。

最后,要感谢学校为我们提供这次实验机会,也要感谢老师的教导和好心人对我的帮助与支持。

组内成员:宋宁宁,王芬,汪晨洋,岳莹,邢媛,曹静

相关推荐