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<stdlib.h>

#include<string.h>

#include<conio.h>

#include<stdio.h>

#include<dos.h>

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("\n\n\tNo:%3d\n",friends[j].number);

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

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

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

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

}

void Data_Input(int j)    /*记录插入函数*/

{

    fflush(stdin);

    friends[j].number=j;

    printf("\n\n\n\tNo %d record",j);

    printf("\n\n\tName:");      /*读入姓名*/

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

    fflush(stdin);

    printf("\n\tSex(m/f):");    /*读入性别*/

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

    printf("\n\t---birthday---");   /*读入出生年月*/

    printf("\n\tyear:");

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

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

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

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

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

    printf("\n\tPost_number:");   /*读入邮编*/

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

    printf("\n\tAddress:");    /*读入家庭地址*/

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

    printf("\n\ttelephone:");    /*读入联系电话*/

    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("\n\n\n\tFunction choose:");

        printf("\n\t1.Read");

        printf("\n\t2.Append");

        printf("\n\t3.Delete");

        printf("\n\t4.Search");

        printf("\n\t5.Insert");

        printf("\n\t6.Save and Exit");

        printf("\n\t7.Quit");

        printf("\n\n");

        printf("\tChoice:");

        ch=getche();

        switch(ch)

        {   case '1': j=1;     /*显示通讯录中的所有记录*/

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

             if(j>i) printf("\n\tEnd of e_note\n");

                break;

            case '2':          /*增加通讯录中的记录*/

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

              {   i++;

                Data_Input(i);

              }

              if(i==50)printf("\n\te_note is filled\n");

                  break;

            case '3':           /*删除通讯录中的记录*/

              if(i<1)

              {   printf("\n\tNo records\n");

                  break;

              }

              printf("\n\tDelete No:");    /*读入删除位置*/

              scanf("%d",&k);

              for(j=k;j<i;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--;      /*元素总数减1*/

              break;

            case '4':      /*通讯录查询功能*/

              printf("\n\tPlease 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("\n\t No such records")  ;

              break;

            case '5':

              printf("\n\tInsert No:");     /*录入插入位置*/

              scanf("%d",&k);

              for(j=i+1;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);

              }

              Data_Input(k);

              i++;

              break;

            case '6': Data_Save();

              exit(0);  break;

            case '7': printf("\n\tDo 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-4\n"

            );

         }

    }while(1);

}

3.1.2 主函数main()

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

void main()

