【问题标题】:C - Drawing rectangle using * special character based on input (For loop)C - 基于输入使用 * 特殊字符绘制矩形(For循环)
【发布时间】:2021-01-02 18:45:18
【问题描述】:

我对编程很陌生,我有一个我无法完成的任务。

所以程序必须接受用户输入,矩形的长度和宽度,然后根据参数长度和宽度使用星号* 绘制矩形。我必须使用for 循环,更准确地说是一个for 循环在另一个循环中。 它不起作用,我一直坚持下去,所以如果有人愿意帮助我,我将不胜感激。

这是我得到的:

int main() {
    
    printf("\n\n***Rectangle***");

    printf("\n\n\nInsert side a: ");
    scanf("%f", &sideA);
    printf("\n\nInsert side b: ");
    scanf("%f", &sideB);
    
    printf("\n\nRectangle: \n\n");
    
    for (int i = 0; i < sideA; i++) {
        for (int j = 0; j < sideB; j++) {
            if (i == 0 || i == sideB - 1 || j == 0 || j == sideA - 1) {
                printf("*");
            } else {
                printf(" ");
            }
            printf("\n");
        }
    }
}

提前非常感谢

【问题讨论】:

  • 你得到什么而不是所需的矩形(其中 *s 必须仅在周边,我想是因为问题不清楚)。如果您可以使用相关的main 代码发布执行它的整个函数会更容易。
  • 在每个书写字符(星号或空格)之后打印一个换行符,你怎么能希望它按预期工作?
  • 如果您使用sideAsideB,如果您调用循环变量ab 而不是i 和@987654331,将会更容易发现错误@.

标签: c for-loop console-application drawing nested-for-loop


【解决方案1】:

有多个问题:

  • 你应该包括&lt;stdio.h&gt;
  • sideAsideB 应定义为 int
  • scanf("%f", &amp;sideA); 应该是 scanf("%d", &amp;sideA);sideB 相同。此外,您应该测试输入是否失败:scanf() 返回成功转换的次数,在这种情况下必须为1
  • 您对坐标有一个简单的混淆:i 应与 sizeAjsizeB 进行比较。
  • 应该在内循环之外打印换行符:

这是一个更正的版本:

#include <stdio.h>

int main() {
    int sideA, sideB;

    printf("\n\n***Rectangle***");

    printf("\n\n\nInsert side a: ");
    if (scanf("%d", &sideA) != 1)
        return 1;

    printf("\n\nInsert side b: ");
    if (scanf("%d", &sideB) != 1)
        return 1;
    
    printf("\n\nRectangle: \n\n");
    for (int i = 0; i < sideA; i++) {
        for (int j = 0; j < sideB; j++) {
            if (i == 0 || i == sideA - 1 || j == 0 || j == sideB - 1) {
                printf("*");
            } else {
                printf(" ");
            }
        }
        printf("\n");
    }
    return 0;
}

【讨论】:

  • 第一步是将printf("\n");向下移动一行到内循环之外。
  • 还有什么建议putchar((...) ? ' ' : '*')
  • @bruno: putchar() 会很好,但是如果超出了OP的技能水平,我担心三元运算符
  • 非常感谢你们。
【解决方案2】:

这段代码有两个问题:

  1. 您正在为每个字符而不是每一行打印换行符。
  2. 您的“*”测试中有错误的 ij

将换行符移到外循环,在if条件下交换'i'和'j':

for (int i = 0; i < sideA; i++) 
{
    for (int j = 0; j < sideB; j++) 
    {
        if (j == 0 || j == sideB - 1 || i == 0 || i == sideA - 1 ) // MODIFIED
        {
            printf("*");
        }
        else 
        {
            printf(" ");
        }
    }
    printf("\n");  // MOVED
}

或者“不那么聪明”,然后将其分解:

  1. 打印一行width 星号 ('*'),后跟换行符。
  2. 打印length - 2 行,以'*' 开头,后跟width - 2 空格,然后是'*' + 换行符。
  3. 重复 1。

【讨论】:

  • 注意这个答案是指原始问题。它没有解决随后更新的代码的问题。我不是针对移动目标。
  • 应该为sideB &lt; 2 细化第2 步(为sideA &lt; 2 细化第3 步)。
  • @chqrlie op 在他的文本中指的是长度和宽度,所以我使用了这些术语(尽管宽度和高度更有意义)。我将把改进留给读者。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多