基本要求:
通讯录可以用来存储1000个人的信息,每个人的信息包括:姓名、性别、年龄、电话、住址
实现功能:
- 添加联系人信息
- 删除指定联系人信息
- 查找指定联系人信息
- 修改指定联系人信息
- 显示所有联系人信息
- 清空所有联系人
- 以名字排序所有联系人
程序代码
- test.c
//引头文件
#include"contact.h"
void menu()
{
printf("***************************************\n");
printf("******1. add 2. del **********\n");
printf("******3. search 4. modify **********\n");
printf("******5. show 6. clear **********\n");
printf("******7. sort 0. exit **********\n");
}
int main()
{
int input = 0;
//创建通讯录
contact con;//con就是通讯录,里边包含:1000的元素的数和size
//初始化通讯录
initcontact(&con);
do
{
menu();
printf("请选择:");
scanf("%d", &input);
switch (input)
{
case add:
//添加联系人信息
addcontact(&con);
break;
case del:
//删除指定联系人信息
delcontact(&con);
break;
case search:
//查找指定联系人信息
findcontact(&con);
break;
case modify:
//修改指定联系人信息
modifycontact(&con);
break;
case sort:
//以名字排序所有联系人
sortcontact(&con);
break;
case show:
//显示所有联系人信息
showcontact(&con);
break;
case clear:
//清空所有联系人
clearcontact(&con);
break;
case Exit:
printf("退出程序\n");
return 0;
default:
printf("输入有误,请重新输入\n");
break;
}
} while (input);
return 0;
}
- contact.c
#include"contact.h"
void initcontact(contact* pcon)
{
assert(pcon);
pcon->sz = 0;
memset(pcon->data, 0, sizeof(pcon->data));
}
void addcontact(contact* pcon)
{
assert(pcon);
printf("请输入名字:");
scanf("%s", pcon->data[pcon->sz].name);
printf("请输入年龄:");
scanf("%d", &(pcon->data[pcon->sz].age));
printf("请输入性别:");
scanf("%s", pcon->data[pcon->sz].sex);
printf("请输入电话:");
scanf("%s", pcon->data[pcon->sz].tele);
printf("请输入地址:");
scanf("%s", pcon->data[pcon->sz].addr);
pcon->sz++;
printf("增加成功\n");
}
static int findbyname(contact* pcon, char name[])
{
int i = 0;
assert(pcon);
for (i = 0; i < pcon->sz; i++)
{
if (0 == strcmp(pcon->data[i].name, name))
{
return i;
}
}
return -1;
}
void delcontact(contact* pcon)
{
int i = 0;
char name[NAME_MAX] = { 0 };
int pos = 0;
assert(pcon);
if (pcon->sz == 0)
{
printf("空通讯录,无法删除\n");
return;
}
printf("请输入要删除的姓名:");
scanf("%s", name);
pos = findbyname(pcon, name);
if (pos == -1)
{
printf("要删除的条目不在\n");
return;
}
for (i = pos; i < pcon->sz; i++)
{
pcon->data[i] = pcon->data[i + 1];
}
pcon->sz--;
printf("删除成功\n");
}
void findcontact(contact* pcon)
{
int i = 0;
char name[NAME_MAX] = { 0 };
int pos = 0;
assert(pcon);
if (pcon->sz == 0)
{
printf("空通讯录,无法删除\n");
return;
}
printf("请输入要删除的姓名:");
scanf("%s", name);
pos = findbyname(pcon, name);
if (pos == -1)
{
printf("要删除的条目不在\n");
return;
}
printf("%15s\t%5d\t%5s\t%12s\t%20s\n",
pcon->data[pos].name,
pcon->data[pos].age,
pcon->data[pos].sex,
pcon->data[pos].tele,
pcon->data[pos].addr);
}
void modifycontact(contact* pcon)
{
int i = 0;
char name[NAME_MAX] = { 0 };
int pos = 0;
assert(pcon);
if (pcon->sz == 0)
{
printf("空通讯录,无法修改\n");
return;
}
printf("请输入要修改的姓名:");
scanf("%s", name);
pos = findbyname(pcon, name);
if (pos == -1)
{
printf("要修改的条目不在\n");
return;
}
printf("请输入要修改的信息(1-姓名,2-年龄,3-性别, 4-电话, 5-地址)");
int msg;
scanf("%d", &msg);
switch (msg)
{
case 1:
printf("请输入要新的姓名:");
scanf("%s", pcon->data[pos].name);
break;
case 2:
printf("请输入要新的年龄:");
scanf("%s", pcon->data[pos].age);
break;
case 3:
printf("请输入要新的性别:");
scanf("%s", pcon->data[pos].sex);
break;
case 4:
printf("请输入要新的电话:");
scanf("%s", pcon->data[pos].tele);
break;
case 5:
printf("请输入要新的地址:");
scanf("%s", pcon->data[pos].addr);
break;
default:
printf("输入有误,修改失败\n");
return;
}
printf("修改成功\n");
}
void showcontact(const contact* pcon)
{
int i = 0;
assert(pcon);
printf("%15s\t%5s\t%5s\t%12s\t%20s\n", "名字", "年龄", "性别", "电话", "地址");
for (i = 0; i < pcon->sz; i++)
{
printf("%15s\t%5d\t%5s\t%12s\t%20s\n",pcon->data[i].name,
pcon->data[i].age,
pcon->data[i].sex,
pcon->data[i].tele,
pcon->data[i].addr);
}
}
void clearcontact(contact* pcon)
{
initcontact(pcon);
}
void sortcontact(contact* pcon)
{
int i, j;
Peoinfo tmp;
for (i = 0; i < pcon->sz - 1; i++)
{
for (j = 0; j < pcon->sz - 1 - i; j++)
{
if (0 < strcmp(pcon->data[j].name, pcon->data[j + 1].name))
{
tmp = pcon->data[j];
pcon->data[j] = pcon->data[j + 1];
pcon->data[j + 1] = tmp;
}
}
}
}
- contact.h
contact.h
#include<stdio.h>
#include<string.h>
#include<assert.h>
#include<stdlib.h>
#include<errno.h>
enum Option
{
Exit,
add,
del,
search,
modify,
show,
clear,
sort,
};
//定义大小
#define DEFAULT_SZ 3
#define MAX 1000
#define NAME_MAX 20
#define SEX_MAX 5
#define TELE_MAX 12
#define ADDR_MAX 25
typedef struct Peoinfo
{
char name[NAME_MAX];
short age;
char sex[SEX_MAX];
char tele[TELE_MAX];
char addr[ADDR_MAX];
}Peoinfo;
//通讯录类型
typedef struct contact
{
Peoinfo data[MAX];
int sz;
}contact;
//声明函数
void initcontact(contact* pcon);
void addcontact(contact* pcon);
void delcontact(contact* pcon);
void findcontact(contact* pcon);
void modifycontact(contact* pcon);
void showcontact(const contact* pcon);
void clearcontact(contact* pcon);
void sortcontact(contact* pcon);
此版本对于内存的利用不是很有效,当存储人数少时,会浪费内存,当人数达到设置值时(如本例为1000)便不能再进行存储,这样是否会让你感觉到不太方便。那么,重点来了!!!在下一篇文章中,我会将该版本改造为动态存储,解决上述问题。