C语言实现_ATM自动取款机系统

本文介绍了一个基于文本界面的简易ATM系统的设计与实现过程,包括登录验证、账户操作等功能。系统采用C语言编写,利用数组、指针等技术点,并通过函数封装实现了良好的模块化。

一、系统简介

1、使用技术点:

数组:把具有相同数据类型的若干变量按有序的形式组起来,以便于程序处理,这些数据元素的集合就是数组。

指针:指针是一个特殊的变量,它里面存储的是地址。

文本文件:数据在相关介质上的表现形式。

函数:具有某种特定意义的代码的集合,利用它可实现代码的重用。

2、主要功能模块:

欢迎界面、登陆界面、操作界面、退出系统。

二、演示效果

进入系统后,有提示信息,界面为绿色代表安全。

选择Y登陆系统

登陆界面密码星号化,使得系统更安全,用户信息存储在文件中。

登陆成功后进入主界面。

选择相应的选项可以执行相应的功能


三、功能实现

1、欢迎界面的实现用函数welcom实现,建立.h文件命名welcom.h

void wel()//欢迎界面;
{
	FILE *fp;
	if((fp=fopen("data/welcome.txt","r"))!=NULL)
	{
		char ch[10000];
		while(!feof(fp))
		{
			fgets(ch,100,fp);
			printf(ch);
			Sleep(200);
		}
		printf("\n\n");
		fclose(fp);
	}
}
void menu()//主菜单;
{
	
	FILE *fp;
	if((fp=fopen("data/menu.txt","r"))!=NULL)
	{
		char ch[100];
		while(!feof(fp))
		{
			fgets(ch,100,fp);
			printf(ch);
		}
		fclose(fp);
	}
}

2.用户的功能由函数client实现,也是存储在client.h文件中。

void showmoney()//功能1:查询余额
{
	printf("\t用户名  :%s\n",user.name);
	printf("\t账户余额:%d\n",user.money);
	printf("\t请按Enter键返回\n");
	getchar();
}

void drawmoney()//功能2:取款业务
{
	FILE *fp;
	int a,i;
	char c;
	while(1){
	printf("\t请输入您的取款金额:");
	scanf("%d",&a);
	if(a>user.money)
		printf("\t账户余额不足,请重新输入!\n");
	else if(a<0)
		printf("\t输入有误,请重新输入!\n");
	else
		break;

	}
	getchar();
	user.money-=a;
	if((fp=fopen("data/client.dat","wb"))!=NULL)
	{
		fwrite(&user, sizeof(client), 1 ,fp);
		fclose(fp);
	}
	printf("\t取款成功,请收好您的钞票!\n");
	printf("\t是否打印凭条?  y/n  ");
	scanf("%c",&c);
	getchar();
	if(c=='Y' || c=='y')
	{
		printf("\t正在打印请稍后。。。。。\n\t\t");
		for(i=0;i<10;i++)
		{
			printf("■");
			Sleep(400);
		}
		printf("\n");
		printf("\t打印完成,请收好您的凭条\n");
		printf("\t请按Enter键退出\n");
		getchar();
		
	}
	else
	{
		printf("\t请按Enter键退出\n");
		getchar();
		
	}
	
}

void savemoney()//功能3:存款业务
{
	FILE *fp;
	int a,i;
	char c;
	printf("\t请输入您的存款数额:");
	scanf("%d",&a);
	getchar();
	user.money+=a;
	if((fp=fopen("data/client.dat","wb"))!=NULL)
	{
		fwrite(&user, sizeof(client), 1 ,fp);
		fclose(fp);
	}
	printf("\t存款成功\n");
	printf("\t是否打印凭条?  y/n  ");
	scanf("%c",&c);
	getchar();
	if(c=='Y' || c=='y')
	{
		printf("\t正在打印请稍侯。。。。。\n\t\t");
		for(i=0;i<10;i++)
		{
			printf("■");
			Sleep(400);
		}
		printf("\n");
		printf("\t打印完成,请收好您的凭条\n");
		printf("\t请按Enter键退出\n");
		getchar();
	}
	else
	{
		printf("\t请按Enter键退出\n");
		getchar();
	}
}

