大家好,具体学习完了结构体,为大家分享一个结构体的小项目——通讯录管理系统!!!
1 | 1.通讯录存放的联系人数量为动态开辟 |
---|---|
2 | 联系人信息的内容为:姓名,性别,年龄,电话,地址 |
3 | 增加联系人 |
4 | 删除联系人 |
5 | 查找联系人 |
6 | 修改联系人 |
7 | 排序联系人 |
8 | 打印联系人 |
文件:
test.c 测试通讯录
AddressBook.c 各个功能的实现
AddressBook.h 头文件
联系人的定义:
利用结构体定义出联系人类型
struct People {
char name[name_MAX];//姓名
char address[address_MAX];//住址
char sex[sex_MAX];//性别
char phnum[phnum_MAX];//电话号码
int age;//年龄
};
通讯录的定义:
typedef struct AddBook {
struct People* contact;//联系人
int size;//长度
int Capacity;//通讯录当前容量
}Book;
定义需要使用到的一些宏:
#define name_MAX 20
#define address_MAX 30
#define sex_MAX 5
#define phnum_MAX 12
#define InitCapacity 3
void menu() {
printf("********************************\n");
printf("*********1、增加联系人**********\n");
printf("*********2、显示联系人**********\n");
printf("*********3、删除联系人**********\n");
printf("*********4、查找联系人**********\n");
printf("*********5、修改联系人**********\n");
printf("*********6、排序联系人**********\n");
printf("*********7、联系人数量**********\n");
printf("*********0、退出通讯录**********\n");
printf("********************************\n");
}
int main()
{
Book book;
InitBook(&book);//程序开始运行时就初始化通讯录
int input = 0;
do
{
menu();
printf("请输入你的选择:\n");
scanf("%d", &input);
switch (input)
{
case Add:
addContact(&book);
break;
case Show:
showContact(&book);
break;
case Del:
delContact(&book);
break;
case Find:
findContact(&book);
break;
case Exchange:
changeContact(&book);
break;
case Sort:
sortBook(&book);
break;
case Size:
bookNum(&book);
break;
case Exit:
saveBook(&book);
destoryBook(&book);
printf("退出通讯录!\n");
system("pause");
system("cls");
break;
default:
printf("输入有误,重新输入!\n");
system("pause");
system("cls");
break;
}
} while (input);
return 0;
}
switch语句中的case1,2,3,4不好对应功能,为了提高代码可读性,我们可以定义一个枚举类型:
enum imput {
Exit,
Add,
Show,
Del,
Find,
Exchange,
Sort,
Size
};
void InitBook(Book* book)
{
assert(book);
book->size = 0;
book->Capacity = InitCapacity;//初始容量设定为3
book->contact = (struct People*)malloc(book->Capacity * sizeof(struct People));
if (book->contact == NULL)
{
perror("malloc");
exit(-1);
}
memset(book->contact, 0, book->Capacity*sizeof(book->Capacity));
//每个联系人设置为0
readFile(book);//初始化时将文件中联系人的信息读取到通讯录中
}
void destoryBook(Book* book)
{
free(book->contact);
book->contact = NULL;
book->Capacity = book->size = 0;
printf("销毁成功!\n");
}
void chect_Capacity(Book* book)
{
assert(book);
if (book->Capacity == book->size)//如果通讯录当前人数等于通讯录容量,则开始扩容
{
struct Peopel* temp = (struct People*)realloc(book->contact, (book->Capacity + 2) * sizeof(struct People));
if (temp == NULL)
{
perror("realloc");
exit(-1);
}
else
{
book->contact = temp;
book->Capacity += 2;//扩容后更新通讯录容量大小
temp = NULL;
//printf("扩容成功!\n");
}
}
}
void addContact(Book* book)
{
assert(book);
chect_Capacity(book);//先检查容量
printf("请输入你要添加的联系人姓名:\n");
scanf("%s", book->contact[book->size].name);
printf("请输入你要添加的联系人性别:\n");
scanf("%s", book->contact[book->size].sex);
printf("请输入你要添加的联系人年龄:\n");
scanf("%d", &(book->contact[book->size].age));
printf("请输入你要添加的联系人住址:\n");
scanf("%s", book->contact[book->size].address);
printf("请输入你要添加的联系人号码:\n");
scanf("%s", book->contact[book->size].phnum);
printf("添加成功!!\n");
book->size++;//联系人个数加1
system("pause");
system("cls");
}
void show(Book* book, int num)
{//这是显示指定位置的某位联系人
printf("姓名:%s\t性别:%s\t年龄:%d\t住址:%s\t号码:%s\n", book->contact[num].name,
book->contact[num].phnum, book->contact[num].age,
book->contact[num].address, book->contact[num].phnum);
}
void showContact(Book* book)
{//显示所有联系人
assert(book);
if (book->size == 0)
{
printf("还未存入联系人!\n");
system("pause");
system("cls");
}
else
{
int i = 0;
for (i = 0; i < book->size; i++)
{
show(book, i);
}
system("pause");
system("cls");
}
}
int isExit(Book* book, char name[20])
{//根据年龄判断某个联系人是否存在
assert(book);
int i = 0;
for (i = 0; i < book->size; i++)
{
if (strcmp(book->contact[i].name, name) == 0)
{
return i;
}
}
return -1;
}
void delContact(Book* book)
{
assert(book);
char name[20];
printf("请输入要删除的联系人姓名:\n");
scanf("%s", name);
int ret = isExit(book, name);//先检查要删除的联系人是否存在
if (ret != -1)
{
int i = 0;
for (i = ret; i < book->size - 1; i++)
{
book->contact[i] = book->contact[i + 1];
//利用数组前移的方法将要删除的联系人覆盖进行删除
}
book->size--;
printf("删除成功!\n");
}
else
{
printf("查无此人!\n");
}
system("pause");
system("cls");
}
void findContact(Book* book)
{
assert(book);
char name[20];
printf("请输入要查找的联系人姓名:\n");
scanf("%s", name);
int ret = isExit(book, name);//先判断联系人是否存在
if (ret != -1)
{
printf("找到了,此人信息为:\n");
show(book, ret);
}
else
{
printf("查无此人!\n");
}
system("pause");
system("cls");
}
先判断要修改的联系人是否存在,在判断是否进行修改
void changeContact(Book* book)
{
assert(book);
char name[20];
printf("请输入要修改的联系人姓名:\n");
scanf("%s", name);
int ret = isExit(book, name);
if (ret != -1)
{
printf("请输入你修改后的联系人姓名:\n");
scanf("%s", book->contact[ret].name);
printf("请输入你修改后的联系人性别:\n");
scanf("%s", book->contact[ret].sex);
printf("请输入你修改后的联系人年龄:\n");
scanf("%d", &book->contact[ret].age);
printf("请输入你修改后的联系人住址:\n");
scanf("%s", book->contact[ret].address);
printf("请输入你修改后的联系人号码:\n");
scanf("%s", book->contact[ret].phnum);
printf("修改成功!\n");
}
else
{
printf("查无此人!\n");
}
system("pause");
system("cls");
}
利用qsort函数根据年龄大小对联系人进行排序
//qsort函数的比较函数
int com_by_age(const void* e1, const void* e2)
{
return ((struct People*)e1)->age - ((struct People*)e2)->age;
}
void sortBook(Book* book)
{
assert(book);
if (book->size == 0)
{
printf("通讯录为空,无法排序!\n");
system("pause");
system("cls");
return;
}
//用qsort函数按照年龄大小排队
qsort(book->contact, book->size, sizeof(book->contact[0]), com_by_age);
printf("按照年龄大小排序成功!\n");
system("pause");
system("cls");
}
void bookNum(Book* book)
{
assert(book);
printf("现在共有 :%d 名联系人!\n", book->size);
system("pause");
system("cls");
}
void saveBook(Book* book)
{
//打开文件
FILE* pf = fopen("BOOK.txt", "wb");
if (pf == NULL)
{
perror("saveBook::fopen");
}
//size_t fwrite(const void* ptr, size_t size, size_t count, FILE * stream);
//写文件
int i = 0;
for (i = 0; i < book->size; i++)
{
fwrite(book->contact + i, sizeof(struct People), 1, pf);
}
//关闭文件
fclose(pf);
pf = NULL;
printf("写入文件成功!\n");
}
void readFile(Book* book)
{
FILE* pf = fopen("BOOK.txt", "rb");
if (pf == NULL)
{
perror("readFile::fopen");
return;
}
//size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );
struct People temp = { 0 };
while (fread(&temp, sizeof(struct People), 1, pf))
{
chect_Capacity(book);//每次存时检查一下容量,不够了就扩容
book->contact[book->size] = temp;
book->size++;
}
fclose(pf);
pf = NULL;
}
#include
#include
#include
#include
//#define MAX 1000
#define name_MAX 20
#define address_MAX 30
#define sex_MAX 5
#define phnum_MAX 12
#define InitCapacity 3
enum imput {
Exit,
Add,
Show,
Del,
Find,
Exchange,
Sort,
Size
};
struct People {
char name[name_MAX];
char address[address_MAX];
char sex[sex_MAX];
char phnum[phnum_MAX];
int age;
};
typedef struct AddBook {
struct People* contact;
int size;
int Capacity;
}Book;
void addContact(Book* book);
void showContact(Book* book);
void findContact(Book* book);
void delContact(Book* book);
void bookNum(Book* book);
void sortBook(Book* book);
void changeContact(Book* book);
void InitBook(Book* book);
void destoryBook(Book* book);
void chect_Capacity(Book* book);
void saveBook(Book* book);
今天的通讯录管理系统就分享到这里啦,希望可以帮助到大家!!!