一.通讯录功能
1.保存1000个联系人的信息
2.增加联系人
3.删除联系人
4.修改联系人
5.查找联系人
6.排序
7.打印
其中一个人的信息包括:
名字 性别 年龄 电话 住址
二.实现的总体思路
创建三个文件
contact.h文件储存头文件的声明和自定义类型
contact.c文件储存具体函数的实现代码
test.c用于测试程序
注意:在写程序时尽量使用函数封装
三.程序实现
1.目录与test.c文件逻辑的基本实现
#include "contact.h"
void menu()
{
printf("**********************************\n");
printf("****** 1.Add 2.Sub ******\n");
printf("****** 3.modify 4.select ******\n");
printf("****** 5.sort 6.print ******\n");
printf("****** 0.exit ******\n");
printf("**********************************\n");
}
void test()
{
int input = 0;
do
{
menu();
printf("请选择模式:\n");
scanf("%d", &input);
switch (input)
{
case 1:
break;
case 2:
break;
case 3:
break;
case 4:
break;
case 5:
break;
case 6:
break;
case 0:
printf("推出程序\n");
break;
default:
printf("请重新输入\n");
break;
}
} while (input);
}
为了便于其他程序员阅读,可以使用枚举将数字替换,枚举类型在.h文件中声明
修改完之后的代码
switch (input)
{
case ADD:
break;
case SUB:
break;
case MODIFY:
break;
case SELECT:
break;
case SORT:
break;
case PRINT:
break;
case EXIT:
printf("退出程序\n");
break;
default:
printf("请重新输入\n");
break;
}
枚举类型默认EXIT为0,之后依次加1,就不用具体声明枚举常量的值了.
2.数据的存储
本节讲述数据的存储实现
首先,我们要有一个结构体,去储存人的信息
其次,需要一个可以储存一千人信息的空间
我们都在contact.c文件中写
为了方便后期修改,可以使用宏定义将可能会变动的值改名
为了方便排序和记录通讯录已经储存信息的个数,设置一个变量sz用于储存
为了便于使用1000人的信息和已经储存的人数,可将这两个封装在一个结构体
#define NAME 20
#define SEX 5
#define TELE 12
#define ADDR 30
#define MAX 1000
enum Mode
{
EXIT,
ADD,
SUB,
MODIFY,
SELECT,
SORT,
PRINT
};
typedef struct PeoInfo
{
char Name[NAME];
char Sex[SEX];
int Old;
char Tele[TELE];
char Addr[ADDR];
}PeoInfo;
typedef struct contact
{
PeoOneInfo PeoInfo[MAX];
int sz;
}contact;
3.实现增加一个人功能的函数
在实现增加一个人的时候需要先初始化通讯录
void InitContact(contact* p)
{
assert(p);
p->sz = 0;
memset(p->PeoInfo, 0, sizeof(p->PeoInfo));
}
下面实现输入信息
其中p->sz代表1000个数组的第几个
void AddContact(contact* p)
{
assert(p);
printf("请输入名字\n");
scanf("%s", p->PeoInfo[p->sz].Name);
printf("请输入性别\n");
scanf("%s", p->PeoInfo[p->sz].Sex);
printf("请输入年龄\n");
scanf("%d", &(p->PeoInfo[p->sz].Age));
printf("请输入手机号\n");
scanf("%s", p->PeoInfo[p->sz].Tele);
printf("请输入地址\n");
scanf("%s", p->PeoInfo[p->sz].Addr);
p->sz++;
}
4.实现减去一个人的功能
要实现减去一个人的功能首先要查找这个人
本文章的查询方法是使用名字查询
查找函数后面的查找功能以及替换功能还会用到所以选择用一个函数进行封装
该函数的使用逻辑是,如果存在返回sz,如果不存在返回-1
void SubContact(contact* p)
{
assert(p);
int i = SelectName(p);
if (-1 == i)
{
printf("找不到\n");
return;
}
int j = 0;
for (j = i; j < p->sz - 1; j++)
{
p->PeoInfo[j] = p->PeoInfo[j + 1];
}
p->sz--;
}
5.实现打印的功能
我们需要通过界面调试来验证我们前面的代码是否正确,所以要加入打印功能
void PrintContact(const contact* p)
{
int i = 0;
printf("%-20s %-5s %-5s %-12s %-30s\n", "名字", "性别", "年龄", "电话", "地址");
for (i = 0; i < p->sz; i++)
{
printf("%-20s %-5s %-5d %-12s %-30s\n", p->PeoInfo[i].Name, p->PeoInfo[i].Sex, p->PeoInfo[i].Age,
p->PeoInfo[i].Tele, p->PeoInfo[i].Addr);
}
}
6.实现查找的功能
实现逻辑是输入名字,如果有对应名字,则输出对应人物信息,如果没有则输出没有
void SelectContact(const contact* p)
{
int i = SelectName(p);
if (-1 == i)
{
printf("找不到该人\n");
return;
}
printf("%-20s %-5s %-5s %-12s %-30s\n", "名字", "性别", "年龄", "电话", "地址");
printf("%-20s %-5s %-5d %-12s %-30s\n", p->PeoInfo[i].Name, p->PeoInfo[i].Sex, p->PeoInfo[i].Age,
p->PeoInfo[i].Tele, p->PeoInfo[i].Addr);
}
7.实现更改的功能
输入名字找到对应人物,更改其信息
void ModifyContact(contact* p)
{
assert(p);
int i = SelectName(p);
if (-1 == i)
{
printf("找不到该人\n");
return;
}
printf("%-20s %-5s %-5s %-12s %-30s\n", "名字", "性别", "年龄", "电话", "地址");
printf("%-20s %-5s %-5d %-12s %-30s\n", p->PeoInfo[i].Name, p->PeoInfo[i].Sex, p->PeoInfo[i].Age,
p->PeoInfo[i].Tele, p->PeoInfo[i].Addr);
printf("请重新信息\n");
printf("请输入名字\n");
scanf("%s", p->PeoInfo[i].Name);
printf("请输入性别\n");
scanf("%s", p->PeoInfo[i].Sex);
printf("请输入年龄\n");
scanf("%d", &(p->PeoInfo[i].Age));
printf("请输入手机号\n");
scanf("%s", p->PeoInfo[i].Tele);
printf("请输入地址\n");
scanf("%s", p->PeoInfo[i].Addr);
}
8.实现排序的功能
按照年龄从小到大进行排序,使用冒泡排序法
void SortContact(contact* p)
{
assert(p);
int i = 0;
for (i = 0; i < p->sz; i++)
{
int j = 0;
for (j = 0; j < p->sz - 1; j++)
{
if (p->PeoInfo[j].Age > p->PeoInfo[j + 1].Age)
{
PeoOneInfo tmp = { 0 };
tmp = p->PeoInfo[j];
p->PeoInfo[j] = p->PeoInfo[j + 1];
p->PeoInfo[j + 1] = tmp;
}
}
}
}
四.总程序
test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"
void menu()
{
printf("**********************************\n");
printf("****** 1.Add 2.Sub ******\n");
printf("****** 3.modify 4.select ******\n");
printf("****** 5.sort 6.print ******\n");
printf("****** 0.exit ******\n");
printf("**********************************\n");
}
void test()
{
int input = 0;
contact con;
InitContact(&con);
do
{
menu();
printf("请选择模式:\n");
scanf("%d", &input);
switch (input)
{
case ADD:
AddContact(&con);
break;
case SUB:
SubContact(&con);
break;
case MODIFY:
ModifyContact(&con);
break;
case SELECT:
SelectContact(&con);
break;
case SORT:
SortContact(&con);
break;
case PRINT:
PrintContact(&con);
break;
case EXIT:
printf("退出程序\n");
break;
default:
printf("请重新输入\n");
break;
}
} while (input);
}
int main()
{
test();
return 0;
}
contact.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"
void InitContact(contact* p)
{
assert(p);
p->sz = 0;
memset(p->PeoInfo, 0, sizeof(p->PeoInfo));
}
void AddContact(contact* p)
{
assert(p);
printf("请输入名字\n");
scanf("%s", p->PeoInfo[p->sz].Name);
printf("请输入性别\n");
scanf("%s", p->PeoInfo[p->sz].Sex);
printf("请输入年龄\n");
scanf("%d", &(p->PeoInfo[p->sz].Age));
printf("请输入手机号\n");
scanf("%s", p->PeoInfo[p->sz].Tele);
printf("请输入地址\n");
scanf("%s", p->PeoInfo[p->sz].Addr);
p->sz++;
}
int SelectName(const contact* pp)
{
assert(pp);
char name[NAME] = { 0 };
printf("请输入你要查找的名字\n");
scanf("%s", name);
int i = 0;
for (i = 0; i < pp->sz; i++)
{
if (0 == strcmp(name, pp->PeoInfo[i].Name))
{
return i;
}
}
return -1;
}
void SubContact(contact* p)
{
assert(p);
int i = SelectName(p);
if (-1 == i)
{
printf("找不到\n");
return;
}
int j = 0;
for (j = i; j < p->sz - 1; j++)
{
p->PeoInfo[j] = p->PeoInfo[j + 1];
}
p->sz--;
}
void PrintContact(const contact* p)
{
assert(p);
int i = 0;
printf("%-20s %-5s %-5s %-12s %-30s\n", "名字", "性别", "年龄", "电话", "地址");
for (i = 0; i < p->sz; i++)
{
printf("%-20s %-5s %-5d %-12s %-30s\n", p->PeoInfo[i].Name, p->PeoInfo[i].Sex, p->PeoInfo[i].Age,
p->PeoInfo[i].Tele, p->PeoInfo[i].Addr);
}
}
void ModifyContact(contact* p)
{
assert(p);
int i = SelectName(p);
if (-1 == i)
{
printf("找不到该人\n");
return;
}
printf("%-20s %-5s %-5s %-12s %-30s\n", "名字", "性别", "年龄", "电话", "地址");
printf("%-20s %-5s %-5d %-12s %-30s\n", p->PeoInfo[i].Name, p->PeoInfo[i].Sex, p->PeoInfo[i].Age,
p->PeoInfo[i].Tele, p->PeoInfo[i].Addr);
printf("请重新信息\n");
printf("请输入名字\n");
scanf("%s", p->PeoInfo[i].Name);
printf("请输入性别\n");
scanf("%s", p->PeoInfo[i].Sex);
printf("请输入年龄\n");
scanf("%d", &(p->PeoInfo[i].Age));
printf("请输入手机号\n");
scanf("%s", p->PeoInfo[i].Tele);
printf("请输入地址\n");
scanf("%s", p->PeoInfo[i].Addr);
}
void SelectContact(const contact* p)
{
assert(p);
int i = SelectName(p);
if (-1 == i)
{
printf("找不到该人\n");
return;
}
printf("%-20s %-5s %-5s %-12s %-30s\n", "名字", "性别", "年龄", "电话", "地址");
printf("%-20s %-5s %-5d %-12s %-30s\n", p->PeoInfo[i].Name, p->PeoInfo[i].Sex, p->PeoInfo[i].Age,
p->PeoInfo[i].Tele, p->PeoInfo[i].Addr);
}
void SortContact(contact* p)
{
assert(p);
int i = 0;
for (i = 0; i < p->sz; i++)
{
int j = 0;
for (j = 0; j < p->sz - 1; j++)
{
if (p->PeoInfo[j].Age > p->PeoInfo[j + 1].Age)
{
PeoOneInfo tmp = { 0 };
tmp = p->PeoInfo[j];
p->PeoInfo[j] = p->PeoInfo[j + 1];
p->PeoInfo[j + 1] = tmp;
}
}
}
}
contact.h
#pragma once
#include <stdio.h>
#include <assert.h>
#include <string.h>
#define NAME 20
#define SEX 8
#define TELE 12
#define ADDR 30
#define MAX 1000
enum Mode
{
EXIT,
ADD,
SUB,
MODIFY,
SELECT,
SORT,
PRINT
};
typedef struct PeoOneInfo
{
char Name[NAME];
char Sex[SEX];
int Age;
char Tele[TELE];
char Addr[ADDR];
}PeoOneInfo;
typedef struct contact
{
PeoOneInfo PeoInfo[MAX];
int sz;
}contact;
void InitContact(contact* p);
void AddContact(contact* p);
void SubContact(contact* p);
int SelectName(const contact* pp);
void ModifyContact(contact* p);
void SelectContact(const contact* p);
void PrintContact(const contact* p);
void SortContact(contact* p);
增加功能
清除通讯录
同初始化
void ClearContact(contact* p)
{
assert(p);
p->sz = 0;
memset(p->PeoInfo, 0, sizeof(p->PeoInfo));
}
以名字长度为标准排序
void SortNameContact(contact* p)
{
assert(p);
int i = 0;
for (i = 0; i < p->sz; i++)
{
int j = 0;
for (j = 0; j < p->sz - 1; j++)
{
if (strlen(p->PeoInfo[j].Name) > strlen( p->PeoInfo[j + 1].Name))
{
PeoOneInfo tmp = { 0 };
tmp = p->PeoInfo[j];
p->PeoInfo[j] = p->PeoInfo[j + 1];
p->PeoInfo[j + 1] = tmp;
}
}
}
}