C语言,手机通讯录程序设计

    技术2023-07-01  110

    C语言,手机通讯录程序设计

    1、系统功能模块框图设计2.数据结构说明3、详细设计4.完整代码如下

    1、系统功能模块框图设计

    2.数据结构说明

    1)头文件 1.#include<stdio.h>,头文件stdio.hC语言标准输入输出函数库。 2.#include<stdlib.h>,头文件stdlib.hC语言实用工具函数库。 3.#include<windows.h>,头文件windows.h这是Windows平台下的系统库 #include<assert.h>,头文件,assert.h用来解决程序终止问题。(源于网络,在程序运行中需要一个结束程序的方法)

    struct ITEM { int key; int balue; }; void additem(struct ITEM *itemptr) { assert(itemptr != NULL); }

    2)结构体

    定义了一个结构体类型,结构体名为“book”。 结构体成员分别为 1.字符类型char,成员名为name,用来表示通讯录姓名。 2.字符类型char,成员名为office,用来表示通讯录的办公电话。 3.字符类型char,成员名为home,用来表示通讯录的家庭电话。 4.字符类型char,成员名为move,用来表示通讯录的移动电话。 5.字符类型char,成员名为sex,用来表示通讯录的性别。 6.字符类型char,成员名为cla,用来表示通讯录的分组。

    定义一个结构体变量s[M];

    struct book { char name[10];//姓名 char office[20];//办公电话 char home[20];//家庭电话 char move[20];//移动电话 char sex[10];//性别 char cla[10];//分组 }s[M];

    3、详细设计

    (1)准备数据 建立数据文件,如下图2所示。 图2 (2)程序整体框架设计 思路分析:手机通讯录的信息存放在“JK0124.txt”文件中,在我的程序中并没有进行全局变量的定义,全是局部变量,也就是每个函数功能块都是单独的一个小程序。通过主函数进行调用,整个程序框架如下图3所示。

    图3 系统框图 (3)主运行OPEN()函数和查阅信息refer()函数 思路分析:利用OPEN()函数调用各个功能模块。由于查询函数refer()和主运行函数的思路是一样的,都是先展示菜单部分,在使用swich选择结构进行选择,调用。所以下面以OPEN()函数进行详细说明。

    第一步,先展示主菜单menu1(),根据用户键盘输入数字,判断并调用对应的功能函数。

    void menu1()//主菜单 { printf("_________________________________\n"); printf("| 手机通讯录操作系统 |\n"); printf("|_______________________________|\n"); printf("|*******************************|\n"); printf("|**********1.查询信息***********|\n"); printf("|**********2.修改数据***********|\n"); printf("|**********3.添加数据***********|\n"); printf("|**********4.删除数据***********|\n"); printf("|**********5.进行排序***********|\n"); printf("|**********6.退出系统***********|\n"); printf("|*******************************|\n"); printf("|_______________________________|\n"); }

    第二步,根据用户键盘输入的数组,赋值给input。采用switch选择结构进行选择。并调用每个数字对应的函数功能块。

    switch (input) { case 1: refer(); break; case 2: modify(); break; case 3: AddData(); break; case 4: Delete(); break; case 5: ordering(); break; case 6: getout(); additem(NULL); break; default: printf("选择错误,请重新选择!\n"); break; } } while (input);

    (4)作者信息Front()函数 思路分析:使用windows系统下的系统库SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY | FOREGROUND_);用来设置控制台的颜色信息。 使用一个for运行来延迟程序的运行,在for循环中使用了整数后加U来解决整数长度过长问题。 最后使用system(“cls”);清除指令,清除控制台信息。

    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED);//设置红色 printf("\n"); printf(" 手机通讯录系统\n"); printf("\n"); SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN);//设置绿色 printf("\n"); printf(" 作者:XXX\n"); printf("\n"); SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_BLUE);//设置蓝色 printf("\n"); printf(" QQ:2238265682\n"); printf("\n"); SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_BLUE);//设置红色和蓝色相加 printf("\n"); printf(" 请等待......"); printf("\n"); SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN); for(int i =0 ;i<=3000000000U;i++){} system("cls");

    (5)查询函数部分。姓名查询refername()函数,分组查询referclass()函数,办公电话查询officephone()函数,家庭电话查询homephone()函数,移动电话查询movephone()函数。 思路分析:查询函数部分的代码和思路基本一样,这里以姓名查询为例进行思路分析。唯一不一样的地方就在于查找的信息不同,对结构体体类型中成员的引用的不一样,也就是s[i].name还是s[i].cla的不同。 第一步:从键盘获取用户输入的查找信息。

    char nam[100]; printf("请输入你要查找的姓名->"); scanf("%s",nam);

    第二步,使用字符操作函数strcmp(str1,str2)进行两个字符串的比较。如果两个字符串相同就输入这一整条信息,如果不一样就输出查无此人。

    while(!feof(fp)) { if(strcmp(nam,s[i].name)==0) { printf("\n已查到该信息,记录为:\n"); puts(title); printf("%-9s %16s %16s %16s %16s %16s\n",s[i].name,s[i].office,s[i].home,s[i].move,s[i].sex,s[i].cla); k=1; break; } i++; } if(k==0) { printf("\n对不起,查无此人!\n"); }

    (6)修改数据部分modify()函数 思路分析: 第一步,既然需要修改数据,首先就要对数据进行查询,判断所要查询的数据是否存在,这个查询部分就和上面的查询函数就有点相识了。

    while(!feof(fp)) { if(strcmp(nam,s[i].name)==0) { printf("\n已查到该信息,记录为:\n"); puts(title); printf("%-9s %16s %16s %16s %16s %16s\n",s[i].name,s[i].office,s[i].home,s[i].move,s[i].sex,s[i].cla); k=1; break; } i++; } if(k==0) { printf("\n对不起,查无此人!\n");

    第二步,查找到需要修改的信息后就要,对该数据进行修改,这里仍然要使用对字符串的操作函数,这里使用的是strcpy(str1,str2)字符串拷贝函数,将str2所指的字符串内容复制到str1所指的存储空间中,函数返回str1的值。

    char num1[10]; printf("\n请输入你要修改的新姓名信息->"); scanf("%s",&num1); strcpy(s[i].name,num1); char num2[10]; printf("\n请输入你要修改的新办公电话信息->"); scanf("%s",&num2); strcpy(s[i].office,num2); char num3[10]; printf("\n请输入你要修改的新家庭电话信息->"); scanf("%s",&num3); strcpy(s[i].home,num3); char num4[10]; printf("\n请输入你要修改的新移动电话信息->"); scanf("%s",&num4); strcpy(s[i].move,num4); char num5[10]; printf("\n请输入你要修改的新性别信息->"); scanf("%s",&num5); strcpy(s[i].sex,num5); char num6[10]; printf("\n请输入你要修改的新分组信息->"); scanf("%s",&num6); strcpy(s[i].cla,num6);

    (7)添加数据AddData()函数 思路分析:添加数据,事实上和修改数据的思路一样,只是添加数据不需要进行判断了,直接在数组的最后加一行,进行数据输入就可以了。同样使用字符串操作函数strcpy()函数进行字符串的操作。

    char num1[10]; printf("\n请输入你要添加的新姓名信息->"); scanf("%s",&num1); strcpy(s[i].name,num1); char num2[10]; printf("\n请输入你要添加的新办公电话信息->"); scanf("%s",&num2); strcpy(s[i].office,num2); char num3[10]; printf("\n请输入你要添加的新家庭电话信息->"); scanf("%s",&num3); strcpy(s[i].home,num3); char num4[10]; printf("\n请输入你要添加的新移动电话信息->"); scanf("%s",&num4); strcpy(s[i].move,num4); char num5[10]; printf("\n请输入你要添加的新性别信息->"); scanf("%s",&num5); strcpy(s[i].sex,num5); char num6[10]; printf("\n请输入你要添加的新分组信息->"); scanf("%s",&num6); strcpy(s[i].cla,num6);

    (8)删除数据Delete()函数

    思路分析:删除数据事实上,就是将你要删除的数据替换掉就行了,也就是将所给的数据换成空字符串就行了。在删除数据中同样使用的是字符串操作函数strcpy(str1,str2),只是将这里的str2换成空字符串了。对于需要查找你要删除的信息的代码和添加数据已经修改数据一样都是一个字符查找操作。

    strcpy(s[i].name," ");strcpy(s[i].office," ");strcpy(s[i].home," "); strcpy(s[i].move," ");strcpy(s[i].sex," ");strcpy(s[i].cla," ");

    (9)排序操作ordering()函数

    思路分析:运用了一个排序的模板,这里用变量m记录最小的数组元素下标,先设m=i,然后通过循环来实现,循环变量n从最小开始,不断比较。用当前最小值(s[n].name)与(s[m].name)进行比较,如果s[n].name小于s[m].name,然后运用结构体变量t将s[n].name与s[m].name进行对换。

    for(i = 0;i < j;i++ ) { m = i; for(int n = 1;n < i;n++) { if(strcmp(s[n].name,s[m].name)>0) { m = n; } t = s[m]; s[m] = s[n]; s[n] = t; } }

    4.完整代码如下

    #include<stdio.h> #include<stdlib.h> #include<windows.h> #include<assert.h> #define M 20 struct book { char name[10];//姓名 char office[20];//办公电话 char home[20];//家庭电话 char move[20];//移动电话 char sex[10];//性别 char cla[10];//分组 }s[M]; / struct ITEM { int key; int balue; }; // char title[100]; void OPEN();//总运行 void Front();//作者信息 void menu1();//主目录 void menu2();//查询目录 void refer();//查询页面 void getout();//退出程序 void input();//读取数据 void print();//输出数据 void refername();//根据姓名查询 void referclass();//根据分组类型查询 void officephone();//根据办公电话查询 void homephone();//根据办公电话查询 void movephone();//根据办公电话查询 void modify();//修改数据 void AddData();//添加数据 void Delete();//删除数据 void ordering();//进行排序 /// int main() { Front(); OPEN(); } /// void Front() { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED);//设置红色 printf("\n"); printf(" 手机通讯录系统\n"); printf("\n"); SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN);//设置绿色 printf("\n"); printf(" 作者:乾中权\n"); printf("\n"); SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_BLUE);//设置蓝色 printf("\n"); printf(" QQ:2238265682\n"); printf("\n"); SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_BLUE);//设置红色和蓝色相加 printf("\n"); printf(" 请等待......"); printf("\n"); SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN); for(int i =0 ;i<=3000000000U;i++){} system("cls"); } /// void getout() { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_BLUE);//设置蓝色 printf("\n"); printf("\n"); printf(" 你已退出程序,欢迎下次使用。 "); printf("\n"); printf("\n"); for (int i = 0; i <= 3000000000U; i++){} } void additem(struct ITEM *itemptr) { assert(itemptr != NULL); } / void menu1()//主菜单 { printf("_________________________________\n"); printf("| 手机通讯录操作系统 |\n"); printf("|_______________________________|\n"); printf("|*******************************|\n"); printf("|**********1.查询信息***********|\n"); printf("|**********2.修改数据***********|\n"); printf("|**********3.添加数据***********|\n"); printf("|**********4.删除数据***********|\n"); printf("|**********5.进行排序***********|\n"); printf("|**********6.退出系统***********|\n"); printf("|*******************************|\n"); printf("|_______________________________|\n"); } void menu2()//查询菜单 { printf(" _________________________________\n"); printf(" | 查询信息菜单 |\n"); printf(" |________________________________|\n"); printf(" |*******1.按姓名查询*************|\n"); printf(" |*******2.按分组查询*************|\n"); printf(" |*******3.按办公电话查询*********|\n"); printf(" |*******4.按家庭电话查询*********|\n"); printf(" |*******4.按移动电话查询*********|\n"); printf(" |*******6.显示全部信息***********|\n"); printf(" |*******0.返回上一级目录*********|\n"); printf(" |********************************|\n"); printf(" |________________________________|\n"); } / void refer()//refer查阅信息 { int Q; do { menu2(); printf("请选择功能->"); scanf("%d",&Q); switch (Q) { case 1: refername(); break; case 2: referclass(); break; case 3: officephone(); break; case 4: homephone(); break; case 5: movephone(); break; case 6: print(); break; case 0: OPEN(); break; default: printf("选择错误,请重新选择!\n"); break; } } while (Q); } // void OPEN()//主运行 { int input; do { menu1(); printf("请选择功能—>"); scanf("%d",&input); switch (input) { case 1: refer(); break; case 2: modify(); break; case 3: AddData(); break; case 4: Delete(); break; case 5: ordering(); break; case 6: getout(); additem(NULL); break; default: printf("选择错误,请重新选择!\n"); break; } } while (input); } // void input()//输入数据,查询所有数据 { FILE *fp; fp = fopen("JK0124.txt","r"); if (fp==NULL) { printf("文件打开失败!"); exit(0); } fgets(title,100,fp); int i=0; while (!feof(fp)) { fscanf(fp,"%s%s%s%s%s%s\n",s[i].name,s[i].office,s[i].home,s[i].move,s[i].sex,s[i].cla); i++; } fclose(fp); } // void print()//输出所有数据 { int i; puts(title); for(i=0;i<M;i++) { printf("%-9s %16s %16s %16s %16s %16s\n",s[i].name,s[i].office,s[i].home,s[i].move,s[i].sex,s[i].cla); } } // void refername()//按姓名进行查询 { int k=0,i; char nam[100]; printf("请输入你要查找的姓名->"); scanf("%s",nam); FILE *fp; fp = fopen("JK0124.txt","r"); if (fp==NULL) { printf("文件打开失败!"); exit(0); } while(!feof(fp)) { fscanf(fp,"%s%s%s%s%s%s\n",s[i].name,s[i].office,s[i].home,s[i].move,s[i].sex,s[i].cla); if(strcmp(nam,s[i].name)==0) { printf("\n已查到该信息,记录为:\n"); puts(title); printf("%-9s %16s %16s %16s %16s %16s\n",s[i].name,s[i].office,s[i].home,s[i].move,s[i].sex,s[i].cla); k=1; break; } i++; } if(k==0) { printf("\n对不起,查无此人!\n"); } fclose(fp); } // void referclass()//按分组进行查询 { int k=0,i=0; char nam[100]; printf("请输入你要查找的分组类型->"); scanf("%s",nam); printf("\n已查到该信息,记录为:\n"); puts(title); FILE *fp; fp = fopen("JK0124.txt","r"); if (fp==NULL) { printf("文件打开失败!"); exit(0); } while(!feof(fp)) { fscanf(fp,"%s%s%s%s%s%s\n",s[i].name,s[i].office,s[i].home,s[i].move,s[i].sex,s[i].cla); if(strcmp(nam,s[i].cla)==0) { printf("%-9s %16s %16s %16s %16s %16s\n",s[i].name,s[i].office,s[i].home,s[i].move,s[i].sex,s[i].cla); k=1; } i++; } if(k==0) { printf("\n对不起,查无此类型!\n"); } fclose(fp); } void officephone()//按办公电话查询 { int k=0,i; char nam[100]; printf("请输入你要查找的办公电话->"); scanf("%s",nam); FILE *fp; fp = fopen("JK0124.txt","r"); if (fp==NULL) { printf("文件打开失败!"); exit(0); } while(!feof(fp)) { fscanf(fp,"%s%s%s%s%s%s\n",s[i].name,s[i].office,s[i].home,s[i].move,s[i].sex,s[i].cla); if(strcmp(nam,s[i].office)==0) { printf("\n已查到该信息,记录为:\n"); puts(title); printf("%-9s %16s %16s %16s %16s %16s\n",s[i].name,s[i].office,s[i].home,s[i].move,s[i].sex,s[i].cla); k=1; break; } i++; } if(k==0) { printf("\n对不起,查无此人!\n"); } fclose(fp); } / void homephone()//按家庭电话查询 { int k=0,i; char nam[100]; printf("请输入你要查找的家庭电话->"); scanf("%s",nam); FILE *fp; fp = fopen("JK0124.txt","r"); if (fp==NULL) { printf("文件打开失败!"); exit(0); } while(!feof(fp)) { fscanf(fp,"%s%s%s%s%s%s\n",s[i].name,s[i].office,s[i].home,s[i].move,s[i].sex,s[i].cla); if(strcmp(nam,s[i].home)==0) { printf("\n已查到该信息,记录为:\n"); puts(title); printf("%-9s %16s %16s %16s %16s %16s\n",s[i].name,s[i].office,s[i].home,s[i].move,s[i].sex,s[i].cla); k=1; break; } i++; } if(k==0) { printf("\n对不起,查无此人!\n"); } fclose(fp); } /// void movephone()//按移动电话查询 { int k=0,i; char nam[100]; printf("请输入你要查找的移动电话->"); scanf("%s",nam); FILE *fp; fp = fopen("JK0124.txt","r"); if (fp==NULL) { printf("文件打开失败!"); exit(0); } while(!feof(fp)) { fscanf(fp,"%s%s%s%s%s%s\n",s[i].name,s[i].office,s[i].home,s[i].move,s[i].sex,s[i].cla); if(strcmp(nam,s[i].move)==0) { printf("\n已查到该信息,记录为:\n"); puts(title); printf("%-9s %16s %16s %16s %16s %16s\n",s[i].name,s[i].office,s[i].home,s[i].move,s[i].sex,s[i].cla); k=1; break; } i++; } if(k==0) { printf("\n对不起,查无此人!\n"); } fclose(fp); } /// void modify()//修改数据 { int m,k=0,i=0; char namekey[10]; printf("请输入你要修改的通讯录姓名->"); scanf("%s",&namekey); FILE *fp; fp = fopen("JK0124.txt","r"); if (fp == NULL) { printf("文件打开失败!"); } while(!feof(fp)) { fscanf(fp,"%s%s%s%s%s%s\n",s[i].name,s[i].office,s[i].home,s[i].move,s[i].sex,s[i].cla); if(strcmp(namekey,s[i].name)==0) { k=1; break; } i++; } if (k==1) { printf("已经查到该姓名所对应的信息\n"); puts(title); printf("%-9s %16s %16s %16s %16s %16s\n",s[i].name,s[i].office,s[i].home,s[i].move,s[i].sex,s[i].cla); printf("*********************\n"); printf("******1.确定修改******\n"); printf("******0.放弃修改******\n"); printf("*********************\n"); printf("请选择->"); scanf("%d",&m); if(m==1) { char num1[10]; printf("\n请输入你要修改的新姓名信息->"); scanf("%s",&num1); strcpy(s[i].name,num1); char num2[10]; printf("\n请输入你要修改的新办公电话信息->"); scanf("%s",&num2); strcpy(s[i].office,num2); char num3[10]; printf("\n请输入你要修改的新家庭电话信息->"); scanf("%s",&num3); strcpy(s[i].home,num3); char num4[10]; printf("\n请输入你要修改的新移动电话信息->"); scanf("%s",&num4); strcpy(s[i].move,num4); char num5[10]; printf("\n请输入你要修改的新性别信息->"); scanf("%s",&num5); strcpy(s[i].sex,num5); char num6[10]; printf("\n请输入你要修改的新分组信息->"); scanf("%s",&num6); strcpy(s[i].cla,num6); printf("修改成功\n"); printf("修改后的通讯录信息如下\n"); print(); } } else { printf("查无此人,无法修改!"); } fclose(fp); } void AddData()//添加数据 { int i=0; FILE *fp; fp = fopen("JK0124.txt","r"); if (fp == NULL) { printf("文件打开失败!"); } while(!feof(fp)) { fscanf(fp,"%s%s%s%s%s%s\n",s[i].name,s[i].office,s[i].home,s[i].move,s[i].sex,s[i].cla); i++; } char num1[10]; printf("\n请输入你要添加的新姓名信息->"); scanf("%s",&num1); strcpy(s[i].name,num1); char num2[10]; printf("\n请输入你要添加的新办公电话信息->"); scanf("%s",&num2); strcpy(s[i].office,num2); char num3[10]; printf("\n请输入你要添加的新家庭电话信息->"); scanf("%s",&num3); strcpy(s[i].home,num3); char num4[10]; printf("\n请输入你要添加的新移动电话信息->"); scanf("%s",&num4); strcpy(s[i].move,num4); char num5[10]; printf("\n请输入你要添加的新性别信息->"); scanf("%s",&num5); strcpy(s[i].sex,num5); char num6[10]; printf("\n请输入你要添加的新分组信息->"); scanf("%s",&num6); strcpy(s[i].cla,num6); printf("添加成功\n"); printf("添加后的通讯录信息如下\n"); print(); fclose(fp); } /// void Delete()//删除数据 { int m,k=0,i=0; char namekey[10]; long a; printf("请输入你要删除的通讯录姓名->"); scanf("%s",&namekey); FILE *fp; fp = fopen("JK0124.txt","a"); if (fp == NULL) { printf("文件打开失败!"); } while(!feof(fp)) { fscanf(fp,"%s%s%s%s%s%s\n",s[i].name,s[i].office,s[i].home,s[i].move,s[i].sex,s[i].cla); if(strcmp(namekey,s[i].name)==0) { k=1; break; } i++; } if (k==1) { printf("已经查到该姓名所对应的信息\n"); puts(title); printf("%-9s %16s %16s %16s %16s %16s\n",s[i].name,s[i].office,s[i].home,s[i].move,s[i].sex,s[i].cla); printf("*********************\n"); printf("******1.确定删除******\n"); printf("******0.放弃删除******\n"); printf("*********************\n"); printf("请选择->"); scanf("%d",&m); int n; if(m==1) { for(n = i; n < M-1;n++) { strcpy(s[n].name,s[n+1].name);strcpy(s[n].office,s[n+1].office);strcpy(s[n].home,s[n+1].home); strcpy(s[n].move,s[n+1].move);strcpy(s[n].sex,s[n+1].sex);strcpy(s[n].cla,s[n+1].cla); } /*strcpy(s[i].name," ");strcpy(s[i].office," ");strcpy(s[i].home," "); strcpy(s[i].move," ");strcpy(s[i].sex," ");strcpy(s[i].cla," ");*/ printf("删除成功\n"); printf("删除后的通讯录信息如下\n"); print(); } } else { printf("查无此人,无法修改!"); } fclose(fp); } /// void ordering()//选择法排序操作 { int i=0,m,n,j=0; struct book t; FILE *fp; fp = fopen("JK0124.txt","r"); if (fp == NULL) { printf("文件打开失败!"); } while(!feof(fp)) { fscanf(fp,"%s%s%s%s%s%s\n",s[j].name,s[j].office,s[j].home,s[j].move,s[j].sex,s[j].cla); j++; } for(i = 0;i < j;i++ ) { m = i; for( n = i+1;n < j;n++) { if(strcmp(s[n].name,s[m].name)>0) { m = n; } t = s[m]; s[m] = s[n]; s[n] = t; } } print(); fclose(fp); }
    Processed: 0.017, SQL: 9