通讯录管理系统的实现:
1)进行程序后,需要有一个选择菜单。
2)需要添加电话号码,实现数据的管理。
3)需要删除电话号码,实现数据的管理。
4)需要进行数据列表,显示所有的电话号码信息。
5)需要根据一个姓名进行查找,查出这个用户的电话号码。
6)需要有文件写入功能,把信息保存到文件上。
7)要有文件读取功能,从文件中读取以前保持的数据。
contact.h
#ifndef define _CONTACT_H_
#define _CONTACT_H_
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//一些方便改的数
#define MAXNAME 20
#define MAXSEX 5
#define MAXTEL 20
#define MAXDOOR 30
#define MAX 1000
#define DEFAULTSIZE 3
//人的信息
typedef struct {
char name[MAXNAME];
char sex[MAXSEX];
int age;
char tel[MAXTEL];
char address[MAXDOOR];
}person;
通讯录静态版本
//typedef struct {
// person perinfo[MAX];
// int sz;//当前通讯录中有效的人的个数
//}Contact;
//通讯录动态版本
typedef struct {
person* perinfo;
int sz;//通讯录中当前有的有效元素个数
int capcity;//通讯录当前的容量
}Contact;
enum Option {
EXIT,
ADD,
DELETE,
FIND,
CHANGE,
SHOW,
CLEAR,
SORT,
};
int checkandexpansion(Contact* p);
int Initcontact(Contact* p);
void add(Contact* p);
void show(Contact* p);
void find(Contact* p);
void contactdelete(Contact* p);
void contactchange(Contact* p);
void contactclear(Contact* p);
void contactsort(Contact* p);
int exitable(Contact* p);
#endif
main.c
#include "contact.h"
void menu()
{
printf("*******************************************\n");
printf("************这是一个通讯录设备*************\n");
printf("*******************************************\n");
printf("********输入对应数字启动对应功能***********\n");
printf("*******************************************\n");
printf("******1.ADD******************2.DELETE******\n");
printf("*******************************************\n");
printf("******3.FIND*****************4.CHANGE******\n");
printf("*******************************************\n");
printf("******5.SHOW*****************6.CLEAR*******\n");
printf("*******************************************\n");
printf("******7.SORT*****************0.EXIT********\n");
printf("*******************************************\n");
}
int main()
{
int input = 0;
//void(*pf[])(Contact*) = { exitable,add,contactdelete,
//find,contactchange,show,contactclear,contactsort };
Contact contact;
int a = Initcontact(&contact);
int b;
if (a == -1)
{
return -1;
}
do {
menu();
scanf("%d", &input);
//(*pf[input])(&contact);
switch (input)
{
case ADD: add(&contact); break;
case DELETE:contactdelete(&contact); break;
case FIND:find(&contact); break;
case CHANGE:contactchange(&contact); break;
case SHOW:show(&contact); break;
case CLEAR:contactclear(&contact); break;
case SORT:contactsort(&contact); break;
case EXIT: b = exitable(&contact);
if (b == -1)
{
input = 5;
}
break;
default: printf("输入错误 请重新输入\n");
}
} while (input != 0);
return 0;
}
contact.c
#include "contact.h"
//静态的版本
//void Initcontact(Contact* p)
//{
// p->sz = 0;
// memset(&p->perinfo, 0, MAX * sizeof(person));
//}
int checkandexpansion(Contact* p)
{
//增加容量
if (p->capcity == p->sz)
{
person* ptr = (person*)realloc(p->perinfo, (p->capcity + 2) * sizeof(person));
if (ptr == NULL)
{
return -1;
}
else
{
p->perinfo = ptr;
p->capcity += 2;
printf("增容成功!\n");
return 0;
}
}
return 1;
}
//动态版本
int Initcontact(Contact* p)
{
p->sz = 0;
p->perinfo = (person*)malloc(DEFAULTSIZE * sizeof(person));
p->capcity = DEFAULTSIZE;
FILE* pf = fopen("C:\\Users\\lenovo\\Desktop\\contact.txt", "rb");
if (pf == NULL)
{
printf("打开文件失败\n");
return -1;
}
person temp = { 0 };
while (fread(&temp, sizeof(person), 1, pf) != 0)
{
checkandexpansion(p);
p->perinfo[p->sz] = temp;
p->sz++;
}
fclose(pf);
pf = NULL;
return 0;
}
//静态的add
//void add(Contact* p)
//{
// if (p->sz == MAX)
// {
// printf("通讯录满了\n");
// }
// else
// {
// printf("请输入姓名\n");
// scanf("%s", p->perinfo[p->sz].name);
// printf("请输入性别\n");
// scanf("%s", p->perinfo[p->sz].sex);
// printf("请输入年龄\n");
// scanf("%d", &(p->perinfo[p->sz].age));
// printf("请输入电话\n");
// scanf("%s", p->perinfo[p->sz].tel);
// printf("请输入住址\n");
// scanf("%s", p->perinfo[p->sz].address);
// p->sz++;
// }
//}
//
//动态版本
void add(Contact* p)
{
int ret = 1;
//增加容量
ret = checkandexpansion(p);
if (ret != -1)
{
//录入新增人的信息
printf("请输入姓名\n");
scanf("%s", p->perinfo[p->sz].name);
printf("请输入性别\n");
scanf("%s", p->perinfo[p->sz].sex);
printf("请输入年龄\n");
scanf("%d", &(p->perinfo[p->sz].age));
printf("请输入电话\n");
scanf("%s", p->perinfo[p->sz].tel);
printf("请输入住址\n");
scanf("%s", p->perinfo[p->sz].address);
p->sz++;
printf("增加成功!\n");
}
else
{
printf("由于内存不足原因添加失败\n");
}
}
void show(Contact* p)
{
printf("%-20s\t%-5s\t%-s\t%-14s\t%-30s\n", "name", "sex", "age", "tel", "address");
for (int i = 0; i < p->sz; i++)
{
printf("%-20s\t%-5s\t%-d\t%-14s\t%-30s\n", p->perinfo[i].name, p->perinfo[i].sex, p->perinfo[i].age, p->perinfo[i].tel, p->perinfo[i].address);
}
}
void find(Contact* p)
{
int a = 0;
printf("如果你是要根据电话号查找,请输入1,如果要根据姓名查找,请输入0\n");
scanf("%d", &a);
if (a == 0)
{
char c[MAXNAME];
printf("请输入查找姓名\n");
scanf("%s", c);
int ret = 0;
for (int i = 0; i < p->sz; i++)
{
if (strcmp(c, p->perinfo[i].name) == 0)
{
printf("查找成功\n对应信息为\n");
ret = 1;
printf("%-20s\t%-5s\t%-d\t%-14s\t%-30s\n", p->perinfo[i].name, p->perinfo[i].sex, p->perinfo[i].age, p->perinfo[i].tel, p->perinfo[i].address);
break;
}
}
if (ret == 0)
{
printf("电话簿中查无此人,请核对此人的姓名是否输入正确\n");
}
}
else if (a == 1)
{
int ret = 0;
printf("请输入待查找的电话号码\n");
char c[MAXTEL];
scanf("%s", c);
for (int i = 0; i < p->sz; i++)
{
if (strcmp(c, p->perinfo[i].tel) == 0)
{
printf("查找成功\n对应信息为\n");
ret = 1;
printf("%-20s\t%-5s\t%-d\t%-14s\t%-30s\n", p->perinfo[i].name, p->perinfo[i].sex, p->perinfo[i].age, p->perinfo[i].tel, p->perinfo[i].address);
break;
}
}
if (ret == 0)
{
printf("电话簿中查无此人,请核对此人的姓名是否输入正确\n");
}
}
else
{
printf("输入错误,即将回到初始界面\n");
}
}
void contactdelete(Contact* p)
{
int a = 0;
printf("如果你是要根据电话号删除,请输入1,如果要根据姓名删除,请输入0\n");
scanf("%d", &a);
if (a == 0)
{
char c[MAXNAME];
printf("请输入要删除的姓名\n");
scanf("%s", c);
int ret = 0;
int i = 0;
for (i = 0; i < p->sz; i++)
{
if (strcmp(c, p->perinfo[i].name) == 0)
{
ret = 1;
break;
}
}
if (ret == 0)
{
printf("电话簿中查无此人,请核对此人的姓名是否输入正确\n");
}
else
{
for (int j = i; j < p->sz; j++)
{
p->perinfo[j] = p->perinfo[j + 1];
}
p->sz--;
printf("删除成功\n");
}
}
else if (a == 1)
{
int ret = 0;
printf("请输入你要删除的电话号码\n");
char c[MAXTEL];
scanf("%s", c);
for (int i = 0; i < p->sz; i++)
{
if (strcmp(c, p->perinfo[i].tel) == 0)
{
int j = i;
for (j = i; i < p->sz; j++)
{
p->perinfo[j] = p->perinfo[j + 1];
}
p->sz--;
printf("删除成功\n");
ret = 1;
break;
}
}
if (ret == 0)
{
printf("电话簿中查无此人,请核对此人的电话号码是否输入正确\n");
}
}
else
{
printf("输入错误,即将回到初始界面\n");
}
}
void contactchange(Contact* p)
{
char c[MAXNAME];
printf("请输入要待修改单位的姓名\n");
scanf("%s", c);
int ret = 0;
for (int i = 0; i < p->sz; i++)
{
if (strcmp(c, p->perinfo[i].name) == 0)
{
int change[5] = { 0 };
printf("是否需要修改姓名?需要修改姓名请输入1,否则输入0\n");
scanf("%d", &change[0]);
if (change[0] == 1)
{
printf("请输入新姓名\n");
scanf("%s", p->perinfo[i].name);
}
printf("是否需要修改性别?需要修改性别请输入1,否则输入0\n");
scanf("%d", &change[1]);
if (change[1] == 1)
{
printf("请输入正确性别\n");
scanf("%s", p->perinfo[i].sex);
}
printf("是否需要修改年龄?需要修改年龄请输入1,否则输入0\n");
scanf("%d", &change[2]);
if (change[2] == 1)
{
printf("请输入新年龄\n");
scanf("%d", &(p->perinfo[i].age));
}
printf("是否需要修改电话号码?需要修改电话号码请输入1,否则输入0\n");
scanf("%d", &change[3]);
if (change[3] == 1)
{
printf("请输入新电话号码\n");
scanf("%s", p->perinfo[i].tel);
}
printf("是否需要修改住址?需要修改住址请输入1,否则输入0\n");
scanf("%d", &change[4]);
if (change[4] == 1)
{
printf("请输入新住址\n");
scanf("%s", p->perinfo[i].address);
}
ret = 1;
printf("修改成功!\n");
printf("此人的新联系信息为:\n");
printf("%-20s\t%-5s\t%-d\t%-14s\t%-30s\n", p->perinfo[i].name, p->perinfo[i].sex, p->perinfo[i].age, p->perinfo[i].tel, p->perinfo[i].address);
break;
}
}
if (ret == 0)
{
printf("电话簿中查无此人,请核对此人的姓名是否输入正确\n");
}
}
//静态版本
//void contactclear(Contact* p)
//{
// Initcontact(p);
//}
//动态版本
void contactclear(Contact* p)
{
memset(p->perinfo, 0, (p->sz) * sizeof(person));
p->sz = 0;
printf("清除成功!\n");
}
void contactsort(Contact* p)
{
int i, j;
char temp1[MAXNAME];
char temp2[MAXSEX];
int temp3;
char temp4[MAXTEL];
char temp5[MAXDOOR];
for (i = 0; i < p->sz; i++)
{
for (j = 0; j < p->sz - 1 - i; j++)
{
if (strcmp(p->perinfo[j].name, p->perinfo[j + 1].name) > 0)
{
strcpy(temp1, p->perinfo[j].name);
strcpy(temp2, p->perinfo[j].sex);
temp3 = p->perinfo[j].age;
strcpy(temp4, p->perinfo[j].tel);
strcpy(temp5, p->perinfo[j].address);
strcpy(p->perinfo[j].name, p->perinfo[j + 1].name);
strcpy(p->perinfo[j].sex, p->perinfo[j + 1].sex);
p->perinfo[j].age = p->perinfo[j + 1].age;
strcpy(p->perinfo[j].tel, p->perinfo[j + 1].tel);
strcpy(p->perinfo[j].address, p->perinfo[j + 1].address);
strcpy(p->perinfo[j + 1].name, temp1);
strcpy(p->perinfo[j + 1].sex, temp2);
p->perinfo[j + 1].age = temp3;
strcpy(p->perinfo[j + 1].tel, temp4);
strcpy(p->perinfo[j + 1].address, temp5);
}
}
}
printf("排序成功!新的通讯录信息如下!\n");
show(p);
}
int exitable(Contact* p)
{
FILE* pf = fopen("C:\\Users\\lenovo\\Desktop\\contact.txt", "wb");
if (pf == NULL)
{
printf("存储文件失败 请重新退出\n");
return -1;
}
for (int i = 0; i < p->sz; i++)
{
fwrite(&(p->perinfo[i]), sizeof(person), 1, pf);
}
fclose(pf);
pf = NULL;
free(p->perinfo);
p->perinfo = NULL;
p->sz = 0;
p->capcity = 0;
printf("销毁成功!\n");
printf("退出\n");
return 0;
}