【问题标题】:How do I print this star pattern in C++?如何在 C++ 中打印这个星形图案?
【发布时间】:2019-11-22 20:05:10
【问题描述】:

我需要打印这样的星形图案:

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

我试过的代码是:

#include <iostream>
using namespace std;

int main()
{
    int i,j,k;
    for(i=1;i<5;i++){
        for(j=1;j<5;j++){
            if(i==1 || j==4 || i==4  )
             // if(j==4 || i==4)
            cout<<"*";
            if(i>1 && i<4){
                for(k=1;k<3;k++){
                    cout<<"";
                }
            }
            else {
                cout<<"";
            }

        }
        cout<<endl;

    }

    return 0;
}

这是我得到的输出:

****                                                                                                                          
*                                                                                                                             
*                                                                                                                             
**** 

所以,您知道我在打印每行末尾的星号时遇到了问题。正如您在我上面提供的所需输出中看到的那样,在第 2 行和第 3 行中,我需要将它们打印出来。现在,正如我给出的代码一样,我尝试这样做,但不确定为什么它不起作用。所以,我需要你的帮助来实现这个输出。

许多其他问题都有类似的标题,但这是关于完全不同的星形图案。

P.S:顺便说一句,我想提一下,我已经学习 C++ 一年多了,但我仍然遇到循环问题。我已经理解了其他的东西,比如函数、if-else、结构、数组、基本的 oop 等,但是由于某种原因,循环给我带来了麻烦,所以我认为我应该做这些星形模式练习。如果你们对我如何改进循环中的逻辑(尤其是嵌套的逻辑)有任何建议,那么这对我很有帮助。谢谢。

【问题讨论】:

  • 请注意,cout &lt;&lt; "";绝对没有任何作用。您的意思是 cout &lt;&lt; " ";(注意空格字符)吗?
  • @scohe001 哦。是的你是对的。我的意思是使用空间
  • @Algirdas Preidžius 谢谢。但是,你有任何关于如何学习循环及其逻辑的资料吗?我的意思是每当我在谷歌上搜索时,每个页面都只显示它的语法。
  • std::cout &lt;&lt; "*****\n ** *\n *** *\n *****\n"; - 完成。
  • @AviadRozenhek 1) 坦率地说,这是基于意见的。我在我的职业生涯中使用过 C++ 和 C#,但我仍然更喜欢 C++。 Python 主要用于在我们的环境中构建脚本,而不是实际开发,即使在有时接触 Python 之后:我仍然更喜欢 C++。 2) “我强烈建议学习一门更简单、更现代和更有用的语言” C++ 有哪些不现代的地方?自 2011 年以来,该语言每 3 年添加一次功能,这有助于使该语言现代化。

标签: c++ loops for-loop


【解决方案1】:

用我的 cmets 更正了代码:

#include <iostream>
using namespace std;

int main()
{
    int n = 5; // columns count
    for(int i = 1; i < n; i++)  // i is row index
    {
        for(int j = 1; j <= n; j++)  // j is current symbol index in line i
        { // note, you print 5 symbols per line, so j <= 5, not j < 5
            if (i > 1 && i < n && j != n && j > i)  // for lines 2 and 3 indexes [3-4] and [4] print space, print * for symbol #5 (last symbol in a line is always *)
            {
                 cout << " ";
            }
            else
            {
                 cout << "*";
            }
         }

         cout << endl;
    }

    return 0;
}

【讨论】:

  • 我不明白为什么在 if 条件下,我们正在做 j != n
  • 如果j == n 比这意味着当前符号是行中的最后一个符号。最后一个符号是*,所以这就是添加这个条件的原因
  • 对不起,我没听懂。你能解释一下吗?
  • 例如,您有** * 行(示例中的第 2 行)。如果索引从 1 开始,则行中元素的最后一个索引为 5(= n,列数)。请注意,在这一行中,符号 #2 之后的所有符号都是空格,除了最后一个。这就是为什么需要j &gt; i 的原因(对角线右侧位置上的所有符号都是空格)。但是最后一个符号总是*,所以有条件检查当前索引是否是行中最后一个符号的索引(j != n),如果是,则打印星号而不是空格
  • 这个解决方案很难阅读和理解。可读性很重要,因为代码的阅读次数多于编写次数。
