先写一个简单的静态内存版本下的通讯录
具体要求如下
通讯录可以用来存储1000个人的信息,每个人的信息包括:
姓名、性别、年龄、电话、住址
提供方法:
- 添加联系人信息
- 删除指定联系人信息
- 查找指定联系人信息
- 修改指定联系人信息
- 显示所有联系人信息
- 清空所有联系人
- 以名字排序所有联系人
- 保存联系人到文件
- 加载联系人
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <errno.h>
#include <string.h>
#define MAX_PERSONS_NUM 300
typedef struct PersonInformation
{
char name[1024];
char gender[1024];
char age[1024];
char tel[1024];
char address[1024];
}PersonInfo;
typedef struct Contectbook
{
PersonInfo persons[MAX_PERSONS_NUM];
int size;
}Contectbook;
Contectbook g_contectbook;
void init()
{
g_contectbook.size = 0;
for (int i = 0; i < MAX_PERSONS_NUM; ++i)
{
g_contectbook.persons[i].name[0] = "\0";
g_contectbook.persons[i].gender[0] = "\0";
g_contectbook.persons[i].age[0] = "\0";
g_contectbook.persons[i].tel[0] = "\0";
g_contectbook.persons[i].address[0] = "\0";
}
}
int meau()
{
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("************************\n");
printf("请输入您的选择:>");
int choice = 0;
scanf("%d", &choice);
return choice;
}
void empty(){}
void add_person()
{
printf("请输入新增的姓名:>");
PersonInfo *p = &g_contectbook.persons[g_contectbook.size];
scanf("%s", p->name);
printf("新增姓名成功\n");
printf("请输入新增的性别:>");
scanf("%s", p->gender);
printf("新增性别成功\n");
printf("请输入新增的年龄:>");
scanf("%s", p->age);
printf("新增年龄成功\n");
printf("请输入新增的电话:>");
scanf("%s", p->tel);
printf("新增电话成功\n");
printf("请输入新增的地址:>");
scanf("%s", p->address);
printf("新增地址成功\n");
g_contectbook.size++;
}
void del_person()
{
printf("请输入您要删除的下标\n");
int index = 0;
scanf("%d", &index);
g_contectbook.persons[index] = g_contectbook.persons[g_contectbook.size];
g_contectbook.size--;
printf("删除联系人成功\n");
}
void search_person()
{
printf("请输入您要查找的联系人\n");
char search_name[1024] = "";
scanf("%s",search_name);
for (int j = 0; j < g_contectbook.size; ++j)
{
PersonInfo *p2 = &g_contectbook.persons[j];
if (!strcmp(search_name,p2->name))
{
printf("name:%s gender:%s age:%s tel:%s address:%s\n",
p2->name, p2->gender, p2->age, p2->tel, p2->address);
}
else
{
printf("不存在该联系人\n");
}
}
}
void update_person()
{
printf("请输入你要更新的联系人序号\n");
int index = 0;
scanf("%d", index);
PersonInfo *person = &g_contectbook.persons[index];
char name1[1024] = "";
char gender1[1024] = "";
char age1[1024] = "";
char tel1[1024] = "";
char address1[1024] = "";
scanf("%s %s %s %s %s", name1, gender1, age1, tel1, address1);
if (!strcmp(person->name, name1))
{
*(person->name) = name1;
}
if (!strcmp(person->gender, gender1))
{
*(person->gender) = gender1;
}
if (!strcmp(person->age, age1))
{
*(person->age) = age1;
}
if (!strcmp(person->tel, tel1))
{
*(person->tel) = tel1;
}
if (!strcmp(person->address, address1))
{
*(person->address) = address1;
}
printf("更新联系人成功\n");
}
void show_all_person()
{
for (int i = 0; i < g_contectbook.size; ++i)
{
printf("name:%s ", g_contectbook.persons[i].name);
printf("gender:%s ", g_contectbook.persons[i].gender);
printf("age:%s ", g_contectbook.persons[i].age);
printf("tel:%s ", g_contectbook.persons[i].tel);
printf("address:%s ", g_contectbook.persons[i].address);
printf("\n");
}
printf("打印成功\n");
}
void clear_all_person()
{
g_contectbook.size = 0;
printf("删除全部联系人成功\n");
}
void swap_string(char *str1, char *str2)
{
char tmp[1024] = "";
strcpy(tmp, str1);
strcpy(str1, str2);
strcpy(str2, tmp);
}
void sort_person()
{
for (int Bound = 0; Bound < g_contectbook.size; ++Bound)
{
for (int i = g_contectbook.size - 1; i > Bound; i--)
{
if (strcmp(g_contectbook.persons[i].name, g_contectbook.persons[i-1].name)< 0)
{
swap_string(g_contectbook.persons[i].name, g_contectbook.persons[i - 1].name);
}
}
}
printf("联系人已经按照姓名排序\n");
}
//保存联系人到文件
void Save_to_file()
{
FILE *fp = fopen("test.txt", "w");
if (fp == NULL)
{
assert(0);
}
for(int i = 0; i<g_contectbook.size; ++i)
{
fputs("name:", fp);
fputs(g_contectbook.persons[i].name,fp);
fputs(" ", fp);
fputs("gender:", fp);
fputs(g_contectbook.persons[i].gender, fp);
fputs(" ", fp);
fputs("age:", fp);
fputs(g_contectbook.persons[i].age, fp);
fputs(" ", fp);
fputs("tel:", fp);
fputs(g_contectbook.persons[i].tel, fp);
fputs(" ", fp);
fputs("address:", fp);
fputs(g_contectbook.persons[i].address, fp);
fputs("\n", fp);
}
fclose(fp);
fp = NULL;
printf("联系人已保存至文件\n");
}
//加载联系人
void Load_file()
{
long file_size;
FILE *fp2 = fopen("test.txt", "r");
if (fp2 == NULL)
{
assert(0);
}
//obtain file size
fseek(fp2, 0, SEEK_END);
file_size = ftell(fp2);
rewind(fp2);
//allocate memory to contain whole file
char *buffer = (char *)malloc(sizeof(char)*file_size);
if (buffer == NULL)
{
perror("malloc:");
}
size_t result = fread(buffer, 1, file_size, fp2);
printf("%s\n", buffer);
//if (result != file_size)
//{
// assert(0);
//}
fclose(fp2);
fp2 = NULL;
free(buffer);
printf("加载联系人成功\n");
}
//定义一个函数指针数组
//typedef void(*Func)();
int main()
{
init();
void(*Func[])() =
{
empty,
add_person,
del_person,
search_person,
update_person,
show_all_person,
clear_all_person,
sort_person,
Save_to_file,
Load_file
};
while (1)
{
int choice = meau();
if (choice<0 ||choice >= sizeof(Func)/sizeof(Func[0]))
{
printf("您的输入有误,请重新输入\n");
continue;
}
else if (choice == 0)
{
break;
}
(*Func[choice])();
}
system("pause");
return 0;
}