注:将所有的头文件声明放入contact.h的头文件中
test.c文件
#include "contact.h"
void menu()
{
printf("*************************************************\n");
printf("**************1.Add 2.Del*****************\n");
printf("**************3.Search 4.Modify**************\n");
printf("**************5.Show 6.Sort****************\n");
printf("************** 0.exit *************\n");
printf("*************************************************\n");
}
int main()
{
//创建通讯录
int input = 0;
//通讯录测试主体↓
do
{
menu();//打印简单菜单,显示通讯录的功能
printf("请选择:");
scanf("%d", &input);//接收选择(数字)选择进入功能窗口
switch (input)
{
case 1:
break;
case 2:
break;
case 3:
break;
case 4:
break;
case 5:
break;
case 6:
break;
case 0:
printf("退出通讯录");
break;
default:
printf("选择错误,请重新选择:\n");
break;
}
} while (input);
}
#pragma once
#include
#include
//便于后续可能更改数据
#define N_MAX 100
#define NAME_MAX 30
#define GENDER_MAX 5
#define TEL_MAX 13
#define ADDR_MAX 50
//创建联系人结构体
struct PeoInfo
{
char name[NAME_MAX];
char gender[GENDER_MAX];
int tel[TEL_MAX];
int age;
char addres[ADDR_MAX];
};
struct Contact
{
struct PeoInfo data[N_MAX];
int sz;
};
//初始化通讯录
void InitContact(struct Contact* pc);
#define _CRT_SECURE_NO_WARNINGS 1
#include "contact.h"
void InitContact(struct Contact* pc)
{
pc->sz = 0;
memset(pc->data, 0, N_MAX * sizeof(struct PeoInfo));
}
memest函数笔记
memset(cplusplus.com)
//增加联系人的信息到通讯录
void AddContact(struct Contact* pc)
{
//首先判断能否增加信息
if (pc->sz == N_MAX)
{
printf("通讯录已满,无法增加联系人的信息\n");
return;
}
else
{
printf("请输入联系人的名字:");
scanf("%s", pc->data[pc->sz].name);
printf("请输入联系人的性别:");
scanf("%s", pc->data[pc->sz].gender);
printf("请输入联系人的电话:");
scanf("%s", pc->data[pc->sz].tel);
printf("请输入联系人的年龄:");
scanf("%d", &pc->data[pc->sz].age);//注意这里age不是数组名!要有‘&’
printf("请输入联系人的地址:");
scanf("%s", pc->data[pc->sz].addres);
printf("成功增加联系人的信息\n\n");
pc->sz++;
}
}
//显示通讯录中的信息
void ShowContact(const struct Contact* pc)
{
assert(pc);
int i = 0;
printf("%-20s\t%-5s\t%-15s\t%-5s\t%-30s\n","姓名","性别","电话","年龄","地址");
//右对齐-正数 ; 左对齐-负数
for (i = 0; i < (pc->sz); i++)
{
printf("%-20s\t%-5s\t%-15s\t%-5d\t%-30s\n", pc->data[i].name,
pc->data[i].gender,
pc->data[i].tel,
pc->data[i].age,
pc->data[i].addres);
}
}
//根据姓名查找指定联系人
int FindByName(const struct Contact* pc, char* name)
{
assert(pc);
int i = 0;
for (i = 0; i < pc->sz; i++)
{
if (0 == strcmp(pc->data[i].name, name))
{
//printf("该联系人不存在\n");
return i;
}
}
return -1;
}
//删除指定联系人
void DelContact(struct Contact* pc)
{
assert(pc);
char name[NAME_MAX];
printf("请输入指定删除的联系人的姓名:");
scanf("%s", &name);
int ret = FindByName(pc, name);
if (-1 == ret)
{
printf("该联系人不存在\n");
return;
}
else
{
int i = 0;
for (i = 0; i < (pc->sz - 1); i++)
{
pc->data[ret + i] = pc->data[ret + 1 + i];
}
pc->sz--;
printf("成功删除指定联系人\n");
}
}
strcmp函数笔记
思路:前半部分同 step5.删除 的思路(到查找为止)->后半部分同 step4.显示 的思路(输出指定查找的联系人)
//查找指定联系人
void SearchContact(const struct Contact* pc)
{
assert(pc);
char name[NAME_MAX];
printf("请输入指定查找的联系人的姓名:");
scanf("%s", &name);
int ret = FindByName(pc, name);
if (-1 == ret)
{
printf("该联系人不存在\n");
return;
}
else
{
printf("%-20s\t%-5s\t%-15s\t%-5s\t%-30s\n", "姓名", "性别", "电话", "年龄", "地址");
printf("%-20s\t%-5s\t%-15s\t%-5d\t%-30s\n", pc->data[ret].name,
pc->data[ret].gender,
pc->data[ret].tel,
pc->data[ret].age,
pc->data[ret].addres);
}
}
思路:类似step5.删除 +step3.增加的思路(删除变修改)
//修改指定联系人的信息
void ModifyContact(struct Contact* pc)
{
assert(pc);
char name[NAME_MAX];
printf("请输入指定修改的联系人的姓名:");
scanf("%s", &name);
int ret = FindByName(pc, name);
if (-1 == ret)
{
printf("该联系人不存在\n");
return;
}
else
{
//注意是[ret]!
printf("请输入联系人的名字:");
scanf("%s", pc->data[ret].name);
printf("请输入联系人的性别:");
scanf("%s", pc->data[ret].gender);
printf("请输入联系人的电话:");
scanf("%s", pc->data[ret].tel);
printf("请输入联系人的年龄:");
scanf("%d", &pc->data[ret].age);
printf("请输入联系人的地址:");
scanf("%s", pc->data[ret].addres);
printf("成功修改联系人的信息\n\n");
}
}
利用qsort函数
//按名字排序
int CmpByName(const void* e1, const void* e2)
{
return ((struct PeoInfo*)e1)->name - ((struct PeoInfo*)e2)->name;
}
//排序通讯录中的信息
void SortContact(const struct Contact* pc)
{
qsort(pc->data, pc->sz, sizeof(struct PeoInfo), CmpByName);
}
qsort函数
源码