【解决方案2】:
 i=1;i<5; 

这会运行 4 次。 i=1,i=2,i=3,i=4。

您需要i&lt;6i&lt;=5

【讨论】:

  • "您需要i&lt;6i&lt;=5" 或者,从i=0 开始。
  • 是的。如果这是你要走的路,你需要改变 if 语句和你检查的索引
【解决方案3】:

为了制作“最短、最干净的 C++ 代码”,您可以在一个循环中完成所有操作:

int n = 10; //input

std::cout << std::string(n, '*') << std::endl; //First line
for (int i = 2; i < n; i++)
    std::cout << std::string(i, '*');
              << std::string(n - i - 1, ' ') 
              << '*' << std::endl;

【讨论】:

    【解决方案4】:

    问题是 "" 不注册空格,但 " " 会。

    int main()
    {
        int i, j, k;
        for (i = 0; i < 4; i++) {
            for (j = 0; j < 5; j++) {
                if (i == 0 || i == 3)
                {
                    cout << "*";
                }
                else if (i == 1) {
                    if (j == 2 || j == 3) {
                        cout << " ";
                    }
                    else {
                        cout << "*"; 
                    }
                }
                else if (i == 2) {
                    if (j == 3) {
                        cout << " ";
                    }
                    else {
                        cout << "*";
                    }
                }
    
            }
            cout << endl;
    
        }
        return 0;
    }
    

    【讨论】:

    • 如果有一个适用于任意数量行的解决方案会很好。在这种情况下 n=5 但如果 n=10 呢?
    【解决方案5】:

    这是python中的一个解决方案。您应该能够将其推断为 C++

    N = 10
    print('*' * N)
    for row in range(2, N+1):
        print('*' * row, end='')
        print(' ' * (N-row -1), end='')
        print('*')
    

    这里有一个 C++ 解决方案,它做的事情完全相同,但比 python 解决方案更长。我首先给出了 python 解决方案,因为我相信它比 C++ 对应物更清晰地显示了思维过程。

    int N = 10;
    for(int i=0 ; i<N ; ++i)
      cout << '*';
    cout << endl;
    for (int row = 2; row < N; ++row) {
      for(int i=0 ; i<row ; ++i)
         cout << "*";
      for(int i=row ; i<N-1; ++i)
         cout << ' ';
      cout << '*' << endl;
    }
    

    这是 N=10 的输出

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

    【讨论】:

    • 请不要用python或其他不相关的语言回答C++问题。
    • @machine_1 这不是一个真正的 C++ 问题,是吗?这是一个简单的学习编程问题。实际上,用 python 编写答案比使用繁琐的 C++ 更能说明原理。
    • @machine_1 说的很到位。如果两种语言有一些共同的语法,那么复制/粘贴可能很诱人——但这通常不是目标语言的正确答案。在这种情况下,您已经演示了一种算法,但使用的语法与 C++ 的语法如此不同,以至于 OP 必须学习 python 才能理解它并将其翻译成 C++。没有帮助。而且,是的,这是一个 C++ 问题。
    • 我认为无论 C++ 多么有用,它都不是学习编程的好语言。@TedLyngmo 整个晚上我一直在回答 n00b 个问题,而这只是看到那些在循环中挣扎的人也需要同时处理 c++ 语法,这让我很伤心。我给出了一个答案,恕我直言更容易阅读,并建议学生将更好地学习不同的 python 作为第一语言。如果这甚至可以帮助 1 人更快地学习编程,那么在这个答案上失去声誉点绝对值得
    • 所以,你的意见是一回事。我碰巧不同意。但是用另一种语言回答一个带有特定语言标签的问题对任何人都没有帮助。
    猜你喜欢
    • 2018-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-08
    • 1970-01-01
    • 2016-01-10
    • 2022-11-20
    • 2022-06-22
    相关资源
    最近更新 更多