仅使用嵌套的while循环打印表

时间:2017-12-01 22:44:55

标签: c++ if-statement while-loop nested-loops cout

我试图用C ++打印下表:

     1    2    3    4    5    6    7    8    9    10    
1    1    2    3    4    5    6    7    8    9    10    
2    2    4    6    8    10   12   14   16   18   20    
3    3    6    9    12   15   18   21   24   27   30    
4    4    8    12   16   20   24   28   32   36   40    
5    5    10   15   20   25   30   35   40   45   50    
6    6    12   18   24   30   36   42   48   54   60    
7    7    14   21   28   35   42   49   56   63   70    
8    8    16   24   32   40   48   56   64   72   80    
9    9    18   27   36   45   54   63   72   81   90    
10   10   20   30   40   50   60   70   80   90   100   

仅使用嵌套的while循环。

我有两个主要问题:

  • 如果不在开头使用非嵌套while(打印第一行)或第一行使用if语句,我不明白如何操作。< / LI>
  • 使用setw我在尝试将数字与两位数对齐时遇到问题。

这是我试过的

#include <iostream>
#include <iomanip>
using namespace std;

int main()
{
  int k=0;
  while(k<=10)
  {cout << k << setw(5);
      k++;
  };
  cout << "\n";

  int i=1;
  while(i<=10){
      cout << i << setw(5);
      int j=1;
      while(j<=10){
          cout<< i*j << setw(5);
          j++;
      }
      cout << "\n";
    i++;
  }  
  return 0;
}

但是,如上所述,我在开头使用了非嵌套while,输出也是:

0    1    2    3    4    5    6    7    8    9   10    
1    1    2    3    4    5    6    7    8    9   10    
2    2    4    6    8   10   12   14   16   18   20    
3    3    6    9   12   15   18   21   24   27   30    
4    4    8   12   16   20   24   28   32   36   40    
5    5   10   15   20   25   30   35   40   45   50    
6    6   12   18   24   30   36   42   48   54   60    
7    7   14   21   28   35   42   49   56   63   70    
8    8   16   24   32   40   48   56   64   72   80    
9    9   18   27   36   45   54   63   72   81   90    
10   10   20   30   40   50   60   70   80   90  100 

两位数字未以正确方式对齐的位置。另一方面,我不能想办法修改循环以增加仅两位数的空间,而不使用if语句。

我是否遗漏了某些内容,或者在不使用if或非嵌套while的情况下无法打印上表?

2 个答案:

答案 0 :(得分:2)

我想你想先隐藏0值。为了隐藏它,我使用了一些操作。嵌套时没有if语句和所有打印。

#include <iostream>
#include <iomanip>
using namespace std;

int main()
{
  int i = 0, k = 0;
  while (i < 10){
      int j = 0;
      while (j <= 10){
          cout << left << setw(5);
          (i || j || k) && cout << j + i * j + !j * (i + 1);
          !(i || j || k) && cout << "";
          j++;
      }
      cout << "\n";
      i += k++ > 0;
  }  
  return 0;
}

输出

     1    2    3    4    5    6    7    8    9    10   
1    1    2    3    4    5    6    7    8    9    10   
2    2    4    6    8    10   12   14   16   18   20   
3    3    6    9    12   15   18   21   24   27   30   
4    4    8    12   16   20   24   28   32   36   40   
5    5    10   15   20   25   30   35   40   45   50   
6    6    12   18   24   30   36   42   48   54   60   
7    7    14   21   28   35   42   49   56   63   70   
8    8    16   24   32   40   48   56   64   72   80   
9    9    18   27   36   45   54   63   72   81   90   
10   10   20   30   40   50   60   70   80   90   100

说明:

  1. 我使用了j作为种子而i * j用于第(j + 1)列的新值。 它适用于从第一行第二列到最后一行最后一列。
  2. 对于第一列,j始终为0.为了使其正常工作,我使用了!j *(i + 1),它为第一列打印0到10.
  3. 要隐藏第一行和第一列的0,i,j和k的全部为0.对于所有其他单元格,其中至少有一个单元格的值不是0。
  4. 如果仍不清楚,我会举例解释。

答案 1 :(得分:1)

需要考虑的事项:

  • 输出标签而不是尝试设置宽度要容易得多, 虽然你对输出的外观控制较少(但它会 取决于控制台的制表位宽度。但您的标准选项卡会停止 将处理您的价值范围。
  • 您的问题陈述并未说明您可以使用的循环次数
  • 您可以使用while循环来模拟if语句:

    while(j == 0){
        cout << i << '\t';
        break;
    }
    

我将把剩下的作为锻炼留给你。