星星们看看俺的程序,头一次写,希望听听你们的意见(火车票治理系统)

时间:2008-05-12 13:49:52   来源:论坛整理  作者:  编辑:chinaitzhe
Train.h
-------------------------------------------------------
#pragma once
#include <iostream>
#include <string>
#include <vector>
#include <ctime>
#include <fstream>
#include <algorithm>
#include <iomanip>
#include <sstream>
using namespace std;
extern struct tm gif;
class Train
{
friend ifstream& operator>>(ifstream&,Train&);
friend ostream& operator < <(ostream&,Train&);
friend fstream& operator < <(fstream&,Train&);
friend bool operator==(Train&,const Train&);
friend void buy(vector <Train>&,string&);//买票
friend void del(vector <Train>&,string&);//退票
friend void release(Train&);//词法分析,分析字符串"20:19:00"。
friend class Cop;//车次查询辅助类
friend class Cop2;//站站查询辅助类
friend class Com;//按时间打印辅助类

public:
Train(struct tm gg=gif);//默认构造函数
~Train(void);
Train(istream&,struct tm gg=gif);//构造函数,接受一个输入流和一个默认的参数
string get_numbers()const; //取出车次
private:
string numbers,start_name,arrive_name,
take_time,start_time_ ,arrive_time_ ;
struct tm start_time,arrive_time;
unsigned int money,tickets;
};
void serach1(vector <Train>&,string&);//根据车次查找,并输出找到。。注:查询支持大小写;
void serach2(vector <Train>&,string&,string&);//根据始发站和终点站查找
void print_all(vector <Train>&);//输出所有车次
void nowant(vector <Train>&);//按时间打印车次
void init();//初始化默认时间
int chose(vector <Train>&);//选择函数 1.增加车次.2,车次查询。3,站站查询。4,买票。5,退票。6,按时间打印



网友回复:
C/C code





Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/



Train.h 

------------------------------------------------------- 

#pragma once 

#include <iostream> 

#include <string> 

#include <vector> 

#include  <ctime> 

#include  <fstream> 

#include <algorithm> 

#include <iomanip> 

#include  <sstream> 

using namespace std; 

extern struct tm gif; 

class Train 

{ 

friend ifstream& operator>>(ifstream&,Train&); 

friend ostream& operator < <(ostream&,Train&); 

friend  fstream& operator < <(fstream&,Train&); 

friend bool operator==(Train&,const Train&); 

friend void buy(vector <Train>&,string&);//买票 

friend void del(vector <Train>&,string&);//退票 

friend void release(Train&);//词法分析,分析字符串"20:19:00"。 

friend class Cop;//车次查询辅助类 

friend class Cop2;//站站查询辅助类 

friend class Com;//按时间打印辅助类 



public: 

Train(struct tm gg=gif);//默认构造函数 

~Train(void); 

Train(istream&,struct tm gg=gif);//构造函数,接受一个输入流和一个默认的参数 

string get_numbers()const; //取出车次 

private: 

string numbers,start_name,arrive_name, 

 take_time,start_time_ ,arrive_time_ ; 

struct tm start_time,arrive_time; 

unsigned int money,tickets; 

}; 

void serach1(vector <Train>&,string&);//根据车次查找,并输出找到。。注:查询支持大小写; 

void serach2(vector <Train>&,string&,string&);//根据始发站和终点站查找 

void print_all(vector <Train>&);//输出所有车次 

void nowant(vector <Train>&);//按时间打印车次 

void init();//初始化默认时间 

int chose(vector <Train>&);//选择函数 1.增加车次.2,车次查询。3,站站查询。4,买票。5,退票。6,按时间打印 


网友回复:
C/C code





Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/



#include "StdAfx.h"

#include "Train.h"

Train::Train(struct tm gg):start_time(gg),arrive_time(gg)

{

}

Train::~Train(void)

{

}

Train::Train(istream&,struct tm gg):start_time(gg),arrive_time(gg)

