2015-03-21 2 views
0

Я пытаюсь отобразить одни и те же данные, но в двух столбцах, поэтому после 19-й недели обучения данные должны отображаться в столбцах справа от таблицы до тех пор, пока не будут достигнуты общие школьные недели, т.е. 36. Ниже приведен код:Отображать данные в двух столбцах C++

#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; 
    } 

} 

} 
+0

Почему ваш ** второй ** 'for' находится за пределами ** основного **? –

ответ

0

Стандартный выход с std::cout основан на идее потока данных. Помните, что это называется «io поток». Это означает, что как только вы написали что-то std::cout, вы просто не можете «вернуться» на несколько строк и добавить что-то.

Рассмотрите возможность подключения трубопровода в оболочке Linux или в командной строке Windows. Вы можете перенаправить вывод своей программы на вход другой программы, которая затем могла бы сделать с ней какую-либо воображаемую вещь, например. отправка его через Интернет:

myprogram.exe > otherprogram.exe 

Как вы могли бы добавить что-то к уже написанной строке в таком сценарии?

Учитывая все это, становится ясно, что единственным жизнеспособным решением является заранее знать содержимое каждой строки. Вы не можете дождаться строки 19, прежде чем думать о втором столбце, вы должны сделать это сразу. Другими словами, первая печатная неделя 1 и неделя 19, затем неделя 2 и неделя 20, затем неделя 3 и неделя 21 и так далее. См. Шаблон? Это всегда «неделя X в колонке 1, неделя X + 18 в колонке 2». И это в значительной степени решение.

Вот такой быстро написал цикл придерживаясь стиля существующего кода:

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. петля рассчитывается только от 1 до 18.
  2. Корпус выполняет вывод для iи для i + 18.
+0

Спасибо, кажется, есть небольшая проблема с счетчиком недели, он сбрасывается после достижения 19 или первой недели во втором столбце, это должен быть CDABCD, но он запускает ABCDABCD. Я попытался добавить 2 к счетчику числа, но он пропускает первые буквы AB и вместо этого отображает CD..CD..CD и т. Д. Невозможно продолжить счетчик в новом столбце, не перебирая букву с надписью i.e ABCD? – user3057164

+0

@ user3057164: Это звучит так, будто вы написали новую программу, основанную на новой идее (той, которая объясняется в моем ответе). Я предлагаю вам просто задать новый вопрос с соответствующим кодом, который не работает, потому что это действительно новая проблема, не так ли? –

Смежные вопросы