C语言课设——客户关系管理系统(附完整源代码)

一个不太成熟的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函数

  1. 函数的原型声明

void input();

  1. 函数功能及参数声明

函数功能:客户数据录入,将输入的数据存在数组cust[N]中

参数声明:无参函数

  1. 函数中使用的关键变量声明

int i;

char p;//判别是否继续录入

  1. 算法设计

图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函数

  1. 函数的原型声明

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号

小赵有限公司

123456111@qq.com

142431199101010010

20220101

1

2

小钱

12634442222

雁翔路2号

小钱有限公司

123456222@qq.com

142431199202020020

20220202

0

3

小孙

11635483333

雁翔路3号

小孙有限公司

123456333@qq.com

142431199303030030

20220303

1

4

小李

14335424444

雁翔路4号

小李有限公司

123456444@qq.com

142431199404040040

20220404

1

5

小周

18635485555

雁翔路5号

小周有限公司

123456555@qq.com

142431199505050050

20220505

1

6

小武

17435426666

雁翔路6号

小武有限公司

123456666@qq.com

142431199606060060

20210606

0

7

小郑

19635417777

雁翔路7号

小郑有限公司

123456777@qq.com

142431199707070070

20210707

1

8

小王

12643548888

雁翔路8号

小王有限公司

123456888@qq.com

142431199808080080

20210808

0

9

小冯

15343569999

雁翔路9号

小冯有限公司

123456999@qq.com

142431199909090090

20210909

1

10

小陈

13675480000

雁翔路10号

小陈有限公司

123456000@qq.com

142431199010100010

20211010

1

4.2 输出结果说明

图13 主菜单

录入客户数据:以录入1号客户数据为例

图14 录入客户数据

修改客户数据:以修改3号客户状态为例

图15 修改客户数据

删除客户数据:以删除5号客户数据为例

图16 删除客户数据

按客户编号排序:

图17.1 排序前客户数据

图17.2 排序后客户数据

显示客户数据:

图18 显示客户数据

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

图19 按客户状态查询

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

图20 按客户名称查询

按客户状态统计:以统计客户状态为“已流失”的客户人数为例

图21 按客户状态统计

5 课程设计总结

在课程设计期间我遇到了很多问题,有逻辑问题,也有语法问题,具体有:

(这里我就省略啦 就是列举了一些我在编程时遇到的问题)

心得体会:

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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值