功能包括: 增、删、改、查、显示、排序
总共创建了三个文件:main.c 、 contact.c 、contact.h
-
主函数main
引入头文件:使用 #define _CRT_SECURE_NO_WARNINGS 来禁用VS中一些安全相关的警告,然后引入自定义头文件 contact.h ,这个头文件可能包含了通讯录实现所需的结构体定义、函数声明等。
定义菜单函数: menu 函数负责在控制台打印出操作菜单,为用户提供了添加、删除、更新、查找、显示、排序和退出等功能选项。
主函数main实现:
变量声明与初始化:在 main 函数中,声明了一个整型变量 input 用于存储用户输入,同时创建了一个通讯录结构体变量 con ,并调用 initContact 函数对其进行初始化。
循环处理用户操作:使用 do - while 循环,不断显示菜单并获取用户输入。根据用户输入的选项,通过 switch 语句调用相应的功能函数,如添加联系人( AddContact )、删除联系人( DelContact )等。当用户选择0时,退出循环,程序结束。
功能函数调用:每个功能对应一个函数,这些函数在 contact.h 头文件中声明,具体实现可能在对应的源文件中。例如 AddContact 函数用于向通讯录中添加联系人信息, ShowContact 函数用于将通讯录中的联系人信息打印出来。
#define _CRT_SECURE_NO_WARNINGS
#include "contact.h"
//删 改 查 三个都有查找的动作
//增删改查 通讯录
void menu(void)
{
printf("*********************************\n");
printf("*******1.Add 2.Delete*******\n");
printf("*******3.Update 4.Find*********\n");
printf("*******5.show 6.sort*********\n");
printf("*********************************\n");
}
int main()
{
int input = 0;
//创建通讯录
Contact con;
//初始化通讯录
initContact(&con); //初始化con
do
{
menu();
printf("请选择->");
scanf("%d", &input);
switch (input)
{
case 1:
AddContact(&con);//信息添加到con
break;
case 2:
DelContact(&con);
break;
case 3:
Modify_Contact(&con);
break;
case 4:
SearchContact(&con);
break;
case 5:
ShowContact(&con);//信息打印出来
break;
case 6:
Sort(&con);
break;
case 0:
printf("退出通讯录\n");
break;
default:
printf("选择错误,请重新选择!\n");
break;
}
} while (input);
return 0;
}
-
增、删、改、查、显示、排序实现
初始化通讯录: initContact 函数负责初始化通讯录,使用 assert 确保传入的指针有效,将通讯录中已存储的联系人数量 sz 设为0,并使用 memset 将存储联系人信息的数组 data 初始化为0。
添加联系人: AddContact 函数用于向通讯录添加联系人。首先检查通讯录是否已满,若未满则提示用户输入姓名、年龄、性别、地址和电话等信息,存入当前空闲位置,并将联系人数量 sz 加1。
显示联系人: ShowContact 函数以表格形式展示通讯录中所有联系人信息。通过 assert 保证传入指针有效,然后遍历联系人数组,按照指定格式输出每个联系人的各项信息。
查找联系人: find_Byname 函数根据姓名查找联系人,在联系人数组中逐个比较姓名,若找到匹配项则返回其在数组中的下标,否则返回-1。
删除联系人: DelContact 函数用于删除指定联系人。先检查通讯录是否为空,然后提示用户输入要删除的联系人姓名,调用 find_Byname 查找该联系人,若找到则将其后的联系人依次向前移动覆盖要删除的联系人,最后将联系人数量 sz 减1 。
查找联系人详情: SearchContact 函数根据用户输入的姓名查找并显示该联系人的详细信息。若未找到则提示用户。
修改联系人: Modify_Contact 函数根据用户输入的姓名查找要修改的联系人,若找到则提示用户重新输入各项信息,完成对该联系人信息的修改。
排序联系人: Sort 函数通过 qsort 对通讯录中的联系人按电话号码进行排序。 sort_by_tele 函数作为比较函数,用于 qsort 中比较两个联系人的电话号码,排序完成后重新打印通讯录内容。
#define _CRT_SECURE_NO_WARNINGS
#include "contact.h"
//初始化通讯录
void initContact(Contact* pc)
{
assert(pc);
pc->sz = 0;//指向通讯录的成员
//pc->data//初始化成我想要的内容
memset(pc->data, 0, sizeof(pc->data));
}
//添加联系人
void AddContact(Contact* pc)
{
assert(pc);
if (pc->sz == CONTACT_MAX)
{
printf("通讯录已满,无法添加");
return;
}
//增加一个人的信息
printf("请输入名字:->");
scanf("%s",pc->data[pc->sz].name);//这里name是数组,不需要取地址
printf("请输入年龄:->");
scanf("%d", &pc->data[pc->sz].age);//变量 需要取地址
printf("请输入性别:->");
scanf("%s", pc->data[pc->sz].sex);
printf("请输入地址:->");
scanf("%s", pc->data[pc->sz].addr);
printf("请输入电话:->");
scanf("%s", pc->data[pc->sz].telep);
pc->sz++;
}
void ShowContact(const Contact* ps)
{
assert(ps);
int i = 0;
printf("%-10s\t%-10s\t%-10s\t%-20s\t%-10s\n",
"姓名", "年龄", "性别", "地址", "电话");
for (i = 0; i < ps->sz; i++)
{
printf("%-10s\t%-10d\t%-10s\t%-20s\t%-10s\n",
ps->data[i].name,
ps->data[i].age,
ps->data[i].sex,
ps->data[i].addr,
ps->data[i].telep);
}
}
int find_Byname(const Contact* pc, char name[])
{
assert(pc && name);
int i = 0;
int del = 0;
for (i = 0; i < pc->sz; i++)
{
if (strcmp(pc->data[i].name, name) == 0)
{
return i;//返回下标i
break;//这里不能写return;
}
}
return -1;
}
void DelContact(Contact* pc)
{
assert(pc);
char name[NAME_MAX] = { 0 };
if (pc->sz == 0)
{
printf("通讯录为空,无法删除");
return;
}
//找到要删除的人
printf("请输入要删除的人的名字:>");
scanf("%s", name);
int pos = find_Byname(pc , name);
if (-1 == pos)
{
printf("要删除的人不存在");
return;
}
int i = 0;
//删除
for (i = pos; i < pc->sz-1; i++)
{//↑//为什么ret为初始值?因为要删除下标的数据(也就是ret这个数据需要改动)
pc->data[i] = pc->data[i + 1];
}
pc->sz--;
printf("删除成功!\n");
}
void SearchContact(const Contact* pc)
{
assert(pc);
char name[NAME_MAX];
printf("请输入要查找的人名字:->");
scanf("%s",name);
//pc 把const数据赋非const数据 不安全,所以find_Byname函数参数也要加const↓
int pos = find_Byname(pc, name);
if (-1 == pos)
{
printf("要查找的人不存在");
return;
}
//打印信息
printf("%-10s\t%-10s\t%-10s\t%-20s\t%-12s\n",
"姓名", "年龄", "性别", "地址", "电话");
printf("%-10s\t%-10d\t%-10s\t%-20s\t%-12s\n",
pc->data[pos].name,
pc->data[pos].age,
pc->data[pos].sex,
pc->data[pos].addr,
pc->data[pos].telep);
}
void Modify_Contact(Contact* pc)
{
assert(pc);
char name[NAME_MAX] = { 0 };
printf("请输入要修改的人的名字:>");
scanf("%s", name);
int pos = find_Byname(pc, name);
if (-1 == pos)
{
printf("要修改的人不存在");
return;
}
//pos 修改这个 “下标”的内容
printf("请输入名字:->");
scanf("%s", pc->data[pos].name);//这里name是数组,不需要取地址
printf("请输入年龄:->");
scanf("%d", &pc->data[pos].age);//变量 需要取地址
printf("请输入性别:->");
scanf("%s", pc->data[pos].sex);
printf("请输入地址:->");
scanf("%s", pc->data[pos].addr);
printf("请输入电话:->");
scanf("%s", pc->data[pos].telep);
printf("修改完成!");
}
//--------------------------------
int sort_by_tele(const void* e1, const void* e2)
{
return strcmp(((const PepIndfo*)e1)->telep , ((const PepIndfo*)e2)->telep);//字符串对比
}
void Sort(Contact* pc)
{
assert(pc);
int sz = pc->sz;
qsort(pc->data, sz, sizeof(pc->data[0]), sort_by_tele);
int i = 0;
printf("%-10s\t%-10s\t%-10s\t%-20s\t%-10s\n",
"姓名", "年龄", "性别", "地址", "电话");
for (i = 0; i < pc->sz; i++)
{
printf("%-10s\t%-10d\t%-10s\t%-20s\t%-10s\n",
pc->data[i].name,
pc->data[i].age,
pc->data[i].sex,
pc->data[i].addr,
pc->data[i].telep);
}
}
-
声明函数,定义结构体
宏定义:使用 #define 定义了一系列常量,如 CONTACT_MAX 表示通讯录最大容量, NAME_MAX 等用于限制联系人各项信息的最大长度,方便统一管理和修改。
结构体定义:
PepIndfo 结构体用于存储单个联系人的信息,包括姓名、年龄、性别、地址和电话号码,每个成员都有对应最大长度的字符数组或整型变量。
Contact 结构体包含一个 PepIndfo 类型的数组 data ,用于存储多个联系人信息,以及一个 int 类型的 sz ,记录当前已存储的联系人数量。
函数声明:剩下的就是函数声明。
#pragma once
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <stdlib.h>
#define CONTACT_MAX 100
#define NAME_MAX 20
#define SEX_MAX 5
#define ADDR_MAX 30
#define TELEP_MAX 20
typedef struct PepIndfo
{
char name[NAME_MAX];
int age;
char sex[SEX_MAX];
char addr[ADDR_MAX];
char telep[TELEP_MAX];
}PepIndfo;
PepIndfo ad = { "dsd",23,"ds","dwe","efs" };
typedef struct Contact
{
PepIndfo data[CONTACT_MAX];
int sz;//已经存了几个人的信息
}Contact;
void initContact(Contact* pc);
//添加联系人
void AddContact(Contact* pc);
//显示联系人信息
void ShowContact(const Contact* ps);
//删除联系人
void DelContact(Contact* pc);
//查找联系人
void SearchContact(const Contact* pc);
//修改联系人
void Modify_Contact(Contact* pc);
void Sort(Contact* pc);
int sort_by_tele(const void* e1, const void* e2);