我使用的逻辑有什么问题?

时间:2019-12-22 16:20:24

标签: c++ design-patterns nested-loops

为我尝试执行的代码设置逻辑错误

  *
 **
***
 **
  *

这就是模式,我的代码正在运行

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

打印星星似乎存在逻辑错误,我只是想知道应该使用哪种逻辑。 这是代码:-

#include<iostream>
using namespace std;
int main()
{

    /*

       *
      **
     ***
      **
       *

    */
    int i,rows;
    cout<<"Enter number of rows :"<<endl;
    cin>>rows;
    for(i = 1; i <= ((rows/2)+1) ; i++)
    {
        for(int j = (rows  - i); j >= 1; j--)
        {
            cout<<" ";
        }
        for(int k = 1; k <= i; k++)
        {
            cout<<"*";
        }
        cout<<endl;
    }
    for(i = ((rows/2)+1) ; i <= rows; i++)
    {
        for(int j = 1; j <= i; j++)
        {
            cout<<" ";
        }
        for(int k = (rows/2); k >= 1; k--)
        {
            cout<<"*";
        }
        cout<<endl;
    }


    return 0;
}

2 个答案:

答案 0 :(得分:1)

您可以如下更改第二个循环:

for ( i = ( rows / 2 ); i >= 1; i-- ) {
    for ( int j = ( rows - i ); j >= 1; j-- ) {
        cout << " ";
    }
    for ( int k = 1; k <= i; k++ ) {
        cout << "*";
    }
    cout << endl;
}

它重用了第一个循环中的逻辑,但只是将其更改为从rows/2降到1(包括)。

第一个循环头对于偶数值也运行太多次。例如,对于4,它执行4 / 2 + 1的{​​{1}}。您想要的在下面。

3

这有效地四舍五入。因此,对于for ( i = 1; i <= (int)( rows / 2. + .5 ); i++ ) ,您现在拥有4的{​​{1}},然后是4 / 2. + .5转换为2.5。使用int,您将得到25的{​​{1}},然后是5 / 2. + .5的{​​{1}}

答案 1 :(得分:0)

您不需要在第二个i循环中初始化for。在第一个循环完成后,让我们继续下一行的值。

您打印的*的数量由k循环控制。在第一行循环中,您将打印其中i,而在第二行中,您将始终打印相同的数字-rows / 2。您将需要打印逐渐减少的数量-rows + 1 - i。或只使用for (int k = i; k <= rows; ++k)