【问题标题】:Printing an inverted triangle with a * at the bottom in C Code在 C 代码中打印底部带有 * 的倒三角形
【发布时间】:2017-10-24 06:30:46
【问题描述】:

抱歉,我再次需要帮助。我得到了一份作业,需要在屏幕上打印出来。但是,我必须满足各种要求。老实说,我真的卡住了,因为当我在网上查看时,我必须考虑空格,它并没有告诉我如何将三角形底部的小尖端编辑成另一个。这就是我所做的,但考虑到我必须做的案例数量,它真的很疯狂,我认为它不可行。请帮忙!非常感谢您。

1) 顶部基本长度必须是用户输入,最大数量为 79(基本长度=79)。

2) 三角形必须是对称的。

xxxxxxxxx
 xxxxxxx
  xxxxx
   xxx
    *

#include<stdio.h>

int main()
{
int i, space, base_length, star;
printf("Enter the base length:\n");
scanf("%d",&base_length);

if (base_length==15)
{
    printf("XXXXXXXXXXXXXXX\n");
    printf(" XXXXXXXXXXXXX\n");
    printf("  XXXXXXXXXXX\n");
    printf("   XXXXXXXXX\n");
    printf("    XXXXXXX\n");
    printf("     XXXXX\n");
    printf("      XXX\n");
    printf("       *\n");
}
else if (base_length==13)
{
    printf(" XXXXXXXXXXXXX\n");
    printf("  XXXXXXXXXXX\n");
    printf("   XXXXXXXXX\n");
    printf("    XXXXXXX\n");
    printf("     XXXXX\n");
    printf("      XXX\n");
    printf("       *\n");
}
else if (base_length==11)
{
    printf("  XXXXXXXXXXX\n");
    printf("   XXXXXXXXX\n");
    printf("    XXXXXXX\n");
    printf("     XXXXX\n");
    printf("      XXX\n");
    printf("       *\n");
}

else if (base_length==9)
{
    printf("   XXXXXXXXX\n");
    printf("    XXXXXXX\n");
    printf("     XXXXX\n");
    printf("      XXX\n");
    printf("       *\n");
}

else if (base_length==7)
{
    printf("    XXXXXXX\n");
    printf("     XXXXX\n");
    printf("      XXX\n");
    printf("       *\n");
}

else if (base_length==5)
{
    printf("     XXXXX\n");
    printf("      XXX\n");
    printf("       *\n");
}

else if (base_length==3)
{
    printf("      XXX\n");
    printf("       *\n");
}

else if  (base_length==1)
{
    printf("       *\n");
}
else
{
    printf("The maximum base length permitted is 79 and has to be an odd number.\nPlease try again with a valid number.\nThank You!!!");
}

return;

}

【问题讨论】:

  • 您必须根据用户信息为要打印的每一行推导出一个公式,然后您需要对这些行使用循环并应用此公式
  • 第一行应该很简单:只需打印与用户输入的数字一样多的X。现在尝试为第 2、3、..n 行推导出一个
  • 使用 char 缓冲区并在其中设置字符,而不是直接打印它们。这可能对您更有指导意义,并且代码更清晰。 (如果您可以在没有循环或递归的情况下进行行格式化,则可以加分。)
  • return; :必须返回一个值。
  • 每一行都有x X 和s 空格。用户在第一行输入 X 的值,因此s 必须为零。之后的每一行都少了两个 X,多了两个空格。一半的空格在 X 的左边,另一半在右边,可以忽略。

标签: c


【解决方案1】:

注意模式,用迭代代替。

喜欢这个

#include <stdio.h>

int main(void){
    int i, base_length, space, x;
    int bias_space = 7, rows;
    const char *X79 = //Prepare in advance because the maximum length is fixed
        "XXXXXXXXXX"
        "XXXXXXXXXX"
        "XXXXXXXXXX"
        "XXXXXXXXXX"
        "XXXXXXXXXX"
        "XXXXXXXXXX"
        "XXXXXXXXXX"
        "XXXXXXXXX";

    printf("Enter the base length:\n");
    scanf("%d", &base_length);

    if(base_length < 1 || base_length > 79 || (base_length & 1) == 0){
        printf("The maximum base length permitted is 79 and has to be an odd number.\nPlease try again with a valid number.\nThank You!!!");
        return -1;
    }
    rows = base_length / 2;//Number of rows excluding the top
    bias_space -= rows;
    if(bias_space < 0) //When there are more than 7 lines, there is no bias space.
        bias_space = 0;

    for(i = rows, space = 0, x = base_length; i--; space++, x -= 2)
        printf("%*s%.*s\n", bias_space + space, "", x, X79);
    printf("%*s%c\n", bias_space + space, "", '*');
}

【讨论】:

  • 几乎正确。一个非常简单的问题的过于复杂的解决方案,您不应该为学生的问题提供完整的解决方案。
  • 我并不过分复杂。相反,它是一个简单的解决方案。当然,我可以展示一个部分的解决方案,但我会尽量展示在这种情况下可行的东西。我厌倦了被告知“它不起作用”。
  • 我们可以帮助 OP 完成他们的作业,而无需我们为他们编写代码。向同级程序员炫耀你的技能是一回事,而帮助学生在家庭作业中作弊则完全不同。
  • 我不需要你的想法。
【解决方案2】:

您可以使用带有帮助函数的简单递归函数:

#include <stdio.h>

void triangle(int size);
void triangle_aux(int size, int n);

int main()
{
    int base_length;

    printf("Enter the base length:\n");
    scanf("%d",&base_length);

    if(base_length < 1 || base_length > 79 || base_length%2 == 0)
        printf("The maximum base length permitted is 79 and has to be an odd number.\nPlease try again with a valid number.\nThank You!!!");
    else
        triangle(base_length);
}

void triangle(int size) {
    triangle_aux(size, 0);
}

void triangle_aux(int size, int n)
{
    int i;
    for(i=0; i<n; i++)
        printf(" ");
    if(n==size/2)
        printf("*\n");
    else {
         for(i=n; i<size-n; i++)
              printf("X");
         printf("\n");
         triangle_aux(size, n+1);
    }
}

【讨论】:

  • 请不要为他们的家庭作业发布代码。而是教他们如何通过算法思考。
  • @jwdonahue 不知道您是否是投反对票的人,但我不认为这是投反对票正确答案的好理由。在这里讨论它:meta.stackoverflow.com/questions/255459/…
  • 我没有 DV 你的帖子。虽然我可能会,如果你没有真正删除它,我有理由回到这个问题。
  • 您好,给您带来的不便,我们深表歉意!非常感谢您提供正确的代码。归根结底,如果我不学习正确的步骤,那将是我的责任。
猜你喜欢
  • 1970-01-01
  • 2015-04-05
  • 2016-07-28
  • 2020-10-03
  • 1970-01-01
  • 1970-01-01
  • 2016-01-25
  • 2020-10-06
  • 1970-01-01
相关资源
最近更新 更多