2017-04-01 229 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