{                                                        

    cin>>numbers>>start_name>>arrive_name       //

          >>start_time_                 //==============发车时间

        >>arrive_time_              //=============到达时间

        >>take_time>>money>>tickets;         //======

}



string Train::get_numbers()const

{

    return numbers;

}



ifstream& operator>>(ifstream& in,Train& t)

{



    in>>t.numbers>>t.start_name>>t.arrive_name       //车次,始发站,终点站

        >>t.start_time_                //发车时间,时,分,秒

        >>t.arrive_time_               //到达时间,时,分,秒

        >>t.take_time>>t.money>>t.tickets;    //运行时间,票价,票数

    return in;

}

//------------------------------------------------------------------------------------------



 ostream& operator<<(ostream& out,Train& t)

{

        out<<setw(7)<<t.numbers<<setw(7)<<t.start_name<<setw(7)<<t.arrive_name

        <<setw(10)<<t.start_time_

        <<setw(10)<<t.arrive_time_<<setw(12)<<t.take_time<<setw(7)

        <<t.money<<setw(7)<<t.tickets<<endl;



        return out;

}

 //-----------------------------------------------------------------------------------------

  fstream& operator<<(fstream& out,Train& t)

{                        

        out<<setw(7)<<t.numbers<<setw(7)<<t.start_name<<setw(7)<<t.arrive_name

        <<setw(10)<<t.start_time_

        <<setw(10)<<t.arrive_time_<<setw(12)<<t.take_time<<setw(7)

        <<t.money<<setw(7)<<t.tickets<<endl;



        return out;

}

 bool operator==(Train& t1,const Train& t2)

{

     

        if(!_stricmp(t1.numbers.c_str(),t2.numbers.c_str()))

        return true;

        else return false;

        

}

 //------------------------------------------------------------------------------------------



class Cop

{

public:

    Cop(string& _s1):s1(_s1){}

bool operator()(Train& t)

    {

        if(!_stricmp(t.numbers.c_str(),s1.c_str()))

        return true;

        else return false;

    }

private:

    string s1;

};

    

//------------------------------------------------------------------------------------------



class Cop2

{

public:

    Cop2(string& _s1,string& _s2):s1(_s1),s2(_s2){}

bool operator()(Train& t)

    {

            if( t.start_name==s1&&t.arrive_name==s2)

                return true;

            else return false;

    }

private:

    string s1,s2;

};

//------------------------------------------------------------------------------------------



class Com

{

public:

bool operator()(Train& t1,Train& t2)

    {

        return difftime(mktime (&(t1.start_time)),mktime (&(t2.start_time)))<0;

    

            

    }



};

 void buy(vector<Train>&v,string& s)

{

    vector<Train>::iterator it=v.begin();

    for(;it!=v.end();it  )

    {

        if(!_stricmp((*it).get_numbers().c_str(),s.c_str()))

        {        

            

            time_t a,b;

            time(&a);

            b=mktime (&((*it).start_time));

            if(difftime(a,b)>0)

            

            {

    cout<<"****************sorry,you are so late*********************\n";

                break;

            }

            else if((*it).tickets==0)

            {

                cout<<"****************There is no tickets left*********************\n";

                break;

            }



            else 

            {

                --(*it).tickets;

                break;

            }

            

        }

    }

    cout<<*it;

    if(it==v.end())

    cout<<"****************sorry,no find*********************\n";

    

}

 //------------------------------------------------------------------------------------------

void del(vector<Train>&v,string&s)

{

        vector<Train>::iterator it=v.begin();

    for(;it!=v.end();it  )

    {

        if(!_stricmp((*it).get_numbers().c_str(),s.c_str()))

        {        

            time_t a,b;

            time(&a);

            b=mktime (&((*it).start_time));

            if(difftime(a,b)>30*60)

            {

                cout<<"*********************no serives***************************\n";

                break;

            }



            else 

            {

                  (*it).tickets;

                break;

            }

        }

    }

    cout<<*it;

    if(it==v.end())

        cout<<"no find ";



}

