主要知识,结构体、枚举、指针、递归、冒泡排序等。
一、前言
本文将会使用c语言实现同通讯录,通讯录可储存联系人的姓名、电话、性别、年龄、住址,包括联系人的增减、查找(包括同名)、排序、联系人信息修改及联系人信息显示。
二、通讯录的实现
1.菜单
通过菜单由用户选择要操作的功能:
void menu()
{
printf("*****************************************\n");
printf("******* 1.add 2.del *********\n");
printf("******* 3.modify 4.search *********\n");
printf("******* 5.sort 6.print *********\n");
printf("******* 0.exit *********\n");
printf("*****************************************\n");
}
2.结构体创建
typedef struct PeoInof
{
char name[name_max];
int age;
char gender[gender_max];
char tele[tele_max];
char addr[addr_max];
}PeoInof;
typedef struct Contect
{
PeoInof dete[dete_max];
int sz;
int num[dete_max];
int sz1;
}Contect;
3.初始化通讯录
void InitContects(Contect* pc)
{
pc->sz = 0;
memset(pc->dete,0,sizeof(pc->dete));
}
4.查找函数
字符串比较函数依次查找,记录符合要求元素在数组中下标位置,再次将函数此时i带入此函数,继续递归查找,直至找完所有联系人。
static int FindName(int num, Contect* pc, char namecmp[])
{
int i = 0;
for (i = num; i < pc->sz; i++)
{
if (strcmp(namecmp, pc->dete[i].name) == 0)
{
pc->num[pc->sz1] = i;
pc->sz1++;
return FindName(i + 1, pc, namecmp);
}
}
if (pc->sz1 != 0)
return 1;
else
return -1;
}
5.增加联系人
若通讯录已满显示“通讯录已存满!”,否则用户依次填入联系人信息,将信息存入同通讯录中 ,显示添加成功。
void AddContect(Contect* pc)
{
if (pc->sz == dete_max)
{
printf("通讯录已存满!");
return;
}
printf("请输入名字:\n");
scanf("%s", pc->dete[pc->sz].name);
printf("请输入电话:\n");
scanf("%s", pc->dete[pc->sz].tele);
printf("请输入地址:\n");
scanf("%s", pc->dete[pc->sz].addr);
printf("请输入性别:\n");
scanf("%s", pc->dete[pc->sz].gender);
printf("请输入年龄:\n");
scanf("%d", &(pc->dete[pc->sz].age));
pc->sz++;
printf("添加成功\n");
}
6.删除联系人
在联系人不为0的情况下输入联系人姓名,系统搜索出所有同名联系人,用户再具体选择删除。
void DelContect(Contect* pc)
{
char namecmp[name_max] = { 0 };
if (pc->sz == 0)
{
printf("保存联系人为0\n");
return;
}
printf("请输入要删除的联系人\n");
scanf("%s", namecmp);
pc->sz1 = 0;
int pos = FindName(0, pc, namecmp);
if (pos > 0)
{
int i = 0;
int j = 0;
printf("%-10s%-6s%-20s%-6s%-40s\n", " 姓名", " 性别", " 电话", " 年龄", " 地址");
for (i = 0; i < pc->sz1; i++)
{
printf("%d:%-10s%-6s%-20s%-6d%-40s\n", i+1,pc->dete[pc->num[i]].name,
pc->dete[pc->num[i]].gender,
pc->dete[pc->num[i]].tele,
pc->dete[pc->num[i]].age,
pc->dete[pc->num[i]].addr);
}
printf("选择要删除的对象\n");
scanf("%d", &j);
if (j - 1 <= pc->sz1)
{
for (i = pc->num[j - 1]; i < pc->sz - 1; i++)
{
pc->dete[i] = pc->dete[pc->num[i + 1]];
}
pc->sz--;
printf("删除成功\n");
}
else
{
printf("输入错误\n");
return;
}
}
else
printf("未查找到相关联系人\n");
}
7.修改联系人信息
输入联系人姓名显示所有同名联系人,根据联系人序号选择要修改的联系人信息,联系人位置不变。
void ModContect(Contect* pc)
{
char namecmp[name_max] = { 0 };
if (pc->sz == 0)
{
printf("保存联系人为0\n");
return;
}
printf("请输入要修改的联系人姓名\n");
scanf("%s", namecmp);
pc->sz1 = 0;
int pos = FindName(0, pc, namecmp);
if (pos > 0)
{
int i = 0;
int j = 0;
printf("%-10s%-6s%-20s%-6s%-40s\n", " 姓名", " 性别", " 电话", " 年龄", " 地址");
for (i = 0; i < pc->sz1; i++)
{
printf("%d:%-10s%-6s%-20s%-6d%-40s\n", i + 1, pc->dete[pc->num[i]].name,
pc->dete[pc->num[i]].gender,
pc->dete[pc->num[i]].tele,
pc->dete[pc->num[i]].age,
pc->dete[pc->num[i]].addr);
}
printf("选择要修改的对象\n");
scanf("%d", &j);
if (j - 1 <= pc->sz1)
{
printf("请输入名字:\n");
scanf("%s", pc->dete[pc->num[j - 1]].name);
printf("请输入电话:\n");
scanf("%s", pc->dete[pc->num[j - 1]].tele);
printf("请输入地址:\n");
scanf("%s", pc->dete[pc->num[j - 1]].addr);
printf("请输入性别:\n");
scanf("%s", pc->dete[pc->num[j - 1]].gender);
printf("请输入年龄:\n");
scanf("%d", &(pc->dete[pc->num[j - 1]].age));
printf("修改成功\n");
}
else
{
printf("输入错误\n");
return;
}
}
else
printf("未查找到相关联系人\n");
}
8. 搜索联系人
根据联系人姓名查找出所有联系人并显示,若没有此联系人则会有相应的提示。
void SeaContect(Contect* pc)
{
char namecmp[name_max] = { 0 };
printf("请输入要查找的姓名\n");
scanf("%s", namecmp);
pc->sz1 = 0;
int pos=FindName(0, pc, namecmp);
if (pos > 0)
{
printf("%-10s%-6s%-20s%-6s%-40s\n", " 姓名", " 性别", " 电话", " 年龄", " 地址");
for (int i = 0; i < pc->sz1; i++)
{
printf("%d:%-10s%-6s%-20s%-6d%-40s\n", i+1,pc->dete[pc->num[i]].name,
pc->dete[pc->num[i]].gender,
pc->dete[pc->num[i]].tele,
pc->dete[pc->num[i]].age,
pc->dete[pc->num[i]].addr);
}
}
else
printf("未查找到相关联系人\n");
}
9.显示联系人
显示所有联系人信息。
void PrintContect(Contect* pc)
{
if (pc->sz == 0)
{
printf("保存联系人为0\n");
return;
}
printf("%-10s%-6s%-20s%-6s%-40s\n", " 姓名", " 性别", " 电话", " 年龄" ," 地址");
for (int i = 0; i < pc->sz; i++)
{
printf("%d:%-10s%-6s%-20s%-6d%-40s\n",i+1, pc->dete[i].name, pc->dete[i].gender, pc->dete[i].tele, pc->dete[i].age, pc->dete[i].addr);
}
}
10.联系人排序
根据冒泡排序 对联系人进行排序。
void SortContrct(Contect* pc)
{
int i = 0;
int j = 0;
for (i = 0; i < pc->sz-1; i++)
{
for (j = 0; j < pc->sz -1- i; j++)
{
if ((strcmp(pc->dete[j].name, pc->dete[j+1].name)) > 0)
{
PeoInof Sor;
Sor = pc->dete[j];
pc->dete[j] = pc->dete[j+1];
pc->dete[j+1] = Sor;
}
}
}
printf("排序成功\n");
}
三、代码展示
contect.h
#pragma once
#include <stdio.h>
#include<string.h>
#define name_max 20
#define gender_max 6
#define tele_max 12
#define addr_max 30
#define dete_max 1000
typedef struct PeoInof
{
char name[name_max];
int age;
char gender[gender_max];
char tele[tele_max];
char addr[addr_max];
}PeoInof;
typedef struct Contect
{
PeoInof dete[dete_max];
int sz;
int num[dete_max];
int sz1;
}Contect;
void InitContects(Contect *pc);//初始化通讯录
void AddContect(Contect *pc);//增加联系人
void PrintContect(Contect* pc);//显示联系人
void DelContect(Contect* pc);//删除联系人
void SeaContect(Contect* pc);//查找联系人
void ModContect(Contect* pc);//修改联系人
void SortContrct(Contect* pc);//联系人排序
main.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"contact.h"
void menu()
{
printf("*****************************************\n");
printf("******* 1.add 2.del *********\n");
printf("******* 3.modify 4.search *********\n");
printf("******* 5.sort 6.print *********\n");
printf("******* 0.exit *********\n");
printf("*****************************************\n");
}
enum Option
{
EXIT,
ADD,
DEL,
MODIFY,
SEARCH,
SORT,
PRINT,
};
int main()
{
int input=0;
Contect con;
InitContects(&con);
do
{
menu();
printf("请输入选项:>\n");
scanf("%d", &input);
switch (input)
{
case ADD://
AddContect(&con);
break;
case DEL:
DelContect(&con);
break;
case MODIFY://修改
ModContect(&con);
break;
case SEARCH://搜索//
SeaContect(&con);
break;
case SORT://排序
SortContrct(&con);
break;
case PRINT://
PrintContect(&con);
break;
case EXIT://
break;
default:
break;
}
} while (input);
return 0;
}
结果展示
感谢观看