前言
这是一个可以存储信息的通讯录,信息包括姓名、年龄、性别、电话、地址,使用到了结构体,枚举等C语言中的知识点。
提示:以下是本篇文章正文内容,下面案例可供参考
一、思路及功能
1、思路:
(1)创键一个结构体PeoInfo,存储一个人的信息;
(2)再创键一个嵌套结构体Contact,存储PeoIfno[MAX_DATA]以及通讯录中已经存储的人数sz;
(3)初始化通讯录Contact,将其中的值置为0;
(4)实现以下功能。
2、功能
(1)添加联系人信息:AddContact()
a.首先判断通讯录中已存储人数是否已满,即(sz=MAX_DATA);
b.如果没有满则可以添加。
(2)删除指定联系人信息:DelContact()
a.按姓名到通讯录中查找是否有此人,即int srt = findByName();
b.如果未找到返回-1(srt==-1),否则返回该人的下标;
c.通过下标删除时,需要遍历将后一个的信息赋给前一个人,最后sz–。
(3)查找指定联系人信息:SearchContact()
a.直接使用findByName查找此人。
(4)修改指定联系人信息:UpdateContact()
a.使用findByName查找到此人,通过返回的下标依次修改此人的信息。
(5)显示所有联系人信息:PrintContact()
a.通过遍历输出所有人的信息。
(6)排序所有联系人信息
a.可以通过姓名、性别、年龄、电话、地址对通讯录中的信息进行排序。
(7)清空所有联系人:ClearContact()
a.直接再次初始化通讯录中的信息。
二、实现
1.通讯录接口
通讯录中需要用到的接口。
contact.h:
#include<stdio.h>
#include<string.h>
#include<assert.h>
#define MAX_DATA 1000
#define MAX_NAME 20
#define MAX_SEX 5
#define MAX_TET 12
#define MAX_ADDR 30
//把功能一一列举出来
enum FUNCTION {
exit,
Add,
Del,
Search,
Update,
Sort,
Print,
Clear
};
enum ORDER {
name=1,
sex,
age,
tele,
addr
};
//通讯录中人的信息
typedef struct PeoInfo {
char name[MAX_NAME];
char sex[MAX_SEX];
int age;
char tele[MAX_TET];
char addr[MAX_ADDR];
}PeoInfo;
//通讯录
typedef struct Contact {
PeoInfo data[MAX_DATA];//可以存放1000个人的信息
int sz;//已经存放的人的个数
}Contact;
//初始化通讯录
void InitContact(Contact* pc);
//添加
void AddContact(Contact* pc);
//删除
void DelContact(Contact* pc);
//查找
void SearchContact(Contact* pc);
//修改
void UndateContact(Contact* pc);
//排序
void SortContact(Contact* pc);
//清空
void ClearContact(Contact* pc);
//打印
void PrintContact(Contact* pc);
2.接口的实现
contact.c:
#include "contact.h"
//初始化通讯录
void InitContact(Contact* pc) {
assert(pc);
memset(pc->data, 0, sizeof(pc->data));
pc->sz = 0;
}
//添加
void AddContact(Contact* pc) {
assert(pc);
if (pc->sz == MAX_DATA) {
printf("通讯录已满,不能再添加了\n");
return;
}
printf("请输入姓名-:>");
scanf("%s", pc->data[pc->sz].name);
printf("请输入性别-:>");
scanf("%s", pc->data[pc->sz].sex);
printf("请输入年龄-:>");
scanf("%d", &pc->data[pc->sz].age);
printf("请输入电话-:>");
scanf("%s", pc->data[pc->sz].tele);
printf("请输入地址-:>");
scanf("%s", pc->data[pc->sz].addr);
printf("添加成功\n");
pc->sz++;//已经存放的人数+1
}
//查找到姓名返回下标
//未查找到返回-1
int findByName(Contact* pc, char* str) {
assert(pc);
for (int i = 0; i < pc->sz; i++) {
if (0 == strcmp(pc->data[i].name, str)) {
return i;
}
}
return -1;
}
//删除
void DelContact(Contact* pc) {
assert(pc);
char str[MAX_NAME];
printf("请输入要查找人的姓名-:>");
scanf("%s", str);
int srt = findByName(pc, str);
if (srt == -1) {
printf("没有找到~~~\n");
return;
}
printf("%-10s %-5s %-5s %-12s %-10s\n", "姓名", "性别", "年龄", "电话", "地址");
printf("%-10s %-5s %-5d %-12s %-10s\n", pc->data[srt].name, pc->data[srt].sex, pc->data[srt].age, pc->data[srt].tele, pc->data[srt].addr);
for (int i = 0; i < pc->sz - 1; i++) {
pc->data[i] = pc->data[i + 1];
}
pc->sz--;
printf("删除成功\n");
}
//查找
void SearchContact(Contact* pc) {
assert(pc);
char str[MAX_NAME];
printf("请输入要删除的人的姓名-:>");
scanf("%s", str);
int srt = findByName(pc, str);
if (srt == -1) {
printf("没有找到此人~~~\n");
return;
}
printf("找到了:\n");
printf("%-10s %-5s %-5s %-12s %-10s\n", "姓名", "性别", "年龄", "电话", "地址");
printf("%-10s %-5s %-5d %-12s %-10s\n", pc->data[srt].name, pc->data[srt].sex, pc->data[srt].age, pc->data[srt].tele, pc->data[srt].addr);
}
//修改
void UndateContact(Contact* pc) {
assert(pc);
char str[MAX_NAME];
printf("请输入要修改信息人的姓名-:>");
scanf("%s", str);
int srt = findByName(pc, str);
if (srt == -1) {
printf("没有找到此人~~~\n");
return;
}
printf("%-10s %-5s %-5s %-12s %-10s\n", "姓名", "性别", "年龄", "电话", "地址");
printf("%-10s %-5s %-5d %-12s %-10s\n", pc->data[srt].name, pc->data[srt].sex, pc->data[srt].age, pc->data[srt].tele, pc->data[srt].addr);
printf("请输入将%s修改后的姓名-:>", pc->data[srt].name);
scanf("%s", pc->data[srt].name);
printf("修改后的性别-:>");
scanf("%s", pc->data[srt].sex);
printf("修改后的年龄-:>");
scanf("%d", &pc->data[srt].age);
printf("修改后的电话-:>");
scanf("%s", pc->data[srt].tele);
printf("修改后的地址-:>");
scanf("%s", pc->data[srt].addr);
printf("修改成功\n");
}
void menu2() {
printf("**********************************\n");
printf("*********1.姓名 2.性别 *******\n");
printf("*********3.年龄 4.电话 *******\n");
printf("*********5.地址 *******\n");
printf("**********************************\n");
}
void sortByName(Contact* pc) {
assert(pc);
PeoInfo tmp;
for (int i = 0; i < pc->sz - 1; i++) {
for (int j = 0; j < pc->sz - i - 1; j++) {
if (strcmp(pc->data[j].name, pc->data[j + 1].name) > 0) {
tmp = pc->data[j];
pc->data[j] = pc->data[j + 1];
pc->data[j + 1] = tmp;
}
}
}
printf("排序成功\n");
}
void sortBySex(Contact* pc) {
assert(pc);
PeoInfo tmp;
for (int i = 0; i < pc->sz - 1; i++) {
for (int j = 0; j < pc->sz - i - 1; j++) {
if (strcmp(pc->data[j].sex, pc->data[j + 1].sex) > 0) {
tmp = pc->data[j];
pc->data[j] = pc->data[j + 1];
pc->data[j + 1] = tmp;
}
}
}
printf("排序成功\n");
}
void sortByAge(Contact* pc) {
assert(pc);
PeoInfo tmp;
for (int i = 0; i < pc->sz - 1; i++) {
for (int j = 0; j < pc->sz - i - 1; j++) {
if (pc->data[j].age > pc->data[j + 1].age) {
tmp = pc->data[j];
pc->data[j] = pc->data[j + 1];
pc->data[j + 1] = tmp;
}
}
}
printf("排序成功\n");
}
void sortByTele(Contact* pc) {
assert(pc);
PeoInfo tmp;
for (int i = 0; i < pc->sz - 1; i++) {
for (int j = 0; j < pc->sz - i - 1; j++) {
if (strcmp(pc->data[j].tele, pc->data[j + 1].tele) > 0) {
tmp = pc->data[j];
pc->data[j] = pc->data[j + 1];
pc->data[j + 1] = tmp;
}
}
}
printf("排序成功\n");
}
void sortByAddr(Contact* pc) {
assert(pc);
PeoInfo tmp;
for (int i = 0; i < pc->sz - 1; i++) {
for (int j = 0; j < pc->sz - i - 1; j++) {
if (strcmp(pc->data[j].addr, pc->data[j + 1].addr) > 0) {
tmp = pc->data[j];
pc->data[j] = pc->data[j + 1];
pc->data[j + 1] = tmp;
}
}
}
printf("排序成功\n");
}
//排序
void SortContact(Contact* pc) {
assert(pc);
int input = 0;
do {
menu2();
printf("请选择要排序的方式-:>");
scanf("%d", &input);
switch (input) {
case name:
sortByName(pc);
return;
case sex:
sortBySex(pc);
return;
case age:
sortByAge(pc);
return;
case tele:
sortByTele(pc);
return;
case addr:
sortByAddr(pc);
return;
default:
return;
}
} while (input);
}
//清空
void ClearContact(Contact* pc) {
assert(pc);
InitContact(pc->data, 0, sizeof(pc->data));
pc->sz = 0;
printf("清空成功\n");
}
//打印
void PrintContact(Contact* pc) {
assert(pc);
printf("%-10s %-5s %-5s %-12s %-10s\n", "姓名", "性别", "年龄", "电话", "地址");
for (int i = 0; i < pc->sz; i++) {
printf("%-10s %-5s %-5d %-12s %-10s\n", pc->data[i].name, pc->data[i].sex, pc->data[i].age, pc->data[i].tele, pc->data[i].addr);
}
}
3.测试通讯录的功能
代码如下(示例):
#include "contact.h"
void menu() {
printf("**********************************\n");
printf("*********1.Add 2.Del ********\n");
printf("*********3.Search 4.Update********\n");
printf("*********5.Sort 6.Print ********\n");
printf("*********7.Clear 0.exit ********\n");
printf("**********************************\n");
}
int main() {
int input = 0;
//创建一个通讯录
Contact con;
//初始化
InitContact(&con);
do {
menu();
printf("请选择-:>");
scanf("%d", &input);
switch (input) {
case Add:
AddContact(&con);//添加
break;
case Del:
DelContact(&con);//删除
break;
case Search:
SearchContact(&con);//查找
break;
case Update:
UndateContact(&con);//修改
break;
case Sort:
SortContact(&con);//排序
break;
case Print:
PrintContact(&con);//打印信息
break;
case Clear:
ClearContact(&con);//清空
break;
case exit:
printf("退出通讯录\n");
break;
default:
printf("输入有误\n");
break;
}
} while (input);
return 0;
}
三、展示
别的就不展示了。。。。。