//------------------------------------------------------------------------------------------

void release(Train& t1)    

{

     char ch;int a,b,c;

istringstream ip(t1.start_time_);

 ip>>a>>ch>>b>>ch>>c;

t1.start_time.tm_hour=a;

t1.start_time.tm_min=b;

t1.start_time.tm_sec=c;



//sscanf_s(t1.start_time_.c_str(),"%d:%d:%d",&t1.start_time.tm_hour,&t1.start_time.tm_min,&t1.start_time.tm_sec);

//sscanf_s(t1.arrive_time_.c_str(),"%d:%d:%d",&t1.arrive_time.tm_hour,&t1.arrive_time.tm_min,&t1.arrive_time.tm_sec);



}

//------------------------------------------------------------------------------------------



void serach1(vector<Train>&v1,string& s)

{

    vector<Train>::iterator it=v1.begin();

    it=find_if(it,v1.end(),Cop(s));

    if(it==v1.end())             

        cout<<"sorry,no find\n";

    else cout<<*it;

}

//------------------------------------------------------------------------------------------



void serach2(vector<Train>&v1,string& s1,string& s2)

{

    vector<Train>::iterator it=v1.begin();

    it=find_if(it,v1.end(),Cop2(s1,s2));

    if(it==v1.end())

    cout<<"****************sorry,no find*********************\n";

        else

        {

            cout<<*it<<endl;

            it  ;

            while(it!=v1.end())

            {

            it=find_if(it,v1.end(),Cop2(s1,s2));

            if(it!=v1.end())

                        

            {

            cout<<*it<<endl;

            it  ;

            }

            

            }

    }

}



//------------------------------------------------------------------------------------------



void print_all(vector<Train>&v)

{

    for(vector<Train>::iterator it=v.begin();it!=v.end();it  )

        cout<<*it<<endl;

}

//------------------------------------------------------------------------------------------



void nowant(vector<Train>&v)

{

    sort(v.begin(),v.end(),Com());

        print_all(v);

}

//------------------------------------------------------------------------------------------

struct tm gif;

void init()

{

gif.tm_sec=0;

gif.tm_min=0;

gif.tm_hour=0;

gif.tm_mday=8;

gif.tm_mon=5-1;

gif.tm_year=2008-1900;

gif.tm_wday=4;

gif.tm_yday=129;

gif.tm_isdst=0;

}

int  chose(vector<Train>&v)

{

    cout<<"***********IF YOU WANT BREAK ,PLEASE INTER 0********************\n";

    while(true)    

    {

    int i;

    cout<<"Please inter your chiose:1.增加车次.2,车次查询。3,站站查询。4,买票。5,退票。6,按时间打印\n";

    cin>>i;    

    while(!cin)//安全处理

{

    cin.clear();

    cin.sync();

    cout<<"Please inter your chiose\n";

    cin>>i;

}

    if(i==0)break;

    switch(i)

    {

    case 1:

    {

        cout<<"Please inter your train datas\n";

        ofstream fout("C:\\Users\\wangchaojie\\Desktop\\jj1.txt",ios_base::out|ios_base::app);

        if (!fout)

        {

        cerr << "Cannot open jj1.txt for output\n";

        return -1 ;

        }

        Train t(cin);

        release(t);

        vector<Train>::iterator it=v.begin();

        it=find(it,v.end(),t);

        if(it!=v.end())

            cout<<"please check there is also has one\n";

        else

        {

        v.push_back(t);

        fout<<t;

        fout.close();

        }

        print_all(v);

        break;

        

    }

    case 2:

    {

        cout<<"Please inter your needing train's number\n";

        string s;

        cin>>s;

        serach1(v,s);

        break;

    }

        case 3:

    {

        cout<<"Please inter your needing train's start_name and arrive_name\n";

        string s1,s2;

        cin>>s1>>s2;//曾经这写成cin>>s1,s2;

        serach2(v,s1,s2);

        break;

    }

        case 4:

    {

        cout<<"Please inter your buy train's number\n";

        string s;

        cin>>s;

        buy(v,s);

        break;

    }

        case 5:

    {

        cout<<"Please inter your del train's number\n";

        string s;

        cin>>s;

        del(v,s);

        break;

    }

        case 6:

    {

        cout<<"The trains are\n";

        nowant(v);

        break;

    

    }

        default:

            {

            cout<<"****************wrong inputs*********************\n";

            }

    

    }

    }

    return 0;

}


