目录
简单介绍一下
本人作为南京某不知名985大学的废柴大二软件专业学生,接触C++刚好过去一年,经过一个暑假的大脑清空,C++知识已经模糊不清,如今暑期学校却要用Qt完成大作业,本以为会很吃力,但其实还好。这是我在CSDN上的第一篇文章,不求有多少人看,只求能记录一下,要是某个点能帮助到与我类似的同学,我就很开心了。
我的情况是:刚上完大一,C++基础掌握得不好不差,暑期学校要求用C++在Qt上编写一个汽车客运公司管理系统,算是一个大作业。老师讲解Qt的内容只用了三天,以大作业的代码例子介绍了Qt的主要功能与信号与槽机制,班里的大神只花了一周就完成了大作业,我大概前前后后花了两周。
题目
设某客运公司每日都发售今、明、后三天的班次车票。该系统需创建和管理以下信息:1、 今、明、后三天每个班次的基本信息:班次号、发车时间、终点城市、座位数量、座位数据集;2.每个班次各座位的旅客登记表:姓名、身份证号、座号。
系统功能要求如下:1.创建和管理描述每个班次基本信息的对象;2.创建和管理描述特定班次的座位信息的对象(售票时实现); 3.办理售票,在班次中添加旅客信息(即座位号),座位号不能重复; 4.办理退票,在班次中删除旅客信息; 5. 基本查询功能; 6.数据文件读写:文件中包含所有班次信息、每个班次的座位旅客登记等数据; 7. 基本信息显示:1)显示所有班次;2)显示特定班次的座位旅客登记表; 8.可选功能提升:查询指定班次的余票数和座位号等;
这个题目的难度不算很大,难点主要在于从没接触过Qt。其实在我看来,本题目的各种类,以及基本的功能,都可以用C++先实现,再学习Qt的基础知识也不迟。Qt也只需掌握信号与槽机制(Qt的一大特色之一),以及Qt中与C++有区别的一些库(例如:C++中的vector在Qt中为QVector,string在Qt中为QSring......)除此之外,UI部分各种控件的知识需要用到时再学也行。
思路与代码实现
本题的数据结构:
结构体A_Seat_Info:管理一个座位的座位号,乘客姓名,乘客身份证号。
类A_Bus:管理一辆车的信息,如班次号,发车日期,发车时间,终点城市,座位数量,以及一个大小为50的结构体数组用来存这辆车的所有座位。
类InfoTable:包含要管理的车辆总数,以及一个QVector容器用来存所有车。
设计流程:
文件与对象描述:
- a_bus.h/.cpp管理一辆车的班次号、发车日期、发车时间、终点、座位数量以及座位数据集(座位号、乘客姓名、乘客身份证),并提供了相应的读文件与写文件函数。
- infotable.h/.cpp用QVector容器存储多辆车的信息,也提供了相应的读文件与写文件操作以及添加一辆车的信息,从QVector容器返回特定车辆信息等函数。
- add_a_bus_dialog.h/.cpp/.ui往容器内添加一辆车的信息,用户在UI界面输入班次号、发车日期时间、终点、座位数量,系统生成一辆车的信息并push入容器。
- passengerlist_dialog.h/.cpp/.ui在UI界面输入要查询的客车的发车日期及班次号,系统在QTableView中显示某天某班次客车的所有座位信息。
- readonlydelegate.h/.cpp/.ui设置QtableView中某列为只读。
- refund_dialog.h/.cpp/.ui用户在UI界面输入乘客姓名、选择班次办理退票。
- sale_dialog.h/.cpp/.ui用户在UI界面输入乘客姓名、身份证号、选择班次、座位办理售票。
- ticketleft_dialog.h/.cpp/.ui查询某班次的余票数。
- sale.h/.cpp用于办理售票/退票时存储乘客姓名、身份证、班次号、座位号。
- 测试文件:”纯班次表.txt”、”班次和乘客表.txt”。
代码实现(主函数以及设计师界面类请见链接):
A_Bus.h
/*A_Bus.h*/
/*管理一辆车的信息,含该车辆的所有座位的信息*/
#ifndef A_BUS_H
#define A_BUS_H
#include <qstring.h>
#include <QTime>
#include <qdatetime.h>
#include <QTextStream>
//某个座位的座位号、乘客姓名、身份证号
typedef struct A_Seat_Info {
bool seated;//该座位有人否
int Seat_Number;
QString Name;
QString ID;
}A_Seat_Info;
//某辆客车的班次号、出发时间、目的地、座位数及每个座位的信息
class A_Bus
{
public:
A_Bus();
virtual ~A_Bus();
A_Bus(const A_Bus &temp_A_Bus);
A_Bus &operator=(const A_Bus &temp_A_Bus);
void Save_Seats(QTextStream &aStream); //往流文件中写入车的所有座位信息
void Read_Seats(QTextStream &aStream); //从流文件读车的所有座位信息
void Save_A_Bus(QTextStream &aStream); //往流文件中写入一辆车信息
void Read_A_Bus(QTextStream &aStream); //从流文件中读一辆车信息
int BusID;//班次号
QString Date;//出发日期
QString DepTime;//出发时间
QString Destination;//终点
int SeatAmount;//座位数量
A_Seat_Info Seats[50];//客运汽车座位数一般在50以内
};
#endif // A_BUS_H
A_Bus.cpp
#include "a_bus.h"
//构造函数设置每个成员的默认值
A_Bus::A_Bus()
{
BusID=0;
Date="今天";//日期默认为今天
SeatAmount=0;
for(int i=0;i<50;i++){
Seats[i].seated=false;//默认每个座位还没有坐人
Seats[i].Seat_Number=i+1;
Seats[i].Name="NULL";
Seats[i].ID="000";
}
}
//析构
A_Bus::~A_Bus(){
}
//拷贝构造
A_Bus::A_Bus(const A_Bus &temp_A_Bus){
BusID=temp_A_Bus.BusID;
Date=temp_A_Bus.Date;
DepTime=temp_A_Bus.DepTime;
Destination=temp_A_Bus.Destination;
SeatAmount=temp_A_Bus.SeatAmount;
for(int i=0;i<50;i++){
Seats[i]=temp_A_Bus.Seats[i];
}
}
//赋值=重载
A_Bus& A_Bus::operator=(const A_Bus &temp_A_Bus){
BusID=temp_A_Bus.BusID;
Date=temp_A_Bus.Date;
DepTime=temp_A_Bus.DepTime;
Destination=temp_A_Bus.Destination;
SeatAmount=temp_A_Bus.SeatAmount;
for(int i=0;i<50;i++){
Seats[i]=temp_A_Bus.Seats[i];
}
return *this;
}
//往流文件中写入车的所有座位信息
void A_Bus::Save_Seats(QTextStream &aStream){
for(int i=0;i<SeatAmount;i++){
aStream<<Seats[i].Seat_Number<<" "<<Seats[i].Name<<" "<<Seats[i].ID<<'\n';
}
}
//从流文件读车的所有座位信息
void A_Bus::Read_Seats(QTextStream &aStream){
for(int i=0;i<SeatAmount;i++)
aStream>>Seats[i].Seat_Number>>Seats[i].Name>>Seats[i].ID;
}
//往流文件中写入一辆车信息
void A_Bus::Save_A_Bus(QTextStream &aStream){
aStream<<BusID<<" "<<Date<<" "<<DepTime<<" "<<Destination<<" "<<SeatAmount<<'\n';
Save_Seats(aStream);
}
//从流文件中读一辆车信息
void A_Bus::Read_A_Bus(QTextStream &aStream){
aStream>>BusID>>Date>>DepTime>>Destination>>SeatAmount;
Read_Seats(aStream);
}
InfoTable.h
/*管理很多辆车的班次信息以及座位信息*/
#ifndef INFOTABLE_H
#define INFOTABLE_H
#include"a_bus.h"
#include <vector>
#include <QVector>
class InfoTable
{
public:
InfoTable();
bool Read_Bus_FromFile(const QString &aReadFileName);//从文件读取所有班次信息(包括其座位信息)
bool Save_Bus_ToFile(const QString &aSaveFileName);//往流文件写入所有班次信息(包括其座位信息)
void Add_Bus(A_Bus & bus);//往InfoTable的对象里添加一辆车
A_Bus & Get_A_Bus(int index);//从InfoTable的对象里返回一辆车
int Get_Bus_Amount();//返回InfoTable的对象里的车辆总数
QVector<A_Bus>Buses;//存所有的车辆及其座位
int Bus_Amount;//InfoTable的对象里的车辆总数
};
#endif // INFOTABLE_H
InfoTable.cpp
#include "infotable.h"
#include <qfile.h>
#include <QTextStream>
#include <QTextCodec>
InfoTable::InfoTable()
{
Bus_Amount=0;
}
//从流文件逐个读车辆信息并push入vector容器
bool InfoTable::Read_Bus_FromFile(const QString &aReadFileName){//给定文件名
QFile aFile(aReadFileName);
if(!aFile.exists()) //文件不存在
return false;
if(!aFile.open(qiodevice::ReadOnly | qiodevice::Text)) //以文本方式打开
return false;
QTextStream aStream(&aFile); //用文本流读取文件
aStream.setCodec(QTextCodec::codecForName("system")); //显示汉字
//初始化
Buses.clear();//将装每辆车的vector池子清零
Bus_Amount = 0;//车辆总数
//逐个读取车辆信息
aStream>>Bus_Amount; //先读车辆总数
A_Bus tempBus;
if(Bus_Amount>0)
{
for(int i=0; i<Bus_Amount; i++)
{
tempBus.Read_A_Bus(aStream);
Buses.push_back(tempBus);
}
}
aFile.close();//关闭文件
return true;
}
//将vector容器里的所有车辆信息存入流文件
bool InfoTable::Save_Bus_ToFile(const QString &aSaveFileName){
QFile aFile(aSaveFileName);
if(!aFile.open(qiodevice::writeonly| qiodevice::Text)) //保存为文本
return false;
QTextStream aStream(&aFile);//用文本流保存文件
aStream.setCodec(QTextCodec::codecForName("system")); //显示汉字
//逐个写入车辆信息
aStream<<Bus_Amount<<'\n';//车辆总数
if(Bus_Amount>0)
{
for(int i=0; i<Bus_Amount; i++)
Buses[i].Save_A_Bus(aStream);
}
aFile.close(); //关闭文件
return true;
}
//添加一辆车到vector容器
void InfoTable::Add_Bus(A_Bus &bus)
{
Buses.push_back(bus);
Bus_Amount++;
}
//返回vector容器指定下标的A_Bus对象
A_Bus & InfoTable::Get_A_Bus(int index){
return Buses[index];
}
//返回vector容器里存了多少bus
int InfoTable::Get_Bus_Amount(){
Bus_Amount = Buses.size();
return Bus_Amount;
}
https://github.com/NaiveGhosttt/bus-company.git
源码食用方法:
解压后打开BusCompany文件夹,删除.pro.user文件后再打开.pro文件就可以看到全部工程代码。
总结
这是我的第一篇CSDN文章,加上我本人也是刚上大二的学生,所以专业知识层面肯定比不上站内的许多大牛。但我也想有一天能像那些大牛一样,在CSDN分享予人帮助,所以这篇就当是试水了,以后的路还很长,我要一步一步地走下去。
原文地址:https://www.jb51.cc/wenti/3279751.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。