{

    int j,k;

    char ch;

    char *search_name;

    clrscr();

    Data_Load();

    i--;

    do

    {   printf("\n\n\n\tFunction choose:");

        printf("\n\t1.Read");

        printf("\n\t2.Append");

        printf("\n\t3.Delete");

        printf("\n\t4.Search");

        printf("\n\t5.Insert");

        printf("\n\t6.Save and Exit");

        printf("\n\t7.Quit");

        printf("\n\n");

        printf("\tChoice:");

        ch=getche();

        switch(ch)

        {   case '1': j=1;     /*显示通讯录中的所有记录*/

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

             if(j>i) printf("\n\tEnd of e_note\n");

                break;

            case '2':          /*增加通讯录中的记录*/

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

              {   i++;

                Data_Input(i);

              }

              if(i==50)printf("\n\te_note is filled\n");

                  break;

            case '3':           /*删除通讯录中的记录*/

              if(i<1)

              {   printf("\n\tNo records\n");

                  break;

              }

              printf("\n\tDelete No:");    /*读入删除位置*/

              scanf("%d",&k);

              for(j=k;j<i;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--;      /*元素总数减1*/

              break;

            case '4':      /*通讯录查询功能*/

              printf("\n\tPlease 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("\n\t No such records")  ;

              break;

            case '5':

              printf("\n\tInsert No:");     /*录入插入位置*/

              scanf("%d",&k);

              for(j=i+1;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);

              }

              Data_Input(k);

              i++;

              break;

            case '6': Data_Save();

              exit(0);  break;

            case '7': printf("\n\tDo 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-4\n"

            );

         }

    }while(1);

}

3.1.3 主菜单界面

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

                        void main()

{

  printf("\n\t1.Read");

        printf("\n\t2.Append");

        printf("\n\t3.Delete");

        printf("\n\t4.Search");

        printf("\n\t5.Insert");

        printf("\n\t6.Save and Exit");

        printf("\n\t7.Quit");

        printf("\n\n");

        printf("\tChoice:");

        ch=getche();

        switch(ch)

3.1.4读取文件中的记录

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

void Data_Load()

{   int j;

    long k;

    fp=fopen("friend.txt","r+t");   /*打开文件friend.txt*/

    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("\n\tEnd of e_note\n");

             break;

3.1.6 删除学生记录

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

case '3':           /*删除通讯录中的记录*/

              if(i<1)

              {   printf("\n\tNo records\n");

                  break;

              }

              printf("\n\tDelete No:");    /*读入删除位置*/

              scanf("%d",&k);

              for(j=k;j<i;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--;      /*元素总数减1*/

              break;

3.1.7查找学生记录

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

case '4':      /*通讯录查询功能*/

              printf("\n\tPlease 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("\n\t No such records")  ;

              break;

3.1.8 插入记录

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

case '5':

              printf("\n\tInsert No:");     /*录入插入位置*/

              scanf("%d",&k);

              for(j=i+1;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);

              }

              Data_Input(k);

              i++;

              break;

3.1.9写入记录到文件中。

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

          

             void Data_Input(int j)    /*记录插入函数*/

{

    fflush(stdin);

    friends[j].number=j;

    printf("\n\n\n\tNo %d record",j);

    printf("\n\n\tName:");      /*读入姓名*/

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

    fflush(stdin);

    printf("\n\tSex(m/f):");    /*读入性别*/

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

    printf("\n\t---birthday---");   /*读入出生年月*/

    printf("\n\tyear:");

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

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

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

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

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

    printf("\n\tPost_number:");   /*读入邮编*/

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

    printf("\n\tAddress:");    /*读入家庭地址*/

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

    printf("\n\ttelephone:");    /*读入联系电话*/

    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保存界面

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

 

 

 需要完整的资料可在我的资源里下载,也可以加入我的纷传圈子,里面有资源压缩包的百度网盘下载地址及提取码。

纷传 点击用微信打开即可,过程有点繁琐请见谅。

C语言编写的通讯录管理程序设计 #include"stdio.h" #include"stdlib.h" #include"string.h" #include"conio.h" #define HEADER1"------------------------------------------MESSAGE MENU--------------------------------------------------------------\n" #define HEADER2" | num | name | phonenumber | address |\n" #define HEADER3" |-------------------------------------------------------------------|\n" #define FORMAT " | %-10s %-10s %-15s %-20s |\n" #define DATA p->num,p->name,p->phonenum,p->address #define END " ------------------------------------------------------------------------------------------------------------------\n" #define N 100 int saveflag=0; /*是否需要存盘的标志变量*/ typedef struct record /*标记为record*/ { char num[4]; /*编号*/ char name[10]; /*姓名*/ char phonenum[15]; /*电话*/ char address[20]; /*地址*/ } RECORD; RECORD tele[N]; void menu(); void Disp(); void Qur(); void Modify(); void SelectSort(); void Wrong(); void Save(); void main() { RECORD tele[N]; /*定义RECOED结构体*/ FILE *fp; /*文件指针*/ int select; /*保持内选择结果变量*/ char ch; /*保存y,Y,n,N*/ int count=0; /*保存文件中的记录条数(或元素个数)*/ fp=fopen("C:\\record.txt","a+"); /*以追加方式打开文本文件c;\record,可读可写,若此文件不存在,会创建此文件*/ if(fp==NULL) { printf("\n=>Can not open file!\n"); exit(0); } while(!feof(fp)) { if(fread(&tele[count],sizeof(RECORD),1,fp)==1) /*一次从文件中读取一条通讯记录*/ count++; } fclose(fp); /*关闭文件*/ printf("\n=>Open file success,the total records number is:%d.\n",count); getchar(); menu(); while(1) { system("cls"); menu(); cprintf("\n Please input your choice(0-8):"); /*显示提示信息*/ ch=getch(); if(ch=='0') { if(saveflag==1) /*若对数组的数据有修且未进行存盘操作,则此标志为1*/ { getchar(); printf("\n==>Whether save the modified record to file?(y/n):"); scanf("%c",&ch); if(ch=='y'||ch=='Y') Save(tele,count); } printf("\n=>Thank you for useness!"); getchar(); break ; } switch(ch) { case'0':break; case'1':count=Add(tele,count);break; /*增加通讯记录*/ case'2':system("cls");Disp(tele,count);break; /*显示通讯记录*/ case'3':count=Del(tele,count) ;break; /*删除通讯记录*/ case'4':Qur(tele,count);break; /*查询通讯记录*/ case'5':Modify(tele,count);break; /*修改通讯记录*/ case'6':count=Insert(tele,count);break; /*插入通讯记录*/ case'7':SelectSort(tele,count);break;/*排序通讯记录*/ case'8':Save(tele,count);break; /*保存通讯记录*/ default: Wrong();getchar();break; /*按键有误,必需为0~8*/ } } } void menu() { system("cls"); /*调用DOS命令清屏,与clrscr()功能相同*/ textcolor(63); /*在文本模式中选择新的字符颜色*/ gotoxy(10,5); /*在文本窗口中设置光标*/ printf(" The communication management system\n"); gotoxy(10,8); printf(" ****Menu**** \n"); gotoxy(10,9); printf("\n"); gotoxy(10,10); printf("\* 1. Add record\n"); /*增加*/ gotoxy(10,11); printf("\* 2. Display record\n"); /*展览*/ gotoxy(10,12); printf("\* 3. Delete record\n"); /*删除*/ gotoxy(10,13); printf("\* 4. Search record\n"); /*查找*/ gotoxy(10,14); printf("\* 5. Modify record\n"); /*更改*/ gotoxy(10,15); printf("\* 6. Insert record\n"); /*插入*/ gotoxy(10,16); printf("\* 7. Sort record\n"); /*整理*/ gotoxy(10,17); printf("\* 8. Save record\n"); /*保存*/ gotoxy(10,18); printf("\* 0 Quit system\n"); /*退出*/ gotoxy(10,19); printf(" ************ \n"); /*cprintf()送格式话输出至文本窗口屏幕中*/ } /*格式化输出表头*/ void printheader() { printf(HEADER1); printf(HEADER2); printf(HEADER3); } /*格式化输出表中数据*/ void printdata(RECORD q) { RECORD *p; p=&q; printf(FORMAT,DATA); } void Disp( RECORD temp[],int n) /*显示数组temp[]中存储的通讯记录,内容为record结构中定义的内容*/ { int i; if(n==0) /*表示没有通讯记录*/ { printf("\n=>No menu record!\n"); getchar(); return ; } printf("\n\n"); printheader(); /*输出表格头部*/ i=0; while(i<n) /*逐条输出数组中存储的通讯记录*/ { printdata(temp[i]); i++; printf(HEADER3); } getchar(); } void Wrong() /*输出按键错误信息*/ { printf("\n\n\n\n\n**********Error:input has wrong! press any key to continue***********\n"); getchar(); } void Nofind() /*输出未查找到此记录的信息*/ { printf("\n=>Not find this menu record!\n"); } int Locate(RECORD temp[],int n,char findmess[],char nameorphonenum[]) { int i=0; if(strcmp(nameorphonenum,"phonenum")==0) /*按电话号码查询*/ { while(i<n) { if(strcmp(temp[i].phonenum,findmess)==0) /*若找到findmess值的电话号码*/ return i; i++; } } else if(strcmp(nameorphonenum,"name")==0) /*按姓名查询*/ { while(i<n) { if(strcmp(temp[i].name,findmess)==0) /*若找到findmess值的姓名*/ return i; i++; } } return -1; /*若未找到,返回一个整数-1*/ } void stringinput(char *t,int lens,char *notice) { char n[255]; do { printf(notice); /*显示提示信息*/ scanf("%s",n); /*输入字符串*/ if(strlen(n)>lens) printf("\n Exceed the required length! \n"); /*进行长度检测,超过lens值重新输入*/ } while(strlen(n)>lens); strcpy(t,n); /*将输入发字符串拷贝到字符串t中*/ } int Add(RECORD temp[],int n) /*增加通讯记录*/ { char ch,num[10]; int i,flag=0; system("cls"); Disp(temp,n); /*先打印出已有的通讯录信息*/ while(1) /*一次可输入多条记录,直至输入编号为0的记录才结束添加操作*/ { while(1) /*输入记录编号,保证该编号没有被使用,若输入编号为0,则退出添加记录操作*/ { stringinput(num,10,"Input number(press '0' return menu):"); /*格式化输入编号并检验*/ flag=0; if(strcmp(num,"0")==0) /*输入为0,则退出添加操作,返回主界面*/ { return n; } i=0; while(i<n) /*产寻该编号是否已经存在,若存在则要求重新输入一个未被占用的编号*/ { if(strcmp(temp[i].num,num)==0) { flag=1; break; } i++; } if(flag==1) /*提示拥护是否重新输入*/ { getchar(); printf("==>The number %s is existing,try again?(y/n):",num); scanf("%c",&ch); if(ch=='y'||ch=='Y') continue; else return n; } else {break;} } strcpy(temp[n].num,num); /*将字符串num拷贝到temp[n].num中*/ stringinput(temp[n].name,15,"Name:\n"); stringinput(temp[n].phonenum,15,"Telephone:\n"); stringinput(temp[n].address,15,"Address:\n"); saveflag=1; n++; } return n; } void Qur(RECORD temp[],int n) /*按编号或姓名查询通讯记录*/ { int select; /*按1:按姓名查,2:按电话号码查,其他:返回住界面(菜单)*/ char searchinput[20]; /*包寻用户输入的查询内容*/ int p=0; if(n<=0) /*若数组为空*/ { system("cls"); printf("\n=>No menu record!\n"); getchar(); return ; } system("cls"); printf("\n =>1 Search by name =>2 Search by telephonenumber\n"); printf(" Please choice[1,2]:"); scanf("%d",&select); if(select==1) /*按姓名查询*/ { stringinput(searchinput,10,"Input the existing name:"); p=Locate(temp,n,searchinput,"name"); /*在数组temp中查找编号为searchinput值的元素,并返回该数组元素的下标值*/ if(p!=-1) /*若找到该记录*/ { printheader(); printdata(temp[p]); printf(END); printf("Press any key to return"); getchar(); } else Nofind(); getchar(); } else if(select==2) /*按电话号码查询*/ { stringinput(searchinput,15,"Input the existing telephone number:"); p=Locate(temp,n,searchinput,"phonenum"); if(p!=-1) { printheader(); printdata(temp[p]); printf(END); printf("Press any key to return"); getchar(); } else Nofind(); getchar(); } else Wrong(); getchar(); } int Del(RECORD temp[],int n) { int sel; char findmess[20]; int p=0,i=0; if(n<=0) { system("cls"); printf("\n=>No menu record!\n"); getchar(); return n; } system("cls"); Disp(temp,n); printf("\n =>1 Delete by name =>2 Delete by telephonenumber\n"); printf(" Please choice[1,2]:"); scanf("%d",&sel); if(sel==1) { stringinput(findmess,10,"Input the existing name:"); p=Locate(temp,n,findmess,"name"); getchar(); if(p!=-1) { for(i=p+1;i<n;i++) /*删除此记录,后面记录向前移*/ { strcpy(temp[i-1].num,temp[i].num); strcpy(temp[i-1].name,temp[i].name); strcpy(temp[i-1].phonenum,temp[i].phonenum); strcpy(temp[i-1].address,temp[i].address); } printf("\n=>Delete success!\n"); n--; getchar(); saveflag=1; } else Nofind(); getchar(); } else if(sel==2) /*先按电话号码查询到该记录所在的数组元素的下标值*/ { stringinput(findmess,15,"Input the existing telephone number:"); p=Locate(temp,n,findmess,"phonenum"); getchar(); if(p!=-1) { for(i=p+1;i<n;i++) /*删除此记录,后面的记录向前移*/ { strcpy(temp[i-1].num,temp[i].num); strcpy(temp[i-1].name,temp[i].name); strcpy(temp[i-1].phonenum,temp[i].phonenum); strcpy(temp[i-1].address,temp[i].address); } printf("\n=>Delete success!\n"); n--; getchar(); saveflag=1; } else Nofind(); getchar(); } return n; } void Modify(RECORD temp[],int n) { char findmess[20]; int p=0; if(n<=0) { system("cls"); printf("\n=>No menu record!\n"); getchar(); return ; } system("cls"); printf("modify menu book recorder"); Disp(temp,n); stringinput(findmess,10,"Input the existing name:"); /*输入并检验该姓名*/ p=Locate(temp,n,findmess,"name"); /*查询到该数组元素,并返回下标值*/ if(p!=-1) /*若p!=-1,表明已经找到该数组元素*/ { printf("Number:%s,\n",temp[p].num); printf("Name:%s,",temp[p].name); stringinput(temp[p].name,15,"Input new name:"); printf("Name:%s,",temp[p].phonenum); stringinput(temp[p].name,15,"Input new telephone:"); printf("Name:%s,",temp[p].address); stringinput(temp[p].address,30,"Input new address:"); printf("\n=>modify success!\n");getchar(); Disp(temp,n); getchar();saveflag=1; } else { Nofind(); getchar(); } return ; } int Insert(RECORD temp[],int n) { char ch,num[10],s[10]; /*s[]保存插入点位置之前的记录编号,num[]保存输入的新记录的编号*/ RECORD newinfo; int flag=0,i=0,m=0; system("cls"); Disp(temp,n); while(1) { stringinput(s,10,"Please input insert location after the Number:"); flag=0;i=0; while(i<n) /*查询该编号是否存在,flag=1表示该编号存在*/ { if(strcmp(temp[i].num,s)==0) { m=i; flag=1; break; } i++; } if(flag==1) break; /*若编号存在,则进行插之前的新记录输入操作*/ else { getchar(); printf("\n=>The number is not existing,try again?(y\n):",s); scanf("%c",&ch); if(ch=='y'||ch=='Y') { continue; } else { return n; } } } /*以下新记录的输入操作与Add()相同*/ while(1) { stringinput(num,10,"Input new Number:"); flag=0;i=0; while(i<n) /*查询该编号是否存在,flag=1表示该编号存在*/ { if(strcmp(temp[i].num,num)==0) { flag=1; break; } i++; } if(flag==1) { getchar(); printf("\n=>Sorry,The number %s is existing,try again?(y\n):",num); scanf("%c",&ch); if(ch=='y'||ch=='Y') { continue; } else { return n; } } else break; } strcpy(newinfo.num,num); /*将字符串num拷贝到newinfo.num中*/ stringinput(newinfo.name,15,"Name:"); stringinput(newinfo.phonenum,15,"Telephone:"); stringinput(newinfo.address,15,"Address:"); saveflag=1; /*在main()中有对该全局变量的判断,若为1,则进行存盘操作*/ for(i=n-1;i>m;i--) /*从最后一个组织元素开始往前移一个元素位置*/ { strcpy(temp[i+1].num,temp[i].num); strcpy(temp[i+1].name,temp[i].name); strcpy(temp[i+1].phonenum,temp[i].phonenum); strcpy(temp[i+1].address,temp[i].address); } strcpy(temp[m+1].num,newinfo.num); strcpy(temp[m+1].name,newinfo.name); strcpy(temp[m+1].phonenum,newinfo.phonenum); strcpy(temp[m+1].address,newinfo.address); n++; Disp(temp,n); printf("\n\n");getchar(); return n; } void SelectSort(RECORD temp[],int n) { int i=0,j=0,flag=0,indexmin,select; char charflag[10]; RECORD newinfo; if(n<=0) { system("cls"); printf("\n=>Not record!\n"); getchar(); return ; } system("cls"); Disp(temp,n); /*显示排序前的所有记录*/ printf("\n =>1 SORT by num =>2 SORT by another way \n"); printf(" Please choice[1,2]:"); scanf("%d",&select); if(select==1) /*按记录编号排序*/ { for(i=0;i<n-1;i++) { flag=32767; indexmin=0; for(j=i;j<n;j++) { if(atoi(temp[j].num)<flag) { flag=atoi(temp[j].num); indexmin=j; } } strcpy(newinfo.num,temp[i].num); /*利用结构变量nesinfo实现数组元素的交换*/ strcpy(newinfo.name,temp[i].name); strcpy(newinfo.phonenum,temp[i].phonenum); strcpy(newinfo.address,temp[i].address); strcpy(temp[i].num,temp[indexmin].num); strcpy(temp[i].name,temp[indexmin].name); strcpy(temp[i].phonenum,temp[indexmin].phonenum); strcpy(temp[i].address,temp[indexmin].address); strcpy(temp[indexmin].num,newinfo.num); strcpy(temp[indexmin].name,newinfo.name); strcpy(temp[indexmin].phonenum,newinfo.phonenum); strcpy(temp[indexmin].address,newinfo.address); } Disp(temp,n); /*显示排序后的所有记录*/ saveflag=1; printf("\n=>Sort complete!\n");getchar(); return; } else if(select==2) { for(i=0;i<n-1;i++) { charflag[0]=255; indexmin=0; strcpy(newinfo.num,temp[i].num); /*利用结构变量nesinfo实现数组元素的交换*/ strcpy(newinfo.name,temp[i].name); strcpy(newinfo.phonenum,temp[i].phonenum); strcpy(newinfo.address,temp[i].address); strcpy(temp[i].num,temp[indexmin].num); strcpy(temp[i].name,temp[indexmin].name); strcpy(temp[i].phonenum,temp[indexmin].phonenum); strcpy(temp[i].address,temp[indexmin].address); strcpy(temp[indexmin].num,newinfo.num); strcpy(temp[indexmin].name,newinfo.name); strcpy(temp[indexmin].phonenum,newinfo.phonenum); strcpy(temp[indexmin].address,newinfo.address); } Disp(temp,n); /*显示排序后的所有记录*/ saveflag=1; printf("\n=>Sort complete!\n");getchar(); return; } else { Wrong(); getchar(); getchar(); return; } } void Save(RECORD temp[],int n) { int i=0; FILE *fp; fp=fopen("c:\\record.txt","w"); /*以只写方式打开文本文件*/ if(fp==NULL) /*打开文件失败*/ { printf("\n=>Open file error!\n"); getchar(); return; } for(i=0;i<n;i++) { if(fwrite(&temp[i],sizeof(RECORD),1,fp)==1) /*每次写一条记录或一个结构数组元素至文件*/ { continue; } else { break; } } if(i>0) { getchar(); printf("\n\n=>Save file complete,total saved's record number is:%d\n",i); getchar(); saveflag=0; } else { system("cls"); printf("The current link is empty,no menu record is saved!\n"); getchar(); } fclose(fp); /*关闭此文件*/ }
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白茶丫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值