訪客無法瀏覽此圖片或連結,請先 註冊 或 登入會員 。
一、系統介紹與系統簡述
簡易提款機是一個簡化的提款機系統,它提供以下幾個功能:
存簿提款:提供資料庫中客戶郵局提款功能。
跨行提款:提供資料庫中客戶跨行提款功能。
查詢餘額:提供資料庫客戶查詢資料庫中自己的金額。
有了以上的假設,我們應該要有以下這些檔案:
會員檔:用來提供客戶資訊,檔案每一行應包含四個欄位:會員代碼、會員帳號、會員姓名、會員存款。
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); /*關閉檔案*/
}