首頁 > 軟體

C語言實現銷售管理系統設計

2022-03-22 13:00:42

本文範例為大家分享了C語言實現銷售管理系統設計的具體程式碼,供大家參考,具體內容如下

某公司有四個銷售員(編號: 1-4), 負責銷售五種產品(編號: 1-5)。 每個銷售員都將當天出售的每種產品各寫一 張便條交上來。每張便條包含內容:銷售員的代號、產品的代號、這種產品的當天的銷售額。每位銷售員每天上繳1張便條。

試設計一個便條管理系統,使之能提供以下功能:

1、系統以選單方式工作

2、便條資訊錄入功能——輸入(支援便條資訊檔案匯入)

3、便條資訊修改功能

4、便條資訊刪除功能

5、收集到了上個月的所有便條後,讀取銷售情況

      1)計算每個人每種產品的銷售額。

      2)按銷售額對銷售員進行排序,輸出排序結果(銷售員代號)

      3)統計每種產品的總銷售額,對這些產品按從高到底的順序,輸出排序結果(需輸出產品的代號和銷售額)

詳情請參考程式碼,註釋寫的很詳細,希望能給你幫助.

最後的最後有截圖展示效果.

#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
#define M 155
 
///這些函數下面會詳細的介紹的滴!
void detail();
void foreach();
void menu();
void product();
void readdata();
void seller();
void total();
void choice();
void add();
void deleteing();
void update();
void clearing();
 
 
struct ss{
    int sid;///銷售程式碼
    int pid;///產品代號
    int sn;///銷售額
}ss[M];
int n;///便條數目
int s[4][5]={{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0},{0,0,0,0,0}};///使用者儲存員工和產品資訊
 
///從檔案讀取資料
void readdata()
{
    FILE *fp;///定義檔案指標
    ///呼叫fopen函數,以唯讀模式開啟d:list.txt檔案,並驗證返回值是否為空
    if((fp=fopen("d:\list.txt","r"))==NULL)
 
    {
        printf("檔案開啟失敗!n");
        exit(0);///表示正常的退出
    }
    else
    /**feof是輸入輸出函數,檢查檔案是否結束,如結束,則返回非零值,
    否則返回0 .函數原型為:int feof(FILE *fp)**/
        for(n=0;!feof(fp);n++)
        {
            fscanf(fp,"%d %d %dn",&ss[n].sid,&ss[n].pid,&ss[n].sn);
        } ///儲存檔案資料到結構體
     fclose(fp);///關閉檔案
}
 
///從便條讀到的資料分類整理統計
void foreach()
{
    int i;
    for(i=0;i<n;i++)///遍歷所有紙條
    {
        switch(ss[i].pid)///按產品分類,再按銷售員分類,累加各人各產品銷售額
        {
            case 1:///當ss[i].pid為1的時候,也就是當產品代號為1的時候
            switch(ss[i].sid)///檢視銷售程式碼
            {
                ///當銷售程式碼為1的時候,累加1號銷售員編號為1的產品的銷售額
                case 1:s[0][0]+=ss[i].sn;break;
                ///當銷售程式碼為2的時候,累加2號銷售員編號為1的產品的銷售額
                case 2:s[1][0]+=ss[i].sn;break;
                ///當銷售程式碼為3的時候,累加3號銷售員編號為1的產品的銷售額
                case 3:s[2][0]+=ss[i].sn;break;
                ///當銷售程式碼為4的時候,累加4號銷售員編號為1的產品的銷售額
                case 4:s[3][0]+=ss[i].sn;break;
            }
            break;
            ///以下程式碼同理可得
            case 2:
            switch(ss[i].sid)
            {
                case 1:s[0][1]+=ss[i].sn;break;
                case 2:s[1][1]+=ss[i].sn;break;
                case 3:s[2][1]+=ss[i].sn;break;
                case 4:s[3][1]+=ss[i].sn;break;
            }
            break;
 
            case 3:
            switch(ss[i].sid)
            {
                case 1:s[0][2]+=ss[i].sn;break;
                case 2:s[1][2]+=ss[i].sn;break;
                case 3:s[2][2]+=ss[i].sn;break;
                case 4:s[3][2]+=ss[i].sn;break;
            }
            break;
 
            case 4:
            switch(ss[i].sid)
            {
                case 1:s[0][3]+=ss[i].sn;break;
                case 2:s[1][3]+=ss[i].sn;break;
                case 3:s[2][3]+=ss[i].sn;break;
                case 4:s[3][3]+=ss[i].sn;break;
            }
            break;
 
            case 5:
            switch(ss[i].sid)
            {
                case 1:s[0][4]+=ss[i].sn;break;
                case 2:s[1][4]+=ss[i].sn;break;
                case 3:s[2][4]+=ss[i].sn;break;
                case 4:s[3][4]+=ss[i].sn;break;
            };
            break;
        }
    }
}
 
