C语言 项目 CRM系统(客户信息管理系统)

项目目标

在这里插入图片描述
在这里插入图片描述

项目需求说明

在这里插入图片描述

系统界面

1)添加客户界面
通过编号来区分客户
在这里插入图片描述
2)删除客户界面
对用户输入的编号进行核查,存在与否,合法与否
在这里插入图片描述
3)显示客户列表界面
在这里插入图片描述
4)修改客户信息的界面
在这里插入图片描述

项目设计

Customer结构体的设计
在这里插入图片描述
CRM系统结构框架图
在这里插入图片描述
在这里插入图片描述

案例代码

#include <stdio.h>
#include <string.h>struct Customer {int id;int age;char name[10];char gender;char  phone[10];char  email[10];
};
char key ;
char loop;
int customerNum;//客户结构体数组
struct Customer customers[20];//得到一个客户的信息
void getInfo(struct Customer *customer) {/*sprintf(info, "\n%d\t%s\t%c\t%d\t%s\t%s", (*customer).id, (*customer).name, (*customer).gender, (*customer).age, (*customer).phone,(*customer).email);*/printf("\n%d\t%s\t%c\t%d\t%s\t%s", (*customer).id, (*customer).name, (*customer).gender, (*customer).age, (*customer).phone,(*customer).email);
}//提供各种操作//1. 添加
void add(){//编号自动增长customers[customerNum].id = customerNum + 1;printf("\n---------------------添加客户---------------------");printf("\n姓名:");scanf("%s", customers[customerNum].name);getchar();printf("\n性别:");scanf("%c", &(customers[customerNum].gender));getchar();printf("\n年龄:");scanf("%d", &(customers[customerNum].age));getchar();printf("\n电话:");scanf("%s", customers[customerNum].phone);getchar();printf("\n邮箱:");scanf("%s",customers[customerNum].email);getchar();printf("\n---------------------添加完成---------------------");customerNum++;}//根据输入的id去找对应的下标,如果找不到返回-1
int findIndex(int id){int index = -1;int i;for (i = 0; i < customerNum ; i++) {if (customers[i].id == id) {index = i;break;}}return index;
}//2. 删除客户
int del(int id){//找到id对应的元素下标int index = findIndex(id);int i;if (index == -1) {return 0;//说明这个客户不存在..}else {//找到,就从index+1开始整体前移for (i = index + 1; i < customerNum; i++) {customers[i - 1] = customers[i];}--customerNum;return 1;}
}//显示部分//1. 显示所有
void showList(){int i = 0;printf("\n---------------------------客户列表---------------------------");printf("\n编号\t姓名\t性别\t年龄\t电话\t邮箱");for (i = 0; i < customerNum; i++) {getInfo(&customers[i]);}
}//2. 完成删除 界面
//---------------------删除客户---------------------
//请选择待删除客户编号(-1退出):1
//确认是否删除(Y/N):y
//---------------------删除完成---------------------void delView(){int id;char choice = ' ';printf("\n---------------------删除客户---------------------");printf("\n请选择待删除客户编号(-1退出):");scanf("%d", &id);getchar();if (id == -1) {printf("\n---------------------删除没有完成---------------------");return;}printf("确认是否删除(Y/N):");scanf("%c", &choice);getchar();if (choice == 'Y') {if(del(id)){printf("\n---------------------删除完成---------------------");}else{printf("\n---------------------删除没有完成,无此id---------------------");}} 
}//3. 主菜单
void mainMenu() {do {printf("\n-----------------客户信息管理软件-----------------");printf("\n                 1 添 加 客 户");printf("\n                 2 修 改 客 户");printf("\n                 3 删 除 客 户");printf("\n                 4 客 户 列 表");printf("\n                 5 退          出");printf("\n请选择(1-5):");scanf("%c", &key);getchar();switch (key) {case '1':add();break;case '2':break;case '3':delView();break;case '4':showList();break;case '5':loop = 0;break;default:printf("\n输入错误,请重新输入");break;}} while (loop);printf("\n你已经成功的退出了系统....");getchar();
}void main() {为了测试方便customers[0].id = 1;customers[0].age = 10;strcpy(customers[0].email , "xx@sohu.com");customers[0].gender = 'f';strcpy(customers[0].name , "zs");strcpy(customers[0].phone , "110");mainMenu();return ;
}