void updatekey()//功能5:改密业务
{
	char ch[10];
	char str[10];
	FILE *fp;
	int i;
	printf("\t请输入您的初始密码   :");
	strcpy(ch,get_password());
	while(1)
	{
		if(strcmp(ch,user.key) != 0)
		{
			printf("\t您的初始密码输入错误请重新输入:");
			strcpy(ch,get_password());
		}
		else 
			break;
	}
	while(1){
		printf("\t请输入您要修改的密码  :");
		strcpy (ch,get_password());
		printf("\t请再次输入要修改的密码:");
		strcpy(str,get_password());
		if(strcmp(ch,str)==0)
		{
			strcpy(user.key,ch);
			printf("\t正在为您修改,请稍候\n\t");
			for(i=0;i<10;i++)
			{
				printf("■");
				Sleep(400);
			}
			if((fp=fopen("data/client.dat","wb"))!=NULL)
			{
				fwrite(&user, sizeof(client), 1 ,fp);
				fclose(fp);
			}
			printf("\n\t密码修改成功\n");
			printf("\t请按回车键退出\n");
			getchar();
			break;
		}
		else
			printf("\t您两次密码输入不一致,请重新输入!\n");
	}
}
void rename()//功能5:修改用户名
{
	FILE *fp;
	char name[30];
	char mame[30];
	while(1)
	{
		printf("\t请输入您要修改的用户名:");
		scanf("%s",&name);
		printf("\t请确认您的用户名      :");
		scanf("%s",&mame);
		getchar();
		if(strcmp(name,mame)==0)
		{
			strcpy(user.name,name);
			if((fp=fopen("data/client.dat","wb"))!=NULL)
			{
				fwrite(&user, sizeof(client), 1 ,fp);
				fclose(fp);
			}
			printf("\t已成功修改您的用户名,请牢记!\n");
			printf("\t请按回车键退出\n");
			getchar();
			break;
		}
		else
			printf("\t您两次输入的用户名不一致,请重新输入!\n");
	}
}
void exitsystem()//功能6:退出系统
{
	system("cls");
	FILE *fp;
	char ch;
	fp=fopen("data/exit.txt","r");
	while(!feof(fp))
	{
		ch=fgetc(fp);
		putchar(ch);
	}
	fclose(fp);
	printf("\n");
	printf("请按Enter键退出\n");
	getchar();
}
3、登陆功能用函数login实现

struct client       //结构体用于存储信息;
{
	char name[50];  //用户名
	char key[10];   //密码
	int money;
}user;
char *get_password()//星号密码获取函数;
{
	int i=0;
	char a[50];
	char ch='\0';
	while(ch != '\r')
	{
		ch = getch();//无回显的从键盘接收一个字符,
		if(ch == 8)  //8是退格符的 ASSIC码。
		{
			a[--i]='\0';
			putchar(8);
			putchar(' ');
			putchar(8);
		}
		else
		{
			if(ch=='\r')
				break;
			a[i++] = ch;
			printf("*");//输出星号
		}
	}
	a[i]='\0';
	printf("\n");
	return &a[0];
}  

int login()         //登陆函数;
{
	FILE *fp;       //读取文件保存的用户名及密码,赋值给结构体。
	if((fp=fopen("data/client.dat","rb"))!=NULL)
	{
		fread(&user,sizeof(user),1,fp);
	}
	else
	{
		printf("该用户信息错误!\n");
	}
	char a[50];
	char b[50];
	int count=0,i,flag=0;
	while(1)
	{
		printf("\t请输入您的用户名:");
		scanf("%s",a);
		printf("\t请输入您的密码  :");
		strcpy(b,get_password());
		if(strcmp(a,user.name)!=0 || strcmp(b,user.key)!=0)
			printf("\t用户名或者密码输入错误!请重新输入!\n");
		else 
		{
			printf("\t\t\t正在登陆  请稍后\n");
			printf("\t\t\t");
			for(i=0;i<8;i++)
			{
				printf("■");
				Sleep(500);   //让系统在此处停留500毫秒之后在运行。
			}
			printf("\n");
			break;
		}
		count++;
		if(count == 3)
		{
			printf("\t\t您输入错误已超过三次,系统已退出!\n");
			system("color 4a");
			flag=1;
			break;
		}
	}
	return flag;
}

4、主函数ATM.cpp中值调用,使得结构更清晰合理。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
#include "login.h"   //登陆函数模块
#include "Welcome.h" //界面欢迎模块
#include "client.h"  //用户操作界面
int main()
{
	system("color 2a");
	wel();
	printf("\t\t\t确定登陆?Y/N   ");
	char c;
	scanf("%c",&c);
	getchar();
	if(c=='n'||c=='N')
	{
		exitsystem();
	}
	else
	{
		int f;
		system("cls"); //清屏
		printf("\t\t\t进入中,请稍候.......\n\n");
		Sleep (800);
		f=login();
		system("cls");
		if(f==1)
		{
			printf("正在退出系统。。。。");
			Sleep(3000);
			exitsystem();
		}
		else
		{
			while(1)
			{
				menu();
				printf("\n\t请输入代号:");
				int m;
				scanf("%d",&m);
				getchar();
				if(m==1)
				{
				
					Sleep (500);
					showmoney();	
					system("cls");
				}
				else if(m==2)
				{
				
					Sleep (500);
					drawmoney();	
					system("cls");
				}
				else if(m==3)
				{
				
					Sleep (500);
					savemoney();	
					system("cls");
				}
				else if(m==4)
				{
				
					Sleep (500);
					updatekey();	
					system("cls");
				}
				else if(m==5)
				{
				
					Sleep (500);
					rename();	
					system("cls");
				}
				else if(m==6)
				{
				
					exitsystem();
					break;
				}
			}
		}	
	}	
	return 0;
}

四、补充

