当初初学C语言的时候,老师用这个ATM机系统的项目作为讲述切入点,学完之后发现自己对这个项目懵懵懂懂。现在来重新整理一下。我会把中间遇到的问题以及值得记录的知识点做成学习笔记,以注释的形式标在涉及到该知识点的地方,然后在文章的最后以超链接来导到笔记页面。这是个大工程,我一点点来。
万事开头难,那么我们可以从简单的事情开始,由简入难。那么,一个项目怎么开始呢?
先来列举一下ATM机需要哪些功能(现在想不完整没关系,做项目的过程中会有许多灵感,可以再回头补充)
用户注册
登录→{存/取款、转账、修改密码、挂失、注销}
退出
那么,开始写了,一个函数的开始,当然是main函数啦
①登录界面main
int main()
{
char ch; //定义一个字符变量,方便之后输入字符选择服务
while(1); //作为一个基础操作界面,需要每次操作完都要显示,用while语句来保证
{
printf("请选择服务类型\n");
printf("A:用户注册\n");
printf("B:用户登录\n");
printf("C:用户退出\n");
ch=getchar(); //输入字符选择服务类型
}
}
有了登录界面,那么需要根据我们输入的字符来选择某项服务。这里用if语句来判断字符以及匹配函数。这一段仍然需要在while语句中。
if(ch =='A' || ch =='a') //输入A或a选择服务,为了用户使用方便,这里不区分大小写
{
Register(); //用于注册操作的函数,之后会在main函数之外定义
}
else if(ch =='B' || ch =='b')
{
Login(); //登录。注意:若在main函数之后定义,则需在之前声明
}
else if(ch =='C' || ch =='c')
{
exit(0); //退出程序(需加头文件stdlib.h)
}
else
{
printf("输入有误!请输入A/a,B/b,C/c选择服务\n");
getch(); //这里需要停顿一下,随便一个字符就可以,不然提示语会一闪而过
}
fflush(stdin); //需要清除一下输入缓存区,不然从别的界面跳回来之后会直接调用里面的字符导致程序出错
system("cls"); //清一下屏,不然会跟之前的一个屏,效果是重新换回之前界面
以上main函数就大体出来了,接下来写各服务函数
②注册函数Register
先写一个基础页面
void Register()
{
system("cls"); //清屏,新的操作界面新的屏
printf("欢迎注册\n");
printf("请输入用户名\n");
fflush(stdin);
gets(u.name); //一个用户的背后,有很多的数据,之后会在所有函数之前加一个结构体来存放这些数据
}
既然是注册用户,当然需要设置密码了。
char pw[6];
char pw1[6];
int time=0; //用来记一共注册错误多少次
while(1) //确认密码若出现错误,需重新输入,所以用while语句保证仍会保持在输入密码界面
{
if(time == 3) //给予三次注册机会,若三次确认密码错误,则返回主界面
{
printf("密码输入次数超过三次!按任意键返回\n");
getch(); //注释❶
return; //注释❷
}
printf("请输入密码:\n");
password(pw); //密码函数,将实现六位约束跟输出加密,之后会定义
printf("请确认密码:\n"); //为了防止用户输错,需要再确认一遍
password(pw1);
if(strcmp(pw,pw1) == 0) //当确认密码与注册密码一致时,就跳出循环
{
break;
}else
{
printf("密码错误,按任意键重新输入!\n");
getch();
}
time++; //每循环一次,记一次错误
}
strcpy(u.pw,pw); //将注册的密码存入结构体中存放密码的变量
}
注册时需要把数据存入文件中保存,这样就需要文件操作
fp = fopen("ATM.dat","ab+"); //这里打开/新建文件,其他地方也会用到,所以需要在前面声明指针fp
if(fp == NULL) //判断文件是否正常打开,错误的话报错退出
{
printf("打开文件失败!按任意键返回\n");
getch();
return;
}
fseek(fp,-sizeof(tem),2); //因为需要跟其他内容读写共用一个指针,这里用fseek来控制指针位置
if(fread(&tem,sizeof(tem),1,fp)) //如果文件不为空的话,用户id+1,;否则,id从1开始
{
u.id = tem.id +1;
}else
{
u.id = 1;
}
u.money = 0; //新用户余额为0
u.stat = 1;
fseek(fp,0,2); //将文件指针放到末尾
fwrite(&user,sizeof(tem),1,fp); //写入新用户数据
fclose(fp); //关闭文件
注释: 这里用来列出我在整理过程根据遇到问题所做笔记的超链接
注释❶:getch();与getchar();
注释❷:return;