栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C语言程序设计--通讯录

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言程序设计--通讯录

通讯录管理系统

  1. 问题定义与描述

1.1问题定义

创建一个学生通讯录管理系统。系统中每个学生信息包括学号、姓名、性别、出生日期、家庭地址、学号、电话、QQ。程序的运行效果如下图所示,选择任意菜单后,实现相应功能。

 

图1.1  学生通讯录管理系统功能需求

1.2问题描述

在问题定义与描述阶段要考虑题目的可行性和需求分析,接下来进入开发阶段,完成系统设计和系统实现的任务。

2、系统设计

 总体设计

采用模块化的程序设计方法,即将较大的任务按照一定的原则分为一个个较小的任务,然后分别设计各个小任务。需要注意的是划分出来的模块应该相对独立但又相关,且容易理解。可以用模块化层次结构图(即模块图)来分析其任务的划分,一般从上到下进行,最上面一层是主模块,下面各层是其上一层模块的逐步细化描述。

2.1主要功能模块

添加:添加通讯录记录。

显示:显示通讯录记录。

删除:删除通讯录记录。

查询:查询通讯录记录。

修改:修改通讯录记录。

保存:将信息保存到文件。

2.2数据结构设计

                                                         

结构体

s struct addr            

{   char post_num[10]; 

    char addr[40];     

};

struct birth     

{   int year;    

    int month;   

    int day;     

};

struct friend1    

{   int number;      

    char name[20];    

    char sex;            

    struct birth birth;  

    struct addr addr;    

    char telephone[13];  

}friends[50];

FILE *fp;

int i;

2.3输入记录模块

输入记录模块主要实现将数据存入结构体中。,用户应选择2,调用Data_Inpu ()函数,进行朋友姓名、电话、地址、性别的输入,即完成在结构体中添加记录的操作。

2.4查询记录模块

查询记录模块主要实现了在结构体中按姓名查找满足相关条件的信息记录。在查询函数search()中,找到相同名字则打印出记录。

2.5删除记录模块

该操作完成删除指定姓名的记录,

输入要删除的序号,输入后调用函数若找到该记录,询问是否继续寻找相同姓名的记录。

2.6显示所有记录模块

该操作完成显示所有记录信息,它分两步完成。

第一步,按照数组中序号进行排序。

第二步,逐条显示出来。

3、系统实现

3.1 编码

3.1.1 部分程序源代码

#include

#include

#include

#include

#include

struct addr            

{   char post_num[10]; 

    char addr[40];     

};

struct birth     

{   int year;    

    int month;   

    int day;     

};

struct friend1    

{   int number;      

    char name[20];    

    char sex;            

    struct birth birth;  

    struct addr addr;    

    char telephone[13];  

}friends[50];

FILE *fp;

int i;

void Data_Show(int j)   

{

    printf("nntNo:%3dn",friends[j].number);

    printf("ntBirthday(y/m/d):%4d%2d%2d",friends[j].birth.year,friends[j].birth.month,friends[j].birth.day);

    printf("ntPostnum:%-10s",friends[j].addr.post_num);

    printf("ntaddress:%-40s",friends[j].addr.addr);

    printf("ntTele%-13s",friends[j].telephone);

}

void Data_Input(int j)   

{

    fflush(stdin);

    friends[j].number=j;

    printf("nnntNo %d record",j);

    printf("nntName:");     

    scanf("%s",friends[j].name);

    fflush(stdin);

    printf("ntSex(m/f):");   

    scanf("%c",&friends[j].sex);

    printf("nt---birthday---");  

    printf("ntyear:");

    scanf("%d",&friends[j].birth.year);

    printf("nttmonth:");

    scanf("%d",&friends[j].birth.month);

    printf("nttday:");

    scanf("%d",&friends[j].birth.day);

    printf("ntPost_number:");  

    scanf("%s",friends[j].addr.post_num);

    printf("ntAddress:");   

    scanf("%s",friends[j].addr.addr);

    printf("nttelephone:");   

    scanf("%s",friends[j].telephone);

    printf("y/n");

     if( getch()=='n')

    main();

}

void Data_Save()

{

    int j;

    fp=fopen("friend.txt","w");

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

    {   fwrite(&friends[j],sizeof(struct friend1),1,fp);

    }

}

void main()

