以两列c++显示数据



我试图显示相同的数据,但分为两列,因此在第19学年之后,数据应显示在表右侧的列中,直到达到总学年数,即36。以下是代码:

#include "stdafx.h"
#include <iostream>
#include <string>
#include <iomanip>
using namespace std;
int const schoolWeeks = 37;
string week[] = { "A", "B", "C", "D" };
int num = 0;
int main()
{
cout << left << setw(9) << setfill(' ') << "Week " << left << setw(9) << setfill(' ')<< "Menu" << left << setw(9) << setfill(' ') << "Week " << "Menu" << endl;
for (int i = 1; i < 20; i++)
{   
    cout << left << setw(9) << setfill(' ')<< i << week[num] << endl;
    num = num + 1;
    if (num == 4)
    {
        num = 0;
    }
}
for (int i = 20; i < schoolWeeks; i++)
{
    cout << left << setw(9) << setfill(' ') << i << week[num] << endl;
    num = num + 1;
    if (num == 4)
    {
        num = 0;
    }
}
}

std::cout的标准输出基于数据流的思想。记住,它被称为"io"是有原因的。这意味着,一旦您向std::cout写入了一些内容,您就无法"返回"几行并添加一些内容。

考虑在Linux shell或Windows命令行中使用管道。可以将程序的输出重定向为另一个程序的输入,然后可以用它做任何可以想象的事情,例如通过互联网发送:

myprogram.exe > otherprogram.exe

在这种情况下,你怎么可能在已经写好的一行中添加一些内容?

考虑到所有这些,很明显,唯一可行的解决方案是提前了解每一行的内容。你不能等到第19行再考虑第二列,你必须马上做。换句话说,先打印第1周和第19周,然后打印第2周和第20周,然后再打印第3周和第21周,依此类推。看到模式了吗?它总是"第一列中的X周,第二列中的X+18周"。这几乎就是解决方案。

下面是一个遵循现有代码风格的快速编写循环:

for (int i = 1; i < 19; i++)
{   
    cout << left << setw(9) << setfill(' ')<< i << week[num]
         << left << setw(9) << setfill(' ') << " " << (i + 18) << " "
         << left << setw(9) << setfill(' ') << " " << week[num]
         << endl;
    num = num + 1;
    if (num == 4)
    {
        num = 0;
    }
}

std::setwstd::setfill这样的操纵器可能需要一些改进,但关键是:

  1. 循环仅从1计数到18
  2. 主体执行i的输出和i + 18的输出

最新更新