2010-09-28 139 views
0

我有以下生成乘法表的程序。输出达到两位数时出现格式问题。我如何理顺这些列?在C++中格式化列

#include <iostream> 

using namespace std ; 
int main() 
{ 
    while (1 != 2) 
    { 
    int column, row, c, r, co, ro; 

    cout << endl ; 

    cout << "Enter the number of columns: " ; 
    cin >> column ; 
    cout << endl ; 
    cout << "Enter the number of rows: " ; 
    cin >> row ; 
    cout << endl ; 

    int temp[column] ; 
    c = 1 ; 
    r = 1 ; 
    for(ro = 1; ro < row ; ro ++){ 
     for(co = 1; co < column ; co ++){ 
      c = C++ ; 
      r = r ++ ; 
      temp [c]= co * ro; 

      cout << temp[c] << " "; 
     } 
     cout << endl ; 
    } 
    system("pause"); 
    } 
} 
+0

你的程序中有一个很大的错误会使它经常崩溃:它应该是int temp [column * row]'。另外,如果你不想重复使用表格,你可以在循环内执行'cout << co * ro'并移除'temp'数组。 – schnaader 2010-09-28 01:42:54

+0

我问为什么有一个临时的。循环后不使用它。为什么不只是做'cout << setw(3)<< co * ro;'? – JoshD 2010-09-28 01:45:49

回答

2

使用setw output manipulator

COUT < <运输及工务局局长(3)< <温度[C];

默认情况下,它使用空格填充,看起来像你想要的。

您将需要包含iomanip,如文档所述。

1

您可以使用“\ t”而不是“”。

+2

我不会低估这一点,因为它在至少相当有限的情况下很有用。但是,由于它完全取决于终端的tabstop设置,因此它不适合生产质量的代码。如果你不控制制表符,或者如果你输出一个跨越这样的tabstop的数字,你的输出将会消失。 – paxdiablo 2010-09-28 01:42:28

3

为此,C++有setwsetfillsetw设置宽度和setfill设置填充字符。

在你的情况,你可以使用类似:

#include <iostream> 
#include <iomanip> 

int main (void) { 
    std::cout << std::setw(5) << 7 << std::endl; // will output " 7". 
    return 0; 
} 

你有许多其他问题的代码,其中至少一些如下:

  • 您不为数组分配足够的空间,它应该是column*row(或使用二维数组)。
  • 数组索引从0开始,而不是1
  • c = c++是不是一个好主意,c++将足以增加c
  • 您可能会在每次迭代中尝试增加c两次,一次如果for语句本身和for正文中的一次。
  • system("pause");是一个丑陋的黑客语言提供了一个很好的getcharcin等效。因为1永远不会等于2。只需使用while (1)for(;;) - 任何值得使用的盐编码器都会知道您的意思。
2

您可以通过使用流操纵这样设置你的列元素的宽度:

cout << setw(3) << temp[c]

但是这是你需要除了修复某些东西:c = c++;不增加变量!

2

这是老式的printfcout容易得多的情况之一。将cout << temp[c] << " "替换为printf("%2d ", temp[c])

我希望你已经发现了你的c计算中的错误。

+0

在Yoda的不朽的话语中,当Luke试图在Dagobah崩溃后使用C++特性时:“不,不要试试,不要试试。” :-)对于C编码器,使用'printf'可能比'cout'更简单,但是如果你想成为一个C++编码器,可以使用C++的全部功能。是的,我知道'printf'可以工作,所以'#define'宏代码和常量 - 这并不一定是他们的好主意。再一次,我不愿意downvote,因为在我过渡到C++之前,我很早就使用它,而且比在一天内完整学习iostream/iomanip更容易。 – paxdiablo 2010-09-28 02:05:55

+1

@paxdiablo,我知道printf是*方式*过时了,我有-1票来证明它。我也知道它比替代品更安全。我仍然经常发现它是实用的方法,可能是我仍然坚持的唯一C部分。 – 2010-09-28 03:17:31