实现一个通讯录;
通讯录可以用来存储1000个人的信息,每个人的信息包括:
姓名、性别、年龄、电话、住址
提供方法:
1. 添加联系人信息
2. 删除指定联系人信息
3. 查找指定联系人信息
4. 修改指定联系人信息
5. 显示所有联系人信息
6. 清空所有联系人
7. 以名字排序所有联系人
8. 保存现有文件到桌面的通讯录.txt文件
9. 从桌面的 通讯录.txt 读取信息并打印出来
头文件:contact.h
#pragma once //只编译一次
#define _CRT_SECURE_NO_WARNINGS
#ifndef __CONTACT__
#define __CONTACT__
#define MAX_NAME 100
#define MAX_SEX 20
#define MAX_TELEPHONE 20
#define MAX_ADDRESS 100
#define MAX_CAPACITY 1000 //最大容量
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
typedef struct People
{
char name[MAX_NAME];
char sex[MAX_SEX];
int age;
char telephone[MAX_TELEPHONE];
char address[MAX_ADDRESS];
int flag;
}People;
typedef struct Contact
{
People * people;
int count;
}Contact,*PContact;
void Add(PContact con);
void Delete(PContact con);
void Find(PContact con);
void Modify(PContact con);
void Show(PContact con);
void Empty(PContact con);
void Sort(PContact con);
void Save(PContact con);
void Free(PContact con);
void Show_file(PContact con);
void menu();
#endif // !__CONTACT__
主函数:main_contact.c
#include "contact.h"
int main()
{
Contact contact = {0};
int input = 1;
void(*fun[9])(PContact) = {Add,Delete,Find,Modify,Show,Empty,Sort,Save,Show_file};
while(1)
{
menu();
printf("请选择功能======>");
scanf("%d", &input);
system("cls");
if (input == 0)
{
Free(&contact);
exit(0);
}
else if (input < 10 && input>0)
{
fun[input - 1](&contact);
}
else
printf("输入有误!\n");
}
return 0;
}
函数实现代码:code_contact.h
#include "contact.h"
void menu()
{
printf("****************************** 通讯录 ******************************\n");
printf("**********************************************************************\n");
printf("**********************************************************************\n");
printf("***************** 1.添加联系人信息 **********\n");
printf("***************** 2.删除指定联系人信息 **********\n");
printf("***************** 3.查找指定联系人信息 **********\n");
printf("***************** 4.修改指定联系人信息 **********\n");
printf("***************** 5.显示所有联系人信息 **********\n");
printf("***************** 6.清空所有联系人 **********\n");
printf("***************** 7.以名字排序所有联系人 **********\n");
printf("***************** 8.保存所有信息到桌面 **********\n");
printf("***************** 9.查看现有文件所存储的联系人 **********\n");
printf("***************** 0.退出程序 **********\n");
printf("**********************************************************************\n");
printf("**********************************************************************\n");
printf("****************************** 通讯录 ******************************\n");
}
void go_menu()
{
printf("返回主菜单请输入y\n");
fflush(stdin);
while (1)
{
int c = 0;
c = getchar();
if (c == 'y')
return;
}
}
void Add(PContact con)
{
int i = 0;
int num = 0;
printf("请输入要添加的人数======>\n");
fflush(stdin);
scanf("%d", &num);
if ( num>MAX_CAPACITY || num < 0 )
{
printf("输入有误,人数范围限制在0-1000,请重新选择!\n");
}
if (con->count == 0)
{
People * Tmp = (People *)malloc(sizeof(People)*num);
if (Tmp == NULL)
{
printf("out of memery");
exit(EXIT_FAILURE);
}
else
{
con->people = Tmp;
}
}
else
{
People * Tmp = (People *)realloc(con->people, sizeof(People)*(con->count+num));
if(Tmp==NULL)
{
printf("out of memery");
exit(EXIT_FAILURE);
}
else
{
con->people = Tmp;
}
}
for (i = 0; i < num; i++)
{
printf("第%d个联系人\n", i + 1);
printf("输入姓名==>>");
fflush(stdin);
scanf("%s", (con->people + con->count)->name);
printf("输入性别==>>");
fflush(stdin);
scanf("%s", (con->people + con->count)->sex);
printf("输入年龄==>>");
fflush(stdin);
scanf("%d", &(con->people + con->count)->age);
printf("输入电话==>>");
fflush(stdin);
scanf("%s", (con->people + con->count)->telephone);
printf("输入地址==>>");
fflush(stdin);
scanf("%s", (con->people + con->count)->address);
(con->people + con->count)->flag = 1;
con->count++;
printf("\n");
}
go_menu();
}
void Show(PContact con)
{
int i = 0;
for (i = 0; i <con->count; i++)
{
if ((con->people + i)->flag == 1)
printf("姓名:%s 性别:%s \n年龄:%d 电话:%s 地址:%s \n",
(con->people + i)->name, (con->people + i)->sex, (con->people + i)->age,
(con->people + i)->telephone, (con->people + i)->address);
}
printf("以显示全部\n");
go_menu();
}
void Find(PContact con)
{
int i = 0;
int t = 0;
char search[100];
printf("请输入要查找的名字:=======>");
fflush(stdin);
scanf("%s", search);
for(i=0; i<con->count; i++)
{
if (strcmp((con->people + i)->name, search)==0)
{
printf("姓名:%s 性别:%s \n年龄:%d 电话:%s 地址:%s \n",
(con->people + i)->name, (con->people + i)->sex, (con->people + i)->age,
(con->people + i)->telephone, (con->people + i)->address);
t = 1;
}
}
if (t == 0)
printf("不存在此联系人!\n");
else
printf("已显示所有符合条件的联系人!\n");
go_menu();
}
void Delete(PContact con)
{
int i = 0;
int t = 0;
char search[100];
printf("请输入要删除的名字:=======>");
fflush(stdin);
scanf("%s", search);
for (i = 0; i<con->count; i++)
{
if (strcmp((con->people + i)->name, search)== 0)
{
(con->people + i)->flag = 0;
t = 1;
}
}
if (t == 0)
printf("此联系人不存在,删除失败!\n");
else
printf("删除成功!\n");
go_menu();
}
void Empty(PContact con)
{
con->count = 0;
printf("已清空所有联系人\n");
go_menu();
}
void Modify(PContact con)
{
char search[100];
int i;
printf("请输入要修改的名字:===>>>>>>>");
fflush(stdin);
scanf("%s", search);
for (i = 0; i<con->count; i++)
{
if (strcmp(search,(con->people+i)->name) == 0)
{
printf("请输入要修改该联系人的信息:=======>>>>>>>>name/sex/age/phone/address/\n");
fflush(stdin);
scanf("%s", search);
if (strcmp("name", search) == 0)
{
printf("请输入新信息:");
fflush(stdin);
scanf("%s", search);
strcpy((con->people + i)->name, search);
}
if (strcmp("sex", search) == 0)
{
printf("请输入新信息:");
fflush(stdin);
scanf("%s", search);
strcpy((con->people + i)->sex, search);
}
if (strcmp("age", search) == 0)
{
int b;
printf("请输入新信息:");
fflush(stdin);
scanf("%d", &b);
(con->people + i)->age = b;
}
if (strcmp("address", search) == 0)
{
printf("请输入新信息:");
fflush(stdin);
scanf("%s", search);
strcpy((con->people + i)->address, search);
}
if (strcmp("phone", search) == 0)
{
printf("请输入新信息:");
fflush(stdin);
scanf("%s", search);
strcpy((con->people + i)->telephone, search);
}
}
}
go_menu();
}
int cmp(const void *elem1, const void *elem2)
{
return strcmp(((People*)elem1)->name, ((People*)elem2)->name);
}
void Sort(PContact con)
{
int i = 0;
qsort(con->people, con->count, sizeof(People), cmp);
for (i = 0; i<con->count; i++)
{
if ((con->people + i)->name != '\0')
printf("姓名:%s 性别:%s \n年龄:%d 电话:%s 地址:%s \n",
(con->people + i)->name, (con->people + i)->sex, (con->people + i)->age,
(con->people + i)->telephone, (con->people + i)->address);
printf("\n");
}
go_menu();
}
void Save(PContact con)
{
int i = 0;
FILE* file = fopen("C:\\Users\\Administrator\\Desktop\\通讯录.txt","w");
if (file == NULL)
{
perror("C:\\Users\\Administrator\\Desktop\\通讯录.txt");
exit(EXIT_FAILURE);
}
for (i = 0; i < con->count; i++)
{
if((con->people+i)->flag==1)
fprintf(file,"姓名:%s 性别:%s \n年龄:%d 电话:%s 地址:%s \n",
(con->people + i)->name, (con->people + i)->sex, (con->people + i)->age,
(con->people + i)->telephone, (con->people + i)->address);
}
if (fclose(file) != 0)
{
perror("fclose");
exit(0);
}
printf("联系人信息已保存到桌面。\n");
go_menu();
}
void Free(PContact con)
{
free(con->people);
con->people = NULL;
}
void Show_file(PContact con)
{
FILE * file = fopen("C:\\Users\\Administrator\\Desktop\\通讯录.txt", "r");
if (file == NULL)
{
perror("C:\\Users\\Administrator\\Desktop\\通讯录.txt");
exit(EXIT_FAILURE);
}
while (!feof(file))//feof 如果到了文件的末尾就返回1 文件还没有结束就返回0
{
char c = fgetc(file);
putchar(c);
}
printf("\n");
if (fclose(file) != 0)
{
perror("fclose");
exit(0);
}
go_menu();
}