通讯录
我们需要用C语言模拟一个通讯录可以用来存储1000个人的信息
每个人的信息包括:
姓名、电话、性别、住址、年龄
功能包括:
- 新增联系人
- 删除联系人
- 查找联系人
- 修改联系人
- 排序所有联系人
- 打印所有联系人
一.通讯录菜单
void muea()
{
printf("************************\n");
printf("*** 1.增加 2.删除 ***\n");
printf("*** 3.查找 4.修改 ***\n");
printf("*** 5.排序 6.打印 ***\n");
printf("*** 0.结束 ***\n");
printf("************************\n");
}
二.通讯录主函数
#include"contact.h"
void muea()
{
printf("************************\n");
printf("*** 1.增加 2.删除 ***\n");
printf("*** 3.查找 4.修改 ***\n");
printf("*** 5.排序 6.打印 ***\n");
printf("*** 0.结束 ***\n");
printf("************************\n");
}
void test()
{
int input = 0;
contact con;
Initcontact(&con);
do
{
muea();
printf("请选择>:");
scanf("%d", &input);
switch (input)
{
case 1:
ADDcontact(&con);
break;
case 2:
sancontact(&con);
break;
case 3:
cazhaocontact(&con);
break;
case 4:
xiougaicontact(&con);
break;
case 5:
paixucontact(&con);
break;
case 6:
printcontact(&con);
break;
case 0:
destroycontact(&con);
printf("\n");
break;
default:
printf("\n");
break;
}
} while (input);
}
int main()
{
test();
return 0;
}
三.定义联系人及通讯录
在这里我们要用到结构体
typedef struct peinof
{
char name[20];
char set[10];
int age;
char tele[12];
char addr[15];
}peinof;
typedef struct contact
{
peinof data[MAX];
int sz;
}contact;
在这利用两个结构体第一个是定义了一个人的信息,第二个是为了记录现在通讯录有多少个人
四.初始化通讯录
void Initcontact(contact* pc)
{
pc->sz = 0;
memset(pc->data, 0, sizeof(pc->data));
}
五.实现通讯录的各个功能
1.增加
void ADDcontact(contact* pc)
{
if (pc->sz == MAX)
{
printf("通讯录已满\n");
return;
}
printf("请输入名字\n");
scanf("%s", pc->data[pc->sz].name);
printf("请输入性别\n");
scanf("%s", pc->data[pc->sz].set);
printf("请输入年龄\n");
scanf("%d", &pc->data[pc->sz].age);
printf("请输入号码\n");
scanf("%s", pc->data[pc->sz].tele);
printf("请输入地址\n");
scanf("%s", pc->data[pc->sz].addr);
pc->sz++;
printf("储存成功\n");
return;
}
2.删除
int findbyname(contact* pc, char name[])
{
int i = 0;
for (i = 0; i < pc->sz; i++)
{
if (strcmp(pc->data[i].name, name) == 0)
{
return i;
}
}
return -1;
}
void sancontact(contact* pc)
{
if (pc->sz == 0)
{
printf("通讯录为空\n");
return;
}
char name[20];
printf("请输入要查找的名字\n");
scanf("%s", name);
int pos = findbyname(pc, name);
if (pos == -1)
{
printf("此人不存在\n");
return;
}
int i = 0;
for (i = pos; i < pc->sz - 1; i++)
{
pc->data[i] = pc->data[i + 1];
}
pc->sz--;
printf("删除成功\n");
return;
}
3.查找
void cazhaocontact(contact* pc)
{
if (pc->sz == 0)
{
printf("通讯录为空\n");
return;
}
char name[20];
printf("请输入要查找的名字\n");
scanf("%s", name);
int i = findbyname(pc, name);
if (i == -1)
{
printf("此人不存在\n");
return;
}
printf("%-20s %-10s %-5s %-12s %-15s\n", "名字", "性别", "年龄", "号码", "地址");
printf("%-20s %-10s %-5d %-12s %-15s\n", pc->data[i].name, pc->data[i].set, pc->data[i].age, pc->data[i].tele, pc->data[i].addr);
return;
}
4.修改
void mu()
{
printf("************************\n");
printf("*** 1.名字 2.性别 ***\n");
printf("*** 3.年龄 4.号码 ***\n");
printf("*** 5.地址 0.结束 ***\n");
printf("************************\n");
}
void xiougaicontact(contact* pc)
{
char name[20];
printf("请输入要修改人的名字\n");
scanf("%s", name);
int i = findbyname(pc, name);
if (i == -1)
{
printf("此人不存在\n");
return;
}
int a = 0;
do
{
mu();
printf("请输入要修改的地方\n");
scanf("%d", &a);
switch (a)
{
case 1:
printf("请输入名字\n");
scanf("%s", pc->data[i].name);
printf("修改成功\n");
break;
case 2:
printf("请输入性别\n");
scanf("%s", pc->data[i].set);
printf("修改成功\n");
break;
case 3:
printf("请输入年龄\n");
scanf("%d", &pc->data[i].age);
printf("修改成功\n");
break;
case 4:
printf("请输入号码\n");
scanf("%s", pc->data[i].tele);
printf("修改成功\n");
break;
case 5:
printf("请输入地址\n");
scanf("%s", pc->data[i].addr);
printf("修改成功\n");
break;
case 0:
printf("修改结束\n");
break;
default:
printf("输入错误请重新输入\n");
break;
}
} while (a);
return;
}
5.排序
void mu()
{
printf("************************\n");
printf("*** 1.名字 2.性别 ***\n");
printf("*** 3.年龄 4.号码 ***\n");
printf("*** 5.地址 0.结束 ***\n");
printf("************************\n");
}
bool cmp(peinof x, peinof y)
{
return x.age > y.age;
}
bool cnp(peinof x, peinof y)
{
return strcmp(x.name, y.name) < 0;
}
bool xin(peinof x, peinof y)
{
return strcmp(x.set, y.set) < 0;
}
bool hao(peinof x, peinof y)
{
return strcmp(x.tele, y.tele) < 0;
}
bool addr(peinof x, peinof y)
{
return strcmp(x.addr, y.addr) < 0;
}
void paixucontact(contact* pc)
{
int a = 0;
do
{
mu();
printf("请输入要按什么排序\n");
scanf("%d", &a);
switch (a)
{
case 1:
sort(pc->data, pc->data + pc->sz, cnp);
printf("排序成功\n");
break;
case 2:
sort(pc->data, pc->data + pc->sz, xin);
printf("排序成功\n");
break;
case 3:
sort(pc->data, pc->data + pc->sz, cmp);
printf("排序成功\n");
break;
case 4:
sort(pc->data, pc->data + pc->sz, hao);
printf("排序成功\n");
break;
case 5:
sort(pc->data, pc->data + pc->sz, addr);
printf("排序成功\n");
break;
case 0:
printf("排序结束\n");
break;
default:
printf("输入错误请重新输入\n");
break;
}
} while (a);
return;
}
6.打印
void printcontact(const contact* pc)
{
if (pc->sz == 0)
{
printf("通讯录为空\n");
return;
}
int i = 0;
printf("%-20s %-10s %-5s %-12s %-15s\n", "名字", "性别", "年龄", "号码", "地址");
for (i = 0; i < pc->sz; i++)
{
printf("%-20s %-10s %-5d %-12s %-15s\n", pc->data[i].name, pc->data[i].set, pc->data[i].age, pc->data[i].tele, pc->data[i].addr);
}
}
具体效果大家可以自己去试
6.完整代码
首先在这里我把代码分成了三部分
主函数部分
#include"contact.h"
void muea()
{
printf("************************\n");
printf("*** 1.增加 2.删除 ***\n");
printf("*** 3.查找 4.修改 ***\n");
printf("*** 5.排序 6.打印 ***\n");
printf("*** 0.结束 ***\n");
printf("************************\n");
}
void test()
{
int input = 0;
contact con;
Initcontact(&con);
do
{
muea();
printf("请选择>:");
scanf("%d", &input);
switch (input)
{
case 1:
ADDcontact(&con);
break;
case 2:
sancontact(&con);
break;
case 3:
cazhaocontact(&con);
break;
case 4:
xiougaicontact(&con);
break;
case 5:
paixucontact(&con);
break;
case 6:
printcontact(&con);
break;
case 0:
destroycontact(&con);
printf("\n");
break;
default:
printf("\n");
break;
}
} while (input);
}
int main()
{
test();
return 0;
}
实现各个自定义函数部分
#include"contact.h"
void Initcontact(contact* pc)
{
pc->sz = 0;
memset(pc->data, 0, sizeof(pc->data));
}
void ADDcontact(contact* pc)
{
/*if (pc->sz == MAX)
{
printf("通讯录已满\n");
return;
}*/
cheak_capacity(pc);
printf("请输入名字\n");
scanf("%s", pc->data[pc->sz].name);
printf("请输入性别\n");
scanf("%s", pc->data[pc->sz].set);
printf("请输入年龄\n");
scanf("%d", &pc->data[pc->sz].age);
printf("请输入号码\n");
scanf("%s", pc->data[pc->sz].tele);
printf("请输入地址\n");
scanf("%s", pc->data[pc->sz].addr);
pc->sz++;
printf("储存成功\n");
return;
}
void printcontact(const contact* pc)
{
if (pc->sz == 0)
{
printf("通讯录为空\n");
return;
}
int i = 0;
printf("%-20s %-10s %-5s %-12s %-15s\n", "名字", "性别", "年龄", "号码", "地址");
for (i = 0; i < pc->sz; i++)
{
printf("%-20s %-10s %-5d %-12s %-15s\n", pc->data[i].name, pc->data[i].set, pc->data[i].age, pc->data[i].tele, pc->data[i].addr);
}
}
int findbyname(contact* pc, char name[])
{
int i = 0;
for (i = 0; i < pc->sz; i++)
{
if (strcmp(pc->data[i].name, name) == 0)
{
return i;
}
}
return -1;
}
void sancontact(contact* pc)
{
if (pc->sz == 0)
{
printf("通讯录为空\n");
return;
}
char name[20];
printf("请输入要查找的名字\n");
scanf("%s", name);
int pos = findbyname(pc, name);
if (pos == -1)
{
printf("此人不存在\n");
return;
}
int i = 0;
for (i = pos; i < pc->sz - 1; i++)
{
pc->data[i] = pc->data[i + 1];
}
pc->sz--;
printf("删除成功\n");
return;
}
void cazhaocontact(contact* pc)
{
if (pc->sz == 0)
{
printf("通讯录为空\n");
return;
}
char name[20];
printf("请输入要查找的名字\n");
scanf("%s", name);
int i = findbyname(pc, name);
if (i == -1)
{
printf("此人不存在\n");
return;
}
printf("%-20s %-10s %-5s %-12s %-15s\n", "名字", "性别", "年龄", "号码", "地址");
printf("%-20s %-10s %-5d %-12s %-15s\n", pc->data[i].name, pc->data[i].set, pc->data[i].age, pc->data[i].tele, pc->data[i].addr);
return;
}
void mu()
{
printf("************************\n");
printf("*** 1.名字 2.性别 ***\n");
printf("*** 3.年龄 4.号码 ***\n");
printf("*** 5.地址 0.结束 ***\n");
printf("************************\n");
}
void xiougaicontact(contact* pc)
{
char name[20];
printf("请输入要修改人的名字\n");
scanf("%s", name);
int i = findbyname(pc, name);
if (i == -1)
{
printf("此人不存在\n");
return;
}
int a = 0;
do
{
mu();
printf("请输入要修改的地方\n");
scanf("%d", &a);
switch (a)
{
case 1:
printf("请输入名字\n");
scanf("%s", pc->data[i].name);
printf("修改成功\n");
break;
case 2:
printf("请输入性别\n");
scanf("%s", pc->data[i].set);
printf("修改成功\n");
break;
case 3:
printf("请输入年龄\n");
scanf("%d", &pc->data[i].age);
printf("修改成功\n");
break;
case 4:
printf("请输入号码\n");
scanf("%s", pc->data[i].tele);
printf("修改成功\n");
break;
case 5:
printf("请输入地址\n");
scanf("%s", pc->data[i].addr);
printf("修改成功\n");
break;
case 0:
printf("修改结束\n");
break;
default:
printf("输入错误请重新输入\n");
break;
}
} while (a);
return;
}
bool cmp(peinof x, peinof y)
{
return x.age > y.age;
}
bool cnp(peinof x, peinof y)
{
return strcmp(x.name, y.name) < 0;
}
bool xin(peinof x, peinof y)
{
return strcmp(x.set, y.set) < 0;
}
bool hao(peinof x, peinof y)
{
return strcmp(x.tele, y.tele) < 0;
}
bool addr(peinof x, peinof y)
{
return strcmp(x.addr, y.addr) < 0;
}
void paixucontact(contact* pc)
{
int a = 0;
do
{
mu();
printf("请输入要按什么排序\n");
scanf("%d", &a);
switch (a)
{
case 1:
sort(pc->data, pc->data + pc->sz, cnp);
printf("排序成功\n");
break;
case 2:
sort(pc->data, pc->data + pc->sz, xin);
printf("排序成功\n");
break;
case 3:
sort(pc->data, pc->data + pc->sz, cmp);
printf("排序成功\n");
break;
case 4:
sort(pc->data, pc->data + pc->sz, hao);
printf("排序成功\n");
break;
case 5:
sort(pc->data, pc->data + pc->sz, addr);
printf("排序成功\n");
break;
case 0:
printf("排序结束\n");
break;
default:
printf("输入错误请重新输入\n");
break;
}
} while (a);
return;
}
3.头文件部分
#pragma once
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<stdlib.h>
#define MAX 1000
#include<iostream>
using namespace std;
typedef struct peinof
{
char name[20];
char set[10];
int age;
char tele[12];
char addr[15];
}peinof;
typedef struct contact
{
peinof data[MAX];
int sz;
}contact;
void Initcontact(contact* pc);
void ADDcontact(contact* pc);
void printcontact(const contact* pc);
void sancontact(contact* pc);
void cazhaocontact(contact* pc);
void xiougaicontact(contact* pc);
void paixucontact(contact* pc);
void destroycontact(contact* pc);