自己完成的代码

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
//项目-CRM系统(客户信息管理系统)-DQ版本1
const int size=100;//结构体数组大小
//客户结构体
struct Customer{int id;//编号char name[10];//姓名char sex[2];//性别int age;//年龄char phone[20];//电话char email[30];//邮箱
}cs[size];
//全局变量
//记住:结构体数组的下标从0开始,而客户编号从1开始
int loop=1;//判断菜单是否循环
char num='0';//用户选择的功能数字
int d=0;//用户选择要删除的客户编号
char c='c';//用户选择确认是否要删除的操作
int count=0;//现在存有的客户数量
char m='c';//用户选择是否要退出系统的操作
//添加客户
void add()
{printf("-----------添加客户-----------\n");//使用结构体数组去存储信息cs[count]printf("姓名:");scanf("%s",cs[count].name);getchar();printf("性别:");scanf("%s",cs[count].sex);getchar();printf("年龄:");scanf("%d",&cs[count].age);getchar();printf("电话:");scanf("%s",cs[count].phone);getchar();printf("邮箱:");scanf("%s",cs[count].email);getchar();cs[count].id=count+1;//客户编号从1开始count++;printf("-----------添加完成-----------\n");
}
//返回对应编号所对应的数组下标
int findindex(int id)
{int i;for(i=0;i<count;i++){if(id==cs[i].id){return i;//已找到id,对应的下标为i}}return -1;//没有找到id
}
//显示要修改的客户界面
void showUpdate(int index)
{	printf("姓名(%s):",cs[index].name);scanf("%s",cs[index].name);getchar();printf("性别(%s):",cs[index].sex);scanf("%s",cs[index].sex);getchar();printf("年龄(%d):",cs[index].age);scanf("%d",&cs[index].age);getchar();printf("电话(%s):",cs[index].phone);scanf("%s",cs[index].phone);getchar();printf("邮箱(%s):",cs[index].email);scanf("%s",cs[index].email);getchar();}
//修改客户
void update()
{int id=0;printf("-----------修改客户-----------\n");printf("请输入要修改的客户的编号:");scanf("%d",&id);getchar();int index=findindex(id);if(index!=-1)//找到下标{showUpdate(index);printf("-----------修改完成-----------\n");}else{printf("没有此编号的客户!\n");}}
//在删除之后重新排列结构体数组
void rearr(int d)
{int i;if(d<count){for(i=d;i<count;i++){cs[i]=cs[i+1];//如:把cs[1]的内容复制给cs[0]//修改编号cs[i].id-=1;//移动过来的数组的编号-1}}count--;//客户数量-1
}
//删除客户
void del(struct Customer*cs)
{printf("-----------删除客户-----------\n");printf("请选择要删除的客户编号:");scanf("%d",&d);getchar();//enterif(d>count){printf("该编号的客户不存在!\n");}else{printf("确认是否删除(y/n):");scanf("%c",&c);if(c=='y'){rearr(d-1);//重新排列结构体}else if(c=='n'){printf("取消删除!\n");}else{printf("输入内容错误!\n");}getchar();}printf("-----------删除完成-----------\n");
}
//客户列表
void show(struct Customer*cs)
{printf("-----------客户列表-----------\n");printf("编号\t姓名\t性别\t年龄\t电话\t邮箱\n");int i;for(i=0;i<count;i++){printf("%d\t%s\t%s\t%d\t%s\t%s\n",(*cs).id,(*cs).name,(*cs).sex,(*cs).age,(*cs).phone,(*cs).email);cs++;}printf("----------客户列表完成--------\n");
}
//显示查找的客户信息
void showSeek(int index)
{printf("编号\t姓名\t性别\t年龄\t电话\t邮箱\n");	printf("%d\t%s\t%s\t%d\t%s\t%s\n",cs[index].id,cs[index].name,cs[index].sex,cs[index].age,cs[index].phone,cs[index].email);
}
//查找客户
void seek()
{int id=0;printf("-----------查找客户-----------\n");printf("请输入要查找的客户的编号:");scanf("%d",&id);getchar();int index=findindex(id);if(index!=-1)//找到下标{showSeek(index);printf("-----------查找完成-----------\n");}else{printf("没有此编号的客户!\n");}
}
//退出
void esc()
{//do-while另外一种写法/*do{printf("请确认是否要退出(y/n):");scanf("%c",&m);getchar();}while(m!='y'&&m!='n');//输入的内容既不是y也不是n*/do{printf("请确认是否要退出(y/n):");scanf("%c",&m);getchar();if(m=='y'||m=='n'){break;//退出此do-while循环}else{printf("输入的内容错误!\n");}}while(1);if(m=='y'){loop=0;//退出系统}
}
//显示菜单
void menu(struct Customer*cs)
{do{printf("-------客户信息管理软件-------\n");printf("---------1.添加客户-----------\n---------2.修改客户-----------\n---------3.删除客户-----------\n---------4.客户列表-----------\n---------5.查找客户-----------\n---------6.退出---------------\n");printf("         请选择(1-6):");scanf("%c",&num);getchar();//enterswitch(num){case '1'://添加客户add();break;case '2'://修改客户update();break;case '3'://删除客户del(cs);break;case '4'://客户列表show(cs);break;case '5'://查找客户seek();break;case '6'://退出esc();break;default://用户输入其他内容时printf("输入的内容错误!");break;}}while(loop);printf("已退出CRM系统!\n");
}int main()
{//初始化局部变量memset(cs,0,sizeof(cs));//cs是数组,直接传递首地址即可menu(cs);getchar();return 0;
}

完成代码遇到的知识点

C语言在void函数中使用return
如:

void add()
{return;
}

return表示中止当前函数的运行,并将操作权返回给调用者。
如果是在main函数中,表示将操作权返回给操作系统,return不是必须要返回一个值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/446523.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

代码重构 防火墙 相关知识

参考 依据Linux命令以及sysconf下现有的iptables命令&#xff0c;详见hsm_sysconf_server/src/sysconf_server.cpp中的firewall规则。 接口名称 firewall_manager 目的(现实) 根据网口直连获取当前eth0和eth1的各种信息保证设置的正确性 以及要针对管理口和服务口设计不…

C语言 文件的基本介绍

基本介绍 输入流与输出流 重点在C程序(内存)的数据移动方向 对于C程序(内存) 输入数据:输入流 输出数据:输出流 输入 和输出 C标准库 标准输入输出库 标准文件 getchar()&putchar()函数 代码 #include<stdio.h> #include<stdlib.h> //文件--getchar()和…

ubuntu修改字体 样式

使用 快捷键 ctrlaltt 打开终端安装gnome-tweaks桌面管理工具 sudo apt install gnome-tweaksaltf2 在运行窗口输入 gnome-tweaks 命令&#xff0c;然后回车打开优化窗口&#xff0c;选择第二个front字体选项ubuntu显示中文

C语言 文件的读写

引入 OS操作系统 打开文件fopen()函数 读写模式: r:读取已有文件 w:文件不存在,创建文件并写入文件.文件存在,内容清零,再写入文件 a: 文件不存在,创建文件并写入文件.文件存在,以追加的形式写入文件 r:读写已有文件 w:文件不存在,创建文件并读写文件.文件存在,内容清零,再…

StarWind V2V Image Converter:虚拟机镜像转换工具,可将 IMG 文件转换为 VMware VMDK 文件

操作流程 选择本地的需要转换的文件找到源文件的路径&#xff0c;img格式选择转化后的格式 第一个选择 第二个 速度快一些选择将转化后的文件的存储路径软件的下载链接 链接: https://pan.baidu.com/s/1Fe6yI42Zz9d_Q7aUhGe1FQ 提取码: 5vmv

数学建模基础知识

原型与模型 模型的分类 数学建模 数学建模的分类 成为建模大神 数学建模比赛 数学建模一般步骤 数学建模全过程 数学建模论文写作 1&#xff09;摘要:是决定最后获奖等级的关键 2&#xff09;问题重述:使用自己的语言将问题重述一次 3&#xff09;符号说明:对于常见的或…

数学建模 线性规划模型基本原理

线性规划问题 例1.1 可行解&可行域 matlab标准形式及软件求解 标准形式: C称为价值向量 如果是求max,加一个负号-c^T 如果是求Ax>b,加一个负号-Ax<b 使用matlab求线性规划例题 求解的是最大值:加上负号 y是求解的最优解 zeros()使用: zeros(n)&#xff1a;生…

接上文 ,解决 虚拟机VM,U盘(磁盘)装有系统,将其中系统安装到另外一块磁盘的具体操作

问题原因&#xff1a;接上文&#xff0c;将生成的vsdk格式的磁盘导入VM创建镜像&#xff0c;相关于U盘装载系统镜像&#xff0c;将U盘其中的镜像导入到磁盘里边&#xff0c;U盘是引导&#xff0c;会将系统最终装载到磁盘出错原因是因为 没有新建第二块磁盘 解决 新增一块磁盘如…

数学建模 层次分析法

简介 针对多目标,多准则或无结构特性的复杂决策问题 步骤 解决评价类问题 评价类问题: 资料查找: 1)查找相关文献 2)如果没有找到相关文献 3)搜索 通过上述步骤后得到的结果 构建层次结构模型 举例: 成对比较矩阵 标度表: 奇数:越大越重要 偶数:上述两相邻判断的中值…

接上文 VM安装的ubuntu系统,配置双网卡

点击编辑 进入虚拟网络编辑器 点击更改设置 补充&#xff1a;如何判定桥接至哪张网卡&#xff1f;进入win&#xff0c;winr 输入cmd&#xff1b;输入 systeminfo选中系统&#xff0c;点击右键&#xff0c;选中设置 重启系统使用 ifconfig查看&#xff0c;发现有eth0和eth1…

数学建模 趣味数模问题(数模入门)

狼羊人菜渡河问题 解答 试探法 因为有4个变量,所以一共有222*216种状态 找出其中不安全的状态:无人看守的状态下:狼羊一起,羊菜一起 人 狼 羊 菜(0是在对面,1是在这边) 狼羊一起:(0,1,1,0) (0,1,1,1) (1,0,0,0) (1,0,0,1) 羊菜一起:(0,0,1,1) (1,1,0,0) 其余的10个都是安全状态…

数学建模 整数规划的基本原理和标准形式

整数规划模型 变量限制为整数 一般解决运输问题和整数问题 分类: 研究的是纯整数规划问题 整数规划特点 实数的解不能直接四舍五入为整数,因为此时可能不满足约束条件 举例-合理下料问题 模型: 题目: 这是在使用材料 1)使用零件A1-Am毛胚,就是使用零件 2)下料方式B1-Bn就…

程序员 面试笔记 C++ 程序设计的基础 第10章

10.1.1 程序的编译和执行 以#开头的代码都属于预处理器处理的步骤#include 将头文件的内容包含进入当前源文件中#define 展开宏定义#ifdef 处理条件编译指令(#ifdef、ifndef、#if、#else、#elif、#endif)#other 处理其他宏指令(#error、#warning、#line、#pragma) 预…

数学建模 分支限界算法求解整数规划原理以及编程实现

引入 线性规划问题(松弛问题) 图解法: 使用图解法求出最优解,再使用四舍五入求出的整数解不满足条件 完全枚举法(穷举法):找出集合内所有满足条件的整数点,再带入不等式中,看是否有最优解 分支限界法 说明: 松弛问题:线性规划问题 ILP:整数规划,在线性规划的基础上对决策…

数学建模 割平面算法求解整数规划基本原理与编程实现

基本思想 松弛问题:线性规划 割掉一块全部都是小数的区域(这一部分取不到整数) 案例 1)横坐标x1,纵坐标x2 2)蓝色小三角形的区域:x2:(1,7/4) x1:(0,3/4) 这块区域,x1与x2完全取不到整数,所以直接切去 所以,此时取值范围变化了: x2<1把此约束条件带入,得到x11,x21,z2 3…

