#pragma once
#pragma warning(disable:6031)
//contact.h 文件
#define PLUS 2
#define INIT 3
#define num_name 20
#define num_sex 5
#define num_tele 20
#define num_addr 30
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<assert.h>
#include<windows.h>
enum MENU
{
EXIT,
ADD,
DEL,
FIND,
FIX,
SHOW,
SORT,
};
typedef struct Contact
{
char name[num_name];// 姓名
int age; // 年龄
char sex[num_sex]; // 性别
char tele[num_tele]; // 手机号码
char addr[num_addr]; // 地址
}Contact;
typedef struct point
{
Contact* data;
int len;
int capacity;
}po;
void Init(po* pc);
void Exit(po* pc);
void Add(po* pc);
void Del(po* pc);
void Find(po* pc);
void Fix(po* pc);
void Show(const po* pc);
void Sort(po* pc);
//contact.c文件
#include "contact.h"
void menu();
void menu()
{
printf("****************************************************\n");
printf("**** 1.添加联系人 2.删除联系人 3.查找联系人 ****\n");
printf("**** 4.修改联系人 5.显示联系人 6.排序联系人 ****\n");
printf("**** 0.退出通讯录 ****\n");
printf("****************************************************\n");
}
void addspace(po* pc)
{
Contact* ptr = (Contact*)realloc(pc->data, (pc->capacity * PLUS) * sizeof(Contact));
if (ptr != NULL)
{
pc->data = ptr;
pc->capacity *= PLUS;
printf("\n通讯录扩容:%d -> %d\n", pc->capacity / 2, pc->capacity);
}
else return;
}
int findspace(po* pc,int rank)
{
if (pc->len == 0)
{
printf("数据为空\n");
return -2;
}
if (rank == DEL) printf("请输入删除者姓名:>");
else if (rank == FIX) printf("请输入修改者姓名:>");
else if (rank == FIND) printf("请输入查找者姓名:>");
char name[num_name] = { 0 };
scanf("%s", name);
for (int i = 0; i < pc->len; i++)
{
if (strcmp(pc->data[i].name, name) == 0)
{
if (rank == DEL) printf("删除%s成功\n", pc->data[i].name);
else if (rank == FIX) printf("修改%s:\n", pc->data[i].name);
else if (rank == FIND) printf("查找%s成功\n", pc->data[i].name);
return i;
}
}
if (rank == DEL) printf("未找到要删除的数据\n");
else if (rank == FIX) printf("未找到要修改的数据\n");
else if (rank == FIND) printf("未找到要查找的数据\n");
return -1;
}
void Init(po* pc)
{
pc->len = 0;
pc->capacity = INIT;
pc->data = calloc(pc->capacity, sizeof(Contact));
if (pc->data == NULL) return;
}
void Exit(po* pc)
{
free(pc->data);
pc->data = NULL;
pc->len = 0;
pc->capacity = 0;
}
void Add(po* pc)
{
//超出就扩容
if (pc->len >= pc->capacity)
{
addspace(pc);
}
//增加信息
printf("请输入姓名:>");
scanf("%s", pc->data[pc->len].name);
printf("请输入年龄:>");
scanf("%d", &(pc->data[pc->len].age));
printf("请输入性别:>");
scanf("%s", pc->data[pc->len].sex);
printf("请输入电话:>");
scanf("%s", pc->data[pc->len].tele);
printf("请输入地址:>");
scanf("%s", pc->data[pc->len].addr);
pc->len++;
printf("您的信息录入成功!\n");
}
void Del(po* pc)
{
int i = findspace(pc, DEL);
if (i >= 0)
{
//删除这个人,后面的向前
for (i; i < pc->len - 1; i++)
{
pc->data[i] = pc->data[i + 1];
}
pc->len--;//最后一个直接删除
}
}
void Find(po* pc)
{
int i = findspace(pc, FIND);
if (i >= 0)
{
printf("%-20s %-5s %-5s %-20s %-30s\n", "姓名", "年龄", "性别", "电话", "地址");
printf("%-20s %-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 Fix(po* pc)
{
int i = findspace(pc, FIX);
if (i >= 0)
{
int timer = 0;
printf("请输入姓名:>");
scanf("%s", pc->data[pc->len].name);
printf("请输入年龄:>");
scanf("%d", &(pc->data[pc->len].age));
printf("请输入性别:>");
scanf("%s", pc->data[pc->len].sex);
printf("请输入电话:>");
scanf("%s", pc->data[pc->len].tele);
printf("请输入地址:>");
scanf("%s", pc->data[pc->len].addr);
printf("修改成功\n");
}
}
void Show(const po* pc)
{
printf("%-20s %-5s %-5s %-20s %-30s\n", "姓名", "年龄", "性别", "电话", "地址");
for (int i = 0; i < pc->len; i++)
{
//打印每个人信息
printf("%-20s %-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 Sort(po* pc)
{
for (int i = 0; i < pc->len - 1; i++)
{
if (strcmp(pc->data[i].name, pc->data[i + 1].name) > 0)
{
Contact tmp;
tmp = pc->data[i];
pc->data[i] = pc->data[i + 1];
pc->data[i + 1] = tmp;
}
}
}
//test.c文件
#include "contact.h"
int main()
{
//通讯录
int input = 0;
Contact con;//创建对象
Init(&con);
do
{
menu();
printf("请输入数字:>");
scanf("%d", &input);
switch (input)
{
case EXIT:
Exit(&con);
break;
case ADD:
Add(&con);
break;
case DEL:
Del(&con);
break;
case FIND:
Find(&con);
break;
case FIX:
Fix(&con);
break;
case SHOW:
Show(&con);
break;
case SORT:
Sort(&con);
break;
default:
printf("输入错误\n");
break;
}
} while (input);
return 0;
}
代码运行显示图例


文章介绍了使用C++编写的通讯录程序,包括数据结构定义(如Contact和po),函数实现(如添加、删除、查找、修改和排序等)以及主函数的流程控制。
413

被折叠的 条评论
为什么被折叠?