///選單選項
void menu()
{
    int c;
    puts("tt*********選單*********************nn");
    puts("tt 1.檢視每人每種產品的銷售額n");
    puts("tt 2.按銷售額對銷售員排序(銷售員代號)n");
    puts("tt 3.對每種產品總銷售額從高到低排序(產品代號和銷售額)n");
    puts("tt 4.輸出統計報表n");
    puts("tt 5.錄入一條便條資訊n");
    puts("tt 6.修改一條便條資訊n");
    puts("tt 7.刪除一條便條資訊n");
    puts("tt 8.退出n");
    puts("nntt*********************************************n");
    printf("請選擇(1-8):[ ]bb");
    scanf("%d",&c);
    if(c<1||c>8)///錯誤輸入,重新獲取輸入
    {
        printf("您輸入的選項不在我們服務範圍之內請確定好您要選擇的服務,重新輸入!!!n");
        menu();
    }
    else///正確輸入
    switch(c)///根據輸入實現相應函數呼叫
    {
        case 1:detail();
        break;
 
        case 2:seller();
        break;
 
        case 3:product();
        break;
 
        case 4:total();
        break;
 
        case 5:add();
        break;
 
        case 6:update();
        break;
 
        case 7:deleteing();
        break;
 
        case 8:exit(0);
    }
}
 
///計算上個月每個人每種產品的銷售額
void detail()
{
    int i,j;
    for(i=0;i<4;i++)
    {
        printf("ntt%d 號銷售員銷售情況:n",i+1);
        for(j=0;j<5;j++)
             printf("tt%d 號產品銷售額:%dn",j+1,s[i][j]);
    }
    choice();
}
 
///按銷售額對銷售員進行排序,輸出排序結果(銷售員代號)
void seller()
{
    int i,j,k;
    int sp[4]={0,0,0,0};///存銷售員的銷售額
    for(i=0;i<4;i++)///統計銷售員的銷售額
        for(j=0;j<5;j++)
            sp[i]+=s[i][j];
 
    for(i=0;i<4;i++)///排序
    {
        k=0;
        for(j=0;j<4;j++)
        {
            if(sp[k]<sp[j])
                k=j;
        }
        printf("tt第%d名是%d號銷售員!n",i+1,k+1);
        sp[k]=-1;
    }
    choice();
}
 
///對每種產品總銷售額從高到低排序(產品代號和銷售額)
void product()
{
    int i,j,k;
    int p[5]={0,0,0,0,0};///存每種產品的銷售額
    for(i=0;i<5;i++)///統計每種產品的銷售額
        for(j=0;j<4;j++)
            p[i]+=s[j][i];
 
    for(i=0;i<5;i++)///將產品的銷售額進行排序
    {
        k=0;
        for(j=0;j<5;j++)
        {
            if(p[k]<p[j])
                k=j;
        }
        printf("tt第%d名是%d號產品!銷售額為%d!n",i+1,k+1,p[k]);
        p[k]=-1;
    }
    choice();
}
 
