一个不太成熟的c语言课设报告,有问题就评论一起探讨吧
1 设计任务及要求
客户关系管理系统设计
客户信息包括:客户编号、客户名称、客户电话、客户地址,客户单位、客户邮箱、客户身份证、最后交易时间、客户状态(已流失、未流失)。
试设计一客户关系管理系统,使之能提供以下功能:
1客户信息录入、修改、删除功能;
2按客户编号排序、浏览功能;
3按客户状态查询、按客户名称等查询及统计功能(按照客户的状态统计个数)。
2 设计方案说明
2.1 数据的存储结构
struct customer{
int num;//客户编号 整型
char name[20];//客户名称 字符型
char pnum[11];//客户电话 字符型
char address[50];//客户地址 字符型
char danwei[50];//客户单位 字符型
char mail[20];//客户邮箱 字符型
char ID[18];//客户身份证号 字符型
char time[8];//最后交易时间 字符型
int status;//客户状态(已流失0/未流失1) 整型
}cust[N]; //定义customer型变量cust[N]存储N个客户的信息
结构体类型customer存储客户信息,占185个字节(4+20+11+50+50+20+18+8+4=185)
2.2函数之间的调用关系说明

图1 函数之间的调用关系说明
2.3函数说明
1.main函数
(1)函数的原型声明
int main();
(2)函数功能及参数声明
函数功能:显示可使用的功能,用户可通过该函数选择要使用的功能
参数声明:无参函数
(3)函数中使用的关键变量声明
int c;
(4)算法设计

图2 main函数算法设计
2.input函数
函数的原型声明
void input();
函数功能及参数声明
函数功能:客户数据录入,将输入的数据存在数组cust[N]中
参数声明:无参函数
函数中使用的关键变量声明
int i;
char p;//判别是否继续录入
算法设计

图3 input函数算法设计
3.modify函数
(1)函数的原型声明
void modify();
(2)函数功能及参数声明
函数功能:修改指定的客户数据
参数声明:无参函数
(3)函数中使用的关键变量声明
int m,i,inf; //m是要修改的客户编号,inf是要修改的信息类别
(4)算法设计

图4 modify函数算法设计
4.delet函数
(1)函数的原型声明
void delet();
(2)函数功能及参数声明
函数功能:删除指定的客户数据,实际上是为对应的客户编号赋值0,当每个操作都在客户编号非零的基础上执行时就起到了删除的效果
参数声明:无参函数
(3)函数中使用的关键变量声明
int number,i; //将要删除的客户编号赋值给number
(4)算法设计

图5 delet函数算法设计
5.sort函数
(1)函数的原型声明
void sort();
(2)函数功能及参数声明
函数功能:按客户编号排序显示客户信息
参数声明:无参函数
(3)函数中使用的关键变量声明
int i,j,k; //用于选择法排序
struct customer t; //交换结构体变量内容时用到的中间变量
(4)算法设计

图6 sort函数算法设计
6.display函数
(1)函数的原型声明
void display();
(2)函数功能及参数声明
函数功能:显示所有客户信息
参数声明:无参函数
(3)函数中使用的关键变量声明
int i;
(4)算法设计

图7 display函数算法设计
7.query1函数
(1)函数的原型声明
void query1();
(2)函数功能及参数声明
函数功能:按客户状态查询符合条件的客户信息
参数声明:无参函数
(3)函数中使用的关键变量声明
int s,i; //s是输入的要查询的状态,值为0或1
(4)算法设计

图8 query1函数算法设计
8.query2函数
(1)函数的原型声明
void query2();
(2)函数功能及参数声明
函数功能:按客户名称查询对应客户的信息
参数声明:无参函数
(3)函数中使用的关键变量声明
char na[20]; //na是输入的要查询的客户名称
int i;
(4)算法设计

图9 query2函数算法设计
9.sum函数
(1)函数的原型声明
void sum();
(2)函数功能及参数声明
函数功能:按客户状态统计符合条件的客户人数
参数声明:无参函数
(3)函数中使用的关键变量声明
int st,i,nn; //st表示要查询的客户状态,值为0或1;通过nn累计人数
(4)算法设计

图10 sum函数算法设计
10.writeToFile函数
(1)函数的原型声明
void writeToFile();
(2)函数功能及参数声明
函数功能:将最新的的客户数据存在文件中
参数声明:无参函数
(3)函数中使用的关键变量声明
int i;
FILE *fp; //定义文件指针fp指向文件所建立的信息区的起始地址
(4)算法设计

