1

我正在为我正在学习的 C++ 课程设计一个程序,教授希望我们制作一个使用“*”输出菱形的程序。我坚持的事情是我的程序输出了太多行。

代替

 *
***
 *

它正在输出

  *
 ***
*****
 ***
  *

我将如何修改我的代码以使其正常工作?我整个早上都在网上寻找答案,但没有运气。

这是我的代码:

#include <iostream>
using namespace std;

int main () {
    //Define Varaible
    int N;

   cout << "Please enter a postitive integer: ";
   cin  >> N;
   cout << "Here is your diamond." << endl << endl;

   for (int i = 0; i <= 2 * N; i++) {
      for (int j = 0; j <= 2 * N; j++) {
         if (i <= N) {
            if (j < N - i || j > N + i) {
               cout << ' ';
            }
            else {
               cout << '*';
            }
         }
         else {
            if (j < i - N || j > 3 * N - i) {
               cout << ' ';
            }
            else {
               cout << '*';
            }
         }
      }
      cout << endl;
   }
    return 0;
}
4

2 回答 2

0

您获得的行数比您预期的多的原因是您2 * N + 1在实际需要时创建了行数2 * N - 1

解决方法很简单:N读取输入后减一。

   cin  >> N;
   assert(N > 0);
   --N;

这样,您的其余代码就不必更改。

于 2013-10-22T17:37:00.847 回答
0

您应该记住,在 [0,5] 范围内(包括在内)有 6 个元素,而不是 5 个。因此,当您执行循环并且想要执行 5 次迭代时,您通常会执行以下任一操作:

for( int i = 0; i < 5; ++i ) // do stuff

或者

for( int i = 1; i <= 5; ++i ) // do stuff

当用 C 或 C++ 编程时,第一个版本更经常使用,因为它适合数组索引并且程序员习惯使用这种形式。但正如我之前所说,如果你这样做:

for( int i = 0; i <= 5; ++i ) // do stuff

那将是6次迭代。

于 2013-10-22T17:39:06.147 回答