#include<string>
#include<iostream>
using namespace std;
#include<windows.h>
#include<stdlib.h>
#define COUNT_1_LINE 31
#define COUNT_2_LINE 20
struct Station
{
int ID1;
int ID2;
string name;
COORD pt;
};
/*
ID1:从一号线的迈皋桥到奥体中心依次为1,。。。,16
从天隆寺到药科大学依次为17,。。。。,31
ID2:从二号线的油坊桥到马群站依次为1,。。。。,20.
*/
Station St1[COUNT_1_LINE],St2[COUNT_2_LINE];
string Names1[COUNT_1_LINE]= {"迈皋桥站","红山动物园","南京站站","新模范马路","玄武门站","鼓楼站","珠江路站","新街口站", /*换乘2号线*/
"张府园站","三山街站","中华门站","安德门站",/*由此去往南延线*/ /**/
"小行站","中胜路站","元通站",/*换乘2号线*/"奥体中心站",/*原来的底站*/
"天隆寺站","软件大道站","花神庙站","南京南站","双龙大道站","河定桥站","胜太路站","百家湖站","小龙湾站",
"竹山路站","天印大道站","龙眠大道站","江苏经贸学院","南京交院站","中国药科大学"/*1号线底站*/
};
string Names2[COUNT_2_LINE]= {"油坊桥站","雨润大街站","元通站", /*换乘1号线*/
"奥体东站","兴隆大街站","集庆门大街","云锦路站","莫愁湖站","汉中门站","上海路站","新街口站",/*换乘1号线*/
"大行宫站","西安门站","明故宫站","苜蓿园站","下马坊站","孝陵卫站","钟灵街站","五棵松站","马群站"/*2号线底站*/
};
int ptX1[COUNT_1_LINE]=
{
10,20,30,40,50,60,10,20,30,40,50,60,10,20,30,40,50,60,10,20,30,40,50,60,10,20,30,40,50,60,10
};
int ptY1[COUNT_1_LINE]=
{
3,3,3,3,3,3,4,4,4,4,4,4,5,5,5,5,5,5,6,6,6,6,6,6,7,7,7,7,7,7,8
};
int ptX2[COUNT_2_LINE]=
{
10,20,30,40,50,60,10,20,30,40,50,60,10,20,30,40,50,60,10,20
};
int ptY2[COUNT_2_LINE]=
{
10,10,10,10,10,10,11,11,11,11,11,11,12,12,12,12,12,12,13,13
};
COORD ptclick;
bool is_clicked=false;
int Count2Xinjiekou(Station *pSt);
int Count2Yuantong(Station *pSt);
int Count2Andemen(Station *pSt);
void ConsoleProc(HANDLE,INPUT_RECORD*);
void GetMousePosition();
void init()
{
int i=0;
for(i=0; i<COUNT_1_LINE; i++)
{
St1[i].ID1=i+1;
St1[i].ID2=0;
St1[i].name=Names1[i];
St1[i].pt.X=ptX1[i];
St1[i].pt.Y=ptY1[i];
}
for(i=0; i<COUNT_2_LINE; i++)
{
St2[i].ID1=0;
St2[i].ID2=i+1;
St2[i].name=Names2[i];
St2[i].pt.X=ptX2[i];
St2[i].pt.Y=ptY2[i];
}
St1[7].ID2=11;
St1[14].ID2=3;
St2[10].ID1=8;
St2[2].ID1=15;
}
int Count2Xinjiekou(Station *pSt)
{
int count=0;
if(pSt->ID1>=17)
{
count=Count2Andemen(pSt)+4;
return count;
}
else if(pSt->ID1<=16&&pSt->ID1>=1)
{
count=pSt->ID1-8;
if(count<0)count=-count;
return count;
}
else
{
count=pSt->ID2-11;
if(count<0)count=-count;
return count;
}
return count;
}
int Count2Yuantong(Station *pSt)
{
int count=0;
if(pSt->ID1>=17)
{
count=Count2Andemen(pSt)+3;
return count;
}
else if(pSt->ID1<=16&&pSt->ID1>=1)
{
count=pSt->ID1-15;
if(count<0)count=-count;
return count;
}
else
{
count=pSt->ID2-3;
if(count<0)count=-count;
return count;
}
return count;
}
int Count2Andemen(Station *pSt)
{
int count=0;
if(pSt->ID1>=17)
{
return pSt->ID1-16;
}
else if(pSt->ID1<=17&&pSt->ID1>=1)
{
count=pSt->ID1-12;
if(count<0)count=-count;
return count;
}
else
{
if(pSt->ID2<=7)
{
count=Count2Yuantong(pSt)+3;
return count;
}
else
{
count=Count2Xinjiekou(pSt)+4;
return count;
}
}
return count;
}
int CountStation(Station *pStart,Station *pEnd)
{
int count=0;
if(pStart->ID1>=17&&pEnd->ID1>=17)//起始站和终点站都在1号难延线
{
count=pStart->ID1-pEnd->ID1;
if(count<0)count=-count;
return count;
}
else if(pStart->ID1<=16&&pEnd->ID1<=16&&pStart->ID1>=1&&pEnd->ID1>=1)//起始站和终点站都在1号线
{
count=pStart->ID1-pEnd->ID1;
if(count<0)count=-count;
return count;
}
else if(pStart->ID2>=1&&pEnd->ID2>=1)//起始站和终点站都在2号线
{
count=pStart->ID2-pEnd->ID2;
if(count<0)count=-count;
return count;
}
else if(pStart->ID1>=17&&pEnd->ID1<=16)//起始站和终点站分别在1号线南延线和非南延线
{
count=Count2Andemen(pStart)+Count2Andemen(pEnd);
return count;
}
else if(pStart->ID1<=16&&pEnd->ID1>=17)//起始站和终点站分别在1号线南延线和非南延线
{
count=Count2Andemen(pStart)+Count2Andemen(pEnd);
return count;
}
else if(pStart->ID1<=16&&pStart->ID1>=1&&pEnd->ID1==0)//起始站和终点站分别在1号线和2号线
{
int count1=Count2Xinjiekou(pStart)+Count2Xinjiekou(pEnd);
int count2=Count2Yuantong(pStart)+Count2Yuantong(pEnd);
count=count1<count2?count1:count2;
return count;
}
else if(pStart->ID1==0&&pEnd->ID1<=16&&pEnd->ID1>=1)//起始站和终点站分别在1号线和2号线
{
int count1=Count2Xinjiekou(pStart)+Count2Xinjiekou(pEnd);
int count2=Count2Yuantong(pStart)+Count2Yuantong(pEnd);
count=count1<count2?count1:count2;
return count;
}
return count;
}
int main()
{
Station stStart,stEnd;
int nPrizeforOne=0;
int nMoneyNeed=0;
int nMoneyPaid=0;
int i=0,nInput=0;
SetConsoleTitle("南京地铁");
HANDLE hStdOut=GetStdHandle(STD_OUTPUT_HANDLE);
init();
string strInput;
cout<<" 您好!欢迎光临,南京地铁!\n";
cout<<"\n请您选择您的起始站点:\n";
while(true)
{
for(i=0; i<COUNT_1_LINE; i++)
{
SetConsoleTextAttribute(hStdOut,FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
SetConsoleCursorPosition(hStdOut,St1[i].pt);
cout<<St1[i].ID1<<":"<<St1[i].name<<" ";
}
for(i=0; i<COUNT_2_LINE; i++)
{
SetConsoleCursorPosition(hStdOut,St2[i].pt);
cout<<i+COUNT_1_LINE+1<<":"<<St2[i].name<<" ";
}
GetMousePosition();
for(i=0; i<COUNT_1_LINE; i++)
{
if(ptclick.X>=ptX1[i]&&ptclick.X<ptX1[i]+10&&ptclick.Y>=ptY1[i])
{
stStart=St1[1];
break;
}
}
for(i=0; i<COUNT_2_LINE; i++)
{
if(ptclick.X>=ptX2[i]&&ptclick.X<ptX2[i]+10&&ptclick.Y>=ptY2[i])
{
stStart=St2[1];
break;
}
}
cout<<"\n对不起,您的选择有误!\n";
}
cout<<"您的起始站是:"<<stStart.name<<"\n\n";
cout<<" 下面请选择您的目的站:\n";
while(true)
{
for(i=0; i<COUNT_1_LINE; i++)
{
SetConsoleTextAttribute(hStdOut,FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
SetConsoleCursorPosition(hStdOut,St1[i].pt);
cout<<St1[i].ID1<<":"<<St1[i].name<<" ";
}
for(i=0; i<COUNT_2_LINE; i++)
{
SetConsoleCursorPosition(hStdOut,St2[i].pt);
cout<<i+COUNT_1_LINE+1<<":"<<St2[i].name<<" ";
}
GetMousePosition();
for(i=0; i<COUNT_1_LINE; i++)
{
if(ptclick.X>=ptX1[i]&&ptclick.X<ptX1[i]+10&&ptclick.Y>=ptY1[i])
{
stEnd=St1[1];
break;
}
}
for(i=0; i<COUNT_2_LINE; i++)
{
if(ptclick.X>=ptX2[i]&&ptclick.X<ptX2[i]+10&&ptclick.Y>=ptY2[i])
{
stEnd=St2[1];
break;
地铁售票程序 c++



在本项目中,我们关注的是一个使用C++编程语言实现的地铁售票程序。C++是一种通用的、面向对象的编程语言,它具有高效性、灵活性和丰富的库支持,因此是开发这种复杂系统的一个理想选择。下面我们将深入探讨地铁售票程序可能涉及的关键知识点。 1. **数据结构与算法**:地铁售票程序需要管理大量的信息,如线路、站点、车次、票价等。这通常涉及到使用数据结构如数组、链表、树或哈希表来存储和检索数据。例如,站点信息可以存储在一个树形结构中以便快速查找,而车次和票价则可能用数组或链表维护。 2. **面向对象编程**:C++的强项在于其面向对象特性。程序可能会包含几个类,如`Station`(站点)、`Train`(列车)、`Ticket`(票)和`TicketSystem`(售票系统)。每个类都有相应的属性(如站点名称、车次时间、票价)和方法(如购票、退票、查询车次)。 3. **用户界面**:售票程序需要有用户友好的交互界面,可能包括命令行接口或图形用户界面(GUI)。在C++中,可以使用标准输入输出流进行基本的命令行交互,或者利用第三方库如Qt、wxWidgets或SFML来创建更复杂的GUI。 4. **错误处理**:程序需要能够处理各种异常情况,如无效的输入、购票失败、系统故障等。C++的异常处理机制使得能优雅地捕获和处理这些错误。 5. **文件操作**:为了持久化存储数据,程序可能需要读写文件。C++的文件流(fstream)库可以用来保存和加载如车次信息、已售出的票等数据。 6. **并发与多线程**:在繁忙的地铁系统中,售票程序可能需要处理多个请求。C++11引入了内置的多线程支持,可以创建并管理线程来提高效率,如并行处理购票请求。 7. **设计模式**:软件设计模式如工厂模式(用于创建票类的实例)、单例模式(确保售票系统只有一个实例)和观察者模式(用于实时更新和通知用户状态变化)在构建此类系统时可能会被应用。 8. **测试**:良好的软件工程实践要求进行单元测试和集成测试,以确保各个部分以及整个系统的功能正确。C++可以配合测试框架如Google Test进行自动化测试。 9. **性能优化**:对于高并发的售票系统,性能优化至关重要。可能涉及到内存管理、算法优化和使用适当的数据结构来提高响应速度。 10. **并发安全**:当多线程操作共享资源时,必须防止竞态条件和死锁。C++的互斥量(mutex)和条件变量(condition variable)可以用来实现线程间的同步。 通过理解并掌握以上知识点,开发者可以构建出一个功能完备、健壮的地铁售票程序。这个项目不仅提供了实践C++语言的机会,也涵盖了软件开发中的许多重要概念和技术。






























- 1

- #完美解决问题
- #运行顺畅
- #内容详尽
- #全网独家
- #注释完整
- zhangcheng09062012-12-07还行需要自己改改
- qq_437951602019-06-26有不少例子可以参考,目前正需要.

- 粉丝: 0
- 资源: 1
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- rubygem-io-console-0.4.2-39.el7-9.x64-86.rpm.tar.gz
- VISIO-visio
- Pycharm代码-pycharm
- oops-plugin-excel-to-json-数据结构资源
- rubygem-json-1.7.7-39.el7-9.x64-86.rpm.tar.gz
- MaxKB-人工智能资源
- Llama3-70B-Chinese-Chat-大模型
- vn-py-jupyter notebook安装
- Cursor-cursor
- Python-100-Days-软件测试面试题
- git_study-git安装
- HuaweiOD-华为od
- escrcpy-android
- rubygem-psych-2.0.0-39.el7-9.x64-86.rpm.tar.gz
- rubygem-rdoc-4.0.0-39.el7-9.x64-86.rpm.tar.gz
- rubygems-2.0.14.1-39.el7-9.x64-86.rpm.tar.gz


