[编程内容]

ATM(Automatic Teller Machine,自动取款机)的工作流程。依据帐户信息:姓名、帐号、密码、余额,完成ATM机功能:登录、显示余额、取款、修改密码。

    程序工作流程:

  • 显示登录界面:      帐号:

                                  密码:                   

     接受用户输入。

  • 若为非法用户,提示出错,并重新登录,3次出错后退出;
  • 若为合法用户,则显示操作菜单,提供下述服务:

    ① 显示基本信息

    ② 修改密码

    ③ 查询余额

    ④ 存款

    ⑤ 取款

    ⑥ 退出

[编程分析]

① 利用数组作为存储单位,保存储户信息;

② 使用文件记载储户信息,程序启动时加载储户信息进入,程序退出时将链表中的储户信息写入文件;

③ 使用链表结构记录有关数据,使用链表完成相关操作;

 

[步骤]

一、用一个数组表示一个储户

struct people
{
char name[10];
char account[20];
char password[10];
float money;
struct people*next;
};

 

二、建立main函数

void main()
{
int i,z,a,t=0;
char account[20],password[10],ch;
struct people *head,*p;  
FILE *fp=fopen("1.txt","r");  
head=NULL;  
 
 
if(fp==NULL){printf("系统出错");return 1;}/*4*/
for(i=0;i<5;i++)                                      /*5*/
{
p=(struct people*)malloc(sizeof(struct people));         /*6*/
fscanf(fp,"%s%s%s%f",p->name,p->account,p->password,&(p->money));
p->next=head;                                    /*8*/
head=p;                                         /*9*/
}                
fclose(fp);
printf("***********欢迎使用ATM自动取款机***********\n");
printf("*******************************************\n");
denglu(head,p);
 
}
  •  分析

   文件:2——fopen函数原型 FILE * fopen(const char * path,const char * mode);参数path字符串包含欲打开的文件路径及文件名,参数mode字符串则代表着流形态(1.txt的内容见附件;mode流形态链接


——fopen函数若打开文件不成功,返回NULL;

——fscanf函数

int fscanf(FILE*stream,constchar*format,[argument...]);FILE *stream:文件指针;char *format:格式字符串;[argument...]:输入列表。

: 从一个流中执行格式化输入,fscanf遇到空格和换行时结束,注意空格时也结束。这与fgets有区别,fgets遇到空格不结束;

——fclose函数关闭文件。

链表:1——定义头指针head和遍历指针p;

——malloc函数为结点分配空间(malloc函数链接

——结点的next指针指向上一个结点;

——设置当前结点为头结点。

注意:1不能放在2后面,2表示FILE*指针fp的初始化,C中要求把变量的声明放在最前面。

 

三、建立功能函数

void denglu(struct people *head,struct people *p);
void jiemian(struct people *head,struct people *p);
void chaxun(struct people *head,struct people *p);
void qukuan(struct people *head,struct people *p);
void cunkuan(struct people *head,struct people *p);
void xiugai(struct people *head,struct people *p);
void tuika(struct people *head,struct people *p);
void xinxi(struct people *head,struct people *p);

[程序错误和缺陷]

错误:登录界面上第一次输入账号错误,有时会自动退出程序,不进入循环;

缺陷:

  • 登录界面不能实现:      帐号:

                                        密码:    

         风格,而只能在把账号输入后显示“密码”;

  •  建立管理员界面,实现储户的增加、减少和储户信息的更改,要求用到链表结点的增加、删除、查找;
  • 5个储户信息);
  • 想一想如果此程序每次运行都需要将文件中的储户信息读入程序链表中,那当文件中的储户量达到一个很大的数字时,每次程序往链表中读入或写入数据时不但要消耗大量的时间,还需要计算机有足够的空间,程序效率太差。

 

 

[程序代码]


 

[附件]

1.txt内容:

zhangsan 2015001 123456 10000.000000
lisi 2015002 123456 6000.000000
wangwu 2015003 123456 4000.000000
cj 2015004 123456 100000.000000
jiaojiao 2015005 123456 100000.000000