{

    int j,k;

    char ch;

    char *search_name;

    clrscr();

    Data_Load();

    i--;

    do

    {   printf("nnntFunction choose:");

        printf("nt1.Read");

        printf("nt2.Append");

        printf("nt3.Delete");

        printf("nt4.Search");

        printf("nt5.Insert");

        printf("nt6.Save and Exit");

        printf("nt7.Quit");

        printf("nn");

        printf("tChoice:");

        ch=getche();

        switch(ch)

        {   case '1': j=1;    

             while(getch()!=0x1b&&j<=i) Data_Show(j++);

             if(j>i) printf("ntEnd of e_noten");

                break;

            case '2':         

              while(getch()!=0x1b&&i<50)

              {   i++;

                Data_Input(i);

              }

              if(i==50)printf("nte_note is filledn");

                  break;

            case '3':          

              if(i<1)

              {   printf("ntNo recordsn");

                  break;

              }

              printf("ntDelete No:");   

              scanf("%d",&k);

              for(j=k;j

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

                  friends[j].sex=friends[j=1].sex;

                  friends[j].birth.year=friends[j+1].birth.year;

                  friends[j].birth.month=friends[j+1].birth.month;

                  friends[j].birth.day=friends[j+1].birth.day;

                  strcpy(friends[j].addr.post_num,friends[j+1].addr.post_num);

                  strcpy(friends[j].addr.addr,friends[j+1].addr.addr);

                  strcpy(friends[j].telephone,friends[j+1].telephone);

              }

              i--;     

              break;

            case '4':     

              printf("ntPlease input name:");

              gets(search_name);

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

              {

                  if(strcmp(search_name,friends[j].name)==0) 

                  {   Data_Show(j); 

                       break;

                  }

              }

              if(j>1)    

              printf("nt No such records")  ;

              break;

            case '5':

              printf("ntInsert No:");    

              scanf("%d",&k);

              for(j=i+1;j

              {   strcpy(friends[j].name,friends[j-1].name);

                  friends[j].sex=friends[j-1].sex;

                  friends[j].birth.year=friends[j-1].birth.year;

                  friends[j].birth.month=friends[j-1].birth.month;

                  friends[j].birth.day=friends[j-1].birth.day;

                  strcpy(friends[j].addr.post_num,friends[j-1].addr.post_num);

                  strcpy(friends[j].addr.addr,friends[j-1].addr.addr);

                  strcpy(friends[j].telephone,friends[j-1].telephone);

              }

              Data_Input(k);

              i++;

              break;

            case '6': Data_Save();

              exit(0);  break;

            case '7': printf("ntDo you want to save e_note:(y/n)");

              ch=getch();

              if(ch=='y') Data_Save();

              fclose(fp);

              exit(0);

            default: printf("Please choose num 1-4n"

            );

         }

    }while(1);

}

3.1.2 主函数main()

main()函数主要实现了对整个程序的运行控制,以及相关功能模块的调用。

void main()

{

    int j,k;

    char ch;

    char *search_name;

    clrscr();

    Data_Load();

    i--;

    do

    {   printf("nnntFunction choose:");

        printf("nt1.Read");

        printf("nt2.Append");

        printf("nt3.Delete");

        printf("nt4.Search");

        printf("nt5.Insert");

        printf("nt6.Save and Exit");

        printf("nt7.Quit");

        printf("nn");

        printf("tChoice:");

        ch=getche();

        switch(ch)

        {   case '1': j=1;     

             while(getch()!=0x1b&&j<=i) Data_Show(j++);

             if(j>i) printf("ntEnd of e_noten");

                break;

            case '2':         

              while(getch()!=0x1b&&i<50)

              {   i++;

                Data_Input(i);

              }

              if(i==50)printf("nte_note is filledn");

                  break;

            case '3':          

              if(i<1)

              {   printf("ntNo recordsn");

                  break;

              }

              printf("ntDelete No:");   

              scanf("%d",&k);

              for(j=k;j

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

                  friends[j].sex=friends[j=1].sex;

                  friends[j].birth.year=friends[j+1].birth.year;

                  friends[j].birth.month=friends[j+1].birth.month;

                  friends[j].birth.day=friends[j+1].birth.day;

                  strcpy(friends[j].addr.post_num,friends[j+1].addr.post_num);

                  strcpy(friends[j].addr.addr,friends[j+1].addr.addr);

                  strcpy(friends[j].telephone,friends[j+1].telephone);

              }

              i--;      

              break;

            case '4':     

              printf("ntPlease input name:");

              gets(search_name);

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

              {

                  if(strcmp(search_name,friends[j].name)==0) 

                  {   Data_Show(j); 

                       break;

                  }

              }

              if(j>1)    

              printf("nt No such records")  ;

              break;

            case '5':

              printf("ntInsert No:");    

              scanf("%d",&k);

              for(j=i+1;j

              {   strcpy(friends[j].name,friends[j-1].name);

                  friends[j].sex=friends[j-1].sex;

                  friends[j].birth.year=friends[j-1].birth.year;

                  friends[j].birth.month=friends[j-1].birth.month;

                  friends[j].birth.day=friends[j-1].birth.day;

                  strcpy(friends[j].addr.post_num,friends[j-1].addr.post_num);

                  strcpy(friends[j].addr.addr,friends[j-1].addr.addr);

                  strcpy(friends[j].telephone,friends[j-1].telephone);

              }

              Data_Input(k);

              i++;

              break;

            case '6': Data_Save();

              exit(0);  break;

            case '7': printf("ntDo you want to save e_note:(y/n)");

              ch=getch();

              if(ch=='y') Data_Save();

              fclose(fp);

              exit(0);

            default: printf("Please choose num 1-4n"

            );

         }

    }while(1);

}

3.1.3 主菜单界面

用户进入通讯录系统时,需要显示主菜单,提示用户进行选择,完成相应任务。此代码被main()函数调用。

                        void main()

{

  printf("nt1.Read");

        printf("nt2.Append");

        printf("nt3.Delete");

        printf("nt4.Search");

        printf("nt5.Insert");

        printf("nt6.Save and Exit");

        printf("nt7.Quit");

        printf("nn");

        printf("tChoice:");

        ch=getche();

        switch(ch)

3.1.4读取文件中的记录

检查文件是否存在,建立student.txt文档,用于保存通讯录中的记录。

void Data_Load()

{   int j;

    long k;

    fp=fopen("friend.txt","r+t");  

    if(fp!=NULL)

    {   for(i=1;i<50;i++)

 {   j=fgetc(fp);

     if(j==EOF)   

               return;

     k=i-1;

     fseek(fp,k*sizeof(struct friend1),SEEK_SET);

     fread(&friends[i],sizeof(struct friend1),1,fp);

         }

    }

    else

    {   fp=fopen("friend.txt","w");

        i=1;

    }

}

}3.1.5 显示所有记录

由于记录显示操作经常进行,所以将这部分由独立的函数来完成,减少代码的重复。排序后更加方便查找所需要的朋友信息,为用户减少不必要的麻烦。

case '1': j=1;    

       while(getch()!=0x1b&&j<=i)

      Data_Show(j++);

           if(j>i) printf("ntEnd of e_noten");

             break;

3.1.6 删除学生记录

在删除操作中,系统会按用户要求先找到该学生记录,然后从将后一条记录覆盖过来。

case '3':          

              if(i<1)

              {   printf("ntNo recordsn");

                  break;

              }

              printf("ntDelete No:");   

              scanf("%d",&k);

              for(j=k;j

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

                  friends[j].sex=friends[j=1].sex;

                  friends[j].birth.year=friends[j+1].birth.year;

                  friends[j].birth.month=friends[j+1].birth.month;

                  friends[j].birth.day=friends[j+1].birth.day;

                  strcpy(friends[j].addr.post_num,friends

[j+1].addr.post_num);

                  strcpy(friends[j].addr.addr,friends[j+1].addr.addr);

                  strcpy(friends[j].telephone,friends[j+1].telephone);

              }

              i--;     

              break;

3.1.7查找学生记录

当通讯记录较多的时候,全部罗列出所有记录太浪费精力,查找则能精确快速的完成这项工作。

case '4':     

              printf("ntPlease input name:");

              gets(search_name);

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

              {

                  if(strcmp(search_name,friends[j].name)==0) 

                  {   Data_Show(j); 

                       break;

                  }

              }

              if(j>1)    

              printf("nt No such records")  ;

              break;

3.1.8 插入记录

插入通讯录中的朋友详细信息。

case '5':

              printf("ntInsert No:");    

              scanf("%d",&k);

              for(j=i+1;j

              {   strcpy(friends[j].name,friends[j-1].name);

                  friends[j].sex=friends[j-1].sex;

                  friends[j].birth.year=friends[j-1].birth.year;

                  friends[j].birth.month=friends[j-1].birth.month;

                  friends[j].birth.day=friends[j-1].birth.day;

                  strcpy(friends[j].addr.post_num,friends[j-

1].addr.post_num);

                  strcpy(friends[j].addr.addr,friends[j-1].addr.addr);

                  strcpy(friends[j].telephone,friends[j-1].telephone);

              }

              Data_Input(k);

              i++;

              break;

3.1.9写入记录到文件中。

 将所输入的朋友信息保存到frieng.txt中,防止信息丢失。

          

             void Data_Input(int j)   

{

    fflush(stdin);

    friends[j].number=j;

    printf("nnntNo %d record",j);

    printf("nntName:");     

    scanf("%s",friends[j].name);

    fflush(stdin);

    printf("ntSex(m/f):");   

    scanf("%c",&friends[j].sex);

    printf("nt---birthday---");  

    printf("ntyear:");

    scanf("%d",&friends[j].birth.year);

    printf("nttmonth:");

    scanf("%d",&friends[j].birth.month);

    printf("nttday:");

    scanf("%d",&friends[j].birth.day);

    printf("ntPost_number:");  

    scanf("%s",friends[j].addr.post_num);

    printf("ntAddress:");   

    scanf("%s",friends[j].addr.addr);

    printf("nttelephone:");   

    scanf("%s",friends[j].telephone);

    printf("y/n");

     if( getch()=='n')

    main();

}

4程序测试与系统维护

4.1测试主菜单界面

主界面如图4.1


图4.1主界面

 

4.2测试添加界面

进入添加界面,如图4.2。

 

图4.2添加界面

4.3测试显示界面

进入显示界面,如图4.3。


图4.3显示界面

4.4测试删除界面

进入删除界面,如图4.4。


图4.4删除界面
4.5测试查询界面


进入查询界面,如图4.5。

图4.5查询界面

 

4.6测试修改界面

进入修改界面,如图4.6。

 


图4.6修改界面

4.7测试保存界面

进入保存界面,如图4.7。


图4.7保存界面

需要完整的资料以及源程序可在我的资源里下载。

 

 

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/997736.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号