一、通讯录功能简介
? ? ? ? 用c语言写一个简单的通讯录,通讯录总共设置增删查改和显示五个功能。动态开辟空间存储。后续可以加上文件操作来保存信息。
二、代码部分
1.主函数相关部分
? ? ? ? 设计页面功能和各个功能函数的接口。
#define _CRT_SECURE_NO_WARNINGS
#include"contact.h"
void menu()
{
system("cls");
printf("\n\n\n");
printf("\t\t\t\t\t**************************************\n");
printf("\t\t\t\t\t************通讯录管理系统************\n");
printf("\t\t\t\t\t======================================\n");
printf("\t\t\t\t\t* 1.录入联系人信息 *\n");
printf("\t\t\t\t\t* 2.删除联系人信息 *\n");
printf("\t\t\t\t\t* 3.查找联系人信息 *\n");
printf("\t\t\t\t\t* 4.修改联系人信息 *\n");
printf("\t\t\t\t\t* 5.显示联系人信息 *\n");
printf("\t\t\t\t\t* 0.退出系统 *\n");
printf("\t\t\t\t\t======================================\n");
printf("\t\t\t\t\t**************************************\n");
printf("\t\t\t\t\t 请选择(0-5):");
}
enum Option
{
EXIT,
ADD,
DEL,
SEARCH,
MODIFY,
SHOW
};
int main()
{
int input = 0;
struct contact con;
InitCon(&con);
do
{
menu();
scanf("%d", &input);
switch (input)
{
case ADD:
AddCon(&con);
break;
case DEL:
DelCon(&con);
break;
case SEARCH:
SeaCon(&con);
break;
case MODIFY:
ModCon(&con);
break;
case SHOW:
ShowCon(&con);
break;
case EXIT:
printf("退出!");
break;
default:
break;
}
} while (input);
return 0;
}
2.通讯录头文件
? ? ? ? 每个人的信息存储类型可以使用结构体类型,再创建一个结构体类型成员包括人信息的结构体、通讯录目前数量和容量。
#pragma once
#define NAME_MAX 20
#define SEX_MAX 10
#define TEL_MAX 20
#define ADR_MAX 20
#define DEFAULT_CAP 3
#include<stdio.h>
#include<windows.h>
#include<string.h>
struct Peo
{
char name[NAME_MAX];
int age;
char sex[SEX_MAX];
char tel[TEL_MAX];
char adr[ADR_MAX];
};
struct contact
{
struct Peo* data;
int nums;
int capacity;
};
void InitCon(struct contact*);
void AddCon(struct contact*);
void ShowCon(struct contact*);
void DelCon(struct contact*);
void SeaCon(struct contact*);
void ModCon(struct contact*);
3.具体函数实现文件
? ? ? ? 各个功能其实写法其实及其相似,都是对结构体中的内容进行存取。但各个函数也有一些细节部分不同。在增加功能中,使用realloc扩大开辟的空间,规则是一旦信息量等于通讯录容量就会怎加两个空间。在删除功能中,需要找到删除位置,然后将后边的存储内容一个个的往前覆盖,再将信息数目减一,完成删除。至于查找、修改、显示,只要合理利用循环对结构体内容存取,即可很好的实现功能。
#define _CRT_SECURE_NO_WARNINGS
#include"contact.h"
void InitCon(struct contact* pc)
{
pc->nums = 0;
pc->capacity = DEFAULT_CAP;
pc->data = (struct Peo*)malloc(DEFAULT_CAP * sizeof(struct Peo));
}
void AddCon(struct contact* pc)
{
if (pc->nums == pc->capacity)
{
struct Peo* ptr = realloc(pc->data, (pc->capacity + 2) * sizeof(struct Peo));
if (ptr != NULL)
{
pc->data = ptr;
pc->capacity += 2;
}
else
{
return;
}
}
printf("请输入要增加人的姓名:");
scanf("%s", pc->data[pc->nums].name);
printf("请输入要增加人的年龄:");
scanf("%d", &pc->data[pc->nums].age);
printf("请输入要增加人的性别:");
scanf("%s", pc->data[pc->nums].sex);
printf("请输入要增加人的电话:");
scanf("%s", pc->data[pc->nums].tel);
printf("请输入要增加人的地址:");
scanf("%s", pc->data[pc->nums].adr);
pc->nums++;
printf("添加成功\n");
system("pause");
}
int FindByName(struct contact* pc, char* name)
{
int i = 0;
for (i = 0; i < pc->nums; i++)
{
if (strcmp(pc->data[i].name, name) == 0)
{
return i;
}
}
return -1;
}
void DelCon(struct contact* pc)
{
if (pc->nums == 0)
{
printf("通讯录为空,无法删除!\n");
system("pause");
return;
}
char name[NAME_MAX] = { 0 };
printf("输入要删除人的姓名:");
scanf("%s", name);
int pos = FindByName(pc,name);
if (pos == -1)
{
printf("无法找到该人!\n");
system("pause");
return;
}
else
{
int i = 0;
for (i = pos; i < pc->nums; i++)
{
pc->data[i] = pc->data[i + 1];
}
pc->nums--;
printf("删除成功!\n");
system("pause");
}
}
void ShowCon(struct contact* pc)
{
int i = 0;
printf("%20s\t%5s\t%10s\t%20s\t%20s\n", "name", "age", "sex", "tel", "adr");
for (i = 0; i < pc->nums; i++)
{
printf("%20s\t%5d\t%10s\t%20s\t%20s\n",
pc->data[i].name, pc->data[i].age, pc->data[i].sex,
pc->data[i].tel, pc->data[i].adr);
}
system("pause");
}
void SeaCon(struct contact* pc)
{
if (pc->nums == 0)
{
printf("通讯录为空!\n");
system("pause");
return;
}
char name[NAME_MAX] = { 0 };
printf("请输入要查找的人的姓名:");
scanf("%s", name);
int pos = FindByName(pc, name);
if (pos == -1)
{
printf("无法找到该人!\n");
system("pause");
return;
}
else
{
printf("找到了!信息如下:\n");
printf("%20s\t%5s\t%10s\t%20s\t%20s\n", "name", "age", "sex", "tel", "adr");
printf("%20s\t%5d\t%10s\t%20s\t%20s\n",
pc->data[pos].name, pc->data[pos].age, pc->data[pos].sex,
pc->data[pos].tel, pc->data[pos].adr);
system("pause");
return;
}
}
void ModCon(struct contact* pc)
{
if (pc->nums == 0)
{
printf("通讯录为空!\n");
system("pause");
return;
}
printf("请输入要修改人的名字:");
char name[NAME_MAX] = { 0 };
scanf("%s", name);
int pos = FindByName(pc, name);
if (pos == -1)
{
printf("无法找到该人!\n");
system("pause");
return;
}
else
{
printf("输入修改后的姓名");
scanf("%s", pc->data[pos].name);
printf("输入修改后的年龄");
scanf("%d", &pc->data[pos].age);
printf("输入修改后的性别");
scanf("%s", pc->data[pos].sex);
printf("输入修改后的电话");
scanf("%s", pc->data[pos].tel);
printf("输入修改后的地址");
scanf("%s", pc->data[pos].adr);
system("pause");
return;
}
}
总结
? ? ? ? 用c语言练习实现通讯录功能,能更好地帮助熟悉结构体和动态开辟空间函数的使用,后续可加入文件操作,即可将通讯录信息保存的txt文件中。
|