概述
- 通讯录的人的信息有:姓名、性别、年龄、电话、住址
可采用结构体来表示人的信息。 - 通讯录中有多个人,因此可创建一个成员为表示人的结构体数组的结构体,通讯录结构体成员还应包含通讯录成员数。
- 通讯录要实现:增添、删除、查找、修改、显示、清空、排序
这些功能可通过调用不同的函数实现。 - 通讯录的选择逻辑:使用while循环和switch…case语句完成用户的选择功能操作。
结构定义
#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <assert.h>
#include <string.h>
#define NAME_MAX 20
#define SZ_MAX 30
typedef struct people
{
char name[NAME_MAX];
char sex[5];
int age;
char phone[13];
char address[80];
}people;
typedef struct contact
{
people contacts[SZ_MAX];
int sz;
}contact;
void Add(contact*);
void Delete(contact*);
int Find(contact*);
void Modify(contact*);
void Display(contact*);
void Clear(contact*);
void Sort(contact*);
功能实现
其中删除功能是要通过用户指定的姓名的去查找并删除,
修改功能通过用户指定的姓名的去查找并修改,所以要实现删除和修改功能时可以使用同一个查找函数来完成查找功能。
#include "contact.h"
void Add(contact* con)
{
assert(con);
if (con->sz == SZ_MAX)
{
printf("人数已满,添加失败\n");
}
else
{
printf("请依次输入姓名、性别、年龄、手机号、地址:");
scanf("%s %s %d %s %s", con->contacts[con->sz].name
, con->contacts[con->sz].sex
, &con->contacts[con->sz].age
, con->contacts[con->sz].phone
, con->contacts[con->sz].address);
con->sz++;
}
Display(con);
}
int Find(contact* con)
{
char name1[NAME_MAX];
scanf("%s", name1);
int i;
for (i = 0; i < con->sz; i++)
if (strcmp(name1, con->contacts[i].name) == 0)
{
return i;
}
return -1;
}
void Delete(contact* con)
{
assert(con);
printf("请输入你想要删除的记录中的姓名:");
int ret = Find(con);
if (ret == -1)
{
printf("未找到");
return;
}
for (; ret < con->sz-1; ret++)
{
con->contacts[ret] = con->contacts[ret + 1];
}
con->sz--;
Display(con);
}
void Modify(contact* con)
{
assert(con);
printf("请输入你想要修改的记录中的姓名:");
int ret = Find(con);
if (ret == -1)
{
printf("未找到");
return;
}
else
{
printf("已找到,请依次输入姓名、性别、年龄、手机号、地址:");
scanf("%s %s %d %s %s", con->contacts[ret].name
, con->contacts[ret].sex
, &con->contacts[ret].age
, con->contacts[ret].phone
, con->contacts[ret].address);
}
Display(con);
}
void Display(contact* con)
{
assert(con);
printf(" %-15s %-15s %-15s %-15s %-15s\n","姓名","性别","年龄","电话","地址");
for (int i = 0; i < con->sz; i++)
{
printf(" %-15s %-15s %-15d %-15s %-15s\n", con->contacts[i].name,
con->contacts[i].sex,
con->contacts[i].age,
con->contacts[i].phone,
con->contacts[i].address);
}
}
void Clear(contact* con)
{
assert(con);
con->sz = 0;
}
void Sort(contact* con)
{
assert(con);
printf("按年龄排序:\n");
for (int i = 0; i < con->sz - 1; i++)
{
for (int j = 0; j < con->sz - 1 - i; j++)
{
if (strcmp(con->contacts[j].name, con->contacts[j + 1].name))
{
people tmp;
tmp = con->contacts[j + 1];
con->contacts[j + 1] = con->contacts[j];
con->contacts[j] = tmp;
}
}
}
Display(con);
}
选择逻辑
#include "contact.h"
void menu()
{
printf("###########1.Add 2.Delete##########\n");
printf("###########3.Find 4.Modify##########\n");
printf("###########5.Display 6.Clear##########\n");
printf("###########7.Sort 0.end##########\n");
}
int main()
{
contact C;
C.sz = 0;
int input = 1;
menu();
while (input)
{
printf("请选择您要进行的操作:");
scanf("%d", &input);
switch (input)
{
case 1:
Add(&C);
break;
case 2:
Delete(&C);
break;
case 3:
Find(&C);
break;
case 4:
Modify(&C);
break;
case 5:
Display(&C);
break;
case 6:
Clear(&C);
break;
case 7:
Sort(&C);
break;
case 0:
break;
}
}
return 0;
}