该系统还有很多特效,但是由于不会在博客展示动态效果,更多信息,课在本地运行展示。

下载代码方式:https://pan.quark.cn/s/dd3561eca308 在软件开发领域,面向对象编程(OOP)是一种普遍采纳的结构化方法,它使得开发者能够借助模拟现实环境中的实体和关系来构建软件系统。在本案例中,我们观察到的是一个关于借助抽象类来执行不同几何图形面积求解的实践应用。现在,让我们详细分析这一议题。 标题 "应用抽象类计算面积" 清晰地表明我们将要讨论一个抽象类,此类设定了一个用于测量图形面积的标准函数,但并未提供实际的执行过程。抽象类在诸如C#或Java等编程语言中通常借助`abstract`修饰符进行声明,它们无法直接创建对象实例,仅能作为其他类的基础模板。 描述部分提及的"图形界面应用"暗示这是一个基于视觉用户界面(GUI)的系统,可能运用了.NET Framework的Windows Forms或WPF技术,或者是Java平台的Swing或JavaFX框架。在这样环境下,用户能够通过视觉元素与这些几何体进行互动,例如输入相关尺寸并观看到计算得出的面积值。 抽象类“几何体”内嵌了“计算面积”这一抽象函数。在代码层面,这可以被表述为: ```csharp public abstract class GeometricShape { public abstract double CalculateArea(); } ``` 随后,有三个派生类:圆(Circle)、矩形(Rectangle)和三角形(Triangle),它们各自提供了这个抽象函数的具体实现。比如,圆的面积是通过π乘以半径的平方得到的,矩形的面积是长和宽的乘积,而三角形的面积可能是底乘以高再除以2的结果。这些类将提供具体实现来计算它们各自的面积: ```csharp p...
内容概要:本文系统研究了移相控制全桥LLC谐振变换器的工作特性,深入分析其在不同工作模式下的运行理与性能表现,重点探讨了软开关实现、高效率能量转换及宽范围电压调节等关键技术优势。通过Simulink搭建精确的仿真模型,对谐振腔参数、开关频率、电压增益、系统效率等关键指标进行仿真分析,验证了理论设计的正确性。同时,详细研究了移相控制策略对系统动态响应、稳定性和轻载/重载工况适应性的影响,揭示了控制参数与电路参数之间的耦合关系,为高频高效电源设计提供了理论依据和实践指导。; 适合人群:具备电力电子技术、模拟电路及自动控制理论基础,从事开关电源、新能源变换器、电动汽车充电模块或高频电源系统研发的工程师及高校研究生。; 使用场景及目标:①掌握全桥LLC谐振变换器的拓扑结构、工作原理与关键参数设计方法;②理解移相控制在实现零电压开通(ZVS)和零电流关断(ZCS)中的作用制;③通过Simulink仿真掌握变换器建模、参数优化与性能评估流程,服务于实际产品开发与学术课题研究。; 阅读建议:建议读者结合提供的Simulink仿真模型进行同步操作,重点关注谐振网络(Lr, Lm, Cr)参数与移相角之间的匹配设计,深入理解软开关条件的形成过程,并通过调整负载和输入电压进行多工况仿真,以全面掌握系统动态特性。
一、项目概述 本项目设计并实现了一个基于STM32F103C8T6微控制器的温湿度监测与报警系统系统通过DHT11传感器实时采集环境温湿度数据,当数据超过预设阈值时,蜂鸣器发出声音报警,同时通过4位数码管实时显示当前温湿度值。整个系统采用Type-C接口供电,支持USB串口通信,便于数据调试与传输。 二、硬件组成 1. 主控模块:STM32F103C8T6最小系统(含晶振、复位、BOOT电路、去耦电容)。 2. 传感器模块:DHT11温湿度传感器(单总线通信)。 3. 报警模块:有源蜂鸣器(三极管驱动)。 4. 显示模块:4位共阴数码管(TM1637驱动)。 5. 通信模块:CH340N USB转串口芯片(Type-C接口)。 6. 电源模块:AMS1117-3.3稳压电路(5V转3.3V)。 7. 调试接口:SWD调试排针(SWDIO/SWCLK)。 三、开发流程 1. 原理图设计:使用嘉立创EDA绘制完整原理图,包含各功能模块。 2. PCB设计:进行PCB布局布线,注重电源完整性、信号隔离及晶振走线。 3. 制板焊接:嘉立创打样,手工焊接元器件。 4. 软件开发:STM32CubeMX配置工程,编写DHT11驱动、TM1637显示、串口通信及报警逻辑。 5. 调试测试:通过SWD下载程序,串口输出数据,测试温湿度采集与报警功能。 四、项目特点 - 完整的嵌入式系统开发流程(硬件设计→制板→软件编程→调试)。 - 多传感器数据融合与实时显示。 - 低功耗设计,支持USB供电与串口通信。 - 模块化设计,便于功能扩展(如添加WiFi模块、数据存储等)。 五、应用前景 适用于家庭环境监测、农业大棚、仓库温湿度监控等场景
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

随风浪仔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值