编程实现火车站售票程序

  1. // 环境VS2003
  2. //
  3. /
  4. //编写程序实现火车站售票程序(以一节车厢为例)。
  5. //下图(图1)是火车车厢内座位的布局,座位号从1到80;
  6. //其中1,2, 5,6位于一个间隔内,3、4、7、8也是一个间隔内的座位…
  7. //1  5  9   13  ………  65 69  73  77
  8. //2  6  10  14  ……… 66  70  74  78
  9. //              过道
  10. //3  7  11  15  ………  67 71  75  79
  11. //4  8  12  16  ……… 68  72  76  80
  12. //售票规则总则 假设每次最多售4张;
  13. //
  14. //售1张票原则:随便售出一张没有售出的票;
  15. //售2张票原则:优先售2张相邻的票、如果没有2张相邻的票就随便售出两张票;
  16. //所谓2张相邻包括:1和2;  3和4;  5和6;  7和8等等
  17. //以下情况不算相邻: 1和5;  2和3等等
  18. //
  19. //售3张或4票原则:优先售一个间隔内的票;
  20. //如果剩余票数不足,就提示不足, 不售票.
  21. //如果不能满足优先原则, 则售任何位置的票.
  22. //
  23. //程序要求:
  24. //1,定义存储车厢座位信息的数据结构和相关状态信息;
  25. //
  26. //2  编写程序模拟售票过程,程序运行允许多次售票。
  27. //每次购票的要求从文件读入;
  28. //Bool GetRequest(int *p);
  29. //返回数值为真,则*p的内容是1—4的数值(不需要考虑容错;);为假时则停止售票;
  30. //
  31. //每次售票结果输出到文件。
  32. //void OutputResult(int * SeatNum, int Count);
  33. //SeatNum表示售出座位号;
  34. //Count是指售出的票数;
  35. //其中函数GetRequest和OutputResult的实现在下页,可以直接使用。
  36. //3,程序要求逻辑清楚、结构良好,符合编码规范要求,否则扣分,最多扣除题目分数的三分之一。 
  37. //
  38. //4,程序能够运行,运行结果正确。
  39. //
  40. //5,输入文件默认为d:/ request.txt
  41. //输出文件默认为d:/result.txt.根据实际情况,可以修改给出的程序。
  42. //输入文件的格式为,1-4的数字,中间可以以空格,制表符,换行符,换页符和回车符分割
  43. //调试时使用输入文件,请使用题目附带的文件request.txt
  44. //request.txt里内容为 
  45. //2 4 1 2 3 1 4 1 4 3 
  46. //1 3 2 3 3 1 2 1 1 4
  47. #include "stdafx.h"
  48. #include <iostream>
  49. #include <fstream>
  50. #include <vector>
  51. #include <string>
  52. #include <algorithm>
  53. using namespace std;
  54. #define MAXNUM 80
  55. /
  56. //                  VC 7.0 以上版本使用此程序
  57. /
  58. //读取需求文件
  59. bool GetRequest(int *p)
  60. {
  61.     static bool first = true;
  62.     static string from = "d://request.txt";
  63.     static ifstream is(from.c_str());
  64.     static istream_iterator < int > ii(is);
  65.     static istream_iterator < int > eos;
  66.     static vector < int > b(ii, eos);
  67.     static vector < int > :: iterator it  = b.begin();
  68.     if (it == b.end()) return false;
  69.     *p = *(it++);
  70.     return true;
  71. }
  72. //输出售票结果
  73. void OutputResult(int * SeatNum, int Count)
  74. {
  75.     string to = "d://result.txt";
  76.     ofstream os(to.c_str(), ios_base::app);
  77.     ostream_iterator < int > oi(os, ", ");
  78.     vector < int > ov(SeatNum, SeatNum + Count);
  79.     os << endl << "=======================" << endl;
  80.     copy(ov.begin(), ov.end(), oi);
  81. }
  82. /
  83. //                  VC 7.0 以上版本使用此程序
  84. /
  85. /
  86. //                  VC 6.0 Sp5 以下版本使用此程序
  87. /
  88. #include <stdio.h>
  89. //读取需求文件
  90. bool GetRequest_VC6(int *p)
  91. {
  92.     static FILE* fp = fopen("d://request.txt""r");
  93.     static int nIndex = 0;
  94.     static int inputData[MAXNUM] = {0};
  95.     static bool isfirst = true;
  96.     int i;
  97.     if (isfirst)
  98.     {
  99.         for (i = 0; i < MAXNUM; i++)
  100.         {
  101.             if (fscanf(fp, "%d, ", &inputData[i]) == EOF) break;
  102.         }
  103.         isfirst = false;
  104.         fclose(fp);
  105.     }
  106.     if (inputData[nIndex] == 0 || nIndex == MAXNUM) return false;
  107.     *p = inputData[nIndex++];
  108.     return true;
  109. }
  110. //输出购票结果
  111. void OutputResult_VC6(int * SeatNum, int Count)
  112. {
  113.     FILE* fp = fopen("d://result.txt""a");
  114.     int i;
  115.     fprintf(fp, "====================================/n");
  116.     for (i = 0; i < Count; i++)
  117.     {
  118.         fprintf(fp, "%d, ", SeatNum[i]);
  119.     }
  120.     fprintf(fp, "/n");
  121.     fclose(fp);
  122. }
  123. /
  124. //                  VC 6.0 Sp5 以下版本使用此程序
  125. /
  126. int m_seat[MAXNUM];     //1表示座位未售出,0表示座位已售出
  127. int m_remain = MAXNUM;  //剩余座位数
  128. //分配座位号
  129. int AssignTickets(int nTickets, int * SeatNum)
  130. {
  131.     int nCount = 0;
  132.     switch (nTickets)
  133.     {
  134.     case 2:
  135.         for (int i = 0; i < MAXNUM && nCount < nTickets; i += 2)
  136.         {
  137.             if (1 == m_seat[i] && 1 == m_seat[i + 1])
  138.             {
  139.                 //有相邻的座位未售出
  140.                 m_seat[i] = 0;
  141.                 m_seat[i + 1] = 0;
  142.                 SeatNum[nCount++] = i + 1;
  143.                 SeatNum[nCount++] = i + 2;
  144.             }
  145.         }
  146.         break;
  147.     case 3:
  148.     case 4:
  149.         int k = 6;
  150.         for (int i = 0; i < MAXNUM && nCount < nTickets; i += k)
  151.         {
  152.             k = 8 - k;
  153.             if (m_seat[i] + m_seat[i + 1] + m_seat[i + 4] + m_seat[i + 5] >= nTickets)
  154.             {
  155.                 //有满足售票数的间隔
  156.                 if (1 == m_seat[i] && nCount < nTickets)
  157.                 {
  158.                     m_seat[i] = 0;
  159.                     SeatNum[nCount++] = i + 1;
  160.                 }
  161.                 if (1 == m_seat[i + 1] && nCount < nTickets)
  162.                 {
  163.                     m_seat[i + 1] = 0;
  164.                     SeatNum[nCount++] = i + 2;
  165.                 }
  166.                 if (1 == m_seat[i + 4] && nCount < nTickets)
  167.                 {
  168.                     m_seat[i + 4] = 0;
  169.                     SeatNum[nCount++] = i + 5;
  170.                 }
  171.                 if (1 == m_seat[i + 5] && nCount < nTickets)
  172.                 {
  173.                     m_seat[i + 5] = 0;
  174.                     SeatNum[nCount++] = i + 6;
  175.                 }
  176.             }
  177.         }
  178.         break;
  179.      default:
            break;
  180.     }
  181.     //不满足优先售票规则,则随机售票
  182.     if (0 == nCount)
  183.     {
  184.         for (int i = 0; i < MAXNUM && nCount < nTickets; i++)
  185.         {
  186.             if (1 == m_seat[i])
  187.             {
  188.                 m_seat[i] = 0;
  189.                 SeatNum[nCount++] = i + 1;
  190.             }
  191.         }
  192.     }
  193.     //售出票后,剩余票数减少
  194.     m_remain -= nCount;
  195.     //返回已售出的票数
  196.     return nCount;
  197. }
  198. //入口函数
  199. int _tmain(int argc, _TCHAR* argv[])
  200. {
  201.     int nTickets = 0;   //一次待购买的票数
  202.     int SeatNum[MAXNUM];
  203.     //给座位售出状态赋初值:全部未售出
  204.     int i = 0;
  205.     for (i = 0; i < MAXNUM; i++)
  206.     {
  207.         m_seat[i] = 1;
  208.     }
  209.     while (GetRequest(&nTickets))
  210.     {
  211.         if (nTickets > m_remain)
  212.         {
  213.             //剩余座位不足
  214.             cout << "剩余座位不足!" << endl;
  215.         }
  216.         else
  217.         {
  218.             int nCount = AssignTickets(nTickets, SeatNum);
  219.             OutputResult(SeatNum, nCount);
  220.         }
  221.     }
  222.     cout << "剩余座位数: " << m_remain << endl;
  223.     return 0;
  224. }
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值