繁体   English   中英

如何使用3 for循环而不是4打印以下图案?

[英]How do I print the following pattern using 3 for loops instead of 4?

我正在尝试打印以下模式:

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

现在,我知道如何使用4 for循环来做到这一点:

for(i=1;i<=n;i++)
{
    for(j=1;j<=i;j++)
    {
        cout<<"*";
    }
    cout<<"\n";
}

打印前半部分并打印后半部分:

for(i=1;i<=n;i++)
 {
    for(j=n;j>i;j--)
    {
        cout<<"*";
    }
     cout<<"\n";
}

仔细观察,两个外部for循环是相同的。 即for(i = 1; i <= n; i ++)。 无论如何,将两个“ j” for循环嵌套在i-for循环内?

仅使用一个循环:

#include <iostream>
#include <string>

int main() {
   for (unsigned i = 0; i < 10; ++i)
      std::cout << std::string( i < 5 ? (i+1) : 10 - (i+1), '*') << std::endl;

   return 0;
}

您是否只关心三个循环,而不是三个循环?

int n=5, i, j, k;

for (i=0; i<n*2-1; i++)
{
   j=i;
   if (j >= n)
      j=n*2-2-j;

   for (k=0; k<=j; k++)
      std::cout << '*';
   std::cout << std::endl;
}

使用2个循环:

int g=1;
for(int i=0;i<=5;i++){
for (int y=0;y<=i;y+=g){
cout<<"*";
}

cout<<endl;

if (i==4 && g==1){
cout<<"*****";
i=3;
g=-1;
}}

可以先打印10行,然后计算每行中的星星数,而不是先打印5行,再打印5行。

for(i = 1; i <= 2*n - 1; i++)
{
    for(j = 1; j <= n - abs(i - n); j++)
        {
            cout<<"*";
        }
    cout<<"\n";
}

对于介于1和n之间的i值,表达式n-abs(in)计算结果为i,对于大于i的i值,计算结果为2n-i。

只是为了好玩,一个循环怎么样:

  for (int i=1, j=0, dir=1; i!=0;) {
      cout << '*';
      ++j;

      if (j==i) {
          cout << '\n';
          j = 0;
          i += dir;

          if (i==6) {
              dir = -1;
              i -= 2;
          }
      }      
  }

您可以在一个循环中完成此操作(也许有点作弊):

size_t max = 5;
size_t rows = max * 2 - 1;
std::string line(std::string(max, '*') + '\n');

for ( size_t j = 0, k = max; j < rows; ++j ) {
    std::cout << line.c_str() + ( j < max ? --k : ++k );
}

我知道您并没有要求它,但是为了完整起见,这里有零循环的代码(改为递归):

#include <iostream>

void print_stars(int count)
{
    if (count > 0)
    {
        std::cout << '*';
        print_stars(count - 1);
    }
}

void print_line(int lines, int stars)
{
    if (lines == 1)
        print_stars(stars);
    else
    {
        if (stars > 0)
        {
            print_stars(stars);
            std::cout << std::endl;
        }

        print_line(lines - 1, stars + 1);
        std::cout << std::endl;

        if (stars > 0)
            print_stars(stars);
    }
}

int main()
{
    int star_count = 5;
    print_line(star_count + 1, 0);
    return 0;
}

只能使用一个for循环输出模式。

这是一个演示程序。

#include <iostream>
#include <iomanip>

int main() 
{
    while ( true )
    {
        const char c = '*';

        std::cout << "Enter non-negative number (0 - exit): ";

        unsigned int n;

        if ( !( std::cin >> n ) || n == 0 ) break;

        std::cout << '\n';

        for ( unsigned int i = 1; i < 2 * n; i++ )
        {
            unsigned int w = i <= n ? i : 2 * n - i;

            std::cout << std::setfill( c ) << std::setw( w + 1 ) << '\n';
        }

        std::cout << std::endl;
    }

    return 0;
}

如果按顺序输入

5 4 3 2 1 0

然后程序输出将如下所示

Enter non-negative number (0 - exit): 5

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

Enter non-negative number (0 - exit): 4

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

Enter non-negative number (0 - exit): 3

*
**
***
**
*

Enter non-negative number (0 - exit): 2

*
**
*

Enter non-negative number (0 - exit): 1

*

Enter non-negative number (0 - exit): 0

使用结构良好的程序的相同变量作为函数参数,您可以编写一个单独的函数来输出模式。

这个给你。

#include <iostream>
#include <iomanip>

std::ostream & pattern( unsigned int n, char c = '*', std::ostream &os = std::cout )
{
    for ( unsigned int i = 1; i < 2 * n; i++ )
    {
        unsigned int w = i <= n ? i : 2 * n - i;

        os << std::setfill( c ) << std::setw( w + 1 ) << '\n';
    }

    return os;
}

int main() 
{
    while ( true )
    {
        std::cout << "Enter non-negative number (0 - exit): ";

        unsigned int n;

        if ( !( std::cin >> n ) || n == 0 ) break;

        std::cout << '\n';

        pattern( n );       

        std::cout << std::endl;
    }

    return 0;
}

考虑到例如使用标准类std::string输出模式是一个不好的主意,因为由于动态内存为该类对象的分配和重新分配,程序将效率低下。

如果不使用标准流操纵器,则可以使用标准算法std::fill_n隐藏内部循环。 在这种情况下,程序也将只有一个显式循环。

例如

#include <iostream>
#include <algorithm>
#include <iterator>

int main() 
{
    while ( true )
    {
        const char c = '*';

        std::cout << "Enter non-negative number (0 - exit): ";

        unsigned int n;

        if ( !( std::cin >> n ) || n == 0 ) break;

        std::cout << '\n';

        for ( unsigned int i = 1; i < 2 * n; i++ )
        {
            unsigned int w = i <= n ? i : 2 * n - i;

            *std::fill_n( std::ostream_iterator<char>( std::cout ), w, c ) = '\n';
        }

        std::cout << std::endl;
    }

    return 0;
}
#include <iostream>
using namespace std;
int main() {
    int i;
    int j;
    int count = 1;
    for(i= 0;i<10;i++) {
        if(i < 5) {
           for(j=0;j<=i;j++) {
               cout<<"*";
           }
        } else {
           for(j=i-count;j>0;j--) {
              cout<<"*";
           } 
           count +=2;
    }
       cout<< "\n";
   }
   return 0;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM