问题描述:
实现一个通讯录;
通讯录可以用来存储个人的信息,每个人的信息包括:
姓名、性别、年龄、电话、住址。实现增,删,查,找,清空这几个功能。
程序分析:
(1)基本思路:学完了结构体,我们必须通过不断地应用才能真正的掌握。这个通讯录是以两个结构体作为框架搭建的一个小型工程。如下所示:
typedef struct Peo
{
char name[NAME_LEN];
int age;
char sex[SEX_LEN];
char tele[TELE_LEN];
char addr[ADDR_LEN];
}PEO,*PPEO;
这个结构体类型是用来存储一个联系人的信息以个模型。只是定义了这样一个模型,还未定义具体的联系人的信息。
typedef struct Contact
{
PEO dhb[MAX_PEO]; //存储人的信息
int count; //记录有效个数
}Con,*Pcon;
而上面这个结构体类型则是将每个联系人存储起来的一种结构。有了这两种结构体类型,接下来只需要在这个基础上对结构体的访问或者赋值来完成通讯录的各种功能。
(2)功能函数:知道了这个工程的规划思想后,主要任务是编写增,删,查,改,清空以及显示的一些函数,从而实现这个通讯录的编写。在这些函数中需要注意的地方有以下几点:
a.增加联系人的时候,千万不能忘记有效联系人数count++;
b.要删除的联系人是建立在查找到该联系人基础上的操作,从这个联系人开始,依次将后一个人的信息赋给前一个人。最后,将count-1;
c.修改联系人的信息,也是在查找到联系人的基础上的;
d.在写清空所有联系人这个函数的时候,要想到最简便的是将有效联系人的个数count赋为0;
(3)建立工程:在建立工程的时候应该注意,将函数的声明和一些宏定义写在头文件contact.h中,将这些函数的定义单独写在一个.c(.cpp)文件中。再建立一个.c(.cpp)文件用来调用这些函数。这样这个通讯录就能顺利地完成了!
代码如下:
/*头文件<span style="background-color: rgb(255, 0, 0);">contact.h</span>*/ #ifndef __CONTACT_H__ #define __CONTACT_H__ #include<stdio.h> #define NAME_LEN 20 #define SEX_LEN 5 #define TELE_LEN 12 #define ADDR_LEN 20 #define MAX_PEO 1000 /**定义一个结构体类型存储每个人的信息**/ typedef struct Peo { char name[NAME_LEN]; int age; char sex[SEX_LEN]; char tele[TELE_LEN]; char addr[ADDR_LEN]; }PEO,*PPEO; //PEO代表了上边所指的类型,PPEO是指向这个类型的结构指针 /*定义一个电话本使所有人(不超过1000)的信息可以存到里面*/ typedef struct Contact { PEO dhb[MAX_PEO]; //存储人的信息 int count; //记录有效个数 }Con,*Pcon; /**声明以下几个函数**/ void InitContact(Pcon contact); //初始化有效联系人的人数 bool addContact(Pcon contact); //增加联系人 void showContact(Pcon contact); //显示所有联系人 void print_menu(); //打印菜单 int searchContact(Pcon contact); //查找联系人 void deleteContact(Pcon contact); //删除联系人 void clearContact(Pcon contact); //清空所有联系人 bool modifyContact(Pcon contact); //修改联系人信息 #endif /* * 在这个<span style="background-color: rgb(255, 0, 0);">contact.c</span>文件中将定义这几个函数**/ #include"contact.h" #include<string.h> void InitContact(Pcon contact) { contact->count = 0; } bool addContact(Pcon contact) { printf("name:"); scanf("%s",contact->dhb[contact->count].name); printf("age:"); scanf("%d",&(contact->dhb[contact->count].age)); printf("sex:"); scanf("%s",contact->dhb[contact->count].sex); printf("tele:"); scanf("%s",contact->dhb[contact->count].tele); printf("addr:"); scanf("%s",contact->dhb[contact->count].addr); contact->count++; return true; } void showContact(Pcon contact) { int i = 0; for(i = 0;i<contact->count;i++) { printf("%12s",contact->dhb[i].name); printf("%12d",contact->dhb[i].age); printf("%12s",contact->dhb[i].sex); printf("%12s",contact->dhb[i].tele); printf("%12s\n",contact->dhb[i].addr); } } int searchContact(Pcon contact) { char name[NAME_LEN]; printf("name:\n"); scanf("%s",name); int ret = 0; for(ret = 0;ret<contact->count;ret++) { if(strcmp(name,contact->dhb[ret].name) == 0) { return ret; } } return -1; } void deleteContact(Pcon contact) { int ret = searchContact(contact); while(ret<contact->count-1) { contact->dhb[ret] = contact->dhb[ret+1]; ret++; } (contact->count)--; } void clearContact(Pcon contact) { contact->count = 0; } bool modifyContact(Pcon contact) { int ret = searchContact(contact); printf("name:"); scanf("%s",contact->dhb[ret].name); printf("age:"); scanf("%d",&(contact->dhb[ret].age)); printf("sex:"); scanf("%s",contact->dhb[ret].sex); printf("tele:"); scanf("%s",contact->dhb[ret].tele); printf("addr:"); scanf("%s",contact->dhb[ret].addr); return true; } void print_menu() { printf("***************************\n"); printf("*[1]add: [2]show: *\n"); printf("*[3]search: [4]delete:*\n"); printf("*[5]clear: [6]modify:*\n"); printf("***************************\n"); } /**定义这几个函数**/ #include"contact.h" #include<string.h> void InitContact(Pcon contact) { contact->count = 0; } bool addContact(Pcon contact) { printf("name:"); scanf("%s",contact->dhb[contact->count].name); printf("age:"); scanf("%d",&(contact->dhb[contact->count].age)); printf("sex:"); scanf("%s",contact->dhb[contact->count].sex); printf("tele:"); scanf("%s",contact->dhb[contact->count].tele); printf("addr:"); scanf("%s",contact->dhb[contact->count].addr); contact->count++; return true; } void showContact(Pcon contact) { int i = 0; for(i = 0;i<contact->count;i++) { printf("%12s",contact->dhb[i].name); printf("%12d",contact->dhb[i].age); printf("%12s",contact->dhb[i].sex); printf("%12s",contact->dhb[i].tele); printf("%12s\n",contact->dhb[i].addr); } } int searchContact(Pcon contact) { char name[NAME_LEN]; printf("name:\n"); scanf("%s",name); int ret = 0; for(ret = 0;ret<contact->count;ret++) { if(strcmp(name,contact->dhb[ret].name) == 0) { return ret; } } return -1; } void deleteContact(Pcon contact) { int ret = searchContact(contact); while(ret<contact->count-1) { contact->dhb[ret] = contact->dhb[ret+1]; ret++; } (contact->count)--; } void clearContact(Pcon contact) { contact->count = 0; } bool modifyContact(Pcon contact) { int ret = searchContact(contact); printf("name:"); scanf("%s",contact->dhb[ret].name); printf("age:"); scanf("%d",&(contact->dhb[ret].age)); printf("sex:"); scanf("%s",contact->dhb[ret].sex); printf("tele:"); scanf("%s",contact->dhb[ret].tele); printf("addr:"); scanf("%s",contact->dhb[ret].addr); return true; } void print_menu() { printf("***************************\n"); printf("*[1]add: [2]show: *\n"); printf("*[3]search: [4]delete:*\n"); printf("*[5]clear: [6]modify:*\n"); printf("***************************\n"); } /* * <span style="background-color: rgb(255, 0, 0);">main.c</span>中函数的调用*/ #include"contact.h" int main() { Con contact; InitContact(&contact); int input = 1; int ret; while(input) { print_menu(); printf("please chose input:\n"); scanf("%d",&input); switch(input) { case 1: addContact(&contact); break; case 2: showContact(&contact); break; case 3: ret = searchContact(&contact); if(ret != -1) { printf(" found it!\n"); } else { printf("not exist!\n"); } break; case 4: deleteContact(&contact); break; case 5: clearContact(&contact); break; case 6: modifyContact(&contact); break; default: break; } } return 0; }