///輸出統計報表(輸出銷售代號,產品代號和銷售額)
void total()
{
    int i,j;
    printf("nt銷售員t產品t銷售額n");
    for(i=0;i<4;i++)
        for(j=0;j<5;j++)
            printf("t%dt%dt%dn",i+1,j+1,s[i][j]);
    choice();
}
 
///選擇退出系統或返回主選單
void choice()
{
    int c;
    printf("請選擇接下來想做什麼:n1.返回選單n2.退出系統n");
    scanf("%d",&c);
    if(c==1)
        menu();
    else
        exit(0);
}
 
///錄入一條便條資訊
void add()
{
    printf("請填寫您要錄入的便條的資訊:銷售程式碼,產品程式碼,銷售額n");
    /**接著readdata()統計的文字中便條的資訊到結構體陣列裡,
    將新增的資訊首先儲存在那些資訊的後面**/
    scanf("%d %d %d",&ss[n].sid,&ss[n].pid,&ss[n].sn);
    FILE *fp;///定義檔案指標
    char *str="d:\list.txt";
    printf("該條記錄正在寫入檔案 list.txt~~~~n");
    fp=fopen(str,"a");///引數"a"意思是說將新新增的資料接著文字裡的資料寫,不會覆蓋文字裡的內容
    fprintf(fp,"n%dt%dt%d",ss[n].sid,ss[n].pid,ss[n].sn);///將結構體裡的資訊寫入文字
    fclose(fp);///關閉檔案
    printf("n該條記錄已經寫入檔案 list.txt,請前往檢視!n");
    switch(ss[n].pid)///借用foreach()函數裡的程式碼,詳情請參考foreach()函數
    {
        case 1:///當ss[i].pid為1的時候,也就是當產品代號為1的時候
        switch(ss[n].sid)///檢視銷售程式碼
        {
            ///當銷售程式碼為1的時候,累加1號銷售員編號為1的產品的銷售額
            case 1:s[0][0]+=ss[n].sn;break;
            ///當銷售程式碼為2的時候,累加2號銷售員編號為1的產品的銷售額
            case 2:s[1][0]+=ss[n].sn;break;
            ///當銷售程式碼為3的時候,累加3號銷售員編號為1的產品的銷售額
            case 3:s[2][0]+=ss[n].sn;break;
            ///當銷售程式碼為4的時候,累加4號銷售員編號為1的產品的銷售額
            case 4:s[3][0]+=ss[n].sn;break;
        }
        break;
        ///以下程式碼同理可得
        case 2:
        switch(ss[n].sid)
        {
            case 1:s[0][1]+=ss[n].sn;break;
            case 2:s[1][1]+=ss[n].sn;break;
            case 3:s[2][1]+=ss[n].sn;break;
            case 4:s[3][1]+=ss[n].sn;break;
        }
        break;
 
        case 3:
        switch(ss[n].sid)
        {
            case 1:s[0][2]+=ss[n].sn;break;
            case 2:s[1][2]+=ss[n].sn;break;
            case 3:s[2][2]+=ss[n].sn;break;
            case 4:s[3][2]+=ss[n].sn;break;
        }
        break;
 
        case 4:
        switch(ss[n].sid)
        {
            case 1:s[0][3]+=ss[n].sn;break;
            case 2:s[1][3]+=ss[n].sn;break;
            case 3:s[2][3]+=ss[n].sn;break;
            case 4:s[3][3]+=ss[n].sn;break;
        }
        break;
 
        case 5:
        switch(ss[n].sid)
        {
            case 1:s[0][4]+=ss[n].sn;break;
            case 2:s[1][4]+=ss[n].sn;break;
            case 3:s[2][4]+=ss[n].sn;break;
            case 4:s[3][4]+=ss[n].sn;break;
        };
        break;
    }
    n++;
    choice();
}
 
