通讯录可以用来存储1000个人的信息,每个人的信息包括:
姓名、性别、年龄、电话、住址
提供方法:
1. 添加联系人信息
2. 删除指定联系人信息
3. 查找指定联系人信息
4. 修改指定联系人信息
5. 显示所有联系人信息
6. 清空所有联系人
7. 以名字排序所有联系人
8. 保存联系人到文件
9. 加载联系人
test.h
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <stddef.h>
#define FILE_PATH "C:/Users/LM/Desktop/test1" //保存文件的路径
#pragma once
#define MAX_name 20 //姓名长度
#define MAX_sex 10
#define MAX_phone 20
#define MAX_adress 30
#define MAX_company 20
//存入单个联系人信息的结构体
typedef struct PersonInfo
{
char name[MAX_name]; //姓名
char sex[MAX_sex]; //性别
char phone[MAX_phone]; //电话
char adress[MAX_adress]; //地址
char company[MAX_company]; //公司
}PersonInfo;
#define MAX_SIZE 5
//通讯录结构体
typedef struct AddressBook
{
int size; //联系人数量
PersonInfo* people; //指向单个联系人结构体
}AddressBook;
AddressBook g_addr;
//通讯录菜单
int Menu();
//初始化通讯录
void InitContacts(AddressBook* addr);
//增加联系人
void AddContacts(AddressBook* addr);
//删除联系人
void DelContacts(AddressBook* addr);
//显示所有联系人
void PrintContacts(AddressBook* addr);
//查找联系人
int FindContacts(AddressBook* addr);
//更改联系人
void ModifyContacts(AddressBook* addr);
//排序联系人
void SortContacts(AddressBook* addr);
//清空通讯录
void ClearallContacts(AddressBook* addr);
//写入文件
void WriteoutContacts(AddressBook* addr);
//写入内存
void ReadinContacts(AddressBook* addr);
test.c
#include "test.h"
int Menu()
{
int choice = 0;
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("请输入你的选择:");
scanf("%d", &choice);
return choice;
}
void InitContacts(AddressBook* addr)
{
memset(addr->people , 0, sizeof(addr->people) * MAX_SIZE);
}
void AddContacts(AddressBook* addr)
{
assert(addr != NULL);
//CheckCapacity(&g_addr);
printf("请输入联系人信息:\n");
printf("姓名:");
scanf("%s", addr->people->name);
printf("性别:");
scanf("%s", addr->people->sex);
printf("电话:");
scanf("%s", addr->people->phone);
printf("地址:");
scanf("%s", addr->people->adress);
printf("公司:");
scanf("%s", addr->people->company);
addr->size++;
printf("联系人个数为:%d\n", addr->size );
printf("\n");
}
void DelContacts(AddressBook* addr)
{
int ret = 0;
assert(addr != NULL);
if(addr->size == 0)
{
printf("没有联系人!\n");
return;
}
ret = FindContacts(&g_addr);
if(ret != -1)
{
int i = ret;
addr->people[i] = addr->people[i + 1];
addr->size--;
printf("删除成功!\n");
printf("此时联系人个数为:%d\n", addr->size);
}
else
{
printf("没有找到此联系人!\n");
return;
}
}
void PrintContacts(AddressBook* addr)
{
int i;
assert(addr != NULL);
if(addr->size == 0)
{
printf("没有联系人!\n");
return;
}
for(i = 0; i <= addr->size - 1; i++)
{
printf("姓名:%s\t", addr->people[i].name);
printf("性别:%s\t", addr->people[i].sex);
printf("电话:%s\t", addr->people[i].phone);
printf("地址:%s\t", addr->people[i].adress);
printf("公司:%s\n", addr->people[i].company);
}
printf("联系人总数:%d\n", i);
printf("\n");
}
int FindContacts(AddressBook* addr)
{
char Name[20];
int i;
assert(addr != NULL);
printf("请输入要查找联系人的姓名:");
scanf("%s", Name);
for(i = 0; i <= addr->size - 1; i++)
{
if(strcmp(Name, addr->people[i].name) == 0)
{
printf("此联系人信息如下:\n");
printf("姓名:%s\t", addr->people[i].name);
printf("性别:%s\t", addr->people[i].sex);
printf("电话:%s\t", addr->people[i].phone);
printf("地址:%s\t", addr->people[i].adress);
printf("公司:%s\n", addr->people[i].company);
printf("\n");
return i;
}
}
printf("没找到此联系人!\n");
return -1;
}
void ModifyContacts(AddressBook* addr)
{
int ret = 0;
assert(addr != NULL);
if(addr->size == 0)
{
printf("没有联系人!\n");
return;
}
ret = FindContacts(&g_addr);
if(ret != -1)
{
int i = ret;
printf("重新输入该联系人信息!\n");
printf("姓名:");
scanf("%s", addr->people[i].name);
printf("性别:");
scanf("%s", addr->people[i].sex);
printf("电话:");
scanf("%s", addr->people[i].phone);
printf("地址:");
scanf("%s", addr->people[i].adress);
printf("公司:");
scanf("%s", addr->people[i].company);
}
else
{
printf("没有找到此联系人!\n");
return;
}
}
void SortContacts(AddressBook* addr)
{
int i;
if(addr == NULL)
{
printf("通讯录无联系人!\n");
return;
}
for(i = 0; i < addr->size - 1; i++)
{
if(strcmp(addr->people[i].name, addr->people[i + 1].name) > 0)
{
char tem1[1024];
char tem2[1024];
char tem3[1024];
char tem4[1024];
char tem5[1024];
strcpy(tem1, addr->people[i].name);
strcpy(addr->people[i].name, addr->people[i + 1].name);
strcpy(addr->people[i + 1].name, tem1);
strcpy(tem2, addr->people[i].sex);
strcpy(addr->people[i].sex, addr->people[i + 1].sex);
strcpy(addr->people[i + 1].sex, tem2);
strcpy(tem3, addr->people[i].phone );
strcpy(addr->people[i].phone , addr->people[i + 1].phone );
strcpy(addr->people[i + 1].phone , tem3);
strcpy(tem4, addr->people[i].adress );
strcpy(addr->people[i].adress , addr->people[i + 1].adress );
strcpy(addr->people[i + 1].adress , tem4);
strcpy(tem5, addr->people[i].company );
strcpy(addr->people[i].company , addr->people[i + 1].company );
strcpy(addr->people[i + 1].company , tem5);
}
}
}
void ClearallContacts(AddressBook* addr)
{
assert(addr != NULL);
free(addr->people);
addr->people = NULL;
addr->size = 0;
addr->capacity = 0;
printf("清除联系人成功!\n");
}
void WriteoutContacts(AddressBook* addr)
{
int i;
FILE* fp = fopen(FILE_PATH, "w");
if(fp == NULL)
{
perror("error");
return;
}
for(i = 0; i <= addr->size - 1 ; i++)
{
fwrite(&(addr->people[i]), sizeof(PersonInfo), 1, fp);
}
fclose(fp);
}
void ReadinContacts(AddressBook* addr)
{
int i = 0;
PersonInfo contact = {0};
FILE* fp = fopen(FILE_PATH, "r");
if(fp == NULL)
{
perror("error");
return;
}
while(fread(&contact, sizeof(PersonInfo), 1, fp))
{
addr->people[i] = contact;
//printf("此联系人信息如下:\n");
//printf("姓名:%s\t", addr->people[i].name);
//printf("性别:%s\t", addr->people[i].sex);
//printf("电话:%s\t", addr->people[i].phone);
//printf("地址:%s\t", addr->people[i].adress);
//printf("公司:%s\n", addr->people[i].company);
i++;
addr->size++;
}
fclose(fp);
}
main.c
#include "test.h"
int main()
{
typedef void(*pfunc_t)(AddressBook*);
pfunc_t pfunc_table[] = { //表驱动
AddContacts,
DelContacts,
PrintContacts,
FindContacts,
ModifyContacts,
SortContacts,
ClearallContacts,
WriteoutContacts,
ReadinContacts
};
InitContacts(&g_addr);
while(1)
{
int choice = Menu();
if(choice < 0 || choice > 9)
{
printf("您的输入不合法,请重新输入\n");
continue;
}
if(choice == 0)
{
printf("GOOD BYE!\n");
break;
}
pfunc_table[choice - 1](&g_addr);
}
system("pause");
return 0;
}