一、测试逻辑
#define _CRT_SECURE_NO_WARNINGS #include "contact.h" void menu() {
printf("***********************************************\n"); printf("**********
1.Add 2.Del *********\n"); printf("********** 3.Sreach 4.Change *********\n");
printf("********** 5.Print 6.Clear *********\n"); printf("********** 7.Sort
0.Exit *********\n");
printf("***********************************************\n"); } int main() {
Contact con; InitContact(&con); int input = 0; menu(); do { scanf("%d",
&input); switch (input) { case Add: AddContact(&con); break; case Del:
DelContact(&con); break; case Sreach: SreachContact(&con); break; case Change:
ChangeContact(&con); break; case Print: PrintContact(&con); break; case Clear:
ClearContact(&con); break; case Sort: SortContact(&con); break; case Exit:
printf("退出通讯录\n"); break; default: printf("输入错误,请重新输入:"); break; } } while
(input); return 0; }
二、通讯录的实现
#define _CRT_SECURE_NO_WARNINGS 1 #include "contact.h" //初始化-清空 void
InitContact(Contact* pc) { assert(pc); pc->sz = 0; memset(pc->data, 0,
sizeof(pc->data)); } void ClearContact(Contact* pc) { assert(pc); pc->sz = 0;
memset(pc->data, 0, sizeof(pc->data)); printf("该通讯录已清空\n"); } //添加 void
AddContact(Contact* pc) { assert(pc); if (pc->sz == Max) { printf("通讯录已满\n");
return; } int n = 0; printf("请输入要添加的人数:"); scanf("%d", &n); while (n--) {
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); printf("\n"); pc->sz++; }
printf("添加成功\n"); } int FindName(const Contact* pc, char name[]) { assert(pc);
int i = 0; for (i = 0; i < pc->sz; i++) { if (0 == strcmp(name,
pc->data[i].name)) { return i; } } return -1; } //删除 void DelContact(Contact*
pc) { assert(pc); if (pc->sz == 0) { printf("通讯录为空\n"); return; } char name[20]
= { 0 }; printf("请输入要删除人的名字:"); scanf("%s", name); int pos = FindName(pc,
name); if (pos == -1) { printf("要删除的人不存在\n"); return; } int j = 0; for (j =
pos; j < pc->sz - 1; j++) { pc->data[j] = pc->data[j + 1]; } pc->sz--;
printf("删除成功\n"); } void PrintContact(const Contact* pc) { assert(pc);
printf("%-15s %-5s %-5s %-20s %-30s\n", "姓名", "年龄", "性别","电话", "住址"); int i =
0; for (i = 0; i < pc->sz; i++) { printf("%-15s %-5d %-5s %-20s %-30s\n",
pc->data[i].name, pc->data[i].age, pc->data[i].sex, pc->data[i].tele,
pc->data[i].addr); } } void SreachContact(Contact* pc) { assert(pc); if (pc->sz
== 0) { printf("通讯录为空\n"); return; } char name[20] = { 0 };
printf("请输入要查找的姓名:"); scanf("%s", name); int pos = FindName(pc, name); if (pos
== -1) { printf("要查找的人不存在\n"); return; } printf("%-15s %-5d %-5s %-20s
%-30s\n", pc->data[pos].name, pc->data[pos].age, pc->data[pos].sex,
pc->data[pos].tele, pc->data[pos].addr); } void ChangeContact(Contact* pc) {
assert(pc); if (pc->sz == 0) { printf("通讯录为空\n"); return; } char name[20] = { 0
}; printf("请输入要修改人的姓名:"); scanf("%s", name); int pos = FindName(pc, name); if
(pos == -1) { printf("要修改信息的人不存在\n"); return; } printf("请输入要修改的年龄:");
scanf("%d", &(pc->data[pos].age)); printf("请输入要修改的性别:"); scanf("%s",
pc->data[pos].sex); printf("请输入要修改的电话:"); scanf("%s", pc->data[pos].tele);
printf("请输入要修改的住址:"); scanf("%s", pc->data[pos].addr); printf("\n"); } int
cmp(const void* e1, const void* e2) { return strcmp((*(PeoInfo*)e1).name,
(*(PeoInfo*)e1).name); } void SortContact(Contact* pc) { assert(pc); if (pc->sz
== 0) { printf("通讯录为空\n"); return; } qsort(pc->data, pc->sz, sizeof(PeoInfo),
cmp); printf("排序成功\n"); }
三、函数的声明和符号的定义
#pragma once #include <stdio.h> #include <string.h> #include <assert.h>
#include <stdlib.h> #define Max 1000 typedef struct PeoInfo { char name[20];
int age; char sex[10]; char tele[20]; char addr[20]; }PeoInfo; typedef struct
Contact { PeoInfo data[Max]; int sz; }Contact; enum Option { Exit, Add, Del,
Sreach, Change, Print, Clear, Sort }; //初始化-清空 void InitContact(Contact* pc);
//添加 void AddContact(Contact* pc); //删除 void DelContact(Contact* pc); //打印 void
PrintContact(Contact* pc); //查找 void SreachContact(Contact* pc); //修改 void
ChangeContact(Contact* pc); //清空 void ClearContact(Contact* pc); //按照姓名排序 void
SortContact(Contact* pc);