c语言:简单的客户管理系统
简单的客户管理系统
本设计针对客户管理系统对企业的实际需求,实现了客户基本信息的输入,删除,查询等功能;自主设定查询条件,实现对客户数据的综合查询。使企业能够全面的及时地了解与客户相关的各种信息。
存储结构设计
定义一个struct Link结构体数组kehu,这个数组的每个成员都七个char型数组来分别存储相对应的属性,然后将kehu数组的信息存入路径为E:\文档\kehuguanli.txt的文件里。
-
存储路径设计 ,我是将我客户信息存在了我电脑E盘的一个叫文档的文件夹里的一个叫kehuguanli的txt纯文本文件里,也就是说你在用这个系统代码的时候你想要再哪里存入客户信息就在哪里建一个txt纯文本文件,然后在代码里存储路径的位置按我的格式改为你自己的存储路径。
-
我的这个存储结构设计是简单的结构体数组, **如果想要表现你比较有思想就自己简单的把存储结构改为单链表就可以啦,**然后记得单链表要是初始化 。
结构功能图: -
增加函数流程图:
-
登录流程图:
;
代码
// A code block
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>//getch函数在C语言中使用时需包含的头文件为conio.h
#define N 2
int Number=N ;
struct Link
{
char User[20];//账号
char Code[20];//登录密码
char name[10];//姓名
char sex[10];//性别
char phone[15];//电话号码
char gonwei[20];//工作单位
char address[20];//地址
}kehu[N];
int i;
void bc(struct Link *&st);//保存函数,将客户信息保存起来
void Draw(FILE *&fp);//绘制菜单界面
void link(FILE *&fp);//登录函数
void output(FILE *&fp);//输出函数
int Denglu(FILE *&fp);//验证账号密码函数(其实就是按账号查找,登录成功后输出来就好了)
void input(FILE *&fp);//输入函数
void add();//对客户信息进行增加函数
void delbyname();//对客户信息按照姓名进行删除
void delbyUser();//对客户信息按照账号进行删除
void del();//删除函数
void change();//修改函数
int total();//计数函数,防止数据被刷新,对于删除查找修改增加函数都有用
void Searchname(FILE *&fp);//查找想要的名字的客户
void Searchgonwei(FILE *&fp);//查找相同工作单位的客户
void Searchsex(FILE *&fp);//查找相同性别的客户
void Search(FILE *&fp);//查找函数
int total()
{
FILE *fp;
int i=0;
fp = fopen("E:\\文档\\kehuguanli.txt", "r");
if (fp == NULL)
{
printf("不能打开文件!按任意键退出程序!");
exit(1);
}
else
{
fseek(fp,0,0);//把文件指针移到文件头,每读一个客户,i就++,直到读到末尾,此时i为TXT文件里的客户数
fread(&kehu[0], sizeof(struct Link), 1, fp);
while (!feof(fp))//判断文件的读写指针是否处于文件结束位置,当文件结束时返回值为1否则为0,若没结束返回然后前面有!就可以继续执行 while循环
{
i++;
fseek(fp,sizeof(struct Link)*i,0);//把文件指针移到需要的那个位置上,输出需要的那个人
fread(&kehu[i], sizeof(struct Link), 1, fp);//如果遇到文件尾,读出的字节个数小于 struct Link,或者读数据失败就自动停止
}
fclose(fp);
}
return i;
}
void input(FILE *&fp)//输入函数
{
fp = fopen("E:\\文档\\kehuguanli.txt", "w");//打开创建一个文本文件,只允许写数据
if (fp == NULL)
{
printf("不能打开文件!按任意键退出程序!");
exit(0);//不能打开一个文本文件,退出
}
else
{
for (i = 0; i < N; i++)
{
printf("请输出第%d个客户的信息\n", i + 1);
printf("输入客户姓名:\t");
scanf("%s",kehu[i].name);
printf("输入客户性别:\t");
scanf("%s", kehu[i].sex);
printf("输入客户账号:\t");
scanf("%s", kehu[i].User);
printf("输入客户密码:\t");
scanf("%s", kehu[i].Code);
printf("输入客户电话号码:\t");
scanf("%s", kehu[i].phone);
printf("输入客户工作单位:\t");
scanf("%s", kehu[i].gonwei);
printf("输入客户地址:\t");
scanf("%s", kehu[i].address);
fwrite(&kehu[i], sizeof(struct Link), 1, fp);//把数组数据写进文件
}
fclose(fp); //关闭文件
printf("按回车键继续执行!");
}
}
int Denglu(FILE *&fp)//验证账号密码函数(其实就是查找,登录成功后输出来就好了)
{
int p=total();//使用total函数来计算出此时文件里有多少客户好用来下面比较有没有此账户的for循环使用
int tag=1;//tag其实就是一个标志,看是否账号或者密码错误,运行的时候先输账号再输密码,即使账号立马出错也得接着输密码(因为账号密码在比较前就先输了),只要账号或者密码哪个出错了全部提示错误信息
int i;
char test_User[20];
char test_Code[20];
printf("请输入账号:\t");
scanf("%s", test_User);
printf("请输入密码:\t");
scanf("%s", test_Code);
for (i = 0; i < p&&tag==1; i++)
{
if (strcmp(test_User, kehu[i].User) == 0)//strcmp字符串比较函数相等时返回值为0,前面大于后面的返回值大于0,前面小于后面的返回值小于0
{
tag=0;
if (strcmp(test_Code, kehu[i].Code)== 0)
{
printf("登录成功!管理员吴丽慧姐姐说你真棒!\n");
printf("输出那位客户:\n");
fp = fopen("E:\\文档\\kehuguanli.txt", "r");
if (fp == NULL)
{
printf("不能打开文件!按任意键退出程序!");
exit(0);//不能打开一个文本文件,退出
}
else
{
fseek(fp,sizeof(struct Link)*i,0);//把文件指针移到需要的那个位置上,输出需要的那个人
fread(&kehu[i], sizeof(struct Link), 1, fp);
printf("第%d个客户的信息\n",i+1);
printf("姓名:\t%s\n性别:\t%s\n",kehu[i].name,kehu[i].sex);
printf("账号:\t%s\n密码:\t%s\n", kehu[i].User, kehu[i].Code);
printf("电话号码:\t%s\n工作单位:\t%s\n",kehu[i].phone,kehu[i].gonwei);
printf("地址:\t%s\n", kehu[i].address);
//break在这里的作用是跳出while循环,即当已找到此客户输出后及时停止循环,防止不必要的比较,账号不会重复,所以只会有一个,找到后及时输出不需要再比较了
fclose(fp);
printf("按回车键继续执行!");
return 1;
}
}
else
{
printf("密码或者账号输入错误!管理员吴丽慧姐姐说你凉了!\n");
return 0;
continue;//continue 的作用是跳出此次的循环,也就是说当账号正确密码错误的情况下跳出此次循环给人家在一次的输出机会
}
}
}
if(tag==1)
{
printf("密码或者账号输入错误!管理员吴丽慧姐姐说你凉了!\n");
return 0;
printf("按回车键继续执行!");
}
}
void Searchname(FILE *&fp)//查找想要的名字的客户,具有相同名字的客户都会输出来
{
int j=0;//j其实就是一个标志,定义一开始是0;如果查询到有此客户就++,然后就不是0了,如果到最后还是0证明没有这个客户就输出错误提示语
int p=total();//使用total函数来计算出此时文件里有多少客户好用来下面比较有没有此账户的for循环使用
int i;
char test_name[10];
printf("请输入名字:\t");
scanf("%s", test_name);
fp = fopen("E:\\文档\\kehuguanli.txt", "r");
for (i = 0; i < p; i++)
{
if (strcmp(test_name, kehu[i].name) == 0)//strcmp字符串比较函数相等时返回值为0,前面大于后面的返回值大于0,前面小于后面的返回值小于0
{
printf("找到了!管理员吴丽慧姐姐说你真棒!\n");
printf("输出那位客户:\n");
if (fp == NULL)
{
printf("不能打开文件!按任意键退出程序!");
exit(0);//不能打开一个文本文件,退出
}
else
{
fseek(fp,sizeof(struct Link)*i,0);//把文件指针移到需要的那个位置上,输出需要的那个人
fread(&kehu[i], sizeof(struct Link), 1, fp);
printf("第%d个客户的信息\n",i+1);
printf("姓名:\t%s\n性别:\t%s\n",kehu[i].name,kehu[i].sex);
printf("账号:\t%s\n密码:\t%s\n", kehu[i].User, kehu[i].Code);
printf("电话号码:\t%s\n工作单位:\t%s\n",kehu[i].phone,kehu[i].gonwei);
printf("地址:\t%s\n", kehu[i].address);
j++ ;
}
}
/*else
{
fclose(fp);
printf("名字输入错误!管理员吴丽慧姐姐说你凉了!\n");
printf("按回车键继续执行!");
}*/
}
if(j==0)//没找到的情况
{
printf("名字输入错误!管理员吴丽慧姐姐说你凉了!\n");
}
fclose(fp);
printf("按回车键继续执行!");
}
void Searchgonwei(FILE *&fp)//查找相同工作单位的客户,具有相同工作单位的客户都会输出来
{
int j=0;//j其实就是一个标志,定义一开始是0;如果查询到有此客户就++,然后就不是0了,如果到最后还是0证明没有这个客户就输出错误提示语
int p=total();//使用total函数来计算出此时文件里有多少客户好用来下面比较有没有此账户的for循环使用
int i;
char test_gonwei[20];
printf("请输入工作单位:\t");
scanf("%s", test_gonwei);
fp = fopen("E:\\文档\\kehuguanli.txt", "r");
for (i = 0; i < p; i++)
{
if (strcmp(test_gonwei, kehu[i].gonwei) == 0)//strcmp字符串比较函数相等时返回值为0,前面大于后面的返回值大于0,前面小于后面的返回值小于0
{
printf("找到了!管理员吴丽慧姐姐说你真棒!\n");
printf("输出那位客户:\n");
if (fp == NULL)
{
printf("不能打开文件!按任意键退出程序!");
exit(0);//不能打开一个文本文件,退出
}
else
{
fseek(fp,sizeof(struct Link)*i,0);//把文件指针移到需要的那个位置上,输出需要的那个人
fread(&kehu[i], sizeof(struct Link), 1, fp);
printf("第%d个客户的信息\n",i+1);
printf("姓名:\t%s\n性别:\t%s\n",kehu[i].name,kehu[i].sex);
printf("账号:\t%s\n密码:\t%s\n", kehu[i].User, kehu[i].Code);
printf("电话号码:\t%s\n工作单位:\t%s\n",kehu[i].phone,kehu[i].gonwei);
printf("地址:\t%s\n", kehu[i].address);
j++;
}
}
/*else
{
fclose(fp);
printf("工作单位输入错误!管理员吴丽慧姐姐说你凉了!\n");
printf("按回车键继续执行!");
}*/
}
if(j==0)//没找到的情况
{
printf("工作单位输入错误!管理员吴丽慧姐姐说你凉了!\n");
}
fclose(fp);
printf("按回车键继续执行!");
}
void Searchsex(FILE *&fp)//查找想要的名字的客户,具有相同名字的客户都会输出来
{
int j=0;//j其实就是一个标志,定义一开始是0;如果查询到有此客户就++,然后就不是0了,如果到最后还是0证明没有这个客户就输出错误提示语
int p=total();//使用total函数来计算出此时文件里有多少客户好用来下面比较有没有此账户的for循环使用
int i;
char test_sex[10];
printf("请输入性别:\t");
scanf("%s", test_sex);
fp = fopen("E:\\文档\\kehuguanli.txt", "r");
for (i = 0; i < p; i++)
{
if (strcmp(test_sex, kehu[i].sex) == 0)//strcmp字符串比较函数相等时返回值为0,前面大于后面的返回值大于0,前面小于后面的返回值小于0
{
printf("找到了!管理员吴丽慧姐姐说你真棒!\n");
printf("输出那位客户:\n");
if (fp == NULL)
{
printf("不能打开文件!按任意键退出程序!");
exit(0);//不能打开一个文本文件,退出
}
else
{
fseek(fp,sizeof(struct Link)*i,0);//把文件指针移到需要的那个位置上,输出需要的那个人
fread(&kehu[i], sizeof(struct Link), 1, fp);
printf("第%d个客户的信息\n",i+1);
printf("姓名:\t%s\n性别:\t%s\n",kehu[i].name,kehu[i].sex);
printf("账号:\t%s\n密码:\t%s\n", kehu[i].User, kehu[i].Code);
printf("电话号码:\t%s\n工作单位:\t%s\n",kehu[i].phone,kehu[i].gonwei);
printf("地址:\t%s\n", kehu[i].address);
j++;
}
}
/*else
{
fclose(fp);
printf("性别输入错误!管理员吴丽慧姐姐说你凉了!\n");
printf("按回车键继续执行!");
}*/
}
if(j==0)//没找到的情况
{
printf("性别输入错误!管理员吴丽慧姐姐说你凉了!\n");
}
fclose(fp);
printf("按回车键继续执行!");
}
void Search(FILE *&fp)//查找函数
{
int n ;
printf("选择查找方式\n");
printf("1 按姓名查找\n");
printf("2 按工作单位查找\n");
printf("3 按性别查找\n");
printf("请输入你的选择:\t");
scanf("%d", &n);
switch (n)
{
case 1: Searchname(fp);
break;
case 2: Searchgonwei(fp);
break;
case 3: Searchsex(fp);
break;
}
}
void output(FILE *&fp)//输出函数
{
int i=0;
fp = fopen("E:\\文档\\kehuguanli.txt", "r");
if (fp == NULL)
{
printf("不能打开文件!按任意键退出程序!");
exit(1);
}
else
{
fseek(fp,0,0);
fread(&kehu[0], sizeof(struct Link), 1, fp);
while (!feof(fp))
{
printf("第%d个客户的信息\n",i+1);
printf("姓名:\t%s\n性别:\t%s\n",kehu[i].name,kehu[i].sex);
printf("账号:\t%s\n密码:\t%s\n", kehu[i].User, kehu[i].Code);
printf("电话号码:\t%s\n工作单位:\t%s\n",kehu[i].phone,kehu[i].gonwei);
printf("地址:\t%s\n", kehu[i].address);
i++;
fseek(fp,sizeof(struct Link)*i,0);//把文件指针移到需要的那个位置上,输出需要的那个人
fread(&kehu[i], sizeof(struct Link), 1, fp);//如果遇到文件尾,读出的字节个数小于 struct Link,或者读数据失败就自动停止
}
fclose(fp);
printf("按回车键继续执行!");
}
}
void link(FILE *&fp)
/*登录函数 ,链接Search函数,如果Search函数找不到想要的那个人就就return0,输出那个密码或者账号错误然后执
行getch函数继续操作,不然找到了就返回 1然后给n,n不是1就break,不要让Search函数死循环 */
{
int n;
printf("\n\n\n\n\t\t\t登录界面\n");
while (1)
{
n = Denglu(fp);
if (n != 0)
break;
}
}
void Draw(FILE *&fp)//绘制菜单界面
{
char n;
/*这里定义n为整型的话就没办法顾及输入错误的处理,如果是char,因为char是字符型,虽然输出字母比如abc或者其他的会出现错误提示语,可是如果是字符'123'
的话不会报错,系统会读取最前面的1当做1功能去执行,这不行啊;如果用字符串类型的话c语言没有字符串类型变量,只能用数组存储,但
是数组是构造类型,switch不允许构造类型啊,就很烦!*/
printf("\n\n\n\t\t********** 简单客户管理系统菜单栏-管理员:美丽善良的吴丽慧 **********\n");
printf("\t\t****** 1.文件的写入 ******\n");
printf("\t\t****** 2.文件的读出 ******\n");
printf("\t\t****** 3.账号密码登录 ******\n");
printf("\t\t****** 4.客户增加 ******\n");
printf("\t\t****** 5.客户删除 ******\n");
printf("\t\t****** 6.信息修改 ******\n");
printf("\t\t****** 7.查找客户信息 ******\n");
printf("\t\t****** 8.退出系统 ******\n");
printf("请输入你的选择:\t");
scanf("%c", &n);
switch (n)
{
case '1':
input(fp);
break;
case '2':
output(fp);
break;
case '3':
link(fp);//登录
break;
case '4':
add();
break;
case '5':
del();
break;
case '6':
change();
break;
case '7':
Search(fp);
break;
case '8':
printf("吴丽慧姐姐跟您说再见!");
exit(0);
default://这里的错误提示是对于那些整型的
printf("输入错误键,是不是傻?吴丽慧姐姐让你重来!") ;
break;
}
}
void change()//修改函数
{
int p=total();
FILE *fp;
int i,c,tag=1;
char User[20];
struct Link temp;
printf("请输入要修改的客户账号:\n");
scanf("%s",User);
for(i=0;i<p&&tag==1;i++)
{
if(strcmp(User,kehu[i].User)==0)
{
tag=0;
printf("请输入要修改的序号:\n");
printf("----0账号修改\n");
printf("----1密码修改\n");
printf("----2姓名修改\n");
printf("----3性别修改\n");
printf("----4电话修改\n");
printf("----5工作单位修改\n");
printf("----6地址修改\n");
scanf("%d",&c);
if(c==0)
{
printf("请输入要修改的账号:\n");//新的要赋值的账号
scanf("%s",temp.User);
strcpy(kehu[i].User,temp.User);
}
else if(c==1)
{
printf("请输入要修改的密码:\n");
scanf("%s",temp.Code);
strcpy(kehu[i].Code,temp.Code);
}
else if(c==2)
{
printf("请输入要修改的姓名:\n");
scanf("%s",temp.name);
strcpy(kehu[i].name,temp.name);
}
else if(c==3)
{
printf("请输入要修改性别:\n");
scanf("%s",temp.sex);
strcpy(kehu[i].sex,temp.sex);
}
else if(c==4)
{
printf("请输入要修改电话号码:\n");
scanf("%s",temp.phone);
strcpy(kehu[i].phone,temp.phone);
}
else if(c==5)
{
printf("请输入要修改工作单位:\n");
scanf("%s",temp.gonwei);
strcpy(kehu[i].gonwei,temp.gonwei);
}
else if(c==6)
{
printf("请输入要修改地址:\n");
scanf("%s",temp.address);
strcpy(kehu[i].address,temp.address);
}
}
}
if(tag!=1)
{
fp = fopen("E:\\文档\\kehuguanli.txt", "wt");//将改后数据写入文件 重新一写的方式打开文件 把以前的数据擦除了
if (fp == NULL)
{
printf("不能打开文件!按任意键退出程序!");
exit(0);//不能打开一个文本文件,退出
}
else
{
for (i = 0; i<p; i++)
{
fwrite(&kehu[i], sizeof(struct Link), 1, fp);
}
fclose(fp);
printf("修改成功;\n");
printf("按回车键继续执行!");
}
}
else
{
printf("没有此客户!丽慧姐姐让你在想想!\n");
printf("按回车键继续执行!");
}
}
void bc(struct Link *st)//保存函数,将客户信息保存起来
{
FILE *fp ;
fp = fopen("E:\\文档\\kehuguanli.txt", "at+");//读写打开一个存在的txt文件,允许读写,可在文件末追写数据
if (fp == NULL)
{
printf("不能打开文件!按任意键退出程序!");
exit(0);//不能打开一个文本文件,退出
}
else
{
fwrite(st, sizeof(struct Link), 1, fp);
fclose(fp);
}
}
void add()//增加人员信息
{
int p=total();
int tag=1;
int numberTemp ;
int i = 0;
printf("请输入要增加的客户信息数量:");
scanf("%d", &numberTemp);
struct Link temp[numberTemp];
for (i = 0; i<numberTemp; i++)
{
printf("输入第%d个客户信息\n", i + 1);
printf("姓名:\t");
scanf("%s", temp[i].name);
printf("性别:\t");
scanf("%s", temp[i].sex);
printf("账号:\t");
scanf("%s", temp[i].User);
printf("密码:\t");
scanf("%s", temp[i].Code);
printf("电话号码:\t");
scanf("%s", temp[i].phone);
printf("工作单位:\t");
scanf("%s", temp[i].gonwei);
printf("地址:\t");
scanf("%s", temp[i].address);
}
for (i = 0; i < p&&tag==1; i++)
{
if (strcmp(temp[i].User, kehu[i].User) == 0)
{
printf("已有此账号,添加失败!\n");
tag=0;
printf("按回车键继续执行!");
}
}
if(tag==1)
{
for(i=0;i<numberTemp;i++)
{
kehu[p++] = temp[i]; //将刚添加的写入到数组
bc(&temp[i]); //将刚添加的写入到文件
}
printf("添加成功\n");
printf("按回车键继续执行!");
}
}
void delbyname()//按姓名删除
{
int p=total();
FILE *fp=NULL;
int tag=1;//标志,看看有没有找到要删除的那个客户
fp= fopen("E:\\文档\\kehuguanli.txt", "wt+");
char name[60];
int i = 0;
int j = 0;
printf("请输入要删除的客户的名字:");
scanf("%s", name);
for (i = 0; i<p&&tag==1; i++)
{
if (strcmp(name, kehu[i].name) == 0) //如果查找到就删除
{
tag=0;
for (j = i; j<p-1; j++)
{
kehu[j] = kehu[j + 1];//把后面的往前移动,就删掉了想删的那个人
}
}
} //将剩余数据写入文件 重新以写的方式打开文件 把以前的数据擦除了
if(tag!=1)
{
if (fp == NULL)
{
printf("不能打开文件!按任意键退出程序!");
exit(0);//不能打开一个文本文件,退出
}
else
{
p--;
for (i = 0; i<p; i++)
{
fwrite(&kehu[i], sizeof(struct Link), 1, fp);
}
fclose(fp);
printf("删除成功;\n");
printf("回车键继续执行!");
}
}
else
{
printf("没有找到可以删除的!再想想啦,老是傻furfur的\n");
fclose(fp);
printf("按回车键继续执行!");
}
}
void delbyUser()//按账号删除
{
int p=total();
FILE *fp=NULL;
fp = fopen("E:\\文档\\kehuguanli.txt", "wt+");//将剩余数据写入文件 重新一写的方式打开文件 把以前的数据擦除了
int tag=1;//标志,看看有没有找到要删除的那个客户
char User[20];
int i = 0;
int j = 0;
printf("请输入要删除的客户的账号:");
scanf("%s", User);
for (i = 0; i<p&&tag==1; i++)
{
if (strcmp(User, kehu[i].User) == 0) //如果查找到就删除
{
tag=0;
for (j = i; j<p-1; j++)
{
kehu[j] =kehu[j + 1];
}
}
}
if(tag!=1)
{
if (fp == NULL)
{
printf("不能打开文件!按任意键退出程序!");
exit(0);//不能打开一个文本文件,退出
}
else
{
p-- ;
for (i = 0; i<p; i++)
{
fwrite(&kehu[i], sizeof(struct Link), 1, fp);//写数据块函数
}
fclose(fp);
printf("删除成功;\n");
printf("按回车键继续执行!");
}
}
else
{
printf("没有找到可以删除的!再想想啦,老是傻furfur的\n");
fclose(fp);
printf("按回车键继续执行!");
}
}
void del()//删除
{
int n ;
printf("选择删除方式\n");
printf("1 按姓名删除\n");
printf("2 按账号删除\n");
printf("请输入你的选择:\t");
scanf("%d", &n);
switch (n)
{
case 1: delbyname();
break;
case 2: delbyUser();
break;
}
}
int main()
{
FILE *fp;//E:\\文档\\kehuguanli.txt对应的文件指针变量
while (1)
{
Draw(fp);//绘制菜单界面
//这里不用这句printf("按任意键执行:\n")提示语了,因为每个子函数里都有这句话这里就不用重复了;
_getch();//可以按下任意键自己决定继续执行
/*getch是一个计算机函数,在windows平台下从控制台无回显地取一个字符,在linux下是有回显的。用法是int getch(void)。
window 平台:注:Windows下不推荐使用POSIX。建议使用使用标准C++相似的名称:_getch。详情请参阅c++标准文件
linux 平台:在WINDOWS/MS-DOS中,也可以利用getch()函数让程序调试运行结束后等待编程者按下键盘才返回编辑界面,用法:包含conio.h头文件后,在主函数结尾,return 0;之前加上getch();即可
这个函数可以让用户按下任意键而不需要回车就可以接受到用户的输入。可以用来作为“press any key to continue”的实现。*/
//window 平台:注:Windows下不推荐使用POSIX。建议使用使用标准C++相似的名称:_getch。详情请参阅c++标准文件
fflush(stdin);//清除标准输入设备(一般是键盘)的缓存。系统自动定义了3个文件指针stdin,stdout,stderr,分别指向终端输入设备,终端输出设备,标准出错输出设备
}
return 0;
}