2017-04-01 22 views
1

我正在努力讓我的專欄對齊我在學校的任務。方向是確保每個列標題與其各自的列正確對齊。我已經嘗試了迄今爲止在網上找到的所有內容,包括cout.width()和setw(),這兩者都不起作用。我希望這不是由於我錯誤地實施了這些方法,儘管我想不出任何其他原因爲什麼他們不工作。該作業特別具有2個學生姓名作爲示例。瓊斯,鮑勃和華盛頓,喬治。由於一個學生和下一個學生的字符數量差別很大,所以這些列不會對齊。我知道設置一個列寬應該可以解決這個問題,但在我看來並不是這樣。然後,我提供的代碼是使用setw()方法,但我可以提供如何嘗試使用cout.width()(如果需要)。任何幫助是極大的讚賞。使用C++進行列對齊

#include <iostream> 
#include <iomanip> 
#include <string> 
#include <cstdlib> 

using std::cout; 
using std::cin; 
using namespace std; 

const int ARRAYSIZE = 2; 

struct studentData{ 
    string lastName; 
    string firstName; 
    float studentGpa; 
}studentArray[ARRAYSIZE]; 

void displayData(int a); 

int main() 
{ 
    int counter = 0; 


    for (int a = 0; a < ARRAYSIZE; a++) 
    { 
     cout << "Enter last name: " << endl; 
     cin >> studentArray[a].lastName; 

     cout << "Enter first name: " << endl; 
     cin >> studentArray[a].firstName; 

     cout << "Enter GPA: "<< endl; 
     cin >> studentArray[a].studentGpa; 

     counter++; 
    } 
    cout << "\n\n"; 
    displayData(counter); 

return 0; 
} 

void displayData(int a) 
{ 
    int newSize = a; 

    cout << left << setw(20) <<"\nName(Last, First)"; 
    cout << right << setw(20) << "GPA\n"; 

    for (int z = 0; z < newSize; z++) 
    { 
     cout << studentArray[z].lastName << ", " << studentArray[z].firstName; 
     cout << right << setw(20) << fixed << setprecision(2) <<studentArray[z].studentGpa << endl; 
    } 
} 

我的控制檯輸入/輸出:

Enter last name: 
Jones 
Enter first name: 
Bob 
Enter GPA: 
3.0 
Enter last name: 
Washington 
Enter first name: 
George 
Enter GPA: 
4.0 



Name(Last, First)     GPA 
Jones, Bob    3.00 
Washington, George    4.00 

回答

1

你是沿着正確的線路,但std::setw僅適用於下一個輸出操作。如果你把打印的名字爲一個人操作,而不是3(最後,逗號,第一個),那麼你可以墊的寬度更容易:

void displayData(std::size_t a) 
{ 
    std::cout << std::left 
       << std::setw(20) 
       << "Name(Last, First)" 
       << "GPA\n"; 

    for (std::size_t z = 0; z < a; ++z) 
    { 
     std::cout << std::left 
        << std::setw(20) 
        << (studentArray[z].lastName + ", " + studentArray[z].firstName) 
        << std::fixed << std::setprecision(2) 
        << studentArray[z].studentGpa 
        << '\n'; 
    } 
} 

輸出:

Name(Last, First) GPA 
Jones, Bob   3.00 
Washington, George 4.00 

在這裏,無論是爲了打印列標題和學生姓名,我使用std::left來表示內容應該在填充總數的左側,並且std::setw將此輸出操作填充到總共20個字符(默認情況下它將填充空格) 。

在這兩種情況下,這是輸出中的第一列,所以我不需要對第二列做任何事情。如果你有第三欄,你也需要填寫第二欄。

我還將int s替換爲size_t以進行數組索引。這是一個小問題,但您不應該使用簽名類型將索引編入到訪問否定索引的容器中,該容器將爲「未定義行爲」。


此外,請重新考慮你的東西通常被認爲是不好的做法使用:using namespace std;endl(這些鏈接指向的解釋)。

+1

你真了不起。非常感謝。感謝底部的鏈接,非常瞭解。 – JoeX