题目:实现一个通讯录,通讯录可以用来存储1000个人的信息,每个人的信息包括:姓名,性别,年龄,电话,住址。
提供方法:1.添加联系人信息 2.删除指定联系人的信息 3.查找指定联系人的信息 4.修改指定联系人的信息 5.显示所有联系人信息 6.清空所有联系人 7.以名字排序所有联系人
思路分析:1. 首先我们可以分三个模块来解决这个问题,第一个模块我们需要一个头文件,这个头文件里可以包含一些相应信息,当实现文件和测试文件包含自己定义的头文件时便可以获得一些相关的信息。所以头文件里应该包括一个结构体,这个结构体里应包含姓名,性别,年龄,电话,住址。同时还可以定义一个结构体,这个结构体里包含通讯录,同时通讯录里人员的计数变量,将通讯录的地址传到别的地方便可以实现对它遍历或者其他操作。 2.第二个模块便是我们的测试函数,测试函数便可以实现我们的菜单打印,同时由我们接收不同的值便可以实现不同的操作,就是相应的方法的实现,这里很明显可以通过一个switch语句来进行控制。 3.第三个模块便是我们的方法实现的函数,将模块2里定义的类型为通讯录的地址传到各个方法里,这样便可以实现对通讯录的操作。
代码实现:
模块1:
#pragma oncetypedef struct Peo//每一个人的信息用一个结构来接收,包括姓名,性别,年龄,电话,地址{char name[20];char sex[4];int age;char tell[12];char address[20];}Peo;typedef struct Contact//将通讯录和人员计数也声明在结构体里{Peo Dhb[1000];int count;}Contact;void add_stu(Contact *p);//相应函数void del_stu(Contact *p);void find_stu(Contact *p);void modify_stu(Contact *p);void show_stu(Contact *p); void clear_stu(Contact *p);void sort_stu(Contact *p);
模块2:(测试功能)
#include<stdio.h>#include"contact.h"#include<stdlib.h>Contact con;//类型为Contact变量,里面包含电话本和计数变量void menu(){printf("menu:n");printf("**********1.添加联系人信息************n");printf("********2.删除指定联系人信息**********n");printf("********3.查找指定联系人信息**********n");printf("********4.修改指定联系人信息**********n");printf("********5.显示所有联系人信息**********n");printf("**********6.清空联系人信息************n");printf("******7.以名字排序所有联系人信********n");}void test()//测试函数{int input = 1;menu();while (input){printf("请输入选项:");scanf_s("%d", &input);switch (input)//方法选择功能的实现{case 1:add_stu(&con);break;case 2:del_stu(&con);break;case 3:find_stu(&con);break;case 4:modify_stu(&con);break;case 5:show_stu(&con);break;case 6:clear_stu(&con);break;case 7:sort_stu(&con);break;case 0:exit(1);break;}}}int main(){test(); return 0;}
模块3:(方法的具体实现)
#include"contact.h"#include<string.h>int search(Contact *p,char *pname)//分装的函数利于删除,查找,修改方法的实现{int ret;int i;for (i = 0; i < p->count; i++){if(strcmp(p->Dhb[i].name, pname)==0)return i;}return -1;}void add_stu(Contact *p)//添加联系人{printf("请输入姓名:");scanf("%s", p->Dhb[p->count].name);printf("请输入性别:");scanf("%s", p->Dhb[p->count].sex);printf("请输入年龄:");scanf("%d", &p->Dhb[p->count].age);printf("请输入电话:");scanf("%s", p->Dhb[p->count].tell);printf("请输入地址:");scanf("%s", p->Dhb[p->count].address);p->count++;printf("联系人添加成功n");}void del_stu(Contact *p)//删除联系人{int ret;int n;int i = 0;char name[20];printf("请输入要删除人的姓名:");scanf("%s",name);ret=search(p,name);if (ret !=-1){printf("要删除的人存在n");printf("你是否确定删除该联系人?n");printf("确定输入1,不删除输入0n");scanf("%d",&n);if (n == 1){for (i = 0; i < p->count; i++){p->Dhb[i] = p->Dhb[i + 1];//使i后面的元素向前覆盖便可以删掉}printf("删除成功n");}else{printf("删除失败n");}}}void find_stu(Contact *p)//查找联系人{int ret;char name[20];printf("请输入要查找人的姓名:");scanf("%s", name);ret = search(p, name);if (ret !=-1){printf("要查找的人存在n");printf("%s ", p->Dhb[ret].name);printf("%s ", p->Dhb[ret].sex);printf("%d ", p->Dhb[ret].age);printf("%s ", p->Dhb[ret].tell);printf("%s ", p->Dhb[ret].address);}}void modify_stu(Contact *p)//修改联系人{int ret;char name[20];printf("请输入要修改人的姓名:");scanf("%s", name);ret = search(p, name);if (ret != -1){printf("请把姓名修改成:");scanf("%s", p->Dhb[ret].name);printf("请把性别修改成:");scanf("%s", p->Dhb[ret].sex);printf("请把年龄修改成:");scanf("%d", &p->Dhb[ret].age);printf("请把电话修改成:");scanf("%s", p->Dhb[ret].tell);printf("请把地址修改成:");scanf("%s", p->Dhb[ret].address);}else{printf("不存在此人n");}}void show_stu(Contact *p)//显示联系人信息{int i = 0;printf("输出所有人的信息:");for (i = 0; i <( p->count); i++){printf("%s ",p->Dhb[i].name);printf("%s ", p->Dhb[i].sex);printf("%d ", p->Dhb[i].age);printf("%s ", p->Dhb[i].tell);printf("%s ", p->Dhb[i].address);}printf("n");}void clear_stu(Contact *p)//清空联系人{p->count = 0;//是人员计数的变量置0就可以实现清空}void sort_stu(Contact *p)//以名字排序所有联系人{int i = 0;int j = 0;for (i = 0; i < p->count-1;i++)//冒泡法for (j = 0; j < p->count - 1 - i;j++){if (strcmp(p->Dhb[j].name, p->Dhb[j + 1].name)>0){Peo tmp;tmp=p->Dhb[j];p->Dhb[j] =p-> Dhb[j + 1];p->Dhb[j + 1] = tmp;}}void show_stu( p);}
总结:此题只是利用了相关结构体的知识,主要难处就是三个模块各自的分工不好想到,其他地方便只是基本方法的实现。