图11 writeToFile函数算法设计
11.readFromFile函数
函数的原型声明
void readFromFile();
(2)函数功能及参数声明
函数功能:从文件中读取客户数据并存入数组cust[N]中
参数声明:无参函数
(3)函数中使用的关键变量声明
int i;
FILE *fp; //指针变量fp指向文件所在位置
(4)算法设计

图12 readFromFile函数算法设计
3设计题目源代码清单
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define N 10
//定义结构体类型customer存储客户数据
struct customer
{
int num;//客户编号
char name[20];//客户名称
char pnum[11];//客户电话
char address[50];//客户地址
char danwei[50];//客户单位
char mail[20];//客户邮箱
char ID[18];//客户身份证号
char time[8];//最后交易时间
int status;//客户状态(已流失0/未流失1)
}cust[N];//存储N个客户的数据
/*
函数声明
*/
void input();
void modify();
void delet();
void sort();
void display();//浏览客户信息
void query1();//按客户状态查询客户编号
void query2();//按客户名称查询
void sum();
void writeToFile();
void readFromFile();
//客户数据录入,将录入的数据存到数组中
void input()
{
int i;
char p;//判别是否继续录入
for(i=0;i<N;i++)
{
printf("请输入第%d位客户的信息:\n",i+1);
printf("输入客户编号(不可为0):\n");
scanf("%d",&cust[i].num);
if(cust[i].num!=0)//规定客户编号非0
{
printf("输入客户名称:\n");
scanf("%s",cust[i].name);
printf("输入客户电话:\n");
scanf("%s",cust[i].pnum);
printf("输入客户地址:\n");
scanf("%s",cust[i].address);
printf("输入客户单位:\n");
scanf("%s",cust[i].danwei);
printf("输入客户邮箱:\n");
scanf("%s",cust[i].mail);
printf("输入客户身份证号:\n");
scanf("%s",cust[i].ID);
printf("输入最后交易时间:\n");
scanf("%s",cust[i].time);
printf("输入客户状态:(已流失0/未流失1)\n");
scanf("%d",&cust[i].status);
writeToFile();
getchar(); //接受换行符
printf("是否要继续录入(是y/否n):\n");
p=getchar();
if(p=='n') break;
}
else //若输入客户编号为0,则提示录入失败
{
printf("\n客户编号不可为0,录入失败\n");break;
}
}
}
//将客户数据存在文件中
void writeToFile()
{
int i;
FILE *fp;
if(fp=fopen("d:\\customer","wb")==NULL) //打开输出文件
{
printf("\n无法打开该文件\n");
return;
}
for(i=0;i<N;i++)
{
if(fwrite(&cust[i],sizeof(struct customer),1,fp)!=1) //将cust[i]这一组数据写入fp指向的文件
{
printf("\n写入文件失败\n");
return;
}
}
fclose(fp);
}
//从文件中读取学生数据并存入数组cust[N]
void readFromFile()
{
int i;
FILE *fp;
if(fp=fopen("d:\\customer","rb")==NULL) //打开输入文件
{
printf("\n无法打开该文件\n");
return;
}
for(i=0;i<N;i++)
fread(&cust[i],sizeof(struct customer),1,fp); //从fp指向的文件读入cust[i]这一组数据
fclose(fp);
}
//修改客户数据
void modify()
{
void tip1();
void tip2();
int m,i,inf;//m是要修改的客户编号,inf是要修改的信息类别
printf("请输入要修改的客户编号:");
scanf("%d",&m);
//先确定输入的客户编号是否存在
for(i=0;i<N;i++)
if(cust[i].num==m) break;
//当输入的客户编号不存在时
if(i==N)
printf("\n输入的客户编号不存在\n");
//当输入的客户编号存在时
else
{
//显示待修改的客户数据
printf("\n客户编号:%d\n客户名称:%s\n客户电话:%s\n客户地址:%s\n客户单位:%s\n客户邮箱:%s\n客户身份证号:%s\n最后交易时间:%s\n客户状态:%d\n",
cust[i].num,cust[i].name,cust[i].pnum,cust[i].address,cust[i].danwei,cust[i].mail,cust[i].ID,cust[i].time,cust[i].status);
printf("\n1.客户编号 2.客户名称 3.客户电话 4.客户地址 5.客户单位\n6.客户邮箱 7.客户身份证号 8.最后交易时间 9.客户状态\n");
printf("\n请选择要修改的信息类别:");
scanf("%d",&inf);
switch(inf)
{
case 1:{tip1();scanf("%d",&cust[i].num);tip2();break;}
case 2:{tip1();scanf("%s",&cust[i].name);tip2();break;}
case 3:{tip1();scanf("%s",&cust[i].pnum);tip2();break;}
case 4:{tip1();scanf("%s",&cust[i].address);tip2();break;}
case 5:{tip1();scanf("%s",&cust[i].danwei);tip2();break;}
case 6:{tip1();scanf("%s",&cust[i].mail);tip2();break;}
case 7:{tip1();scanf("%s",&cust[i].ID);tip2();break;}
case 8:{tip1();scanf("%s",&cust[i].time);tip2();break;}
case 9:{tip1();scanf("%d",&cust[i].status);tip2();break;}
default:printf("\n未查询到对应内容\n");
}
}
}
void tip1()
{
printf("请输入修改后的信息:");
}
void tip2()
{
printf("\n修改成功\n");
}
/*
删除客户数据
实际是给要删除的客户的编号赋值0,当所有操作在客户编号非零的基础上执行时达到删除的效果
*/
void delet()
{
int number,i;//将要删除的客户编号赋值给number
printf("请输入要删除的客户编号:");
scanf("%d",&number);
for(i=0;i<N;i++)
if(cust[i].num==number)
cust[i].num=0; //赋值0
printf("\n已删除原编号为%d的客户信息\n",number);
}
//按客户编号排序
void sort()
{
int i,j,k;
struct customer t;
printf("按客户编号排序后为:\n");
//用选择法排序
for(i=0;i<N-1;i++)
{
k=i;
for(j=i+1;j<N;j++)
if(cust[j].num<cust[k].num) k=j;
t=cust[i];
cust[i]=cust[k];
cust[k]=t;
}
//显示排序后的客户数据
printf("客户编号 客户名称 客户电话 客户地址 客户单位 \n");
for(i=0;i<N;i++)
if(cust[i].num!=0)
printf("%5d %10s %15s %20s %20s\n",
cust[i].num,cust[i].name,cust[i].pnum,cust[i].address,cust[i].danwei);
printf("\n");
printf("客户编号 客户邮箱 客户身份证号 最后交易时间 客户状态\n");
for(i=0;i<N;i++)
if(cust[i].num!=0)
printf("%5d %20s %18s %10s %d\n",
cust[i].num,cust[i].mail,cust[i].ID,cust[i].time,cust[i].status);
}
//显示客户数据
void display()
{
int i;
printf("客户编号 客户名称 客户电话 客户地址 客户单位 \n");
for(i=0;i<N;i++)
if(cust[i].num!=0)
printf("%5d %10s %15s %20s %20s\n",
cust[i].num,cust[i].name,cust[i].pnum,cust[i].address,cust[i].danwei);
printf("\n");
printf("客户编号 客户邮箱 客户身份证号 最后交易时间 客户状态\n");
for(i=0;i<N;i++)
if(cust[i].num!=0)
printf("%5d %20s %18s %10s %d\n",
cust[i].num,cust[i].mail,cust[i].ID,cust[i].time,cust[i].status);
}
//按客户状态查询客户
void query1()
{
int s,i;//s是输入的要查询的状态,值为0或1
printf("请输入要查询的客户状态(已流失0/未流失1):");
scanf("%d",&s);
if(s==0||s==1)
{
printf("符合条件的客户有:\n");
for(i=0;i<N;i++)
if((cust[i].status==s)&&(cust[i].num!=0))
printf(" 编号:%d 名称:%s\n",cust[i].num,cust[i].name);
}
else //当输入的值不在取值范围内时,提示输入有误
printf("输入有误");
}
//按客户名称查询
void query2()
{
char na[20];//na是输入的要查询的客户名称
int i;
printf("请输入要查询的客户名称:");
scanf("%s",na);
for(i=0;i<N;i++)
if(strcmp(cust[i].name,na)==0)
{
printf("客户编号 客户名称 客户电话 客户地址 客户单位 \n");
printf("%5d %10s %15s %20s %20s\n",
cust[i].num,cust[i].name,cust[i].pnum,cust[i].address,cust[i].danwei);
printf("客户编号 客户邮箱 客户身份证号 最后交易时间 客户状态\n");
printf("%5d %20s %18s %10s %d\n",cust[i].num,cust[i].mail,cust[i].ID,cust[i].time,cust[i].status);
break;
}
if(i==N) //当输入的客户名称不存在时,进行提示
printf("\n输入的客户名称不存在\n");
}
//按客户状态统计个数
void sum()
{
int st,i,nn;//st表示要查询的客户状态,值为0或1;通过nn累计人数
printf("请输入要查询的客户状态(已流失0/未流失1):");
scanf("%d",&st);
if(st==0||st==1)
{
for(i=0,nn=0;i<N;i++)
if(cust[i].status==st)
nn++;
printf("有%d位客户符合条件",nn);
}
else //当输入的值不在取值范围内时,提示输入有误
printf("输入有误");
}
int main()
{
readFromFile(); //从文件中读取客户数据
int c;
do
{
printf("\n\n");
printf(" 客户关系管理系统 \n");
printf("--------------------------------------------------------------------------------------");
printf("\n\n");
printf(" 1 录入客户数据 2 修改客户数据 3 删除客户数据 4 按客户编号排序\n");
printf(" 5 显示客户数据 6 按客户状态查询 7 按客户名称查询 8 按客户状态统计\n");
printf(" 0 退出系统 \n");
printf("\n");
printf("--------------------------------------------------------------------------------------");
printf("\n 请选择:");
scanf("%d",&c);
switch(c)
{
case 1:{input();getchar();break;}
case 2:{modify();getchar();break;}
case 3:{delet();getchar();break;}
case 4:{sort();getchar();break;}
case 5:{display();getchar();break;}
case 6:{query1();getchar();break;}
case 7:{query2();getchar();break;}
case 8:{sum();getchar();break;}
case 0:
{
printf("\n 感谢使用该系统 再见\n");
writeToFile(); //将通过操作更新后的客户数据存在文件中
exit(0);
}
default:
{
printf("\n 输入有误,请重试");
scanf("%d",&c);
}
}
}while(1);
return 0;
}
4 程序测试
4.1 测试数据说明
表1 测试数据说明
客户编号 | 客户名称 | 客户电话 | 客户地址 | 客户单位 | 客户邮箱 | 客户身份证号 | 最后交易时间 | 客户状态 |
1 | 小赵 | 13643541111 | 雁翔路1号 | 小赵有限公司 | 142431199101010010 | 20220101 | 1 | |
2 | 小钱 | 12634442222 | 雁翔路2号 | 小钱有限公司 | 142431199202020020 | 20220202 | 0 | |
3 | 小孙 | 11635483333 | 雁翔路3号 | 小孙有限公司 | 142431199303030030 | 20220303 | 1 | |
4 | 小李 | 14335424444 | 雁翔路4号 | 小李有限公司 | 142431199404040040 | 20220404 | 1 | |
5 | 小周 | 18635485555 | 雁翔路5号 | 小周有限公司 | 142431199505050050 | 20220505 | 1 | |
6 | 小武 | 17435426666 | 雁翔路6号 | 小武有限公司 | 142431199606060060 | 20210606 | 0 | |
7 | 小郑 | 19635417777 | 雁翔路7号 | 小郑有限公司 | 142431199707070070 | 20210707 | 1 | |
8 | 小王 | 12643548888 | 雁翔路8号 | 小王有限公司 | 142431199808080080 | 20210808 | 0 | |
9 | 小冯 | 15343569999 | 雁翔路9号 | 小冯有限公司 | 142431199909090090 | 20210909 | 1 | |
10 | 小陈 | 13675480000 | 雁翔路10号 | 小陈有限公司 | 142431199010100010 | 20211010 | 1 |
4.2 输出结果说明