网友回复:main.cpp
------------------------------------------------------

// 火车票系统.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
#include "Train.h"
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
init();
string s,str;
vector <Train>v1;
ifstream input("C:\\Users\\wangchaojie\\Desktop\\jj1.txt");
input.ignore(1000,'\n');
input.ignore(1000,'\n');
while(true)
{
Train t1;
input>>t1;
release(t1);
if(input.fail())
break;
v1.push_back(t1);
cout < <t1 < <endl;
}
input.close();
chose(v1);
return 0;
}



网友回复:jj1.txt
-------------------------------------------------------------------------
CSS code





Code highlighting produced by Actipro CodeHighlighter (freeware)

http://www.CodeHighlighter.com/



车次        始发站     终点站    发车时间(时分秒)     到达时间(时分秒)       运行时间           票价    当前票数



L420/L417    天津        郑州       23:35:00                12:53:00        14小时33分            799      1    

T184/T181    天津        郑州       21:20:00         05:58:00        8小时46分            799      100   

T238/T235    天津        郑州       07:09:00         15:44:00        8小时43分            799      100   

K548/K545    天津        郑州       12:00:00         22:58:00        11小时6分            875      100   

K548/K545    天津北        郑州       12:18:00         22:58:00        10小时47分           871      100   

K128/K125    天津        郑州       02:23:00         13:00:00        10小时47分            799      100   

T122/T123    天津        郑州       08:02:00         16:46:00        8小时52分            799         106       

1058/1055    天津西        郑州       00:30:00         10:43:00        10小时21分           821      100


网友回复:三角进来混分

为何只见头文件?
网友回复:void serach1(vector <Train>&,string&);//根据车次查找,并输出找到。。注:查询支持大小写;
void serach2(vector <Train>&,string&,string&);//根据始发站和终点站查找

看到这个就晕了
首先是单词拼写,另外是1和2
再就是......用重载吧
网友回复:程序设计题: 票务治理系统
【问题描述】
一火车站天天有n个发车班次,每个班次都有一班次号,固定的发车时间,固定的路线(起始站、终点站),大致的行车时间,固定的额定载客量,如:
车次 发车时间 起点站 终点站 行车时间 额定载量 余票数量
K234 8:00 南京 广州 12 1100 30
K211 6:30 南京西 成都 18 1500 40
T25 7:00 北京 广州 24 1700 20
T58 10:00 南京 上海 2 800 2
该系统要求对一个文件中所存储的票务信息进行各种常规操作,如:查询、计算、显示等功能。通过此课题,熟练把握文件、数组、指针的各种操作,以及一些算法思想的应用,实现一个简单的票务治理系统。
【功能要求】
(1)录入班次信息(信息用文件保存number.dat),可随时增加新车次数据
(2)浏览班次信息,可显示出所有车次当前状况(假如当前系统时间超过了某班次的发车时间,则显示“此车已发出”的提示信息)。
(3)查询路线:可按班次号、终点站查询售票情况。
(4)根据发车时间给出顺序的发车时间表(排序方法自选),存入文件保存(sort.dat)。
(5)售票和退票功能
当查询出已定票人数小于额定载量且当前系统时间小于发车时间时才能售票,自动更新余票数量。
退票时,输入退票的班次,当本车次发出前半小时才可以退票,自动更新已售票人数
【程序设计的具体说明】
数据结构:
依据给定的学生信息和数据格式,结构数组的分量必须用结构实现; 结构类型的层次结构:
class ticket
车次 字符串 char no[9]
起点站 字符串 char name_b[10] (尽量用汉字)
终点站 字符串 char name_e[10] (尽量用汉字)
发车时间与行车时间
class Time
int hour
int minute
额定载量 int load
余票数量 int remainder
【程序设计的开发环境】
VC 6.0,在内存中的各种存储可以采用数组方式。
网友回复:
引用 6 楼 baihacker 的回复:
void serach1(vector <Train>&,string&);//根据车次查找,并输出找到。。注:查询支持大小写;
void serach2(vector <Train>&,string&,string&);//根据始发站和终点站查找

