Не удается правильно выровнять с помощью манипулятора setw

Я не могу выровнять вывод своей программы. Я хочу сохранить те же имена и получить правильный интервал. Код приведен ниже. Я также пытался использовать left, но это все равно не работает.

Ожидаемый результат:
expected

Вывод, который я получаю:
getting

    //taking name and votes recieved
    for (i = 0; i < 5; i++)
    {
        cout << "Enter last name of candidate " << (i + 1) << ": ";
        cin >> names[i];
        cout << "Enter votes recived by " << names[i] << ": ";
        cin >> votes[i];
    }

    //calculating total votes
    for ( i = 0; i < 5; i++)
    {
        total = total + votes[i];
    }

    //calculating percentage of total votes for each candidate
    for ( i = 0; i < 5; i++)
    {
        percent_of_total[i] = (votes[i] / total) * 100.0;
    }

    //checking winner
    winner = names[0];
    int most = 0;

    for ( i = 0; i < 5; i++)
    {
        if (votes[i] > most)
        {
            most = votes[i];
            winner = names[i];
        }
    }

    cout << fixed << setprecision(2);

    //dislaying

    cout << "Candidte" << setw(20) << "Votes Recieved" << setw(20) << "% of Total Votes";

    for (i = 0; i < 5; i++)
    {
        cout << endl;
        
        cout << names[i] << setw(20) << votes[i] << setw(20) << percent_of_total[i];
    }

    cout << endl;

    cout << "Total" << setw(20) << total;

    cout << endl << "The winner of the Election is " << winner << ".";
    
    return 0;
}

person MAbdullahMughal    schedule 15.12.2020    source источник
comment
Пожалуйста, не размещайте текстовую информацию в виде изображений.   -  person Scheff's Cat    schedule 15.12.2020
comment
Вы не применили std::setw() к своему первому столбцу, но имена также имеют разную длину. Это причина вашего невыровненного внешнего вида таблицы. (Обратите внимание, что ваши выходные строки лестны именно по длине имен.)   -  person Scheff's Cat    schedule 15.12.2020
comment
Возможно, вы не знаете, что std::setw() применяется к следующему форматированному выводу, но не к предыдущему. (std::setw())   -  person Scheff's Cat    schedule 15.12.2020


Ответы (1)


setw необходимо вызвать перед полем, к которому вы хотите применить фиксированный длина до. В том числе и имена. Если вы хотите, чтобы имена были выровнены по левому краю, вы можете использовать

std::cout << std::left << std::setw(20) << name /*<< [...]*/;

В качестве примечания вам следует избегать использования using namespace std;. Причина в том, что std содержит много имен, и вы можете использовать другие библиотеки, использующие те же имена, или использовать их самостоятельно. std довольно короткий и не слишком загромождает код. Жизнеспособной альтернативой является использование

using std::cout;
using std::cin;
using std::endl;
using std::setw;
using std::left;
// etc

для всех имен, которые вы хотите использовать.

другой альтернативой является вызов с использованием пространства имен std в функции, которую вы хотите использовать в пространстве имен std.

#include <iostream>

void f()
{
  using namespace std;
  cout << "f() call" << endl;
}

int main()
{
  // std not being used here by default
  f();
  return 0;
}
person FalcoGer    schedule 15.12.2020
comment
Большое спасибо. Это сработало. - person MAbdullahMughal; 16.12.2020