图13 主菜单
录入客户数据:以录入1号客户数据为例

图14 录入客户数据
修改客户数据:以修改3号客户状态为例

图15 修改客户数据
删除客户数据:以删除5号客户数据为例

图16 删除客户数据
按客户编号排序:

图17.1 排序前客户数据

图17.2 排序后客户数据
显示客户数据:

图18 显示客户数据
按客户状态查询:以查询状态为“已流失”的客户数据为例

图19 按客户状态查询
按客户名称查询:以查询名称为“小孙”的客户数据为例

图20 按客户名称查询
按客户状态统计:以统计客户状态为“已流失”的客户人数为例

图21 按客户状态统计
5 课程设计总结
在课程设计期间我遇到了很多问题,有逻辑问题,也有语法问题,具体有:
(这里我就省略啦 就是列举了一些我在编程时遇到的问题)
心得体会:
经过这一周的课程设计,我充分体会到学习编程语言光靠知识点是不够的,在编写过程中总会出现各种预想不到的问题,可能是语法错误导致无法运行,也可能是逻辑问题导致运行结果有误,只能通过一次次的上机练习才能降低错误出现的频率。在课程设计过程中,我将这学期课上学到的零碎的知识点结合起来运用在实践中,这才真实感受到c语言的魅力,虽然现在只是初步掌握,只能编写一些简单的系统,但相信通过之后的上机练习,编写时注意细节,不断积累经验,自己编写c语言的能力能得以提升,对其运用能更加熟练。