C语言通讯录
1.创建menu函数和循环结构
void menu(int* input) {
printf("******************************\n");
printf("******1. add 2. del******\n");
printf("******3. modify 4. serach***\n");
printf("******5. show 6. sort*****\n");
printf("******0. exit *****\n");
printf("******************************\n");
printf("请输入操作->");
scanf("%d", input);
}
2.创建contact.h
#pragma once
#include<string.h>
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#define NAME_MAX 20
#define SEX_MAX 5
#define ADDR_MAX 30
#define TEL_MAX 13
enum contacts {
EXIT,
ADD,
DEL,
MODIFY,
SERACH,
SHOW,
SORT
};
typedef struct peopleInfo
{
char name[NAME_MAX];
int age;
char sex[SEX_MAX];
char addr[ADDR_MAX];
char tel[TEL_MAX];
}People;
typedef struct contact
{
People pepinfo[100];
int sz;
} Contact;
void init_contact(Contact* contact);
void addpep(Contact* contact);
void show(const Contact* contact);
void del(const Contact* contact);
void serach(const Contact* contact);
void modify(Contact* contact);
void sort(Contact* contact);
包含引入头文件和函数声明
3.创建信息和通讯录结构体
typedef struct peopleInfo
{
char name[NAME_MAX];
int age;
char sex[SEX_MAX];
char addr[ADDR_MAX];
char tel[TEL_MAX];
}People;
typedef struct contact
{
People pepinfo[100];
int sz;
} Contact;
4.初始化contact对象的函数
void init_contact(Contact* contact) {
assert(contact);
contact->sz = 0;
memset(contact->pepinfo, 0, sizeof(contact->pepinfo));
}
将数组中的元素初始化成0
5.增加成员的函数
void addpep(Contact* contact) {
assert(contact);
if (contact->sz >= 100)
{
printf("联系人已满,无法添加!");
return;
}
else {
printf("请输入姓名\n");
scanf("%s", contact->pepinfo[contact->sz].name);
printf("请输入年龄\n");
scanf("%d", &contact->pepinfo[contact->sz].age);
printf("请输入性别\n");
scanf("%s", contact->pepinfo[contact->sz].sex);
printf("请输入地址\n");
scanf("%s", contact->pepinfo[contact->sz].addr);
printf("请输入电话\n");
scanf("%s", contact->pepinfo[contact->sz++].tel);
}
}
6.显示所有成员的函数
void show(const Contact* contact) {
assert(contact);
printf("%-20s%-10s%-10s%-12s%-30s\n", "姓名", "年龄", "性别", "电话", "地址");
for (int i = 0; i < contact->sz; i++)
{
People p = contact->pepinfo[i];
//printf("%sssss\n", p.name);
printf("%-20s%-10d%-10s%-12s%-30s\n", p.name, p.age, p.sex, p.tel, p.addr);
}
}
7.删除成员函数
void del( Contact* contact) {
assert(contact);
char arr[NAME_MAX];
int ret;
printf("请输入要删除成员的姓名\n");
scanf("%s", arr);
ret = findByName(contact, arr);
if (ret == -1) {
printf("没找到成员\n");
}
else {
for (int i = ret; i < contact->sz - 1; i++) {
contact->pepinfo[i] = contact->pepinfo[i + 1];
}
contact->sz--;
printf("删除成功\n");
}
}
8.查找成员函数
int findByName(const Contact* contact,const char* p) {
int i = 0;
for (int i = 0; i < contact->sz; i++)
{
if (!strcmp(contact->pepinfo[i].name, p))return i;
}
return -1;
}
void serach(const Contact* contact) {
assert(contact);
char arr[NAME_MAX];
int ret;
printf("请输入要查找成员的姓名\n");
scanf("%s", arr);
ret = findByName(contact, arr);
if (ret == -1) {
printf("没找到成员\n");
}else{
printf("%-20s%-10s%-10s%-12s%-30s\n", "姓名", "年龄", "性别", "电话", "地址");
People p = contact->pepinfo[ret];
printf("%-20s%-10d%-10s%-12s%-30s\n", p.name, p.age, p.sex, p.tel, p.addr);
}
}
9.修改成员函数
void modify(Contact* contact) {
assert(contact);
char arr[NAME_MAX];
int ret;
printf("请输入要修改成员的姓名\n");
scanf("%s", arr);
ret = findByName(contact, arr);
if (ret == -1) {
printf("没找到成员\n");
}
else {
printf("请输入姓名\n");
scanf("%s", contact->pepinfo[ret].name);
printf("请输入年龄\n");
scanf("%d", &contact->pepinfo[ret].age);
printf("请输入性别\n");
scanf("%s", contact->pepinfo[ret].sex);
printf("请输入地址\n");
scanf("%s", contact->pepinfo[ret].addr);
printf("请输入电话\n");
scanf("%s", contact->pepinfo[ret].tel);
}
}
10.按姓名排序
int namecmp(void* p1, void* p2) {
return strcmp(((People*)p1)->name, ((People*)p2)->name);
}
void sort(Contact* contact) {
assert(contact);
qsort(contact->pepinfo,contact->sz,sizeof(People),namecmp);
printf("排序完成\n");
}