ATM管理系統(C語言)


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM