1. 作業信息
| 這個作業屬於哪個課程 | 軟件工程 |
|---|---|
| 這個作業要求在哪里 | 作業要求 |
| 學號 | 3180701312 |
2.題目
編寫一個ATM管理系統,語言不限,要求應包括以下主要功能:
(1)開戶,銷戶
(2)查詢賬戶余額
(3)存款
(4)取款
(5)轉賬(一個賬戶轉到另一個賬戶)等...
3. 代碼提交與運行截圖
3.1 源代碼
(1)頭文件
//使用鏈表完成系統,賬戶信息從文檔中讀取,並用鏈表存放
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
(2)結構體與全局變量
struct users
{
char cardnum[17];//銀行卡號
char name[20];//用戶姓名
char DID[19];//身份證號
float Balance;//余額
int password;//銀行卡密碼
struct users *next;//指向下一個結點//
};
char C[3];
char title[53];
int B=7;
(3)隨機生成銀行卡號
void randc()
{
int j,m;
j=B%10;
m=B/10;
C[0]=m+'0';
C[1]=j+'0';
}
(4)結束功能(用於停頓,防止目錄刷屏太快)
void over()
{
int i;char c;
printf("輸入任意數字退出!\n");
printf("請輸入數字:");
scanf("%d",&i);
c=getchar();
}
(5)從文本中讀取用戶信息
struct users *readuser(struct users *u)
{
struct users *r=NULL,*p=NULL;
FILE *fp;//定義文件指針
p=u=(struct users *)malloc(sizeof(struct users));
if ((fp = fopen("ATM管理系統.txt", "r")) == NULL)
printf("ATM管理系統文件不存在 \n");
else
{
fgets(title, 54, fp);//讀取第一行說明:銀行卡號,用戶姓名,身份證號,余額,銀行卡密碼等;
r=(struct users *)malloc(sizeof(struct users));
while (fscanf(fp,"%s%s%s%d%f",&r->cardnum,&r->name,&r->DID,&r->password,&r->Balance)!=EOF)//如果文件沒有讀取結束,繼續讀取//
{
p->next=r;
p=r;
r=(struct users *)malloc(sizeof(struct users));
}
p->next=NULL;
}
fclose(fp);
fp=NULL;
return u;
}
(6)保存修改的用戶信息到文本中
void saveusers(struct users *u)
{
struct users *r=NULL;
FILE *fp;
r=u->next;
fp=fopen("ATM管理系統.txt","w+");
fputs(title,fp);
while(r!=NULL)
{
fprintf(fp,"\n%s\t%s\t\t%s\t%d\t\t%f\n",r->cardnum,r->name,r->DID,r->password,r->Balance);
r=r->next;
}
fclose(fp);
}
(7)查詢用戶
struct users *finduser(struct users *u)
{
char card[17];
char c;
int pass;//密碼
struct users *r=NULL;
int i,t;
while(1)
{
r=u->next;
printf("請輸入銀行卡號:");
gets(card);
printf("請輸入密碼:");
scanf("%d",&pass);
c=getchar();
t=0;
while(r!=NULL)
{
if(strcmp(r->cardnum,card)==0&&r->password==pass)
{
t=1;
return r;
}
else
r=r->next;
}
if(t==0)
printf("密碼或銀行卡號錯誤!\n");
printf("請選擇 1.繼續輸入;2.退出;\n");
printf("請輸入選項(點擊任意鍵,繼續輸入):");
scanf("%d",&i);
c=getchar();
switch(i)
{
case 2:
return NULL;
default :
break;
}
}
}
(8)存款
struct users *deposit(struct users *e)
{
int i;
char c;
float b;
printf("請確認賬戶信息!1.確定,2取消\n");
printf("銀行卡號:%s\n",e->cardnum);
printf("姓名:%s\n",e->name);
printf("請輸入選項:");
scanf("%d",&i);
c=getchar();
if(i==1)
{
printf("請輸入存入余額:");
scanf("%f",&b);
e->Balance=e->Balance+b;
printf("存入成功!\n");
}
else
{
printf("取消存款!\n");
}
return e;
}
(9)取錢
struct users *Withdrawal(struct users *e)
{
int i;
char c;
float b;
printf("請輸入取款金額:");
scanf("%f",&b);
c=getchar();
while(b>e->Balance)
{
printf("余額不足!請重新選擇!\n");
printf("1.重新輸入金額 2.取消取款\n");
printf("請輸入選項:");
scanf("%d",&i);
c=getchar();
if(i==1)
{
printf("請輸入取款金額:");
scanf("%f",&b);
}
else
{
return e;//退出
}
}
e->Balance=e->Balance-b;
printf("取款成功!\n");
return e;
}
(10)轉賬 (1.找到轉賬用戶,2.輸入小於余額金額 )
struct users *Transfer(struct users *e,struct users *u)
{
char card[17];
char c;
struct users *r=NULL;
int i,j,t;
float b;
while(1)
{
r=u->next;
printf("請輸入轉賬銀行卡號:");
gets(card);
t=0;
while(r!=NULL)
{
if(strcmp(r->cardnum,card)==0)//查找轉賬賬戶
{
t=1;
printf("請確認轉賬賬戶信息:\n");
printf("銀行卡號:%s\n",r->cardnum);
printf("姓名:%s\n",r->name);
printf("請確認賬戶信息!1.確定,2取消\n");
printf("請輸入選項:");
scanf("%d",&i);
c=getchar();
if(i==1)
{
printf("請輸入轉入金額:");
scanf("%f",&b);
c=getchar();
while(b>e->Balance)
{
printf("余額不足!請重新選擇!\n");
printf("1.重新輸入金額 2.取消轉賬\n");
printf("請輸入選項:");
scanf("%d",&j);
c=getchar();
if(j==1)
{
printf("請輸入轉賬金額:");
scanf("%f",&b);
}
else
{
printf("取消轉款!\n");
return u;
}
}
//轉賬
e->Balance=e->Balance-b;
r->Balance=r->Balance+b;
printf("轉款成功!\n");
return u;
}
else
{
printf("取消轉款!\n");
return u;
}
}
else
{
r=r->next;
}
}
if(t==0)
{
printf("銀行卡號錯誤!\n");
printf("請選擇 1.繼續輸入;2.退出;\n");
printf("請輸入選項(點擊任意鍵,繼續輸入):");
scanf("%d",&i);
c=getchar();
switch(i)
{
case 2:
return u;
default :
break;
}
}
}
}
(11)開戶
struct users *create(struct users *u)
{
int i;
struct users *s=NULL;
s=(struct users *)malloc(sizeof(struct users));
printf("請輸入身份證:");
gets(s->DID);
printf("請輸入姓名:");
gets(s->name);
printf("請輸入密碼(6位):");
scanf("%d",&s->password);
randc();
strcpy(s->cardnum,"01234567890000");
strcat(s->cardnum,C);
s->Balance=0;
printf("是否確定創建用戶:1.確定 2.取消\n");
printf("請輸入選項:");
scanf("%d",&i);
if(i==1)
{
s->next=u->next;
u->next=s;
B++;
printf("創建成功!\n");
printf("%s",title);
printf("\n%s\t%s\t\t%s\t%d\t\t%f\n",s->cardnum,s->name,s->DID,s->password,s->Balance);
}
else
{
free(s);
printf("取消創建\n");
}
return u;
}
(12)銷戶(檢查余額)
struct users *del(struct users *u)
{
struct users *e=NULL,*q=NULL;
int i;
char card[17];
int pass;//密碼
char D[19];
char c;
e=u;
q=e->next;
printf("請輸入銀行卡號:");
gets(card);
printf("請輸入密碼:");
scanf("%d",&pass);
c=getchar();
while(q!=NULL)
{
if(strcmp(q->cardnum,card)==0&&q->password==pass)
{
break;
}
e=q;
q=q->next;
}
if(q==NULL)//查找賬戶失敗!退出
{
printf("查找賬戶失敗!");
over();
return u;
}
printf("請輸入身份證號:");
gets(D);
while(1)
{
if(strcmp(q->DID,D)==0)
{
printf("取出余額%f\n",q->Balance);
printf("銷戶成功!\n");
e->next=q->next;
free(q);
return u;
}
else
{
printf("身份證號錯誤!\n");
printf("1.重新輸入身份證號 2.取消注銷\n");
printf("請輸入選項:");
scanf("%d",&i);
c=getchar();
if(i==1)
{
printf("請輸入身份證號:");
gets(D);
}
else
{
printf("取消注銷\n");
return u;
}
}
}
}
(13)界面
void menu()
{
system("cls"); //清屏操作
printf("* 歡迎進入ATM管理系統 *\n");
printf("*****************************\n");
printf("* 1.查詢賬戶余額 *\n");
printf("* 2.存 款 *\n");
printf("* 3.取 款 *\n");
printf("* 4.轉 賬 *\n");
printf("* 5.開戶 *\n");
printf("* 6.銷戶 *\n");//銷戶取出所有余額
printf("* 7.退 出 系 統 *\n");
printf("*****************************\n");
}
(14)主函數
int main()
{
struct users *u=NULL;
struct users *e=NULL;
int j,i;
char c;
u=readuser(u);//讀取用戶信息//
while (1)
{
menu();
printf("請輸入你的選擇:");
scanf("%d",&j);
c=getchar();
switch(j)
{
//查詢賬戶余額
case 1:
e=finduser(u);//查找用戶
if(e==NULL)//查找賬戶失敗!退出
{
printf("查找賬戶失敗!");
over();
break;
}
else
{
printf("賬戶余額為:%f\n",e->Balance);
over();
break;
}
//存款
case 2:
e=finduser(u);//查找用戶
if(e==NULL)//查找賬戶失敗!退出
{
printf("查找賬戶失敗!");
over();
break;
}
e=deposit(e);
saveusers(u);
over();
break;
//取錢
case 3:
e=finduser(u);//查找用戶
if(e==NULL)//查找賬戶失敗!退出
{
printf("查找賬戶失敗!");
over();
break;
}
e=Withdrawal(e);
saveusers(u);
over();
break;
//轉賬
case 4:
e=finduser(u);//查找用戶
if(e==NULL)//查找賬戶失敗!退出
{
printf("查找賬戶失敗!");
over();
break;
}
u=Transfer(e,u);
saveusers(u);
over();
break;
//開戶
case 5:
u=create(u);
saveusers(u);
over();
break;
//銷戶
case 6:
u=del(u);
saveusers(u);
over();
break;
case 7:
return 0;
default:
printf("輸入的選項錯誤,請重新輸入!\n");
break;
}
}
}
3.2運行代碼截圖
(1)用戶信息文件

