C++进阶训练——停车收费系统设计
一、简介
经过一段时间的c++基础学习,是时候做一个较为全面的、运用c++功能的较复杂的项目练练手了。
运用软件:Visual Studio (VS)。
题目:c++停车收费系统设计(某本编程书进阶习题)
要求: 管理员登陆; 有停车、取车、查询实时停车情况三个功能; 按照停车后时间分段计时收费。
分析: 管理员登陆需要密码的不可视输入,即输入密码输出“*”,输入错误用户名或者错误密码要报错并且返回初始界面; 三个功能要基于写入txt文件来实行,其中停车写入信息,取车读取信息并初始化信息,查询输出文件信息; 通过写入文件的停车时间和取车时时间来计算停车分钟,然后分段计时收费; 主界面需要实时显示系统时间,并且在一段时间没有操作后返回初始界面,标题要自定义为c++停车系统; 注意输出格式; 文件信息应包括车位序号、车牌号、入库时间(按指定位数输出,如201808041128方便保存),停车时优先存在车位序号小的车位。
流程图如下图所示。
二、系统设计思路
void mainspace();//主界面,功能界面 void stop();//停车子函数 void move();//取车子函数 void check();//检查当前库存情况子函数 int money(int n);//计时收费子函数 void code();//密码登陆子函数 string hide(int size);//输入密码输出*子函数
根据流程图大致需要以上几个子函数,其中登陆界面包含code()和hide()两个函数,主界面为mainspace(),三个操作功能一一对应一个子函数,其中取车多包含money()计时收费功能。
根据分析,这些函数应分别实现以下功能:
code():密码登陆界面,用户名与密码预先设置好,若输入错误则报错并返回登陆界面,成功则进入主界面
hide():输入一个字符时在操作台上不显示本来字符,并输出一个“*”
mainspace():输出三个功能选择,跳转页面
stop():将停车的三个信息(车位序号,车牌号,停车时间)写入txt文件,车位序号小数字优先,其中停车时间由读取当前系统时间进行处理
move():将选择的车位序号的那一行信息删除
check():将txt文件内容全部输出
money():读取选择的车位序号的那一行信息,并处理计算得出停车时间并计时收费
三、函数功能实现
#include <iostream>
#include <ctime>
#include <string>
#include <stdio.h>
#include <conio.h>
#include <cstdlib>
#include <windows.h>
#include <iomanip>
#include <fstream>
using namespace std;
void mainspace();//主界面,功能界面
void stop();//停车子函数
void move();//取车子函数
void check();//检查当前库存情况子函数
int money(int n);//计时收费子函数
void code();//密码登陆子函数
string hide(int size);//输入密码输出*子函数
int park[] = { , };//停车位序号,此时txt里预设了两组数据
struct pay //返回自定义值
{
int timemin;
int money;
}pay1;
int main()
{
SetConsoleTitle("Stop Cars");//标题
while () {
time_t now = time();
tm *ltm = localtime(&now);
cout << + ltm->tm_year << "." << + ltm->tm_mon << "." << ltm ->tm_mday << endl;
cout << ltm->tm_hour << ":" << ltm->tm_min << endl;//输出时间
code();
mainspace();
Sleep();//一段时间不操作返回初始界面
system("cls");
}
}
void mainspace()
{
cout << "功能" << endl;
cout << "1.停车" << endl;
cout << "2.取车" << endl;
cout << "3.查询" << endl;
int x;
cin >> x;
switch (x)
{
case :stop(); break;
case :move(); break;
case :check(); break;
}
}
void code()
{
string name = "linuas";
string pw = "";
string name1;
string code;
while ()
{
cout << "请输入用户名:" << endl;
cin >> name1;
if (strcmp(name1.c_str(), name.c_str()) == )
{
system("cls");
cout << "请输入密码:" << endl;
code = hide();
if (strcmp(pw.c_str(), code.c_str()) == )
{
system("cls");
cout << "登陆成功!" << endl;
Sleep();
break;
}
else cout << endl << "密码错误!" << endl;
Sleep();
system("cls");
continue;
}
else cout << endl << "用户名不存在!" << endl;
Sleep();
system("cls");
continue;
}
}
string hide(int size)
{
char c;
int count = ;
char *password = new char[size]; // 动态申请空间
string str;
while ((c = _getch()) != '\r') { if (c == ) { // 退格
if (count == ) {
continue;
}
putchar('\b'); // 回退一格
putchar(' '); // 输出一个空格将原来的*隐藏
putchar('\b'); // 再回退一格等待输入
count--;
}
if (count == size - ) { // 最大长度为size-1
continue;
}
if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '' && c <= '')) { // 密码只可包含数字和字母
putchar('*'); // 接收到一个字符后, 打印一个*
password[count] = c;
count++;
}
}
password[count] = '\0';
str = password;
return str;
}
void stop()
{
int n = ;
int i = ;
string str;
time_t now = time();
tm *ltm = localtime(&now);//获取当前系统时间准备写入
cout << "请输入车牌号:" << endl;
cin >> str;
for (i = ; i < ; i++)//车位序号存在与否判定
{
if (park[i] != )
{
n = i;
break;
}
else continue;
}
park[n] = ;
ofstream outfile("C:\\Users\\Linuas\\Desktop\\demo.txt", ios::app);//写入文件式打开
outfile << endl << n << " " << str << " " << ( + ltm->tm_year) * + ( + ltm->tm_mon) * +ltm->tm_mday << " " << (ltm->tm_hour) * + ltm->tm_min;
outfile.close();//写入成功后关闭文件,切记!
cout << "停车成功" << endl;
Sleep();
mainspace();
}
void check()
{
ifstream myfile("C:\\Users\\Linuas\\Desktop\\demo.txt");
string temp;
cout << "车位 " << "车牌号 " << "停车时间" << endl;
while (getline(myfile, temp))
{
cout << temp << endl;
}
myfile.close();
mainspace();
}
void move()
{
ifstream file("C:\\Users\\Linuas\\Desktop\\demo.txt");
string line;
int m, n, count = ;
ofstream outfile("test2.txt", ios::out | ios::trunc);
cout << "您停车的车位是:" << endl;
cin >> m;
n=money(m)+;
n = m + ;
while (!file.eof()) {
getline(file, line);
if (count != n - )//保留行
outfile << line << endl;
count++;
}
outfile.close();
file.close();
ofstream outfile1("C:\\Users\\Linuas\\Desktop\\demo.txt", ios::out | ios::trunc);
fstream file1("test2.txt");
while (!file1.eof()) {
getline(file1, line);
outfile1 << line << endl;
}
outfile1.close();
file1.close();
system("del test2.txt");//删除中间文件
Sleep();
mainspace();
}
int money(int n)
{
fstream infile;
infile.open("C:\\Users\\Linuas\\Desktop\\demo.txt", ios::in);
string line;
int count = ;
int a, b, c, d;
int b1, b2, c1, c2;
if (n == ) { infile >> a >> line >> b >> c; }
else
{
while (!infile.eof()) {
getline(infile, line);//自动回车了一次
if (count == n - )
{
infile >> a >> line >> b >> c;
}
count++;
}
}
infile.close();
d = b % ;
b1 = d % ;
b2 = (d - b1) / ;
c1 = c % ;
c2 = (c - c1) / ;
time_t now = time();
tm *ltm = localtime(&now);
pay1.timemin = ( + ltm->tm_mon - b2) * * * + (ltm->tm_mday - b1) * * + (ltm->tm_hour - c2) * + ltm->tm_min - c1;
if (pay1.timemin <= )
{
pay1.money = ;
}
else if (pay1.timemin <= )
{
pay1.money = + pay1.timemin - ;
}
else pay1.money = ;
cout << "停车时间为" << pay1.timemin << "分钟" << endl;
cout << "计时收费为" << pay1.money << "元" << endl;
Sleep();
return n;
}
其中,
str1=str2 即字符串相等时,strcmp(str1.c_str(),str2.c_str())=0。 因为 strcmp 的参数应为 char ,因此 string 定义的参数要加 .c_str(),如上所示。 c++定义字符时,用 string 比用 char 数组要简便的多得多。
四、程序运行图示
登陆界面。
密码不可视输入。
主界面。
停车指令。
查询现在停车场的情况。
此时txt文件情况。
取车计算时间与收费。
取车完后删除那一行信息。
五、总结与分享
总的来说,这个项目还算有些内容,是即将开始的下一个项目的很好的台阶。希望大家一起学习,在代码学习的道路上越走越远,头发越掉越少!
下个项目,某为校招笔试题。
https://www.bilibili.com/read/cv899072
出处: bilibili
C++进阶训练——停车收费系统设计的更多相关文章
- ETC(电子不停车收费系统)的发展演变
ETC引进中国是在上世纪的90年代中期,当时中国部分经济发达地区的高速公路车流量激增,从而导致了收费口的交通堵塞.高速公路堵车现象时有发生,拥堵严重的路段可能会天天堵,有时候一堵好几天.高速公路管理手 ...
- 手持式停车收费管理系统全套案例,支持车牌识别,包含了android版app,微信小程序查询,响应式管理后台,云端大数据存储
先展示几个app效果图片吧,使用起来非常方便,关联了机器的快捷键操作,操作速度提高了不少,摄像头车牌自动识别,车牌识别无网络情况下离线也可以使用 再来一张后台截图,停车场信息完整显示,今日数据实时 ...
- JSP/JAVA目录清单
JAVA253中国象棋(CS) JAVA258网络五子棋游戏的设计与实现(CS) JAVA390停车场管理系统SQL(CS) JSP001学生综合素质测评系统JAVA+Mysql JSP002学生成绩 ...
- ebe2
Email:kefu007@vip.qq.com 软件每天有更新.请用Ctrl+F键搜索您需要的软件..如果你找不到你需要的软件可以联系客户服务人员帮您找! 海拉之光LucidShape光学设计仿真分 ...
- Android NFC开发概述
NFC手机相比普通手机来说,有以下3个附加功能: 1.可以当成POS机来用,也就是“读取”模式 2.可以当成一张卡来刷,也就是NFC技术最核心的移动支付功能 3.可以像蓝牙.Wi-Fi一样做点 ...
- PBOC规范(2.0->3.0)对照表
1 数据方面 TAG PBOC2.0 ...
- 解惑:NFC手机如何轻松读取银行卡信息?
自支付宝钱包8.0推出了NFC新功能,只要将支持NFC功能的手机靠近公交卡.银行卡等带有芯片的IC卡上,可迅速读取卡内余额.卡的信息,还可以给卡进行充值,非常贴心实用. 但是很多网友表示担忧,要是别人 ...
- PBOC2.0与3.0的区别
一.PBOC规范颁布的历程 1997年12月,PBOC V1.0 定义了五个方面的事项 电子钱包/电子存折应用(EP,ED) 卡片和终端的接口 卡片本身的技术指标 应用相关的交易流程 终端 ...
- PBOC2.0与PBOC3.0的区别
2013年2月,中国人民银行发布了<中国金融集成电路(IC)卡规范(V3.0)>(以下简称PBOC3.0),PBOC3.0是在中国人民银行2005年颁布的<中国金融集成电路(IC)卡 ...
随机推荐
- BottomNavigationView的使用
BottomNavigationView的使用 废话少说, 先看东西 依赖 implementation 'com.android.support:design:26.1.0' 布局 //用这个控件需 ...
- objc单例的两种安全实现方案
所有转出博客园,请您注明出处:http://www.cnblogs.com/xiaobajiu/p/4122034.html objc的单例的两种安全实现方案 首先应该知道单例的实现有两大类,一个是懒 ...
- OO 第三次博客总结
调研规格化设计 1950年代,第一次分离,主程序和子程序的分离程序结构模型是树状模型,子程序可先于主程序编写.通过使用库函数来简化编程,实现最初的代码重用.产生基本的软件开发过程:分析—设计—编码—测 ...
- poj1733 Parity Game(扩展域并查集)
描述 Now and then you play the following game with your friend. Your friend writes down a sequence con ...
- C++笔记014:C++对C的扩展——新增数据类型bool类型
原创笔记,转载请注明出处! 点击[关注],关注也是一种美德~ 1.C++在C语言的基本类型系统之上增加了bool类型. 2.C++中的bool类型变量可取的值只有true 和false,true代表真 ...
- nexus3使用docker运行/创建docker私有仓库/maven私有仓库
version: '3.2' services: nexus3: container_name: nexus3 hostname: nexus3 image: sonatype/nexus3:3.14 ...
- Python学习 :多线程
多线程 什么是线程? - 能独立运行的基本单位——线程(Threads). - 线程是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位. - 一条线程指的是进程中一个单一 ...
- U盘,移动硬盘显示显示需要格式化怎么修复
冷静别怕,用windows系统自带磁盘修复CHKDSK命令即可解决此问题. 首先,在开始菜单栏站到“运行”窗口,也就是c:\(命令提示符),win7可直接在开始菜单的搜索窗口中输入“cmd”. 其次, ...
- HDFS(0.20.2)运营中急救方案
这段时间折腾的都是hadoop和lucene,总结了hadoop在运营过程中出现问题时的解决方案,请大家指教! HDFS(0.20.2)运营中急救方案 1 Namenode 挂掉( ...
- 20155209林虹宇虚拟机的安装及一点Linux的学习
预备作业3 虚拟机的安装 首先,我先了解了一下Linux和安装虚拟机的有关常识. Linux:Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户.多任务.支 ...