Iomanip ошибки с std :: left / right

Я пытаюсь выровнять по левому краю одну сторону строки, а по правому — другую сторону, но у меня возникают проблемы с выравниванием правой стороны по правому краю. Кто-нибудь может поймать мою ошибку?

//The following program will declare
#include <iostream>
#include <iomanip>

using namespace std;

const int HOUSING = 3500;                                       //housing cost
const int MEALS = 2000;                                         //meal cost
const int N_CRED_PER = 285;                                     //out of state credit cost
const int CRED_PER = 130;                                       //amount of money per credit(cost)
const int TAB = 30;                                             //precision
const int ADD_FEES = 6200;                                      //out of state fees for non-resident

int main()
{
cout << "Grant Mercer section 1002 Assignment 6\n\n";
int size, studentID, credits, i, valid,total;
//size of loop, studentID to hold ID of student, credits to hold num
//of credits the student will take, i to start loop
char first, last, res, housing, meal;                         //first and last to hold initials of
//student, res to hold code
//if student is resident, meal to hold
//code if student has meals
cin >> size;                                                  //grab length of loop in file
cout << left;                                                 //manipulate stream
cout << fixed << showpoint << setprecision(2);
valid = size;                                                 //initially all entries are valid, but de
//cremented each time something goes wrong
while  (i < size)
{
cin >> studentID >> first >> last >> credits >> res;      //read in mandatory data to vars
cout << setw(TAB) << left <<  "Student #: " << right << studentID << endl;  //display id
cout << setw(TAB) << left << "Initials: " << right << first << last << endl;//display initials
if(credits > 0 && credits < 21)                           //if credits are fine
{
switch(res)                                           //find char in res
{
case 'R':                                           //if RESIDENT
case 'r':
cout << setw(TAB) << left << "Residency status: " << right << "Resident" << endl;
cout << setw(TAB) << left << "Credits: " << right << credits << endl;
cout << setw(TAB-10) << left << "Tuition: " << setw(10) << "$" << right << (double)CRED_PER * credits << endl;
cout << setw(TAB-10) << left << "Total due: " << setw(10) << "$" << right << (double)CRED_PER * credits << endl;
total += CRED_PER * credits;                      //add to total cost
break;
case 'N':                                           //if NON-RESIDENT
case 'n':
cout << setw(TAB) << left  << "Residency status: " << right <<  "Non-resident" << endl;
cin >> housing >> meal;                            //since the student is non-resident, they
//have a mean and house code
cout << setw(TAB) << left << "Credits: " << right << credits << endl;
cout << setw(TAB - 10) << left  << "Tuition: " << setw(10) << "$" << right << (double)credits * N_CRED_PER + ADD_FEES << endl;
if(housing == 'H' || housing == 'h')
{
cout << setw(TAB - 10) << left << "Housing: " << setw(10) << "$" << right << (double)HOUSING << endl;
if(meal == 'M' || meal == 'm')                  //if MEALS
{
cout << setw(TAB-10) << left << "Meal Plan: " << setw(10) << "$" << right << (double) MEALS << endl;
cout << setw(TAB-10) << left << "Total due: " << setw(10) << "$" << right << (double) MEALS + HOUSING + (credits * N_CRED_PER) + ADD_FEES << endl;
total += MEALS + HOUSING + (credits * N_CRED_PER) + ADD_FEES;
//add to total
}
else                                             //if NO MEALS
{
cout << setw(TAB-10) << left << "Total due: " << setw(10) << "$" << right << (double)\
HOUSING + (credits *N_CRED_PER) + ADD_FEES << endl;
total += HOUSING + (credits * N_CRED_PER) + ADD_FEES;
//add to total
total += HOUSING + (credits * N_CRED_PER) + ADD_FEES;
//add to total
}
}
else                                              //if NO HOUSING NO MEALS
{
cout << setw(TAB-10) << left  << "Total due: " << setw(10) << "$" << right << (double)(cr\
edits * CRED_PER) + ADD_FEES
<< endl;
total += (credits * CRED_PER) + ADD_FEES;
}
break;
}

}
else
{
cout << "INVLIAD CREDIT AMOUNT...\n";
valid--;
}
i++;
cout << endl << endl;
}
cout << "\nFINAL TOTALS\n";                                   //display final totals from students
cout << right << setw(TAB) << left << "Valid request count: " << right << valid << endl;
cout << setw(TAB) << left  << "Invalid requrest count: " << right << size - valid << endl;
cout << setw(TAB - 10) << left  << "Total feed due: " << setw(10) << "$" << right << (double)total;
cout << endl;
return 0;
}

все результаты выровнены по левому краю, я не понимаю, что мне нужно сделать, чтобы все это было правильно. Спасибо!

0

Решение

Вы забываете использовать setw() перед печатью каждой строки с выравниванием по правому краю с помощью cout, Например, возьмите следующую строку в вашем коде:

cout << setw(TAB) << left << "Residency status: " << right << "Resident" << endl;

Перед печатью каждой строки, выровненной влево или вправо, необходимо установить новую ширину:

cout << setw(20) << left << "Residency status: " << setw(20) << right << "Resident" << endl;

Без setw(), он предполагает, что ширина равна нулю, что в основном игнорирует правильное выравнивание.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]