/**刪除便條資訊流程:新建一個臨時檔案,將不被刪除的便條資訊存到臨時檔案裡,
然後刪除原檔案,再將臨時檔案改名為原檔案的檔名**/
void deleteing()
{
    printf("請輸入您要刪除的便條的資訊:銷售程式碼,產品程式碼,銷售額n");
    int a,b,c;///存使用者需要刪除的便條的資訊
    scanf("%d %d %d",&a,&b,&c);
    printf("請稍等,您選擇的便條正在刪除~~~n");
    FILE *fin,*ftp;
    int x,y,z;
    fin=fopen("d:\list.txt","r");///讀開啟原檔案list.txt
    ftp=fopen("d:\tmp.txt","w");///寫開啟臨時檔案tmp.txt
    if(fin==NULL || ftp==NULL){
        printf("檔案開啟失敗!n");
        exit(0);
    }
    int m=0;///該變數是控制寫入文字是首行不自動換行
    for(int i=0;!feof(fin);i++)
    {
        fscanf(fin,"%d %d %dn",&x,&y,&z);///從原檔案讀取到的一行資料放到x,y,z三個變數中
        if(x==a&&y==b&&z==c)///所有的資料相等,說明是要刪除的便條,則不寫入臨時檔案
            continue;
        else///將不是要刪除的其他便條資訊寫入臨時檔案
        {
            if(m==0)
            {
                fprintf(ftp,"%dt%dt%d",x,y,z);///不是則將這一行寫入臨時檔案tmp.txt
                m++;
            }
            else
                fprintf(ftp,"n%dt%dt%d",x,y,z);///不是則將這一行寫入臨時檔案tmp.txt
        }
    }
    fclose(fin);
    fclose(ftp);
    system("DEL/f d:\list.txt");///刪除原檔案,如果刪除錯誤,會報原因
    ///unlink("d:\list.txt");///刪除原檔案
    rename("d:\tmp.txt","d:\list.txt");///將臨時檔名改為原檔名
    printf("您選擇的便條已經刪除,請開啟檔案檢視!n");
    clearing();
    readdata();
    foreach();
    choice();
}
 
///清空之前所統計的原檔案裡的銷售員和銷售產品所對應的銷售額
void clearing()
{
    for(int i=0;i<4;i++)
    {
        for(int j=0;j<5;j++)
            s[i][j]=0;
    }
}
 
