实现一个;
通讯录可以用来存储1000个人的信息,每个人的信息包括:
姓名、性别、年龄、电话、住址
提供方法:
1. 添加联系人信息
2. 删除指定联系人信息
3. 查找指定联系人信息
4. 修改指定联系人信息
5. 显示所有联系人信息
6. 清空所有联系人
7. 排序所有联系人 (以名字、年龄、性别、手机号、地址排序(由用户选择一种排序方法))
//catact.h
#ifndef __CONTACT_H__
#define __CONTACT_H__
#define MAX_NAME 20
#define MAX_SEX 5
#define MAX_ADDER 40
#define MAX_COUNT 1000
void menu1();
void menu2();
void menu3();
enum operate1
{
Exit,
Add,
Sub,
Find,
Modify,
Show,
Empty,
SORT
};
enum operate2
{
NAME=1,
AGE,
SEX,
TEL,
ADDER
};
typedef struct Iformation
{
char name[MAX_NAME];
int age;
char sex[MAX_SEX];
char tel[11];
char adder[MAX_ADDER];
}infor;//每个联系人的信息
typedef struct Contact
{
infor date[MAX_COUNT];
int count;
}contact,*pcontact;//通讯录所有人的信息组成的数组,和通信录以有人的个数
void InitialCount(pcontact p);//通讯录的初始化
void AddContact(pcontact p);//添加联系人
void SubContact(pcontact p);//删除联系人
void FindContact(pcontact p);//查找联系人
void ModifyContact(pcontact p);//修改联系人
void ShowContact(pcontact p);//展示通讯录
void EmptyContact(pcontact p);//把通讯录清空
void SORTContact(pcontact p);//联系人排序
void bubble_sort(void *base, int count, int size, int(*cmp)(void*, void*));//冒泡排序
int cmp_stu_age(const void *e1, const void*e2);//结构体按年龄的比较函数
int cmp_stu_sex(const void *e1, const void *e2);//结构体按性别的比较函数
int cmp_stu_tel(const void *e1, const void *e2);//结构体按电话的比较函数
int cmp_stu_name(const void *e1, const void *e2);//结构体按名字的比较函数
int cmp_stu_adder(const void *e1, const void *e2);// 结构体按地址的比较函数
#endif // !_CONTACT_H
//catact.c
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include"contact.h"
//对通讯录操作的菜单
void menu1()
{
printf("***********************\n");
printf("*** 1.add 2.sub ***\n");
printf("*** 3.find 4.mod ***\n");
printf("*** 5.show 6.empty ***\n");
printf("*** 7.sort 0.exit ***\n");
printf("************************\n");
}
//要修改联系人的哪一项信息
void menu2()
{
printf("***********************\n");
printf("*** 1.name 2.age ***\n");
printf("*** 3.sex 4.tel ***\n");
printf("*** 5.adder ***\n");
printf("************************\n");
}
//以哪种方式排序
void menu3()
{
printf("***********************\n");
printf("*** 1.name 2.age ***\n");
printf("*** 3.sex 4.tel ***\n");
printf("*** 5.adder ***\n");
printf("************************\n");
}
//通讯录的初始化
void InitialCount(pcontact p)
{
p->count = 0;
memset(p->date, 0, sizeof(p->date));
}
//在修改和删除和查找某个人是我们要找到此人的下标,所以我把它写成了个函数
int FindOne(pcontact p, char* name)
{
int i = 0;
for (i = 0; i < p->count; i++)
{
if (strcmp(name, p->date[i].name) == 0)
return i;
}
if (i == p->count)
{
printf("\n*******通讯录里没有此人*******\n");
printf("\n");
return -1;
}
}
//添加联系人
void AddContact(pcontact p)
{
if (p->count == MAX_COUNT)//当联系人数(从0开始计的)等于最大容量数时,说明通讯录已满
{
printf("通讯录已满\n");
return;
}
printf("输入姓名>");
scanf("%s", p->date[p->count].name);
printf("输入年龄>");
scanf("%d", &(p->date[p->count].age));
printf("输入性别>");
scanf("%s", p->date[p->count].sex);
printf("输入电话号>");
scanf("%s", p->date[p->count].tel);
printf("输入地址>");
scanf("%s", p->date[p->count].adder);
p->count++;
}
//删除联系人
void SubContact(pcontact p)
{
char name[20];
int i = 0;
int k = 0;
printf("请输入你要删除人的姓名>");
scanf("%s", name);
i = FindOne(p, name);
if(i != -1)
{
for (k = i; k < p->count - 1; k++)
{
p->date[k] = p->date[k + 1];
}
p->count--;
}
}
//查找联系人
void FindContact(pcontact p)
{
char name[20];
int i = 0;
printf("请输入你要查找人的姓名>");
scanf("%s", name);
i = FindOne(p, name);
if (i != -1)
{
printf("\n %s %d %s %s %s\n",
p->date[i].name,
p->date[i].age,
p->date[i].sex,
p->date[i].tel,
p->date[i].adder);
printf("--------------------------------\n");
}
}
//修改联系人
void ModifyContact(pcontact p)
{
char name[20];
int i = 0;
printf("请输入你要修改人的姓名>");
scanf("%s", name);
i = FindOne(p, name);
if (i != -1)
{
int n = 0;
menu2();
printf("你要修改哪一项>");
scanf("%d", &n);
switch (n)
{
case NAME: printf("输入修改后的姓名>");
scanf("%s", p->date[i].name);
break;
case AGE: printf("输入修改后的年龄>");
scanf("%d", &(p->date[i].age));
break;
case SEX: printf("输入修改后的性别>");
scanf("%s", p->date[i].sex);
break;
case TEL: printf("输入修改后的电话号>");
scanf("%s", p->date[i].tel);
break;
case ADDER: printf("输入地址>");
scanf("%s", p->date[i].adder);
break;
default:
break;
}
}
}
//展示通讯录
void ShowContact(pcontact p)
{
int i = 0;
printf("姓名 年龄 性别 电话号 家庭地址\n");
printf("--------------------------------\n");
for (i = 0; i < (p->count); i++)
{
printf("%s %d %s %s %s\n",
p->date[i].name,
p->date[i].age,
p->date[i].sex,
p->date[i].tel,
p->date[i].adder);
printf("--------------------------------\n");
}
}
//把通讯录清空
void EmptyContact(pcontact p)
{
p->count = 0;
memset(p->date, 0, sizeof(p->date));
}
//联系人排序
void SORTContact(pcontact p)
{
int way;
menu3();
printf("你要以哪种方式排序>");
scanf("%d", &way);
int sz = sizeof(infor);
switch (way)
{
case NAME: bubble_sort(p->date, p->count, sz, cmp_stu_name);
break;
case AGE: bubble_sort(p->date, p->count, sz, cmp_stu_age);
break;
case SEX: bubble_sort(p->date, p->count, sz, cmp_stu_sex);
break;
case TEL: bubble_sort(p->date, p->count, sz, cmp_stu_tel);
break;
case ADDER: bubble_sort(p->date, p->count, sz, cmp_stu_adder);
break;
default:
break;
}
}
//冒泡排序sort.c
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
#include"contact.h"
//结构体按年龄的比较函数
int cmp_stu_age(const void *e1, const void*e2)
{
assert(e1 && e2);
return (((infor*)e1)->age) - (((infor*)e2)->age);
}
//结构体按名字的比较函数
int cmp_stu_name(const void *e1, const void *e2)
{
assert(e1 && e2);
return strcmp(((infor*)e1)->name, ((infor*)e2)->name);
}
//结构体按性别的比较函数
int cmp_stu_sex(const void *e1, const void *e2)
{
assert(e1 && e2);
return strcmp(((infor*)e1)->sex, ((infor*)e2)->sex);
}
//结构体按电话的比较函数
int cmp_stu_tel(const void *e1, const void *e2)
{
assert(e1 && e2);
return strcmp(((infor*)e1)->tel, ((infor*)e2)->tel);
}
// 结构体按地址的比较函数
int cmp_stu_adder(const void *e1, const void *e2)
{
assert(e1 && e2);
return strcmp(((infor*)e1)->adder, ((infor*)e2)->adder);
}
//交换函数
void swap(char *e1, char *e2, int size)
{
assert(e1 && e2);
int i = 0;
for (i = 0; i < size; i++)
{
char tamp = *((char*)e1 + i);
*((char*)e1 + i) = *((char*)e2 + i);
*((char*)e2 + i) = tamp;
}
}
void bubble_sort(void *base, int count, int size, int(*cmp)(void*, void*))
{
assert(base && cmp);
int i = 0;
int j = 0;
for (i = 0; i < count - 1; i++)
for (j = 0; j < count - i - 1; j++)
{
if (cmp((char*)base + j * size, (char*)base + (j + 1)*size) > 0)
swap((char*)base + j * size, (char*)base + (j + 1)*size, size);
}
}
//main.c
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include"contact.h"
int main()
{
int input = 0;
contact my_contact;
InitialCount(&my_contact);
do
{
menu1();
printf("请输入您要进行操作的序号>");
scanf("%d", &input);
switch (input)
{
case Add: AddContact(&my_contact);
break;
case Sub: SubContact(&my_contact);
break;
case Find: FindContact(&my_contact);
break;
case Modify:ModifyContact(&my_contact);
break;
case Show: ShowContact(&my_contact);
break;
case Empty: EmptyContact(&my_contact);
break;
case SORT: SORTContact(&my_contact);
break;
case Exit:
break;
default:
break;
}
} while (input);
return 0;
}