问题描述:
实现一个通讯录;
通讯录可以用来存储个人的信息,每个人的信息包括:
姓名、性别、年龄、电话、住址。实现增,删,查,找,清空这几个功能。
程序分析:
(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; <span style="font-family: Arial, Helvetica, sans-serif;">/*将有效联系人数初始化为0,也可以直接定义为0,</span><span style="font-family: Arial, Helvetica, sans-serif;">而不必封装一个这样的函数来达到contact初始化的目的*/</span>
}
bool addContact(Pcon contact)
{
printf("name:");//提示输入要添加的姓名
scanf("%s",contact->dhb[contact->count].name);//通过箭头访问到结构体中存放姓名的空间,并且将内容赋给name
printf("age:");<span style="font-family: Arial, Helvetica, sans-serif;">//提示输入要添加的年龄</span>
scanf("%d",&(contact->dhb[contact->count].age));//<span style="font-family: Arial, Helvetica, sans-serif;">通过箭头访问到结构体中存放姓名的空间,并且将内容赋给age</span>
printf("sex:");<span style="font-family: Arial, Helvetica, sans-serif;">//提示输入要添加的性别</span>
scanf("%s",contact->dhb[contact->count].sex);//<span style="font-family: Arial, Helvetica, sans-serif;">通过箭头访问到结构体中存放姓名的空间,并且将内容赋给sex</span>
printf("tele:"); <span style="font-family: Arial, Helvetica, sans-serif;">//提示输入要添加的姓名</span><span style="font-family: Arial, Helvetica, sans-serif;"> </span>
scanf("%s",contact->dhb[contact->count].tele);//<span style="font-family: Arial, Helvetica, sans-serif;">通过箭头访问到结构体中存放姓名的空间,并且将内容赋给tele</span>
printf("addr:");<span style="font-family: Arial, Helvetica, sans-serif;">//提示输入要添加的姓名</span>
scanf("%s",contact->dhb[contact->count].addr);//<span style="font-family: Arial, Helvetica, sans-serif;">通过箭头访问到结构体中存放姓名的空间,并且将内容赋给addr</span>
contact->count++;//使有效联系人数赠加
return true;
}
void showContact(Pcon contact)
{
int i = 0;//定义循环变量,并且将其初始化为0
for(i = 0;i<contact->count;i++)//运用for循环将所有联系人的所有信息全部打印出来
{
printf("%12s",contact->dhb[i].name);//靠右12位对齐,输出联系人的姓名
printf("%12d",contact->dhb[i].age);<span style="font-family: Arial, Helvetica, sans-serif;">//靠右12位对齐,输出联系人的年龄</span>
printf("%12s",contact->dhb[i].sex);<span style="font-family: Arial, Helvetica, sans-serif;">//靠右12位对齐,输出联系人的性别</span>
printf("%12s",contact->dhb[i].tele);<span style="font-family: Arial, Helvetica, sans-serif;">//靠右12位对齐,输出联系人的电话号码</span>
printf("%12s\n",contact->dhb[i].addr);<span style="font-family: Arial, Helvetica, sans-serif;">//靠右12位对齐,输出联系人的住址</span>
}
}
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;//若查找的联系人不存在,则返回-1
}
void deleteContact(Pcon contact)
{
int ret = searchContact(contact);//调用“查找联系人”这个函数,并用ret接收所查找到的联系人的下标
while(ret<contact->count-1)
{
contact->dhb[ret] = contact->dhb[ret+1];//这种思路:将ret位置的用ret+1位置的内容覆盖,再讲ret++,使ret指向下一位,相同思路,将后一个往前一个覆盖到前一个的位置,ret往后走,从后往前覆盖,这样就达到了将原来ret位置的联系人删除的功能
ret++;
}
(contact->count)--;//删除完之后,将有效联系人数-1
}
void clearContact(Pcon contact)
{
contact->count = 0;//清空联系人,即将有效联系人数置为0
}
bool modifyContact(Pcon contact)
{
int ret = searchContact(contact);<span style="font-family: Arial, Helvetica, sans-serif;">//调用“查找联系人”这个函数,并用ret接收所查找到的联系人的下标</span>
printf("name:");
scanf("%s",contact->dhb[ret].name);<span style="font-family: Arial, Helvetica, sans-serif;">//输入要修改后的姓名</span>
printf("age:");
scanf("%d",&(contact->dhb[ret].age)); <span style="font-family: Arial, Helvetica, sans-serif;">//输入要修改后的年龄</span>
printf("sex:");
scanf("%s",contact->dhb[ret].sex); <span style="font-family: Arial, Helvetica, sans-serif;">//输入要修改后的性别</span>
printf("tele:");
scanf("%s",contact->dhb[ret].tele);<span style="font-family: Arial, Helvetica, sans-serif;">//输入要修改后的电话号码</span>
printf("addr:");
scanf("%s",contact->dhb[ret].addr);<span style="font-family: Arial, Helvetica, sans-serif;">//输入要修改后的住址</span><span style="font-family: Arial, Helvetica, sans-serif;"> </span>
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; //定义结构体contact
InitContact(&contact);//使有效联系人数得到初始化
int input = 1;
int ret;
while(input) //运用while循环使程序可以在控制下循环测试
{
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");//ret没有返回1,说明找到
}
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;
}