项目2——客户信息管理系统
实现一个客户信息管理系统,功能包括添加客户、修改客户、删除客户、显示客户列表。
2.1需求说明
2.1.1主菜单
进入系统,展示主菜单,输入各功能对应的数字编号选择要进行的操作,如下图:
2.1.2添加客户
输入1,进入“添加客户”界面,需要填写姓名、性别、年龄、电话、邮箱这些信息,如下图:
2.1.3显示客户列表
输入4,进入“客户列表”,显示客户列表信息,如下图:
2.1.4修改客户
输入 2,进入“修改客户”,首先要输入要修改客户的编号,然后填写信息,如下图:
2.1.5删除客户
输入 3,进入“删除客户”,输入要删除客户的编号,再确认是否删除,如下图:
2.1.6退出
输出5,经过确认后退出系统,如下图:
2.2流程分析
2.2.1总流程图
2.2.2添加客户流程图
2.2.3显示客户列表流程图
2.2.4修改客户流程图
(1)修改客户总体流程图:
(2)具体执行修改部分的流程图:
2.2.5删除客户流程图
2.2.6退出流程图
#include <stdio.h>
#include <string.h>
#define MAX_CAPACITY 30
void menu();
void exits();
void showView();
void addCustomer();
void deleteCoustomer();
int getCustomerIndex(int);
void modifyView();
int removeCustomer(int);
/**
* 声明结构体
*/
struct Customer
{
int id;
char name[10];
char gender;
int age; // 年龄
char phone[20]; // 电话
char email[30]; // 电子邮件
};
// 声明结构体数组
struct Customer customers[MAX_CAPACITY];
// 记录添加客户的个数
int total;
int loop = 1;
int main()
{
// customers[0].id = 1;
// strcpy(customers[0].name,"张三");
// customers[0].gender = 'f';
// customers[0].age = 67;
// strcpy(customers[0].phone,"2345678978654");
// strcpy(customers[0].email,"2345678876543");
// total += 1;
menu();
getchar();
getchar();
return 0;
}
/**
* 显示客户管理软件的界面
*/
void menu()
{
// 控制整体界面的显示
while (loop)
{
printf("客户信息管理软件\n");
printf("1 添加客户\n");
printf("2 修改客户\n");
printf("3 删除客户\n");
printf("4 客户列表\n");
printf("5 退 出\n");
printf("请选择(1-5):\n");
int selection; // 记录用户的选择
scanf("%d", &selection);
switch (selection)
{
case 1:
addCustomer();
break;
case 2:
modifyView();
break;
case 3:
deleteCoustomer();
break;
case 4:
showView();
break;
case 5:
exits();
break;
}
}
printf("退出客户信息管理系统,欢迎下次光临!\n");
}
/**
* 修改客户
*/
void modifyView()
{
printf("修改客户\n");
printf("请选择修改客户的编号");
int modifyId;
scanf("%d", &modifyId);
if (modifyId == -1)
{
return;
}
int modifyIndex = getCustomerIndex(modifyId);
if (modifyIndex == -1)
{
printf("不存在此编号的客户!修改失败!\n");
return;
}
// 代码能执行到此位置,表示此编号的客户可以修改
struct Customer *cust = &customers[modifyIndex];
printf("修改客户");
// 先声明一个通用的字符串,用于存储可能要修改的数据
char info[30];
getchar();
printf("姓名(%s)", cust->name);
// scanf("%s", info);
/**
* fgets:stdin是标准输入从键盘获取的指针,他从steam中获取数据,
* 数据最长是info的字节长度,遇到\n结束,连带着\n一起装入
* info数组中
*
* sscanf:函数是格式化输入,遇到换行符或者空格结束,但是换行符和
* 空格并不会一起存入cust->name中
*/
fgets(info,sizeof(info),stdin);
printf("%s",info);
if (!(info[0] == '\n'))
{
// strcpy(cust->name, info);
sscanf(info,"%s",cust->name);
}
printf("性别(%c)", cust->gender);
fgets(info,sizeof(info),stdin);
if (!(info[0] == '\n'))
{
// strcpy(cust->name, info[0]);
sscanf(info,"%c",&cust->gender);
}
printf("年龄(%d)", cust->age);
fgets(info,sizeof(info),stdin);
if (!(info[0] == '\n'))
{
// cust->age = info[0];
sscanf(info,"%d",&cust->age);
}
printf("电话(%s)", cust->phone);
fgets(info,sizeof(info),stdin);
if (!info[0] == '\n')
{
// strcpy(cust->phone, info);
sscanf(info,"%s",cust->phone);
}
printf("邮箱(%s)", cust->email);
fgets(info,sizeof(info),stdin);
if (!(info[0] == '\n'))
{
// strcpy(cust->email, info);
sscanf(info,"%s",cust->email);
}
printf("修改完成\n");
}
/**
* 判断指定编号的客户是否存在
* 如果客户存在,返回-1
* 如果客户存在 返回此编号的客户所在数组中的索引位置
*/
int getCustomerIndex(int id)
{
for (int i = 0; i < total; i++)
{
if (customers[i].id == id)
{
return i;
}
}
return -1;
}
/**
* 删除指定索引位置的客户
* 删除失败,返回0
* 删除成功,返回非0
*/
int removeCustomer(int index)
{
if (index < 0 || index >= total)
{
return -1;
}
// 通过循环遍历的方式,将index后续位置依次前移,实现删除的效果
for (int i = index; i < total - 1; i++)
{
customers[i] = customers[i + 1];
// 如果需要修改编号的话
customers[i].id = index + 1;
}
total--;
return 1;
}
void deleteCoustomer()
{
printf("--------------删除客户----------\n");
printf("请选择待删除客户的编号(-1退出):");
int deleteId;
scanf("%d", &deleteId);
if (deleteId == -1)
{
return;
}
// 判断给定的客户编号对应的客户是否存在
int deleteIndex = getCustomerIndex(deleteId);
if (deleteIndex == -1)
{
printf("不存在指定编号的客户\n");
return;
}
// 如果代码可以执行到此位置,表示指定编号的客户是存在的
// 判断是否要删除
getchar();
printf("确认是否删除(y/n)");
char isDelete;
scanf("%c", &isDelete);
if (isDelete == 'n')
{
return;
}
else if (isDelete == 'y')
{
// 确定要删除
// 具体删除的过程
if (removeCustomer(deleteIndex) != 0)
{
printf("-------删除成功-----------\n");
}
else
{
printf("删除不成功");
}
}
else
printf("你输入的选择有误!\n");
}
/**
* 添加用户
*/
void addCustomer()
{
if (total < MAX_CAPACITY)
{
printf("------------------添加客户--------------\n");
struct Customer *cust = &customers[total];
// 编号自动累加
cust->id = total + 1;
printf("姓名:");
char name[10];
scanf("%s", name);
strcpy(cust->name, name);
getchar();
printf("性别:");
char sex;
scanf("%c", &sex);
cust->gender = sex;
printf("年龄:");
int age;
scanf("%d", &age);
cust->age = age;
printf("电话:");
char phone[20];
scanf("%s", phone);
strcpy(cust->phone, phone);
printf("邮箱:");
char email[20];
scanf("%s", email);
strcpy(cust->email, email);
printf("添加完成\n");
total++;
}
else
{
printf("客户列表已满,添加失败\n");
}
}
/**
* 显示某个具体客户的信息
*/
void showCustomer(struct Customer *custptr)
{
printf("%d\t%s\t%c\t%d\t%s\t%s\n", custptr->id, custptr->name, custptr->gender,
custptr->age, custptr->phone, custptr->email);
}
/**
* 显示客户列表
*/
void showView()
{
if (total == 0)
{
printf("系统中没有任何客户信息!请先添加\n");
}
else
{
printf("-----------客户列表---------\n");
printf("编号\t姓名\t性别\t年龄\t电话\t\t邮箱\n");
// 遍历数组元素
for (int i = 0; i < total; i++)
{
showCustomer(&customers[i]);
}
}
}
void exits()
{
printf("确认是否退出(y/n)");
char isExit;
while (1)
{
getchar();
scanf("%c", &isExit);
if (isExit == 'y' || isExit == 'n')
{
break;
}
else
{
printf("输入有误,请重新输入(y/n)");
}
}
if (isExit == 'y')
{
loop = 0;
}
}