看到这个就晕了
首先是单词拼写,另外是1和2
再就是......用重载吧


啊,咋忘了!!。。真是知道,不记得用啊。。。飞雪,先记你10分
网友回复:没写,拷贝构造函数,赋值函数。。因为没有指针,所以就用默认的了,应该没事吧。。
网友回复:switch(i)
{
这里面的分支最好写成函数
网友回复:ifstream& operator>>(ifstream& in,Train& t)

用istream
网友回复:必要的地方请加上const
网友回复:代码看起来确实挺清爽,比偶在学校时不知道强多少倍。^_^

仔细看了看头文件,觉得有不少可以改进的地方:
(1)friend ifstream& operator>>(ifstream&,Train&);
ifstream最好改为istream,不要把输入只限制成来自文件;

(2)friend bool operator==(Train&,const Train&);
使用非成员函数实现operator==挺好的,但第一个参数最好也是const Train&;

(3)除操作符外中,友元函数和友元类太多了,这明显暴露出设计存在问题。模块、类、函数之间应该尽量独立。而friend是C 语言中最强的依靠机制,或者说最紧的耦合关系,应慎用。

(4)“Cop”,“Com”以及search1,search2等名字取得不好,不能准确反应类或函数的功能;可以考虑使用重载,或者至少给一个更有意义的名字;不到万不得已,不要依靠于注释来解释一个名字的意思;

(5)有些注释明显是多余的。比如:
Train(struct tm gg=gif);//默认构造函数
再比如:
Train(istream&,struct tm gg=gif);//构造函数,接受一个输入流和一个默认的参数
在实际项目中,注释的维护会成为问题,因此不要在不需要的地方滥加注释,更不要让注释重复代码自身;非凡是上面第二个例子,只要是懂C 语言的,都知道这是个构造函数,也明白它的两个参数类型,而你又不是在写入门级的教科书,所以实在没有必要加这个注释。

(6)struct tm是一个有好多字段的结构体,因此作参数时也可以考虑使用常引用,而不是直接使用值拷贝。

(7)string numbers,start_name,arrive_name, take_time,start_time_ ,arrive_time_ ;
为何同时使用带“_”后缀和不带后缀两种风格?一般应尽量保证同一项目中命名风格一致,或者至少同一源文件风格一致,上面这个同一行却出现两种风格,当然不好;
另外,这6个成员变量之间看不出明显的关联关系,因此最好不要定义在同一行上;即使有关联关系的,也应该尽量做到每行只定义一个变量,以提高可读性。

(8)好多处string&参数应改为const string&,因为看不出函数中有修改实参的需要;
网友回复:学习学习:)
网友回复:学习了
网友回复:看看先。。。
网友回复:“inter” ?
是enter 吧? 呵呵

13楼回答得好好~ 学习!!
网友回复:up 老大
网友回复:
引用 13 楼 steedhorse 的回复:
代码看起来确实挺清爽,比偶在学校时不知道强多少倍。^_^

仔细看了看头文件,觉得有不少可以改进的地方:
(1)friend ifstream& operator>>(ifstream&,Train&);
ifstream最好改为istream,不要把输入只限制成来自文件;

