目录
功能都测试过 没有问题 各位课设的朋友 拿去吧
我的vs是2019版的
主函数(源文件): zhu.c
#define _CRT_SECURE_NO_WARNINGS
#include"申明.h"
//通讯录使用前提 可以重名 但是手机号不能一样!!!
void menu()
{
printf("************* 通讯录 ******************\n");
printf("*************************************************************\n");
printf("*************************************************************\n");
printf("************* 1增加联系人 2删除联系人 ******************\n");
printf("************* 3查询联系人 4修改联系人 ******************\n");
printf("************* 5排序联系人 6显示联系人 ******************\n");
printf("************* 0退出系统 ******************\n");
printf("*************************************************************\n");
printf("*************************************************************\n");
printf("\n");
}
int main()
{
int floag = 0;
man people;
message* jet;
jet = (message*)malloc(sizeof(message) * 2); //先开辟两个大小
if (jet == NULL)
{
printf("初始化失败\n");
printf("%s\n", strerror(errno));
return 0;
}
else
{
people.taxt = jet;
people.size = 0;
people.capacity = 2;
}
readtext(&people);
do
{
menu();
printf("请选择需要进行的操作>:");
scanf("%d",&floag);
switch (floag)
{
case 1:
addtext(&people);
break;
case 2:
deletetext(&people);
break;
case 3:
findtext(&people);
break;
case 4:
altertext(&people);
break;
case 5:
sorttext(&people);
break;
case 6:
showtext(&people);
break;
case 0:
printf("已退出通讯录\n\n");
break;
default:
printf("输入错误,请重新选择\n\n\n");
Sleep(800);
break;
}
} while (floag);
storetext(&people);
free(people.taxt);
people.taxt = NULL;
return 0;
}
函数库(源文件):function.c
#define _CRT_SECURE_NO_WARNINGS
#include"申明.h"
void addtext(man* people)
{
if ((people->size) == (people->capacity))
{
message* jet = (message*)realloc(people->taxt, (people->capacity )* 2 * sizeof(message));
if (jet == NULL)
{
printf("通讯录已满,扩容失败\n");
printf("%s\n", strerror(errno));
exit(-1); //退出程序
}
else
{
printf("扩容成功\n");
people->taxt = jet;
people->capacity = people->capacity * 2;
Sleep(300);
}
}
printf("\n请输入联系人姓名:");
scanf("%s", people->taxt[people->size].name);
printf("\n请输入联系人性别:");
scanf("%s", people->taxt[people->size].sxe);
printf("\n请输入联系人电话:");
scanf("%s", people->taxt[people->size].phone);
printf("\n请输入联系人地址:");
scanf("%s", people->taxt[people->size].address);
printf("\n添加成功\n");
Sleep(500);
people->size = people->size + 1;
}
int look_up1 (man* x,char name[10])
{
int zu = x->size;
int y = 0;
int floag = 0;
int aa = 1;
while (zu--)
{
if (0 == strcmp(x->taxt[zu].name, name))
{
floag = zu; //保存下标
if(aa==1)
printf("name sex phone address\n");
aa = 0;
printf("%-15s%-8s%-20s%-10s\n", x->taxt[zu].name, x->taxt[zu].sxe, x->taxt[zu].phone, x->taxt[zu].address);
y++;
}
}
if (y > 1)
{
printf("有多个联系人,请使用手机号进行删除\n");
return -1;
}
else if (y== 0)
{
printf("未有该姓名的用户,查找失败\n");
return -2;
}
else
{
printf("查找成功\n");
return floag;
}
}
int look_up2(man* x, char sex[5])
{
int zu = x->size;
int y = 0;
int floag = 0;
int aa = 1;
while (zu--)
{
if (0 == strcmp(x->taxt[zu].sxe,sex))
{
floag = zu; //保存下标
if (aa == 1)
printf("name sex phone address\n");
aa = 0;
printf("%-15s%-8s%-20s%-10s\n", x->taxt[zu].name, x->taxt[zu].sxe, x->taxt[zu].phone, x->taxt[zu].address);
y++;
}
}
if (y > 1)
{
printf("\n有多个联系人,请使用其他属性查找进行删除\n");
return -1;
}
else if (y == 0)
{
printf("未有该性别的用户,查找失败\n");
return -2;
}
else
{
printf("查找成功\n");
return floag;
}
}
int look_up3(man* x, char phone[15])
{
int zu = x->size;
int y = 0;
int floag = 0;
int aa = 1;
while (zu--)
{
if (0 == strcmp(x->taxt[zu].phone, phone))
{
floag = zu; //保存下标
if (aa == 1)
printf("name sex phone address\n");
aa = 0;
printf("%-15s%-8s%-20s%-10s\n", x->taxt[zu].name, x->taxt[zu].sxe, x->taxt[zu].phone, x->taxt[zu].address);
y++;
}
}
if (y == 0)
{
printf("未有该号码的用户,查找失败\n");
return -2;
}
else
{
printf("查找成功\n");
return floag;
}
}
int look_up4(man* x, char address[10])
{
int zu = x->size;
int y = 0;
int floag = 0;
int aa = 1;
while (zu--)
{
if (0 == strcmp(x->taxt[zu].address, address))
{
floag = zu; //保存下标
if (aa == 1)
printf("name sex phone address\n");
aa = 0;
printf("%-15s%-8s%-20s%-10s\n", x->taxt[zu].name, x->taxt[zu].sxe, x->taxt[zu].phone, x->taxt[zu].address);
y++;
}
}
if (y > 1)
{
printf("\n有多个联系人,请使用其他属性查找进行删除\n");
return -1;
}
else if (y == 0)
{
printf("未有该性别的用户,查找失败\n");
return -2;
}
else
{
printf("查找成功\n");
return floag;
}
}
int find(man* x)
{
do {
stop2:;
int floag = 0;
printf("************ 1姓名查找 2性别查找 **************\n");
printf("************ 3电话查找 4地址查找 **************\n");
printf("*************************************************************\n");
printf("************ 0退出 **************\n");
printf("\n请选择查找方式:\n");
scanf("%d", &floag);
switch (floag)
{
case 1:
printf("请输查找人姓名:");
char name[10];
scanf("%s", name);
int a = look_up1(x, name);
if (a == -2)
return 0;
else if (a == -1)
goto stop1; //跳转到手机号查找
else //找到唯一一个 进行删除
{
for (; a <= x->size - 2; ++a)
{
x->taxt[a] = x->taxt[a + 1]; //往前覆盖
}
printf("\n删除成功\n");
return 1;
}
break;
case 2:
printf("请输查找人的性别:");
char sex[5];
scanf("%s", sex);
a = look_up2(x, sex);
if (a == -2)
return 0;
else if (a == -1)
goto stop2; //跳转到查找目录
else //找到唯一一个 进行删除
{
for (; a <= x->size - 2; ++a)
{
x->taxt[a] = x->taxt[a + 1]; //往前覆盖
}
printf("\n删除成功\n");
return 1;
}
break;
case 3:
stop1:
printf("请输查找人电话:");
char phone[15];
scanf("%s", phone);
a = look_up3(x, phone);
if (a == -2)
return 0;
else //找到唯一一个 进行删除
{
for (; a <= x->size - 2; ++a)
{
x->taxt[a] = x->taxt[a + 1]; //往前覆盖
}
printf("\n删除成功\n");
return 1;
}
break;
case 4:
printf("请输查找人地址:");
char address[10];
scanf("%s", address);
a = look_up4(x, address);
if (a == -2)
return 0;
else if (a == -1)
goto stop2; //跳转到查找目录
else //找到唯一一个 进行删除
{
for (; a <= x->size - 2; ++a)
{
x->taxt[a] = x->taxt[a + 1]; //往前覆盖
}
printf("\n删除成功\n");
return 1;
}
break;
case 0:printf("退出成功\n");
return 0;
default:
printf("\n输入错误,请重新输入:");
break;
}
} while (1);
}
void deletetext(man* people)
{
if ((people->size)<=0)
{
printf("联系人为空,无需删除了.\n");
return;
}
int a=find(people);
if (a == 1)
people->size--;
else
printf("删除失败,请检查删除人信息;");
}
void look_up11(man* people, char* x)
{
int zu = people->size;
int floag = 1;
while (zu--)
{
if (0 == strcmp(people->taxt[zu].name, x))
{
if (floag == 1)
{
printf("\n查找成功,信息如下:\n\n");
printf("name sex phone address\n");
}
floag = 0;
printf("%-15s%-8s%-20s%-10s\n", people->taxt[zu].name, people->taxt[zu].sxe, people->taxt[zu].phone, people->taxt[zu].address);
}
}
if (floag == 1)
printf("\n查找失败,通讯录无此信息\n");
}
void look_up12(man* people, char* x)
{
int zu = people->size;
int floag = 1;
while (zu--)
{
if (0 == strcmp(people->taxt[zu].sxe, x))
{
if (floag == 1)
{
printf("\n查找成功,信息如下:\n\n");
printf("name sex phone address\n");
}
floag = 0;
printf("%-15s%-8s%-20s%-10s\n", people->taxt[zu].name, people->taxt[zu].sxe, people->taxt[zu].phone, people->taxt[zu].address);
}
}
if (floag == 1)
printf("\n查找失败,通讯录无此信息\n");
}
void look_up13(man* people, char* x)
{
int zu = people->size;
int floag = 1;
while (zu--)
{
if (0 == strcmp(people->taxt[zu].phone, x))
{
if (floag == 1)
{
printf("\n查找成功,信息如下:\n\n");
printf("name sex phone address\n");
}
floag = 0;
printf("%-15s%-8s%-20s%-10s\n", people->taxt[zu].name, people->taxt[zu].sxe, people->taxt[zu].phone, people->taxt[zu].address);
}
}
if (floag == 1)
printf("\n查找失败,通讯录无此信息\n");
}
void look_up14(man* people, char* x)
{
int zu = people->size;
int floag = 1;
while (zu--)
{
if (0 == strcmp(people->taxt[zu].address, x))
{
if (floag == 1)
{
printf("\n查找成功,信息如下:\n\n");
printf("name sex phone address\n");
}
floag = 0;
printf("%-15s%-8s%-20s%-10s\n", people->taxt[zu].name, people->taxt[zu].sxe, people->taxt[zu].phone, people->taxt[zu].address);
}
}
if (floag == 1)
printf("\n查找失败,通讯录无此信息\n");
}
void findtext(man* people)
{
if (people->size == 0)
{
printf("\n当前通讯录为空\n");
Sleep(500);
return;
}
do {
stop2:;
int floag = 0;
printf("************ 1姓名查找 2性别查找 **************\n");
printf("************ 3电话查找 4地址查找 **************\n");
printf("*************************************************************\n");
printf("************ 0退出 **************\n");
printf("\n请选择查找方式:\n");
scanf("%d", &floag);
switch (floag)
{
case 1:
printf("请输查找人姓名:");
char name[10];
scanf("%s", name);
look_up11(people, name);
return;
case 2:
printf("请输查找人的性别:");
char sex[5];
scanf("%s", sex);
look_up12(people, sex);
return;
case 3:
stop1:
printf("请输查找人电话:");
char phone[15];
scanf("%s", phone);
look_up13(people, phone);
return;
case 4:
printf("请输查找人地址:");
char address[10];
scanf("%s", address);
look_up14(people, address);
return;
case 0:printf("退出成功\n");
return;
default:
printf("\n输入错误,请重新输入:\n");
break;
}
} while (1);
}
int look_up5(man* x, char name[10])
{
int zu = x->size;
int y = 0;
int floag = 0;
int aa = 1;
while (zu--)
{
if (0 == strcmp(x->taxt[zu].name, name))
{
floag = zu; //保存下标
if (aa == 1)
printf("name sex phone address\n");
aa = 0;
printf("%-15s%-8s%-20s%-10s\n", x->taxt[zu].name, x->taxt[zu].sxe, x->taxt[zu].phone, x->taxt[zu].address);
y++;
}
}
if (y > 1)
{
printf("有多个联系人,请使用手机号进行检索\n");
return -1;
}
else if (y == 0)
{
printf("未有该姓名的用户,查找失败\n");
return -2;
}
else
{
printf("查找成功\n");
return floag;
}
}
int look_up6(man* x, char sex[5])
{
int zu = x->size;
int y = 0;
int floag = 0;
int aa = 1;
while (zu--)
{
if (0 == strcmp(x->taxt[zu].sxe, sex))
{
floag = zu; //保存下标
if (aa == 1)
printf("name sex phone address\n");
aa = 0;
printf("%-15s%-8s%-20s%-10s\n", x->taxt[zu].name, x->taxt[zu].sxe, x->taxt[zu].phone, x->taxt[zu].address);
y++;
}
}
if (y > 1)
{
printf("\n有多个联系人,请使用其他属性查找进行检索\n");
return -1;
}
else if (y == 0)
{
printf("未有该性别的用户,查找失败\n");
return -2;
}
else
{
printf("查找成功\n");
return floag;
}
}
int look_up7(man* x, char phone[15])
{
int zu = x->size;
int y = 0;
int floag = 0;
int aa = 1;
while (zu--)
{
if (0 == strcmp(x->taxt[zu].phone, phone))
{
floag = zu; //保存下标
if (aa == 1)
printf("name sex phone address\n");
aa = 0;
printf("%-15s%-8s%-20s%-10s\n", x->taxt[zu].name, x->taxt[zu].sxe, x->taxt[zu].phone, x->taxt[zu].address);
y++;
}
}
if (y == 0)
{
printf("未有该号码的用户,查找失败\n");
return -2;
}
else
{
printf("查找成功\n");
return floag;
}
}
int look_up8(man* x, char address[10])
{
int zu = x->size;
int y = 0;
int floag = 0;
int aa = 1;
while (zu--)
{
if (0 == strcmp(x->taxt[zu].address, address))
{
floag = zu; //保存下标
if (aa == 1)
printf("name sex phone address\n");
aa = 0;
printf("%-15s%-8s%-20s%-10s\n", x->taxt[zu].name, x->taxt[zu].sxe, x->taxt[zu].phone, x->taxt[zu].address);
y++;
}
}
if (y > 1)
{
printf("\n有多个联系人,请使用其他属性查找进行检索\n");
return -1;
}
else if (y == 0)
{
printf("未有该性别的用户,查找失败\n");
return -2;
}
else
{
printf("查找成功\n");
return floag;
}
}
void edit(man* x, int zu)
{
int floag = 0;
do {
printf("************ 1姓名修改 2性别修改 **************\n");
printf("************ 3电话修改 4地址修改 **************\n");
printf("*************************************************************\n");
printf("************ 0退出 **************\n");
printf("\n请选择类别:");
scanf("%d", &floag);
switch (floag)
{
case 1:
printf("\n请输入修改后姓名:");
char name[10];
scanf("%s", name);
memmove(x->taxt[zu].name, name, 10);
printf("\n修改成功\n");
break;
case 2:
printf("\n请输入修改后的性别:");
char sex[5];
scanf("%s", sex);
memmove(x->taxt[zu].sxe, sex, 5);
printf("\n修改成功\n");
break;
case 3:
printf("\n请输入修改后的电话:");
char phone[15];
scanf("%s", phone);
memmove(x->taxt[zu].phone,phone, 15);
printf("\n修改成功\n");
break;
case 4:
printf("\n请输入修改后的地址:");
char address[10];
scanf("%s", address);
memmove(x->taxt[zu].address,address, 10);
printf("\n修改成功\n");
break;
case 0: break;
default:
printf("\n输入错误,请重新选择\n");
break;
}
} while (floag);
}
int find1(man* x)
{
do {
stop4:;
int floag = 0;
printf("************ 1姓名查找 2性别查找 **************\n");
printf("************ 3电话查找 4地址查找 **************\n");
printf("*************************************************************\n");
printf("************ 0退出 **************\n");
printf("\n请选择查找方式:\n");
scanf("%d", &floag);
switch (floag)
{
case 1:
printf("请输查找人姓名:");
char name[10];
scanf("%s", name);
int a = look_up5(x, name);
if (a == -2)
return 0;
else if (a == -1)
goto stop3; //跳转到手机号查找
else //找到唯一一个 进行修改
{
edit(x, a);
return 1;
}
break;
case 2:
printf("请输查找人的性别:");
char sex[5];
scanf("%s", sex);
a = look_up6(x, sex);
if (a == -2)
return 0;
else if (a == -1)
goto stop4; //跳转到查找目录
else //找到唯一一个 进行修改
{
edit(x, a);
return 1;
}
break;
case 3:
stop3:
printf("请输查找人电话:");
char phone[15];
scanf("%s", phone);
a = look_up7(x, phone);
if (a == -2)
return 0;
else //找到唯一一个 进行修改
{
edit(x, a);
return 1;
}
break;
case 4:
printf("请输查找人地址:");
char address[10];
scanf("%s", address);
a = look_up8(x, address);
if (a == -2)
return 0;
else if (a == -1)
goto stop4; //跳转到查找目录
else //找到唯一一个 进行修改
{
edit(x, a);
return 1;
}
break;
case 0:printf("退出成功\n");
return 0;
default:
printf("\n输入错误,请重新输入:");
break;
}
} while (1);
}
void altertext(man* people)
{
if ((people->size)<=0)
{
printf("联系人为空,无联系人可修改.\n");
return;
}
int a = find1(people);
if (a == 1)
printf("\n\n联系人信息已修改\n");
else
printf("\n信息未修改\n");
}
int cmp1(const void* e1, const void* e2)
{
return strcmp(((message*)e1)->name,((message*)e2)->name);
}
int cmp2(const void* e1, const void* e2)
{
return strcmp(((message*)e1)->sxe, ((message*)e2)->sxe);
}
int cmp3(const void* e1, const void* e2)
{
return strcmp(((message*)e1)->phone, ((message*)e2)->phone);
}
int cmp4(const void* e1, const void* e2)
{
return strcmp(((message*)e1)->address, ((message*)e2)->address);
}
void sorttext(man* people)
{
if (people->size <= 0)
{
printf("\n通讯录为空,无法排序\n");
return;
}
int floag = 0;
do {
printf("************ 1姓名排序 2性别排序 **************\n");
printf("************ 3电话排序 4地址排序 **************\n");
printf("*************************************************************\n");
printf("************ 0退出 **************\n");
printf("\n请选择排序方式:\n");
scanf("%d", &floag);
switch (floag)
{
case 1:
qsort(people->taxt, people->size, sizeof(message), cmp1);
printf("\n排序成功\n\n");
return;
case 2:
qsort(people->taxt, people->size, sizeof(message), cmp2);
printf("\n排序成功\n\n");
return;
case 3:
qsort(people->taxt, people->size, sizeof(message), cmp3);
printf("\n排序成功\n\n");
return;
case 4:
qsort(people->taxt, people->size, sizeof(message), cmp4);
printf("\n排序成功\n\n");
return;
case 0: printf("\n退出成功\n\n");
return;
default :
printf("\n输入有误,请重新选择\n");
break;
}
} while (1);
}
void showtext(man* people)
{
if (people->size <= 0)
{
printf("\n通讯录为空\n");
return;
}
int i = 0;
printf("name sex phone address\n");
for (i = 0; i <= ((people->size) - 1); ++i)
{
printf("%-15s%-8s%-20s%-10s\n", people->taxt[i].name, people ->taxt[i].sxe, people->taxt[i].phone, people->taxt[i].address);
}
printf("\n\n显示完成\n");
return;
}
void storetext(man* people)
{
FILE* jet;
jet=fopen("store.txt", "w");
if (jet == NULL)
{
perror("storetext");
return;
}
int i = 0;
int a = 0;
for (i = 0; i <= people->size-1;++i)
{
fprintf(jet,"%s %s %s %s ", people->taxt[i].name, people->taxt[i].sxe, people->taxt[i].phone, people->taxt[i].address);
}
printf("\n保存成功,联系人已储存在文件中\n");
Sleep(500);
fclose(jet);
jet = NULL;
}
void readtext(man* people)
{
FILE* jet=fopen("store.txt", "r");
if (jet == NULL)
{
perror("readtext");
printf("\n");
exit(-1);
}
while ((fscanf(jet,"%s %s %s %s ",people->taxt[people->size].name, people->taxt[people->size].sxe, people->taxt[people->size].phone, people->taxt[people->size].address))!=EOF)
{
people->size++;
if (people->size == people->capacity)
{
message* a = (message*)realloc(people->taxt, sizeof(message) * 2 * people->capacity);
if (a == NULL)
{
printf("\n扩容失败\n");
exit(-1);
}
printf("\n扩容成功\n");
people->taxt = a;
people->capacity = people->capacity * 2;
}
}
printf("\n\n联系人写入完成\n\n");
fclose(jet);
jet= NULL;
}
头文件:申明.h
#pragma once
#include<stdio.h>
#include<windows.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
typedef struct message
{
char name[10];
char sxe[5];
char phone[15];
char address[10];
}message;
typedef struct man
{
message* taxt;
int size;
int capacity;
}man;
//增加联系人函数
void addtext(man* people);
//删除联系人
void deletetext(man* people);
//查找联系人
void findtext(man* people);
//修改联系人
void altertext(man* people);
//排序
void sorttext(man* people);
//显示联系人
void showtext(man* people);
//存储联系人到文件中
void storetext(man* people);
//初始化写入 文件中的联系人
void readtext(man* people);