功能要求
- 添加联系人信息
- 删除指定联系人信息
- 查找指定联系人信息
- 修改指定联系人信息
- 显示所有联系人信息
- 清空所有联系人
- 以名字排序所有联系人
实现思想
- 采用多文件实现功能,避免程序混乱
- 利用转移表(函数指针数组)减少代码量
- 采用动态内存,节省了内存空间
- 使用结构体保存通讯录信息
- 使用I/O流的概念,并使用IO函数,完成通讯录的文件存储
具体代码:
contact.h
#ifndef __CONTACT_H__
#define __CONTACT_H__
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<string.h>
#include<windows.h>
#define NAME_NUM 20
#define SEX_NUM 3
#define ADDR_NUM 30
#define TEL_NUM 20
#define NUMBER 5 //通讯录开始的容量
#define RESET_NUMNER 5 //每次扩展的容量
typedef struct contact_people
{
char name[NAME_NUM];
char sex[SEX_NUM];
int age;
char addr[ADDR_NUM];
char phone[TEL_NUM];
}peo;
typedef struct contact
{
struct contact_people *arr; //录通讯录的大小,动态内存开辟
int count; //通讯录人数记录
int sum; //通讯录容量
}con;
typedef struct contact *p;
void menu();
void isfull(p contact);
void init_contact(p contact);
void add_contact(p contact);
void delete_contact(p contact);
void find_contact(p contact);
void amend_contact(p contact);
void display_contact(p contact);
void clear_contact(p contact);
void sort_contact(p contact);
void Free(p contact);
void save_contact(p conatct);
void show_file(p contact);
#endif
contact.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"
#include<stdio.h>
void menu()
{
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("****************************************************\n");
printf("****************************************************\n");
}
//初始化通讯录
void init_contact(p contact)
{
contact->count = 0;//人数
contact->arr = (struct contact_people *)malloc(sizeof(struct contact_people)*NUMBER);//开辟动态内存
memset(contact->arr, 0, NUMBER*sizeof(peo));
contact->sum = NUMBER;//通讯录容量
}
//判断通讯录满
void isfull(p contact)
{
if (contact->sum < contact->count)
{
contact->arr = (struct contact_people *)realloc(contact->arr, sizeof(struct contact_people)*RESET_NUMNER);
contact->sum = NUMBER + RESET_NUMNER;
}
}
//添加联系人
void add_contact(p contact)
{
isfull(contact);
fflush(stdin);
system("cls");
printf("\n请输入姓名:>");
scanf("%s", contact->arr[contact->count].name);
printf("\n请输入性别:>");
scanf("%s", contact->arr[contact->count].sex);
printf("\n请输入年龄:>");
scanf("%d", &contact->arr[contact->count].age);
printf("\n请输入地址:>");
scanf("%s", contact->arr[contact->count].addr);
printf("\n请输入电话:>");
scanf("%s", contact->arr[contact->count].phone);
contact->count++;
system("cls");
}
//删除联系人
void delete_contact(p contact)
{
int i = 0; //数组下标
int ret = 0;
char name[NAME_NUM];
fflush(stdin);
system("cls");
printf("请输入你要删除的联系人:");
scanf("%s", name);
while (i < contact->count)
{
if (strcmp(contact->arr[i].name, name) == 0)
{
contact->arr = 0;
ret = 1;
}
i++;
}
if (ret == 1)
{
printf("联系人已经删除\n");
}
else if (ret == 0)
{
printf("联系人不存在\n");
}
system("cls");
}
//查找联系人
void find_contact(p contact)
{
int i = 0;
int ret = 0;
char name[NAME_NUM];
fflush(stdin);
system("cls");
printf("请输入你要查找的联系人:");
scanf("%s", name);
while (i < contact->count)
{
if (strcmp(contact->arr[i].name, name) == 0)
{
printf("\tname\tsex\tage\ttel\t\taddr\n");
printf("\t%s", contact->arr[i].name);
printf("\t%s", contact->arr[i].sex);
printf("\t%d", contact->arr[i].age);
printf("\t%s", contact->arr[i].phone);
printf("\t\t%s", contact->arr[i].addr);
printf("\n\n");
ret = 1;
}
i++;
}
if (ret != 1)
{
printf("联系人不存在\n");
}
}
//修改联系人信息
void amend_contact(p contact)
{
int i = 0; //数组下标
int ret = 0;
char name[NAME_NUM];
fflush(stdin);
system("cls");
printf("请输入你要修改的联系人:");
scanf("%s", name);
while (i < contact->count)
{
if (strcmp(contact->arr[i].name, name) == 0)
{
printf("\n请输入姓名:>");
scanf("%s", contact->arr[i].name);
printf("\n请输入性别:>");
scanf("%s", contact->arr[i].sex);
printf("\n请输入年龄:>");
scanf("%d", &contact->arr[i].age);
printf("\n请输入电话:>");
scanf("%s", contact->arr[i].phone);
printf("\n请输入地址:>");
scanf("%s", contact->arr[i].addr);
ret = 1;
}
i++;
}
if (ret == 1)
{
printf("联系人已修改\n");
}
else if (ret == 0)
{
printf("联系人不存在\n");
}
system("cls");
}
//显示所有联系人
void display_contact(p contact)
{
int i = 0;
fflush(stdin);
system("cls");
printf("\n\t\tname\t\tsex\t\tage\t\taddr\t\ttel\n");
for (i = 0; i < contact->count; i++)
{
printf("\t\t%s", contact->arr[i].name);
printf("\t\t%s", contact->arr[i].sex);
printf("\t\t%d", contact->arr[i].age);
printf("\t\t%s", contact->arr[i].addr);
printf("\t\t%s", contact->arr[i].phone);
printf("\n");
}
}
//清空联系人
void clear_contact(p contact)
{
contact->count = 0;//人数清零
contact->arr = (struct contact_people *)malloc(sizeof(struct contact_people)*NUMBER);//开辟动态内存
memset(contact->arr, 0, NUMBER*sizeof(peo));
contact->sum = NUMBER;//通讯录容量恢复原始记录
}
//排序联系人
void sort_contact(p contact)
{
fflush(stdin);
system("cls");
if (0 == contact->count)
{
printf("通讯录为空\n");
}
else
{
int i = 0;
int j = 0;
for (i = 0; i < contact->count - 1; i++){
for (j = 0; j < contact->count - 1 - i; j++)
{
if (strcmp(contact->arr[j].name, contact->arr[j + 1].name) == 1)
{
struct contact_people tmp = contact->arr[j];
contact->arr[j] = contact->arr[j + 1];
contact->arr[j + 1] = tmp;
}
}
}
}
system("cls");
}
//释放内存
void Free(p contact)
{
free(contact->arr);
contact->arr = NULL;
}
//保存通讯录到桌面
void save_contact(p contact)
{
fflush(stdin);
system("cls");
FILE *file;
int i = 0;
file = fopen("C:\\Users\\lenovo\\Desktop\\通讯录.txt", "w");
if (file == NULL)
{
perror("C:\\Users\\lenovo\\Desktop\\通讯录.txtt");
exit(EXIT_FAILURE);
}
for (i = 0; i < contact->count; i++)
{
fprintf(file,"姓名:%s\t\t年龄:%d\t\t性别:%s\t\t电话:%s\t\t住址:%s\t\t",contact->arr[i].name,
contact->arr[i].age,
contact->arr[i].sex,
contact->arr[i].phone,
contact->arr[i].addr);
}
if (fclose(file) != 0)
{
perror("flcose");
exit(EXIT_FAILURE);
}
printf("联系人已保存\n");
system("cls");
}
//打开文件
void show_file(p contact)
{
fflush(stdin);
system("cls");
FILE * file = fopen("C:\\Users\\lenovo\\Desktop\\通讯录.txt", "r");
if (file == NULL)
{
perror("C:\\Users\\lenovo\\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);
}
}
test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include"contact.h"
int main()
{
struct contact people;
int input = 1;
void(*arr[10])(p) = { ' ',add_contact, delete_contact, find_contact, amend_contact, display_contact, clear_contact, sort_contact, save_contact,show_file };
init_contact(&people);
while (input)
{
menu();
printf("plesae select:");
scanf("%d", &input);
if (input > 0 && input < 10){
arr[input](&people);
printf("\n\n");
}
else if (input == 0){
Free(&people);
exit(0);
}
else{
printf("Enter error!\n\n\n");
continue;
}
}
}