西电软件学院c++上机实验报告

更新时间:2024-06-08 06:38:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

C++实验报告 姓 名:学 院:学 号:赵 妍 软件学院 14130140358

一、实验要求

? 完成一个完整的简化系统:一卡通乘车系统。

? 一卡通乘车系统主要完成的功能是,支持一卡通刷卡乘车;对每张一卡通的使用情况及费用进行统计;对每辆班车的运行情况进行统计。 ? 在实现该系统的功能时,不要求实现图形界面,控制台输出即可。 ? 必须采用面向对象程序设计的方式实现。

二、程序中所设计的类

class StuCard;

Class People; class bus;

三、类中的关键数据成员和成员函数

1、StuCard类

class StuCard { public:void pay();//上车刷卡时调用此函数,根据卡的类型扣除上车费用并给出 相应提示

int GetRest();//获取卡余额

StuCard(string name,string id,int money,int type,int count); string get_name(){return name; } string get_id(){return id;} int get_type(){return type;} int get_money(){return money;} int get_count(){return count;}//乘车次数 private:string name;//持卡人姓名 string id;//卡号 int money;//余额 int type;//卡的类型 (type=1,学生卡;type=2,教师卡;type=3,限制卡)

int count; //乘车次数

} ;//定义了一个StuCard的类,用type来区分卡的类型,用get_X函数在主函 数中来获得数据成员的值

2、bus类

struct time{ int hour; int minute; };