(2)friend bool operator==(Train&,const Train&);
使用非成员函数实现operator==挺好的,但第一个参数最好也是const Train&;

(3)除操作符外中,友元函数和友元类太多了,这明显暴露…


看了老大的回复,真是让我感觉清凉一夏。。。

每一个条款都要我感慨很深,,涉及注释,设计各个方面,,真是学习了! 谢谢老大
网友回复:整体来说是相当不错的,
1)既然用标准的C 编程
int _tmain(int argc, _TCHAR* argv[])
#include "stdafx.h"
就不要用了
2)界面设计
要用中文都用中文,要用英文都用英文。
布局,可操作性这些都要重视

假如是我来做程序界面至少像下面一样。
*************************************************************************
* XX 火车票治理系统 *
* 售票员:XX 当前时间:2008-5-10 11:05*
*************************************************************************
没有符合条件的车次。 <--内容显示区


------------------------------------------------------------------------
F2-增加车次 F3-车次查询.... <--快捷菜单区
------------------------------------------------------------------------
票已全售完,请明天再来。 <--信息提示区
------------------------------------------------------------------------

当你要做像上面这样的界面的时候,你就会发现,随时随地cout是不好的
你会需要一个专门的menu类或者gui类,然后train类只负责处理数据。
然后你的程序几乎要完全重写。
网友回复:运行了一下程序,
发现
车次 始发站 终点站 发车时间(时分秒) 到达时间(时分秒) 运行时间 票价 当前票数
都没有在数据的上面

还有很多,数据多时翻页的问题。等等。
可以到售票点瞄一下人家的界面。
网友回复:太多了
没看下去
网友回复:纯支持,太长了

网友回复:收藏了,等高手详解
网友回复:支持一下
网友回复:继续观望,案例分析是很好的学习方式,嘿嘿,接经验~~
网友回复:mark
网友回复:
引用 21 楼 goodsong 的回复:
运行了一下程序,
发现
车次 始发站 终点站 发车时间(时分秒) 到达时间(时分秒) 运行时间 票价 当前票数
都没有在数据的上面

还有很多,数据多时翻页的问题。等等。
可以到售票点瞄一下人家的界面。


恩,你的建议很好,当初我不会调dos的输出窗口,那个太窄了,分行显示,就没让显示出来。。呵呵。。

一个专门的menu类,是个好主意思,,那样的话,要全部改写一边,,由于这个里面友元太多,,我正计划着重新设计,,再加上一个专门的menu类。。估计工程不小,,尽量做吧。。呵呵,,

能不能给个menu类的建议,因为我没见过,主要什么功能,能说一下吗?
网友回复:来学习了,自己差很多啊。。。
网友回复:顶13楼啊,我反正是不打算接分了!
这个楼主习惯把分给星星的……
网友回复:把代码拿出来review是提高水平的最好方式之一。楼主做得很好。
网友回复:来看猩猩……
网友回复:
引用 31 楼 iambic 的回复:
把代码拿出来review是提高水平的最好方式之一。楼主做得很好。


up
网友回复:做个标记,回头细看
网友回复:
引用 30 楼 hnbczmh 的回复:
顶13楼啊,我反正是不打算接分了!
这个楼主习惯把分给星星的……


纯属造谣,谁帮俺解决问题,俺给谁分
网友回复:学习
网友回复:学习了。
写的代码和上面老大门的分析都相当的不错,收藏了!
网友回复:来学习哈,这似乎是我们数据结构的实习题目一样啊 ,那程序人都看傻了,呵呵!1
网友回复:up
网友回复:up
网友回复:几个大哥说的很不错,顶起来
网友回复:同感
引用 31 楼 iambic 的回复:
把代码拿出来review是提高水平的最好方式之一。楼主做得很好。

网友回复:还凑合把,加油把
关键字:星星,看看,程序,一次,希望,
上一篇:c语言中的这个

相关文章

文章评论

共有 0 位网友发表了评论 此处只显示部分留言 点击查看完整评论页面