一、通讯录头文件
通讯录包括5个功能:增加信息,打印信息,删除信息,查找信息,修改信息,我们使用结构体来创建通讯录
头文件如下:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define namemax 255
#define sexmax 20
#define telemax 30
#define addrmax 50
#define MAX 1000
struct people
{
char name[namemax];
int age;
char sex[sexmax];
char tele[telemax];
char addr[addrmax];
};
struct contact
{
struct people data[MAX];
int sz;
};
//初始化通讯录
void initcontact(struct contact*pc);
//增加信息
void addcontact(struct contact *pc);
//打印信息
void showcontact(struct contact *pc);
//删除信息
void delcontact(struct contact *pc);
//查找信息
void searchcontact(struct contact *pc);
//修改信息
void modifycontact(struct contact *pc);
在通讯录结构体中包含两部分,其一为结构体数组,储存每个人的信息,其二为一个整数,记录当前的通讯录已有的人数
重点来讲7个实现功能的函数,剩余的两个文件会在最后统一展现
二、初始化通讯录
void initcontact(struct contact*pc)
{
pc->sz = 0;
//memset--设置内存的函数
memset(pc->data, 0, sizeof(pc->data));//将结构体数组初始化为0
}
memset函数将结构体数组初始化为0
void *memset( void *dest, int c, size_t count );
三、添加通讯录信息
void addcontact(struct contact *pc)
{
if (pc->sz == MAX)
printf("通讯录已满,无法添加\n");
else
{
printf("请输入名字:>");
scanf("%s", pc->data[pc->sz].name);
printf("请输入年龄:>");
scanf("%d", &(pc->data[pc->sz].age));
printf("请输入性别:>");
scanf("%s", pc->data[pc->sz].sex);
printf("请输入电话号码:>");
scanf("%s", pc->data[pc->sz].tele);
printf("请输入地址:>");
scanf("%s", pc->data[pc->sz].addr);
pc->sz++;
printf("添加成功\n");
}
}
四、展示通讯录信息
//打印信息
void showcontact(struct contact *pc)
{
int i = 0;
printf("%-15s\t%-5s\t%-5s\t%-12s\t%-20s\n","名字","年龄","性别","电话","住址");
for (i = 0; i < pc->sz; i++)
{
printf("%-15s\t%-5d\t%-5s\t%-12s\t%-20s\n",
pc->data[i].name,pc->data[i].age,pc->data[i].sex,pc->data[i].tele,pc->data[i].addr);
}
}
五、删除信息
//找到名字并返回对应的下标
int findname(struct contact *pc, char name[])
{
int i = 0;
for (i = 0; i < pc->sz; i++)
{
if (strcmp(pc->data[i].name, name) == 0)
return i;
}
return - 1;
}
//删除信息
void delcontact(struct contact *pc)
{
char name[namemax] = {0};
if (pc->sz == 0)
printf("通讯录为空,无法删除\n");
else
{
printf("请输入删除人的名字:>");
scanf("%s", name);
int pos=findname(pc, name);
if (pos == -1)
printf("要删除的人不存在");
else
{
int j = 0;
for (j = pos; j < pc->sz - 1; j++)
{
pc->data[j] = pc->data[j + 1];
}
pc->sz--;
}
}
}
在删除信息之前,先要找到该信息的位置,所以有了findname函数,为保障信息的连贯性,需要将后面的信息一个一个的提前,向前赋值即可,结构体可以整体赋值
六、查找通讯录信息
//查找信息
void searchcontact(struct contact *pc)
{
char name[namemax] = { 0 };
printf("所要查找的名字");
scanf("%s", name);
int ret = findname(pc, name);
if (ret == -1)
printf("不存在");
else
{
printf("%-15s\t%-5s\t%-5s\t%-12s\t%-20s\n", "名字", "年龄", "性别", "电话", "住址");
printf("%-15s\t%-5d\t%-5s\t%-12s\t%-20s\n",
pc->data[ret].name, pc->data[ret].age, pc->data[ret].sex, pc->data[ret].tele, pc->data[ret].addr);
}
}
同样用findname函数 ,找到下标后打印
七、修改指定信息
//修改信息
void modifycontact(struct contact *pc)
{
char name[namemax] = { 0 };
printf("所要修改的名字");
scanf("%s", name);
int ret = findname(pc, name);
if (ret == -1)
printf("不存在");
else
{
printf("请输入名字:>");
scanf("%s", pc->data[ret].name);
printf("请输入年龄:>");
scanf("%d", &(pc->data[ret].age));
printf("请输入性别:>");
scanf("%s", pc->data[ret].sex);
printf("请输入电话号码:>");
scanf("%s", pc->data[ret].tele);
printf("请输入地址:>");
scanf("%s", pc->data[ret].addr);
printf("修改成功");
}
}
用findname函数找到下标后,再次输入一次新的信息即可
八、实现主要代码
#define _CRT_SECURE_NO_WARNINGS
#include"contact.h"
//初始化通讯录
void initcontact(struct contact*pc)
{
pc->sz = 0;
//memset--设置内存的函数
memset(pc->data, 0, sizeof(pc->data));//将结构体数组初始化为0
}
//增加信息
void addcontact(struct contact *pc)
{
if (pc->sz == MAX)
printf("通讯录已满,无法添加\n");
else
{
printf("请输入名字:>");
scanf("%s", pc->data[pc->sz].name);
printf("请输入年龄:>");
scanf("%d", &(pc->data[pc->sz].age));
printf("请输入性别:>");
scanf("%s", pc->data[pc->sz].sex);
printf("请输入电话号码:>");
scanf("%s", pc->data[pc->sz].tele);
printf("请输入地址:>");
scanf("%s", pc->data[pc->sz].addr);
pc->sz++;
printf("添加成功\n");
}
}
//打印信息
void showcontact(struct contact *pc)
{
int i = 0;
printf("%-15s\t%-5s\t%-5s\t%-12s\t%-20s\n","名字","年龄","性别","电话","住址");
for (i = 0; i < pc->sz; i++)
{
printf("%-15s\t%-5d\t%-5s\t%-12s\t%-20s\n",
pc->data[i].name,pc->data[i].age,pc->data[i].sex,pc->data[i].tele,pc->data[i].addr);
}
}
//找到名字并返回对应的下标
int findname(struct contact *pc, char name[])
{
int i = 0;
for (i = 0; i < pc->sz; i++)
{
if (strcmp(pc->data[i].name, name) == 0)
return i;
}
return - 1;
}
//删除信息
void delcontact(struct contact *pc)
{
char name[namemax] = {0};
if (pc->sz == 0)
printf("通讯录为空,无法删除\n");
else
{
printf("请输入删除人的名字:>");
scanf("%s", name);
int pos=findname(pc, name);
if (pos == -1)
printf("要删除的人不存在");
else
{
int j = 0;
for (j = pos; j < pc->sz - 1; j++)
{
pc->data[j] = pc->data[j + 1];
}
pc->sz--;
}
}
}
//查找信息
void searchcontact(struct contact *pc)
{
char name[namemax] = { 0 };
printf("所要查找的名字");
scanf("%s", name);
int ret = findname(pc, name);
if (ret == -1)
printf("不存在");
else
{
printf("%-15s\t%-5s\t%-5s\t%-12s\t%-20s\n", "名字", "年龄", "性别", "电话", "住址");
printf("%-15s\t%-5d\t%-5s\t%-12s\t%-20s\n",
pc->data[ret].name, pc->data[ret].age, pc->data[ret].sex, pc->data[ret].tele, pc->data[ret].addr);
}
}
//修改信息
void modifycontact(struct contact *pc)
{
char name[namemax] = { 0 };
printf("所要修改的名字");
scanf("%s", name);
int ret = findname(pc, name);
if (ret == -1)
printf("不存在");
else
{
printf("请输入名字:>");
scanf("%s", pc->data[ret].name);
printf("请输入年龄:>");
scanf("%d", &(pc->data[ret].age));
printf("请输入性别:>");
scanf("%s", pc->data[ret].sex);
printf("请输入电话号码:>");
scanf("%s", pc->data[ret].tele);
printf("请输入地址:>");
scanf("%s", pc->data[ret].addr);
printf("修改成功");
}
}
九、实现main.c
#include"contact.h"
void menu()
{
printf("*********** *****************\n");
printf("*****1 add 2 del**********\n");
printf("*****3 search 4 modify*******\n");
printf("*****5 show *****************\n");
printf("*****0 exit ******************\n");
printf("******************************\n");
}
enum option
{
EXIT,
ADD,
DEL,
SEARCH,
MODIFY,
SHOW
};
void test()
{
int input = 0;
struct contact con;//创建通讯录
initcontact(&con);//初始化
do
{
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case EXIT:
printf("退出通讯录");
break;
case ADD:
addcontact(&con);
break;
case DEL:
delcontact(&con);
break;
case SEARCH:
searchcontact(&con);
break;
case MODIFY:
modifycontact(&con);
break;
case SHOW:
showcontact(&con);
break;
}
} while (input);
}
int main()
{
test();
return 0;
}
一顿操作猛如虎,结果是个二百五。