class bus{

string bnumber;//车牌号 string xnumber;//型号 int people;//载乘人数 string name;//驾驶员姓名 struct time stime;//发车时间 struct time etime;//到站时间 struct time t_stime;//实际发车时间 struct time t_etime;//实际到站时间

public:

bus(string bn,string xn,int p,string n,int sh,int sm,int eh,int em){

bnumber=bn; xnumber=xn; people=p; name=n; stime.hour=sh; stime.minute=sm; etime.hour=eh; etime.minute=em; }//构造函数

string get_b(){return bnumber;}//获得车牌号 string get_x(){return xnumber;}//获得车的型号 int get_p(){return people;}//获取上车人数 string get_n(){return name;}//获取驾驶员姓名 void Stime(int a,int b);//获取预计发车时间 void Etime(int c,int d);//获取预计到站时间

void show(string bnumber,string xnumber,int people,string name); void T_stime(int ta,int tb);//获取实际发车时间 void T_etime(int tc,int td);//获取实际到站时间

float peoplebi(float e,float f);//载乘人数比 int get_sthour(); //获得发车时间的小时 int get_stminute();//获得发车时间的分钟 int get_ethour();//获得到站时间的小时 int get_etminute();//获得到站时间的分钟 void stshow(int p,int q); void etshow(int x,int y); };

3、people类

class People{

string name;//姓名 string sex;//性别 string work;//职务 string office;//所属单位 string number;//学号/工号

public:

People(string n,string s,string w,string o,string b);//构造函数 void readPeople();//用于在主函数中读入人的信息

void show(string name,string sex,string work,string office,string

number);

};

void addPeople();//申请一张新卡 void deletePeople();//注销一卡通 string get_name(){return name;} string get_sex(){return sex;} string get_work(){return work;} string get_office(){return office;} string get_number(){return number;}

四、运行流程的说明

主程序分为两个系统:乘车系统和一卡通管理系统。 1、 乘车系统主要实现的功能如下:

首先,采用随机函数,生成本站会上车的人数,这个人数不超过车的最大载乘人数。其次,生成几个人上车,就依次输入几个人的卡号,持卡人在持卡上车时一卡通余额、乘车次数会发生变更,并且根据余额的多少会有相应提示信息,再将变更后的信息写入文件

公交车在每上一个人的时候乘车人数加一,到达最大载乘人数时提示不能再刷卡上车,并且采用随机函数,随机生成预计发车时间、预计到站时间,实际发车时间和实际到站时间,计算发车准时率和到站准时率,再将变更后的的信息写入文件

2、一卡通管理系统主要实现的功能如下:

在文件中保存人的基本信息,记录每个人的乘车次数,增加申请新卡,注销一卡通的功能。

在程序中有一个people的txt文件,里面储存了人的信息,卡的主体是人,办卡的前提是人在people文件中存在。当选择办卡时,输入people中存在的人名,从文件头开始查找,到文件尾结束,当输入的人名与people中已存的信息相匹配的时候,就将这组信息(包括姓名,学号,卡的类型,余额(新办的卡余额初始化为50),乘车次数(新卡为0))写入mycard.txt文件中去,办卡成功。 当需要删除一个卡的时候,人的信息没有改动,只是将mycard.txt中办卡的信息删去了。以vector cards(200)的方式,定义了一个类的数组,当输入需要删除的人的姓名之后,从文件头开始查找,当输入的人名与mycard中已存的信息不匹配的时候,就将这一组信息写入数组,到文件尾结束,再将数组里面的写入mycard中,这样子就把想要删掉的内容删掉了。

五、运行结果及分析

文档设置:

Mycard内容分别对应 姓名,学号,余额,乘车次数,卡的类型(1=学生卡;2=教师卡,3=限制卡)

Bus的内容分别对应为 车牌号,车类型,最大载乘人数,驾驶员姓名,预计出发时间(时、分)和预计到达时间(时、分)

选择1,进入乘车系统

首先输入车牌信息,随机产生等车人数,刷卡上车,即输入卡号

输入1402012,即李四上车,李四的乘车次数加1,余额减2,写入文件,可以看到

其中,李四的乘车信息相比初始时发生了正确的改变。并且随机产生的30组发车时间和到站时间,发车准时率和到站准时率,载乘人数比也正确的算出。 选择2,进入一卡通管理系统

选择1,办新卡

输入张三,为张三办一张新卡,张三的卡号从people文件读取,卡的类型,根据张三的职业的定义初始化为1=学生卡;2=教师卡,3=限制卡,新卡余额默认100元,乘车次数为0。 若

2

如图,将刚刚插入的张三的信息删除,并且更新文件信息,张三在mycard内的记录已经不见了。删卡成功。

六、源代码

#include #include #include #include #include

#include #include #include using namespace std;

struct time{ };

class StuCard {

public:void pay(); int hour; int minute;

int GetRest(); void show();

StuCard(string name,string id,int money,int type,int count); string get_name(){

return name;

}

string get_id(){ }

StuCard(){ }

int get_type(){

name=\id=\money=0; count=0; type=0; return id;

}

return type;

int get_money(){ }

int get_count(){ }

return count; return money;

private:string name;//持卡人姓名 } ;

void StuCard::pay(){

if (type==1 ) {

money-=2; count=count+1;

cout<<\你的卡余额为:\

//StuCard stucard1(char name[16],char ID[17],int money,int type,int count); string id;//卡号

int money;//余额

int type;//卡的类型 (type=1,学生卡;type=2,教师卡;type=3,限制卡) int count; //乘车次数

if(money<5)

cout<<\你的余额过低,请及时充值!\ }

if(type==2) {

count=count+1;

cout<<\你的卡余额为:\

if(money<5)

cout<<\你的余额过低,请及时充值!\ }

if(type==3) {

if (count<20){

count=count+1;

cout<<\你的卡余额为:\

if(money<5)

cout<<\你的余额过低,请及时充值!\

}

if (count==20){

count=count+1;

cout<<\这是本学期内最后一次免费乘车!\\n\

cout<<\你的卡余额为:\

if(money<5)

cout<<\你的余额过低,请及时充值!\

}

if (count>20){

cout<<\本次开始收费!\\n\money-=2; count=count+1;

cout<<\你的卡余额为:\

if(money<5)

cout<<\你的余额过低,请及时充值!\

}

}

}

int StuCard::GetRest(){ }

void StuCard::show() { }

StuCard::StuCard(string name,string id,int money,int type,int count){ }

//People

class People{

string name; string sex; this->name=name; this->id=id;

this->money=money; this->type=type; this->count=count;

cout<<\名字:\cout<<\卡的类型:\cout<<\乘车次数:\

return money;

string work; string office; string number;

public: };

People::People(string n,string s,string w,string o,string b) { }

void People::readPeople() {

cout<<\请输入姓名:\cin>>name;

cout<<\请输入性别:\cin>>sex;

cout<<\请输入职务:\name=n; sex=s; work=w; office=o; number=b;

People(string n,string s,string w,string o,string b); void readPeople();

void show(string name,string sex,string work,string office,string number); void addPeople(); void deletePeople();

string get_name(){return name;} string get_sex(){return sex;} string get_work(){return work;} string get_office(){return office;} string get_number(){return number;}

}

cin>>work;

cout<<\请输入所属单位:\cin>>office; if(work==\学生\{ } else { }

cout<<\请输入工号:\cin>>number;

cout<<\请输入学号:\cin>>number;

void People::addPeople()//定义添加持卡人函数 {

People people1(\实例化对象 ofstream fileout(\打开文件 if(!fileout) { } else {

cout<<\请输入持卡人基本信息:\

cout<<\不能打开文件!\

people1.readPeople();//读入信息 cout<

fileout<

ple1.get_office()

}

}

<<\写入信息

fileout.close();//关闭文件

void People::deletePeople() {

ifstream filein(\打开文件 if(!filein) { } else {

string t,m;

int n=0;//标签,是否有这个读者

cout<<\请输入删除持卡人的的姓名:\cin>>m;

cout<<\打开文件失败!\

cout<<\请输入删除持卡人的的学号或工号:\

cin>>t; do {

string x,y,z,u,w;//定义变量

string s;

getline(filein,s);//读入每一行 istringstream sin(s);

sin>>x>>y>>z>>u>>w;//把s中第一个字符串给a

ofstream fileout(\写到新文件中去

if(m!=x||t!=w)//判断是否为删除的地方 fileout<

}

if(m==x&&t==w)//判断是否为删除的地方 {

n=1;

cout<<\原持卡人信息为:\cout<<\姓名:\cout<<\性别:\cout<<\职务:\cout<<\所属单位:\

if(z==\学生\ cout<<\学号:\else cout<<\工号:\

cout<<\是否删除?(Y:是,N:否)\char a;//定义变量 cin>>a; if(a=='Y') { }

cout<<\删除成功!\

if(a=='N') }

{

cout<<\未删除!\

fileout<

fileout.close();//关闭文件

}

}

while(!filein.eof());//判断是否到文件尾 if(n==0)//不存在这个学生

cout<<\未找到要删除的持卡人!\

filein.close();//关闭

ifstream filei(\打开文档

ofstream fileout(\打开文档并清空内容

for(string s;getline(filei,s);)//将修改后的内容写到文件中去 { }

filei.close();//关闭文件 fileout.close();//关闭文件

system(\删除文件副本

fileout<

class bus{

string bnumber;//车牌号 string xnumber;//型号 int people;//载乘人数 string name;//驾驶员姓名 struct time stime;//发车时间 struct time etime;//到站时间

struct time t_stime;//实际发车时间 struct time t_etime;//实际到站时间

public:

bus(string bn,string xn,int p,string n,int sh,int sm,int eh,int em) {

bnumber=bn; xnumber=xn; people=p; name=n; stime.hour=sh; stime.minute=sm; etime.hour=eh; etime.minute=em; }

string get_b(){return bnumber;} string get_x(){return xnumber;} int get_p(){return people;} string get_n(){return name;} void Stime(int a,int b); void Etime(int c,int d);

void show(string bnumber,string xnumber,int people,string name); void T_stime(int ta,int tb); void T_etime(int tc,int td); float peoplebi(float e,float f); int get_sthour();

int get_stminute();//获得实际发车时间 int get_ethour();

int get_etminute();//获得实际到站时间

void stshow(int p,int q); void etshow(int x,int y); };

void bus::Stime(int a,int b) { }

void bus::Etime(int c,int d) { }

void bus::show(string bnumber,string xnumber,int people,string name) { }

void bus::T_stime(int ta,int tb) {

t_stime.hour=ta; t_stime.minute=tb;

cout<<\车牌号:\cout<<\型号:\cout<<\载乘人数:\cout<<\驾驶员名字:\

etime.hour=c; etime.minute=d; cout<<\到站时间为:\

cout<

cout<

}

} }

}

}

bus1.etshow(bus1.get_sthour()+1,bus1.get_stminute()); cout<<\}

cout<<\到站准时率为:\

cout<<\乘车系统;2:一卡通办理系统;3:退出\cin>>s;

七、实验中遇到的问题

第一次实验的时候,不知道改建几个类,最后只建了一个stucard类,以type来区分学生卡,教师卡,限制卡。

在第三次实验中,删除一个卡的信息的时候,思路是把除要删除的内容之外的信息写入数组,但不知道怎么讲数组里面的内容一个一个对应给类的数据成员再写入文件,后来设置了一个类的数组,头文件中加上#include,以 vector cards(200);的方式定

义了一个stucard型,名为cards,大小为200的一个数组,利用get_X函数和for循环,将数组的内容对应写入文件。

第四次实验,把前面几次没有用文件输入的改成从文件获取数据,一开始对C++中的文件操作很陌生,经过查阅资料和学习,学会了不少。

八、实验总结

本次实验上机实现的部分共分为五次,历时半个学期,除第五次设置中途停车点没有实现之外,其余功能都已实现。虽然在算法和结构方面还有很多不足,但主要功能都可以满足。通过上机,我熟悉了C++的语法和语言结构,从面向过程的编程转向了面向对象,学会了类的使用以及C++编程里的文件操作,编程的角度也有所改变,以前拿到一个题目先考虑算法,现在拿到一个题目先考虑需求,从需求出发,建立起大的框架,一点一点完善算法,一步一步实现所有功能。当然,我在程序里只是运用了很简单的C++知识,继承之类的还没有用到,这还需要我进一步去学习和完善。总之,上机交给的不仅是编程的能力,更锻炼了我的思维,以后的学习过程中,我会勤动脑,勤动手,争取提高自己的编程能力。

本文来源:https://www.bwwdw.com/article/kgt6.html

Top