先上图,展示:
又没有想法?
分析:
- 一个菜单,八个功能
- switch分支语句
- 分文件式编写
utili.h
公用的头文件
#ifndef _UTILI_H_
#define _UTILI_H_
#include<stdio.h>
#include<string.h>
#include<stdbool.h>
#include<stdlib.h>
#define _CRT_SECURE_NO_WARNINGS
#endif
contact.h
通讯录头文件,必要的声明
#ifndef _CONTACT_H_
#define _CONTACT_H_
#include"utili.h"
#define MAX_NAME_SIZE 256
#define MAX_TEL_SIZE 12
#define MAX_ADDRESS_SIZE 256
#define MAX_SEX_SIZE 3
#define MAX_CONTACT_SIZE 256
//定义人员信息结构体
typedef struct PersonInfo
{
char name[MAX_NAME_SIZE];
char sex[MAX_SEX_SIZE];
char address[MAX_ADDRESS_SIZE];
char tel[MAX_TEL_SIZE];
}PersonInfo;
//定义通讯录结构体
typedef struct Contact
{
PersonInfo pers[MAX_CONTACT_SIZE];
int capacity;
int size;
}Contact;
//枚举
enum { QUIT, ADD, DEL, MODIFY, FIND, SORT, CLEAR, SHOW };
//函数声明
void initContact(Contact* con);
bool IsFull(Contact* con);
bool IsEmpty(Contact* con);
int FindByName(Contact* con, char* name);
void add(Contact* con);
void del(Contact* con);
void modify(Contact* con);
void find(Contact* con);
void sort(Contact* con);
void clear(Contact* con);
void show(Contact* con);
void quit(Contact* con);
#endif
contact.c
函数功能的实现
contactmain.c
主函数
主函数
#include"contact.h"
int main(int argc,char *argv[])
{
system("title 通讯录管理系统");
system("mode con cols=36 lines=20");
system("color E0");
Contact con;
initContact(&con);
int select=1;
while (select)
{
printf("************ 通 讯 录 ************\n");
printf("* [1] 增加 [2] 删除 *\n");
printf("* [3] 修改 [4] 查找 *\n");
printf("* [5] 排序 [6] 清除 *\n");
printf("* [7] 显示 [0] 退出 *\n");
printf("**********************************\n");
printf("请输入:>");
//输入及输入判定
while (scanf("%d", &select) != 1 || select>7)
{
char ch;
while ((ch = getchar()) != '\n')
{
continue;
}
printf("输入功能不在服务区!\n重新输入:>");
}
//switch分支语句
switch (select)
{
case ADD:
//增加
add(&con);
break;
case DEL:
del(&con);
break;
case MODIFY:
modify(&con);
break;
case FIND:
find(&con);
break;
case SORT:
sort(&con);
break;
case CLEAR:
clear(&con);
break;
case SHOW:
show(&con);
break;
}
}
}
方法
初始化contact结构体
void initContact(Contact *con)
{
memset(con->pers, 0, sizeof(PersonInfo) * MAX_CONTACT_SIZE);
con->capacity = MAX_CONTACT_SIZE;
con->size = 0;
}
判”满“
bool IsFull(Contact* con)
{
return con->size >= con->capacity;
}
判”空“
bool IsEmpty(Contact* con)
{
return (con->size == 0);
}
添加数据
void add(Contact* con)
{
if (IsFull(con))
{
printf("都满了,还想加[~ _~]?\n");
return ;
}
int count = 0;
printf("输入添加数据个数:>\n");
scanf("%d", &count);
while (--count >= 0)
{
printf("------------------------------------\n");
printf("输入姓名:>");
scanf("%s", con->pers[con->size].name);
printf("输入性别:>");
scanf("%s", con->pers[con->size].sex);
printf("输入住址:>");
scanf("%s", con->pers[con->size].address);
printf("输入电话:>");
scanf("%s", con->pers[con->size].tel);
con->size++;
}
printf("添加成功!\n");
}
删除数据
根据名字找下标
int FindByName(Contact* con, char* name)
{
for (int i = 0; i < con->size; i++)
{
if (strcmp(name, con->pers[i].name) == 0)
{
return i;
}
}
return -1;
}
删除
void del(Contact* con)
{
if (IsEmpty(con))
{
printf("都没朋友还想删谁,快去加盆友!加了再删\n");
return;
}
char name[MAX_NAME_SIZE];
printf("输入删除姓名:>");
scanf("%s", name);
int index = FindByName(con, name);
if (index == -1)
{
printf("这个盆友还不认识呢[^o^]\n");
return;
}
for (int i = index; i < con->size-1; i++)
{
con->pers[i] = con->pers[i + 1];
}
con->size--;
}
修改数据
void modify(Contact* con)
{
if (IsEmpty(con))
{
printf("建议先交一个盆友,再修改信息,不然没得改!\n");
return;
}
char name[MAX_NAME_SIZE];
printf("输入修改姓名:>");
scanf("%s", name);
int index = FindByName(con, name);
if (index == -1)
{
printf("这个盆友还不认识呢[^o^]\n");
return;
}
printf("原信息;>");
printf("%-8s%-6s%-6s%-13s\n",
con->pers[index].name,
con->pers[index].sex,
con->pers[index].address,
con->pers[index].tel);
printf("选择要修改的信息:>(1-名字 2-性别 3-住址 4-电话 0-不想改了)\n");
int select = 0;
while (scanf("%d", &select) != 1||select>4)
{
char ch;
while ((ch = getchar()) != '\n')
{
continue;
}
printf("输入的功能不在服务区!\n重新输入:>");
}
printf("输入修改值:>");
switch (select)
{
case 1:
scanf("%s", con->pers[index].name);
break;
case 2:
scanf("%s", con->pers[index].sex);
break;
case 3:
scanf("%s", con->pers[index].address);
break;
case 4:
scanf("%s", con->pers[index].tel);
break;
case 0:
return;
}
}
查找数据
void find(Contact* con)
{
if (IsEmpty(con))
{
printf("都没朋友还想找谁,快去加盆友!!!\n");
return;
}
char name[MAX_NAME_SIZE];
printf("输入查找姓名:>");
scanf("%s", name);
int index = FindByName(con, name);
if (index == -1)
{
printf("这个盆友还不认识呢[^o^]\n");
return;
}
printf("%-8s%-6s%-6s%-13s\n",
con->pers[index].name,
con->pers[index].sex,
con->pers[index].address,
con->pers[index].tel);
}
数据排序
void sort(Contact* con)
{
if (IsEmpty(con))
{
printf("是空的不用排,下一个......\n");
return;
}
for (int i = 0; i < con->size - 1; i++)
{
for (int j = 0; j < con->size - i - 1; j++)
{
if (strcmp(con->pers[j].name, con->pers[j + 1].name))
{
PersonInfo ptmp = con->pers[j];
con->pers[j] = con->pers[j + 1];
con->pers[j + 1] = ptmp;
}
}
}
printf("排完了!\n");
}
数据清除
void clear(Contact* con)
{
if (IsEmpty(con))
{
printf("我说它都不用清除你信吗?你得信!因为是空的(^v^)\n ");
return;
}
printf("着重考虑,里面可能有非常重要的人!!!(i_i)\n");
printf("接着删就输13,输别的就算返悔.\n");
int select = 0;
while (scanf("%d", &select) != 1)
{
char ch;
while ((ch = getchar()) != '\n')
{
continue;
}
break;
}
if (select == 13)
{
con->size = 0;
printf("删完了,全删完了\n");
return;
}
printf("就知道你不想删^v^\n");
}
展示数据
void show(Contact* con)
{
if (IsEmpty(con))
{
printf("都是空的还有展示的必要吗?\n");
return;
}
for (int i = 0; i < con->size; i++)
{
printf("%-8s%-6s%-6s%-13s\n",
con->pers[i].name,
con->pers[i].sex,
con->pers[i].address,
con->pers[i].tel);
}
}
退出
void quit(Contact* con)
{
}
改进
功能函数 结构类似
使用转移表(指针进阶学习)
#include"contact.h"
int main(int argc,char *argv[])
{
system("title 通讯录管理系统");
system("mode con cols=36 lines=20");
system("color E0");
Contact con;
initContact(&con);
int select=1;
void (*pfun[8])(Contact*) = {quit,add,del,modify,find,sort,clear,show };
while (select)
{
printf("************ 通 讯 录 ************\n");
printf("* [1] 增加 [2] 删除 *\n");
printf("* [3] 修改 [4] 查找 *\n");
printf("* [5] 排序 [6] 清除 *\n");
printf("* [7] 显示 [0] 退出 *\n");
printf("**********************************\n");
printf("请输入:>");
//输入及输入判定
while (scanf("%d", &select) != 1 || select>7)
{
char ch;
while ((ch = getchar()) != '\n')
{
continue;
}
printf("输入功能不在服务区!\n重新输入:>");
}
//switch分支语句
/*switch (select)
{
case ADD:
//增加
add(&con);
break;
case DEL:
del(&con);
break;
case MODIFY:
modify(&con);
break;
case FIND:
find(&con);
break;
case SORT:
sort(&con);
break;
case CLEAR:
clear(&con);
break;
case SHOW:
show(&con);
break;
}*/
//转移表
(*pfun[select])(&con);
system("cls");
}
}
完成!
最难不过坚持!