#pragma once//这是头文件的代码
#include<stdio.h>
#include<string.h>
#define Max_NAME 20
#define Max_SEX 10
#define Max_TELE 12
#define Max_Addr 30
#define Max 100
//在这里我们要写一个人的基本信息,为了使程序更加稳定,我用预定义来限制字符串的长度
/*1.姓名
2.年龄
3.性别
4.地址
5.电话
6.等等*/
typedef struct Peotfe
{
char name[Max_NAME];
int age;
char sex[Max_SEX];
char tele[Max_TELE];
char addr[Max_Addr];
}Peotfe;
//现在写一个通讯录的框架
typedef struct Contact
{
Peotfe date[Max];
int sz;
}Contact;
//初始化通讯录
void Initcontact(Contact* pc);
//增加联系人信息
void AddContact(Contact* pc);
//打印通讯录信息
void PrintContact(Contact* pc);
//删除联系人信息
void DelContact(Contact* pc);
//查找联系人信息
void SearchContact(Contact* pc);
//修改联系人信息
void ModifyContact(Contact* pc);
//排序通讯录
void SortContact(Contact* pc);
#define _CRT_SECURE_NO_WARNINGS 1//这是函数实现的代码
#include"Contact.h"
void Initcontact(Contact* pc)//初始化函数
{
pc->sz = 0;
//memset — 内存设置函数
memset(pc->date, 0, sizeof(pc->date));
}
void AddContact(Contact* pc)//增加函数
{
if (pc->sz == Max)//如果人满了,就无法添加联系人
{
printf("联系人已满,无法添加联系人\n");
return;
}
printf("请输入名字:>");
scanf("%s", pc->date[pc->sz].name);
printf("请输入电话:>");
scanf("%s", pc->date[pc->sz].tele);
printf("请输入地址:>");
scanf("%s", pc->date[pc->sz].addr);
printf("请输入年龄:>");
scanf("%d", &(pc->date[pc->sz].age));
printf("请输入性别:>");
scanf("%s", pc->date[pc->sz].sex);
pc->sz++;
printf("成功增加联系人\n");
}
void PrintContact(Contact* pc)//打印函数
{
if (pc->sz == 0)
{
printf("通讯录没有联系人,请添加联系人再打印\n");
return;
}
int i = 0;
printf("%-20s\t%-5s\t%-5s\t%-15s\t%-20s\n","姓名","年龄","性别","电话","地址");
for (i = 0; i < pc->sz; i++)
{
printf("%-20s\t%-5d\t%-5s\t%-15s\t%-20s\n",
pc->date[i].name,
pc->date[i].age,
pc->date[i].sex,
pc->date[i].tele,
pc->date[i].addr
);
}
}
static int Seekcontact(Contact* p,char str[])
{
/*这里我们需要注意返回值,参数设计等等
并且我在这个顺便说一下,大家写程序的时候一定要认真
任何一个小失误可能都会导致你的失败*/
//想一想 我们改则么查找呢,有人会说姓名或者是电话号码,或者地址对吧?
//想法没有问题,主要是如何实现,因为这是第一版本,所以我就简单的用姓名查找吧
//一些细节我没有注意,比如说名字一样则么办,我后面会升级代码的哈,希望大家点个关注,不迷路
//废话不多说,开始实现
int i = 0;
for (i = 0; i < p->sz; i++)//用循环的方式 一个一个找
{
if (strcmp((p->date[i].name), str) == 0)
{
return i;
}
}
return -1;//如果这个循环出来都没有找到的话,就是没有
}
void DelContact(Contact* pc)//删除函数
{
/*删除的布置
首先要输入一个联系人的信息,比如姓名,地址等等
我在这里就按姓名举例子
1.查找,如果有返回下标
如果有,然后将后面的往前移一个
如果没有,返回-1或者负数,因为负数不可能是下标*/
//显然我们先要写一个查找函数
if (pc->sz == 0)
{
printf("通讯录为空,无需删除\n");
return;
}
int ret = 0;
int i = 0;
printf("请输入你要查找的联系人的姓名:>");
char str[Max_NAME] = { 0 };
scanf("%s", str);
ret = Seekcontact(pc, str);//我声明一下,我英语不太好,单词都是简单的,别嫌弃哈
if (ret == -1)
{
printf("你要查找的人不存在\n");
return;
}
else
{
for (i = ret; i < pc->sz - 1; i++)//这里的判断条件 会在后面的图片里有,我先标记一下 (1)
{
pc->date[i] = pc->date[i+1];
}
pc->sz--;//这里也是一种特殊情况
printf("删除成功\n");
}
}
void SearchContact(Contact* pc)
{
/*查找之前就写过了
会比较轻松*///还是要输入一个人的名字
//分两种情况
//1.查找的人不存在 或者没有联系人可以查找
//2.另一种就是存在
if (pc->sz == 0)
{
printf("通讯录为空,无需查询\n");
return;
}
printf("请输入你要查找的联系人的姓名:>");
char name[Max_NAME] = { 0 };
scanf("%s", name);
int ret = 0;
ret = Seekcontact(pc, name);
if (ret == -1)
{
printf("你查找的联系人不存在,请你确认后再查询\n");
return;
}
else
{
printf("你查找的联系人存在,他的信息是:>\n");
printf("%-20s\t%-5s\t%-5s\t%-15s\t%-20s\n", "姓名", "年龄", "性别", "电话", "地址");
printf("%-20s\t%-5d\t%-5s\t%-15s\t%-20s\n",
pc->date[ret].name,
pc->date[ret].age,
pc->date[ret].sex,
pc->date[ret].tele,
pc->date[ret].addr
);
}
}
void ModifyContact(Contact* pc)
{
/*修改也是一样的
* 0.看通讯录是否为空
1.查询是否存在
2.存在,然后修改*/
if (pc->sz == 0)
{
printf("通讯录为空,无需修改\n");
return;
}
printf("请输入你要修改的联系人的姓名:>");
char name[Max_NAME] = { 0 };
scanf("%s", name);
int ret = 0;
ret = Seekcontact(pc, name);
if (ret == -1)
{
printf("你要修改的联系人不存在,请你确认后再修改\n");
return;
}
else
{
printf("你修改的联系人存在,他的信息是:>\n");
printf("%-20s\t%-5s\t%-5s\t%-15s\t%-20s\n", "姓名", "年龄", "性别", "电话", "地址");
printf("%-20s\t%-5d\t%-5s\t%-15s\t%-20s\n",
pc->date[ret].name,
pc->date[ret].age,
pc->date[ret].sex,
pc->date[ret].tele,
pc->date[ret].addr
);
printf("下面是修改他的信息:>\n");
printf("请输入名字:>");
scanf("%s", pc->date[ret].name);
printf("请输入电话:>");
scanf("%s", pc->date[ret].tele);
printf("请输入地址:>");
scanf("%s", pc->date[ret].addr);
printf("请输入年龄:>");
scanf("%d", &(pc->date[ret].age));
printf("请输入性别:>");
scanf("%s", pc->date[ret].sex);
printf("修改后他的信息是:>\n");
printf("%-20s\t%-5s\t%-5s\t%-15s\t%-20s\n", "姓名", "年龄", "性别", "电话", "地址");
printf("%-20s\t%-5d\t%-5s\t%-15s\t%-20s\n",
pc->date[ret].name,
pc->date[ret].age,
pc->date[ret].sex,
pc->date[ret].tele,
pc->date[ret].addr
);
}
}
void SOrtContact(Contact* pos)
{
int i = 0;
int j = 0;
for (i = 0; i < pos->sz; i++)
{
for (j = 0; j < pos->sz - i; j++)//冒泡排序大家肯定都是知道的
//如果不知道的话 我后面写一篇博客
{
if (strcmp(pos->date[j].name, pos->date[j + 1].name) == -1)
{
Peotfe str = pos->date[j];
pos->date[j] = pos->date[j + 1];
pos->date[j + 1] = str;
}
}
}
}
void SortContact(Contact* pc)
{
/*排序可以有很多种方式
不过本人主要想用姓名或者地址
毕竟字符串方便一点,前面那些都用的姓名
那么这个函数也围绕这姓名吧*/
//写道这里首先想到的是冒泡排序
//首先是思维,然后是代码
/*思维是排序是按一下,所有人都排序
因为是第一版本,我就弄简单点,这次这是从小到大
或者从大到小
后面的版本我会升级
一样的大家期待一吧
废话不多说 我们现在就开始*/
//我们还是会用到字符串比较函数 strcmp
SOrtContact(pc);
PrintContact(pc);
}
#define _CRT_SECURE_NO_WARNINGS 1//这是主函数
/*通讯录
1.增加联系人信息
2.删除联系人信息
3.查找联系人信息
4.排序联系人
5.打印通讯录
6.退出*/
#include"Contact.h"
void menu()
{
printf("***************************************\n");
printf("****** 1. Add 2.Ddl **************\n");
printf("****** 3. Search 4. Modify **********\n");
printf("****** 5. Sort 6. Print **********\n");
printf("************ 0. Exit ******************\n");
printf("***************************************\n");
}
enum Option
{
Exit,
Add,
Del,
Search,
Modify,
Sort,
Print
};
int main()
{
Contact con;
//初始化通讯录
Initcontact(&con);
int input = 0;
do
{
menu();
printf("请选择:>");
scanf("%d", &input);
switch(input)
{
case Add:
AddContact(&con);
//增加联系人信息
break;
case Del:
DelContact(&con);
//删除
break;
case Search:
SearchContact(&con);
//查找
break;
case Modify:
//修改
ModifyContact(&con);
break;
case Sort:
//排序
SortContact(&con);
break;
case Print:
//打印
PrintContact(&con);
break;
case Exit:
//退出
printf("已经退出通讯录\n");
break;
default:
//输入错误
printf("输入错误,请重新输入\n");
break;
}
} while (input);
return 0;
}