11 12
發新話題

[問題]教我C程式語言提款機系統

[問題]教我C程式語言提款機系統

請教我C程式語言提款機系統,或是範例

TOP

訪客無法瀏覽此圖片或連結,請先 註冊登入會員
一、系統介紹與系統簡述
        簡易提款機是一個簡化的提款機系統,它提供以下幾個功能:
存簿提款:提供資料庫中客戶郵局提款功能。
跨行提款:提供資料庫中客戶跨行提款功能。
查詢餘額:提供資料庫客戶查詢資料庫中自己的金額。

有了以上的假設,我們應該要有以下這些檔案:
會員檔:用來提供客戶資訊,檔案每一行應包含四個欄位:會員代碼、會員帳號、會員姓名、會員存款。
member2.txt

1 22        9032        15468000
2 11        9031        95468000
3 33        9030        25468000
4 44        9034        55468000
5 55        9035        45298000         

二、資料及檔案結構說明
在程式當中,我們建構並使用了一個資料結構:會員資料結構(member structure),用來紀錄每一筆會員資料,每一筆會員資料應含有以下的欄位:
代碼(int num)
帳號(int ID)
密碼(long int password)
存款(long int money),表示會員帳號內存款。
圖示概念圖如下:

會員(member)          
欄位意義        欄位名稱          
代碼          int  num          
帳號          int  id          
密碼          Long int password          
存款          Long int  money         

三、主程式解析
主程式main()
功能:根據使用者的選擇而執行相對應的動作(1.提款,2.轉帳,3.查詢紀錄)。
流程圖



