我试图显示相同的数据,但分为两列,因此在第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::setw
或std::setfill
这样的操纵器可能需要一些改进,但关键是:
- 循环仅从1计数到18
- 主体执行
i
的输出和i + 18
的输出