/**更新便條資訊流程:新建一個臨時檔案,將原檔案裡的東西複製到臨時檔案中,在複製的過程中,
需要修改的東西修改之後再放入臨時檔案,然後刪除原檔案,將臨時檔案改名為原檔案的名字**/
void update()
{
    printf("請輸入您要修改的便條的資訊:銷售程式碼,產品程式碼,銷售額n");
    int a,b,c,d,e,x,y,z;
    scanf("%d %d %d",&a,&b,&c);
    printf("請問您要修改該便條中那一項資訊:n(1)銷售程式碼n(2)產品程式碼n(3)銷售額n");
    scanf("%d",&d);
    printf("請問您要將該項資訊修改成什麼(請輸入數位):n");
    scanf("%d",&e);
    printf("您選擇的便條正在修改中~~~~~n");
    FILE *fin=fopen("d:\list.txt","r");
    FILE *ftp=fopen("d:\tmp.txt","w");  ///是充當臨時檔案作用
    if(!fin)
    {
        printf("不能開啟list.txt檔案n");
        exit(1);
    }
    if(!ftp)
    {
        printf("不能開啟tmp.txt檔案n");
        exit(1);
    }
    int m=0;///該變數是控制寫入文字時首行不自動換行
    ///開始複製
    switch(d)///根據選項修改(1)銷售程式碼 (2)產品程式碼 (3)銷售額
    {
        case 1:///(1)銷售程式碼
        {
               for(int i=0;!feof(fin);i++)
                {
                    fscanf(fin,"%d %d %dn",&x,&y,&z);
                    if(x==a&&y==b&&z==c)///檢驗是要修改的行嗎
                    {
                        x=e;
                        if(m==0)
                        {
                            fprintf(ftp,"%dt%dt%d",x,y,z);///將修改過的資料寫入臨時檔案
                            m++;
                        }
                        else
                            fprintf(ftp,"n%dt%dt%d",x,y,z);///將修改過的資料寫入臨時檔案
                    }
                    else
                    {
                        if(m==0)
                        {
                            fprintf(ftp,"%dt%dt%d",x,y,z);///將原本的資料寫入臨時檔案
                            m++;
                        }
                        else
                            fprintf(ftp,"n%dt%dt%d",x,y,z);///將原本過的資料寫入臨時檔案
                    }
                }
            }
            break;
 
        ///以下程式碼同理可得
        case 2:
        {
            for(int i=0;!feof(fin);i++)
                {
                    fscanf(fin,"%d %d %dn",&x,&y,&z);
                    if(x==a&&y==b&&z==c)///檢驗是要修改的行嗎
                    {
                        y=e;
                        if(m==0)
                        {
                            fprintf(ftp,"%dt%dt%d",x,y,z);///將修改過的資料寫入臨時檔案
                            m++;
                        }
                        else
                            fprintf(ftp,"n%dt%dt%d",x,y,z);///將修改過的資料寫入臨時檔案
                    }
                    else
                    {
                        if(m==0)
                        {
                            fprintf(ftp,"%dt%dt%d",x,y,z);///將原本的資料寫入臨時檔案
                            m++;
                        }
                        else
                            fprintf(ftp,"n%dt%dt%d",x,y,z);///將原本過的資料寫入臨時檔案
                    }
                }
        }
        break;
 
        case 3:
        {
            for(int i=0;!feof(fin);i++)
                {
                    fscanf(fin,"%d %d %dn",&x,&y,&z);
                    if(x==a&&y==b&&z==c)///檢驗是要修改的行嗎
                    {
                        z=e;
                        if(m==0)
                        {
                            fprintf(ftp,"%dt%dt%d",x,y,z);///將修改過的資料寫入臨時檔案
                            m++;
                        }
                        else
                            fprintf(ftp,"n%dt%dt%d",x,y,z);///將修改過的資料寫入臨時檔案
                    }
                    else
                    {
                        if(m==0)
                        {
                            fprintf(ftp,"%dt%dt%d",x,y,z);///將原本的資料寫入臨時檔案
                            m++;
                        }
                        else
                            fprintf(ftp,"n%dt%dt%d",x,y,z);///將原本過的資料寫入臨時檔案
                    }
                }
        }
        break;
    }
    fclose(fin);
    fclose(ftp);
     printf("您選擇的便條已經修改完畢,請開啟檔案檢視!n");
    system("DEL/f d:\list.txt");///刪除原檔案,刪除錯誤的時候會報提示資訊
    ///unlink("d:\list.txt");///刪除原檔案
    rename("d:\tmp.txt","d:\list.txt");///改名
    clearing();
    readdata();
    foreach();
    choice();
}
 
int main()
{
    readdata();///讀取檔案資料
    foreach();///初始化陣列
    menu();///顯示主選單
}

首先在D槽下新建一個文字檔案 ,名為 list.txt,在文字檔案裡存入的資料如下(資料僅供參考):

然後我們開始執行該程式:

對於上圖第五項新增便條資訊的操作,我們 來看一看文字裡的內容(最後一行就是新添的資料)

在我們執行第六個選項的時候,首先需要在D槽下新建一個文字檔案  tmp.txt,至於為啥,詳情請參考程式碼,程式碼裡面有詳細的解釋

我們再去檢視D槽裡的檔案,這時tmp.txt不見了,只剩下  list.txt,裡面的內容如下(為什麼會醬紫呢?快去檢視程式碼吧):

在我們執行第七個選項的時候,需要在D槽下重新新建一個文字檔案  tmp.txt,至於為啥,詳情請參考程式碼,程式碼裡面有詳細的解釋

我們再去檢視D槽裡的檔案,這時tmp.txt不見了,只剩下  list.txt,裡面的內容如下(為什麼會醬紫呢?快去檢視程式碼吧):

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com