(2)查詢余額

(3)存款

文件更改

(4)取款

文件更改

(5)轉賬

文件更改


(6)開戶

文件更改

(7)銷戶

文件更改

(8)退出

4. 個人小結
困難:
1.讀取文件后出現亂碼
解決:用記事本的話,打開文件→另存為修改編碼方式。選ANSI。
2.文件讀取feof();總是多讀一行亂碼
解決:使用fscanf()的返回判斷。關於fscanf的返回值是:fscanf返回的是實際讀取的數據個數,出錯或者到結尾返回EOF。在讀取最后一個字符時,fscanf不能讀到有效字符,因此結果將會返回EOF
(psp表格)
| psp2.1 | 任務內容 | 計划完成需要的時間(min) | 實際完成需要的時間(min) |
|---|---|---|---|
| Planning | 計划 | 315 | 470 |
| Estimate | 估計這個任務需要多少時間,並規划大致工作步驟 | 15 | 30 |
| Development | 開發 | 10 | 20 |
| Analysis | 需求分析(包括學習新技術) | 30 | 50 |
| Design Spec | 生成設計文檔 | 20 | 20 |
| Design Review | 設計復審 | 10 | 15 |
| Coding Standard | 代碼規范 | 10 | 10 |
| Design | 具體設計 | 30 | 60 |
| Coding | 具體編碼 | 60 | 120 |
| Code Review | 代碼復審 | 30 | 60 |
| Test | 測試(自我測試,修改代碼,提交修改) | 40 | 60 |
| Reporting | 報告 | 10 | 20 |
| Test Report | 測試報告 | 10 | 15 |
| Size Measurement | 計算工作量 | 20 | 20 |
| Postmortem & Process Improvement Plan | 事后總結,並提出過程改進計划 | 20 | 30 |