数学建模 匈牙利算法求解整数规划基本原理与编程实现

投资问题(0-1规划) 匈牙利算法求解0-1规划问题 解答: 项目之间是互斥关系,所以使用x1x2x31; 项目5是以项目1为先验条件,所以x5<x1,意味着x11时,x51或0 ,但x10时,x50 案例- 互斥约束问题 1)当两个约束条件是互斥时,新建立一个约束条件y(0-1) 2)如果M取无穷大的数,此时就…

Ubuntu通过可视化界面配置 查找IP地址不存在的解决办法

命令行用ifconfig eno0 up&#xff0c;启用网卡&#xff0c;没有问题&#xff0c;硬件ok&#xff0c;但是配置里面还是找不到。之前修改了 /etc/network/interfaces&#xff0c;去掉配置。由于图形界面使用的是 network-manager&#xff0c;所以需要修改重启sudo service netwo…

数学建模 非线性规划原理的应用与编程实现

非线性规划模型NP 包含非线性函数:不是直线而是曲线、曲面、或不确定的属性,叫非线性。 如:x^2 线性函数:一次函数,axb 列1-投资决策问题 解答: 设置决策变量: 1)投资某个项目达到收益最高,使用比值法(更直观) 收益/投资花费 取值范围 1)*非线性规划中常用 限制xi0或1(在编…

数学建模1 赛前准备 赛题选择 查找文献

了解国赛 生成了MD5码之后就不能再碰文件&#xff0c;打开都不行 软件安装 其他 ABC赛题特点 一般选择B,C题 赛题选择 1.排除背景都看不懂的题 定题 1.少数服从多数 2.选择资料多的题 搜索技巧 1.双引号–“CT参数标定”&#xff08;内容或标题一致&#xff09; 2…