- // 环境VS2003
- //
- /
- //编写程序实现火车站售票程序(以一节车厢为例)。
- //下图(图1)是火车车厢内座位的布局,座位号从1到80;
- //其中1,2, 5,6位于一个间隔内,3、4、7、8也是一个间隔内的座位…
- //1 5 9 13 ……… 65 69 73 77
- //2 6 10 14 ……… 66 70 74 78
- // 过道
- //3 7 11 15 ……… 67 71 75 79
- //4 8 12 16 ……… 68 72 76 80
- //售票规则总则 假设每次最多售4张;
- //
- //售1张票原则:随便售出一张没有售出的票;
- //售2张票原则:优先售2张相邻的票、如果没有2张相邻的票就随便售出两张票;
- //所谓2张相邻包括:1和2; 3和4; 5和6; 7和8等等
- //以下情况不算相邻: 1和5; 2和3等等
- //
- //售3张或4票原则:优先售一个间隔内的票;
- //如果剩余票数不足,就提示不足, 不售票.
- //如果不能满足优先原则, 则售任何位置的票.
- //
- //程序要求:
- //1,定义存储车厢座位信息的数据结构和相关状态信息;
- //
- //2 编写程序模拟售票过程,程序运行允许多次售票。
- //每次购票的要求从文件读入;
- //Bool GetRequest(int *p);
- //返回数值为真,则*p的内容是1—4的数值(不需要考虑容错;);为假时则停止售票;
- //
- //每次售票结果输出到文件。
- //void OutputResult(int * SeatNum, int Count);
- //SeatNum表示售出座位号;
- //Count是指售出的票数;
- //其中函数GetRequest和OutputResult的实现在下页,可以直接使用。
- //3,程序要求逻辑清楚、结构良好,符合编码规范要求,否则扣分,最多扣除题目分数的三分之一。
- //
- //4,程序能够运行,运行结果正确。
- //
- //5,输入文件默认为d:/ request.txt
- //输出文件默认为d:/result.txt.根据实际情况,可以修改给出的程序。
- //输入文件的格式为,1-4的数字,中间可以以空格,制表符,换行符,换页符和回车符分割
- //调试时使用输入文件,请使用题目附带的文件request.txt
- //request.txt里内容为
- //2 4 1 2 3 1 4 1 4 3
- //1 3 2 3 3 1 2 1 1 4
- #include "stdafx.h"
- #include <iostream>
- #include <fstream>
- #include <vector>
- #include <string>
- #include <algorithm>
- using namespace std;
- #define MAXNUM 80
- /
- // VC 7.0 以上版本使用此程序
- /
- //读取需求文件
- bool GetRequest(int *p)
- {
- static bool first = true;
- static string from = "d://request.txt";
- static ifstream is(from.c_str());
- static istream_iterator < int > ii(is);
- static istream_iterator < int > eos;
- static vector < int > b(ii, eos);
- static vector < int > :: iterator it = b.begin();
- if (it == b.end()) return false;
- *p = *(it++);
- return true;
- }
- //输出售票结果
- void OutputResult(int * SeatNum, int Count)
- {
- string to = "d://result.txt";
- ofstream os(to.c_str(), ios_base::app);
- ostream_iterator < int > oi(os, ", ");
- vector < int > ov(SeatNum, SeatNum + Count);
- os << endl << "=======================" << endl;
- copy(ov.begin(), ov.end(), oi);
- }
- /
- // VC 7.0 以上版本使用此程序
- /
- /
- // VC 6.0 Sp5 以下版本使用此程序
- /
- #include <stdio.h>
- //读取需求文件
- bool GetRequest_VC6(int *p)
- {
- static FILE* fp = fopen("d://request.txt", "r");
- static int nIndex = 0;
- static int inputData[MAXNUM] = {0};
- static bool isfirst = true;
- int i;
- if (isfirst)
- {
- for (i = 0; i < MAXNUM; i++)
- {
- if (fscanf(fp, "%d, ", &inputData[i]) == EOF) break;
- }
- isfirst = false;
- fclose(fp);
- }
- if (inputData[nIndex] == 0 || nIndex == MAXNUM) return false;
- *p = inputData[nIndex++];
- return true;
- }
- //输出购票结果
- void OutputResult_VC6(int * SeatNum, int Count)
- {
- FILE* fp = fopen("d://result.txt", "a");
- int i;
- fprintf(fp, "====================================/n");
- for (i = 0; i < Count; i++)
- {
- fprintf(fp, "%d, ", SeatNum[i]);
- }
- fprintf(fp, "/n");
- fclose(fp);
- }
- /
- // VC 6.0 Sp5 以下版本使用此程序
- /
- int m_seat[MAXNUM]; //1表示座位未售出,0表示座位已售出
- int m_remain = MAXNUM; //剩余座位数
- //分配座位号
- int AssignTickets(int nTickets, int * SeatNum)
- {
- int nCount = 0;
- switch (nTickets)
- {
- case 2:
- for (int i = 0; i < MAXNUM && nCount < nTickets; i += 2)
- {
- if (1 == m_seat[i] && 1 == m_seat[i + 1])
- {
- //有相邻的座位未售出
- m_seat[i] = 0;
- m_seat[i + 1] = 0;
- SeatNum[nCount++] = i + 1;
- SeatNum[nCount++] = i + 2;
- }
- }
- break;
- case 3:
- case 4:
- int k = 6;
- for (int i = 0; i < MAXNUM && nCount < nTickets; i += k)
- {
- k = 8 - k;
- if (m_seat[i] + m_seat[i + 1] + m_seat[i + 4] + m_seat[i + 5] >= nTickets)
- {
- //有满足售票数的间隔
- if (1 == m_seat[i] && nCount < nTickets)
- {
- m_seat[i] = 0;
- SeatNum[nCount++] = i + 1;
- }
- if (1 == m_seat[i + 1] && nCount < nTickets)
- {
- m_seat[i + 1] = 0;
- SeatNum[nCount++] = i + 2;
- }
- if (1 == m_seat[i + 4] && nCount < nTickets)
- {
- m_seat[i + 4] = 0;
- SeatNum[nCount++] = i + 5;
- }
- if (1 == m_seat[i + 5] && nCount < nTickets)
- {
- m_seat[i + 5] = 0;
- SeatNum[nCount++] = i + 6;
- }
- }
- }
- break;
- default:
break; - }
- //不满足优先售票规则,则随机售票
- if (0 == nCount)
- {
- for (int i = 0; i < MAXNUM && nCount < nTickets; i++)
- {
- if (1 == m_seat[i])
- {
- m_seat[i] = 0;
- SeatNum[nCount++] = i + 1;
- }
- }
- }
- //售出票后,剩余票数减少
- m_remain -= nCount;
- //返回已售出的票数
- return nCount;
- }
- //入口函数
- int _tmain(int argc, _TCHAR* argv[])
- {
- int nTickets = 0; //一次待购买的票数
- int SeatNum[MAXNUM];
- //给座位售出状态赋初值:全部未售出
- int i = 0;
- for (i = 0; i < MAXNUM; i++)
- {
- m_seat[i] = 1;
- }
- while (GetRequest(&nTickets))
- {
- if (nTickets > m_remain)
- {
- //剩余座位不足
- cout << "剩余座位不足!" << endl;
- }
- else
- {
- int nCount = AssignTickets(nTickets, SeatNum);
- OutputResult(SeatNum, nCount);
- }
- }
- cout << "剩余座位数: " << m_remain << endl;
- return 0;
- }
编程实现火车站售票程序
最新推荐文章于 2018-12-20 17:39:55 发布