程式碼
void main()
{       
long int PW=0;
        int a,j,i,l;                /*a試判斷ID與密碼用的*/
        int id;
        fp=fopen("member2.txt","r");
        q=readfile(guide);                /*讀入檔案,共有q-1組*/
        fclose(fp);
        printf("歡迎光臨此提款機\n");
        for(j=1;j<=3;j++)                                               
        {
                printf("請輸入提款卡ID:");                                /*輸入帳號ID*/
                scanf("%d",&id);
                a=check_id(id);                                /*副程式:確認資料庫是否有此ID*/
                if(a==1)
                break;
                else
                printf("ID輸入錯誻᭚⩻
        }

    for(i=1;i<=3;i++)
        {
                printf("請輸入密碼:");                                        /*輸入密碼PW*/
                scanf("%d",&PW);                       
                a=check_PW(PW);                                                        /*副程式:確認密碼*/
                if(a==1)
                break;
                else
                printf("密碼輸入錯誻᭚⩻
                if(i==3)
                {       
                        printf("你的卡已經被怪獸吃掉啦!!\n");   /*密碼輸入錯誤三次*/
                        printf("請帶100萬元向OSAKADO贖回");    /*程式中斷結束*/
                        goto end;
                }
        }
        withdraw();                        /*選擇服務項目*/
        writefile(guide);        /*資料更改後寫入檔案*/
        end:                                /*終止用*/
                        printf("\n");
        }

四、副程式解析
int readfile(struct member guide[])
功能:讀檔進來
參數:struct member guide[]
回傳值:回傳值i告知檔案裡有i組資料
流程圖:

  
程式碼:
int readfile(struct member guide[])             /*副程式*/
{
        if((fp=fopen("member2.txt","r"))==NULL)   /*看是否能開啟檔案*/
        {
                printf("can not open the file");        /不行的話就顯示」can not
        }                                     open the file」 */

        int i=0;               
        int fileend=0;              /*fileend  宣告偵測是否已到檔案結尾*/
        while(fileend==feof(fp))         /*feof函數檢查是否已到檔案結尾,*/
/*若不是則傳回0,若是則傳回非0的值*/
        {
                i=i+1;
                fscanf(fp,"%d",&guide.num);         /*讀取檔案資料的num*/
        fscanf(fp,"%s",&guide.ID);           /*讀取檔案資料的ID*/
                fscanf(fp,"%ld",&guide.password); /*讀取檔案資料的password*/
                fscanf(fp,"%ld",&guide.money);     /*讀取檔案資料的money*/

        }
        return i;

}















2. check_id(int id)
說明:當我們輸入帳號時,尋找資料庫中是否有此帳號
輸入參數:id帳號
傳回值:資料庫有此帳號id,傳回1;否則傳回0
流程圖:

程式碼:

check_id(int id)                 /*副程式:確認資料庫內帳號是否存在*/
{
                int n;
                for(n=1;n<=q-1;n++)
                {
                        if(id==guide[n].ID)
                                return 1; /*帳號ID存在傳回值1*/
                }
                return 0; /*帳號ID不存在傳回值0*/
}
3. check_PW(long int PW)
說明:當我們輸入密碼(PW)時,比對此帳號密碼是否正確
輸入參數:PW(帳號密碼)
傳回值:PW正確,傳回1;不正確傳回0
流程圖:


程式碼:

check_PW(long int PW) /*副程式;確認ID密碼*/
{
                if(PW==guide[n].password)
                        return 1; /*密碼正確傳回值1*/
return 0; /*密碼不正確傳回值0*/
}

4. withdraw()
說明:當我們確認帳號和密碼皆為正確後,即可執行提款的動作
輸入參數:無,因為我們定義structure的矩陣和資料為全域變數
傳回值:無,在副程式內就把資料提款和顯示的最後步驟做完,無傳回值
流程圖:


程式碼:
void withdraw()
{
        long int x;                /*x表示提款的金額數目*/
        int T;                /*T表示提款類別*/

        printf("\n1.存簿提款\n");
        printf("2.跨行提款\n");
        printf("3.查詢結餘\n");

        printf("請輸入欲使用的服務類別(1~3):");
        scanf("%d",&T);

        if(T>=1&&T<=3)
        {
                switch(T)
                {
                case 1:
                        printf("請輸入欲提款金額:");
                        scanf("%ld",&x);
                        if(x<=guide[n].money)
                        {
                                guide[n].money=guide[n].money-x;
                        }
                        else
                                printf("輸入金額錯誤,餘額不足\n");
                        break;
                case 2:
                        printf("請輸入欲提款金額:");
                        scanf("%ld",&x);
                        if(x<=guide[n].money-6)
                        {
                                guide[n].money=guide[n].money-x-6;        /*跨行手續費6元*/
                        }
                        else
                                printf("輸入金額錯誤,餘額不足\n");
                        break;
                case 3:
                        x=0;
                        break;
                }
        }

        printf("本次提款金額:%d元整\n",x);
        printf("您的餘額還有%ld元整\n",guide[n].money);
        printf("謝謝您的使用,歡迎再度利用本局提款。");
}


5. writefile()
說明:將結果存到member2.txt的檔案中
輸入參數:struct member guide[]
傳回值:無
流程圖:


程式碼:
int writefile(struct member guide[])             /*副程式*/
{
        int i;                             
         fp=fopen("member2.txt","w");            /*開啟檔案*/
         for(i=1;i<=q-1;i++)
         {
                        fprintf(fp,"%d\t」,guide.num);   /*將矩陣的num寫到檔案*/
            fprintf(fp,「%d\t」,guide.ID);   /*將矩陣的ID寫到檔案*/
            fprintf(fp,「%ld\t」,guide.password);  /*將矩陣的password寫到檔案*/
            fprintf(fp,「%ld\n」,guide.money);   /*將矩陣的money寫到檔案*/
                }
         fclose(fp);           /*關檔*/
}

五、程式執行範例
一開始程式顯示主選單,並輸入ID與密碼
***************************
歡迎光臨此提款機
***************************
請輸入提款卡ID:22
請輸入密碼:9032


之後選擇服務項目
***************************
歡迎光臨此提款機
***************************
請輸入提款卡ID:22
請輸入密碼:9032
1.存簿提款
2.跨行提款
3.查詢結餘
請輸入欲使用的服務類別(1~3):



選擇存簿提款並輸入提款金額
***************************
歡迎光臨此提款機
***************************
請輸入提款卡ID:22
請輸入密碼:9032
1.存簿提款
2.跨行提款
3.查詢結餘
請輸入欲使用的服務類別(1~3):1
請輸入欲提款金額:4000
執行完結果為
***************************
歡迎光臨此提款機
***************************
請輸入提款卡ID:22
請輸入密碼:9032
1.存簿提款
2.跨行提款
3.查詢結餘
請輸入欲使用的服務類別(1~3):1
請輸入欲提款金額:4000
本次提款金額:4000元整
您的餘額還有15455494元整
謝謝您的使用,歡迎再度利用本局提款

選擇跨行提款並輸入提款金額
***************************
歡迎光臨此提款機
***************************
請輸入提款卡ID:22
請輸入密碼:9032
1.存簿提款
2.跨行提款
3.查詢結餘
請輸入欲使用的服務類別(1~3):2
請輸入欲提款金額:8000



執行完結果為
***************************
歡迎光臨此提款機
***************************
請輸入提款卡ID:22
請輸入密碼:9032
1.存簿提款
2.跨行提款
3.查詢結餘
請輸入欲使用的服務類別(1~3):2
請輸入欲提款金額:8000
本次提款金額:8000元整
您的餘額還有25459994元整
謝謝您的使用,歡迎再度利用本局提款

選擇查詢結餘
***************************
歡迎光臨此提款機
***************************
請輸入提款卡ID:44
請輸入密碼:9034
1.存簿提款
2.跨行提款
3.查詢結餘
請輸入欲使用的服務類別(1~3):3
本次提款金額:0元整
您的餘額還有55468000元整
謝謝您的使用,歡迎再度利用本局提款

如果輸入密碼錯誤3次
***************************
歡迎光臨此提款機
***************************
請輸入提款卡ID:55
請輸入密碼:94
密碼輸入錯誤
請輸入密碼:34
密碼輸入錯誤
請輸入密碼:54
密碼輸入錯誤
你的卡已經被怪獸吃掉啦!
請帶100萬元向OSAKADO贖回

六、完整程式碼和註解
#include<stdio.h>
#include<string.h>

FILE *fp;                                /*宣告檔案*/

struct member                        /*宣告結構*/
{
    int  num;
        int ID;
        long int password;
        long int money;
};

int q,n;                                /*q:資料庫內資料數,n:執行程式中第幾筆資料*/
int readfile(struct member guide[]);                /*讀檔*/
int writefile(struct member guide[]);                /*寫檔*/
struct member guide[100];
check_id(int ID);                                /*尋找資料庫是否有此帳號ID副程式*/
check_PW(long int PW);                        /*確認ID密碼是否正確副程式*/
void withdraw();

void main()
{
        long int PW=0;
        int a,i;                                        /*a:確認資料庫帳號和密碼傳回之值*/
        int id;
        int l;

        fp=fopen("member2.txt","r");
        if((fp=fopen("member2.txt","r"))==NULL)                /*看是否能開啟檔案*/
        {
                printf("can not open the file");        /*不行的話就顯示"can not open the file" */
        }
        q=readfile(guide);                                                        /*呼叫讀檔副程式*/
       
        fclose(fp);                                                /*關檔*/

        printf("**********************************\n");
        printf("      歡迎光臨此提款機\n");
        printf("**********************************\n");
        for(n=1;n<=3;n++)
        {
                printf("請輸入提款卡ID:");
                scanf("%d",&id);
                a=check_id(id);                                /*確認資料庫是否有此ID副程式*/
                if(a==1)
                break;
                else
                printf("ID輸入錯誻᭚⩻
        }

    for(i=1;i<=3;i++)
        {
                printf("請輸入密碼:");
                scanf("%d",&PW);
                a=check_PW(PW);                                /*確認帳號密碼副程式*/
                if(a==1)
                break;
                else
                printf("密碼輸入錯誻᭚⩻
                if(i==3)
                {       
                        printf("你的卡已經被怪獸吃掉啦!!\n");/*輸入密碼錯誤三次*/
                        printf("請帶100萬元向OSAKADO贖回");
                        goto end;                                /*中斷程式*/
                }
        }
       
        withdraw();                                                /*選擇服務項目*/

        writefile(guide);                                /*呼叫寫檔副程式*/
       
        end:
                        printf("\n");
        scanf("%d",&p);
}

int readfile(struct member guide[])
{
        int i=0;
   
        int fileend=0;                                                /*fileend  宣告偵測是否已到檔案結尾*/
        if((fp=fopen("member2.txt","r"))==NULL)                /*看是否能開啟檔案*/
        {
                printf("can not open the file");        /*不行的話就顯示"can not open the file" */
        }
        while(fileend==feof(fp))                         /*feof函數檢查是否已到檔案結尾,*/
                                                                        /*若不是則傳回0,若是則傳回非0的值*/
        {
                i=i+1;
                fscanf(fp,"%d",&guide.num); /*讀取檔案資料的num*/
        fscanf(fp,"%d",&guide.ID);/*讀取檔案資料的ID*/
                fscanf(fp,"%ld",&guide.password);/*讀取檔案資料的password*/
                fscanf(fp,"%ld",&guide.money);/*讀取檔案資料的money*/

        }
        return i;
}
check_id(int id)        /*副程式:確認資料庫內帳號是否存在*/
{
        for(n=1;n<=q-1;n++)
        {
                if(id==guide[n].ID)  /*帳號ID存在傳回值1*/
                        return 1;
        }
        return 0;                                 /*帳號ID不存在傳回值0*/
}

check_PW(long int PW)/*副程式;確認ID密碼*/
{

         
                if(PW==guide[n].password)
                        return 1;                        /*密碼正確傳回值1*/
       
        return 0;                                        /*密碼不正確傳回值0*/
}

void withdraw()                                        /*服務項目副程式*/
{
        long int x;        /*x表示提款的金額數目*/
        int T;                /*T表示提款類別*/

        printf("\n1.存簿提款\n");
        printf("2.跨行提款\n");
        printf("3.查詢結餘\n");

        printf("請輸入欲使用的服務類別(1~3):");
        scanf("%d",&T);

        if(T>=1&&T<=3)                                /*選擇項目*/
        {
                switch(T)
                {
                case 1:
                        printf("請輸入欲提款金額:");
                        scanf("%ld",&x);
                        if(x<=guide[n].money)
                        {
                                guide[n].money=guide[n].money-x;
                        }
                        else
                                printf("輸入金額錯誤,餘額不足\n");
                        break;

                case 2:
                        printf("請輸入欲提款金額:");
                        scanf("%ld",&x);
                        if(x<=guide[n].money-6)
                        {
                                guide[n].money=guide[n].money-x-6;        /*跨行手續費6元*/
                        }
                        else
                                printf("輸入金額錯誤,餘額不足\n");
                        break;
                case 3:
                        x=0;
                        break;
                }
        }

        printf("本次提款金額:%d元整\n",x);
        printf("您的餘額還有%ld元整\n",guide[n].money);
        printf("謝謝您的使用,歡迎再度利用本局提款。");
}
int writefile(struct member guide[])                                /*寫檔副程式*/
{
        int i;
         fp=fopen("member2.txt","w");                   /*開啟member2.txt檔*/
         for(i=1;i<=q-1;i++)
         {
                       
                fprintf(fp,」%d\t」,guide.num);                            /*將矩陣的num寫到檔案*/
        fprintf(fp,」%d\t」,guide.ID);                                 /*將矩陣的ID寫到檔案*/
                fprintf(fp,」%ld\t」,guide.password);                /*將矩陣的password寫到檔案*/
        fprintf(fp,」%ld\t」,guide.money);                /*將矩陣的money寫到檔案*/
         fclose(fp);                                                                        /*關閉檔案*/
}

TOP

挖~

寫這麼詳細竟然沒人來逛~~真可惜~~推推推~~目前我正在學c語言剛好複習一下

TOP

我目前也在學習當中..寫的真棒!!還是有點看不懂!!

TOP

=.=完全看不懂..
我才剛學..好累喔...為什麼學電的..都那麼累....

TOP

寫的真的很詳細
不過對初學都來說有一點太難了
初學的人應該先教一些基本概念吧

TOP

好複雜...
剛學不久呀!

TOP

好複雜喔
不過對於初學著來講很容易懂

TOP

超讚的,而且還有註解,隨然我沒有全看完,可是知道大大的用心,謝謝

TOP

超讚的,而且還有註解,隨然我沒有全看完,可是知道大大的用心,謝謝

TOP

 11 12
發新話題

本站所有圖文均屬網友發表,僅代表作者的觀點與本站無關,如有侵權請通知版主會盡快刪除。