【问题标题】:Nested loops creating pattern (not diamond) in C嵌套循环在 C 中创建模式(不是菱形)
【发布时间】:2015-02-26 19:28:19
【问题描述】:

因此,对于我的作业,我必须输入长度和宽度,并根据输入打印出“*”模式。最小高度为 7,仅增加奇数,宽度为 6 的任意倍数。

使用高7宽12输出的基本格式:

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

所以基本上第一行和最后两行是笔直穿过整个宽度,奇数行包含 3 个星号,后跟 3 个空格,直到到达宽度的末尾。偶数行以 3 个空格开头。

我已经弄清楚如何使用以下代码打印前两行:

do 
    {
        printf("*");
        ++i;
    }while(i<width);

    printf("\n");

    do 
    {
        printf("*");
        ++j;
    }while(j<=width);
    printf("\n");

但是对于我的生活,我想不出正确的方法来使用基本的嵌套循环来打印出内部模式。我问了一个不熟悉 C 但用 Java 写了一个基本程序的程序员朋友。我不懂 Java,并试图翻译它,但注意到两种语言之间的逻辑存在一些大差异,这让我很头疼。这是他的代码:

// LOGGING
var consoleLine = "<p class=\"console-line\"></p>";

console = {
    log: function (text) {
        $("#console-log").append($(consoleLine).html(text));
    }
};


// PATTERN PARAMETERS
var rows = 6;
var cols = 7;

// hard code a space so html respects it
var space = "&nbsp;"

console.log("cols: " + cols + " rows: " + rows);

for (y = 0; y < rows; ++y) {
    var line = "";
    for (x = 0; x < cols; ++x) {

        // First two and last two rows do not have patterns and just print filled
        if (y == 0 || y == 1 || y == rows - 1 || y == rows - 2) {
            line += "*";
        } else {
            if (y % 2 == 0) {
                // Even row
                line += x % 6 < 3 ? "*" : space;
            } else {
                // Odd row
                line += x % 6 >= 3 ? "*" :  space;
            }
        }
    }
    console.log(line);
}

请帮助我或指出正确的方向!我在网上搜索过,但似乎找不到有效的解决方案!

编辑-忘了提到所有“printf”使用一次只能打印一个字符......例如单个*

编辑编辑-我成功了!!!!非常感谢大家,非常感谢您的意见和指导!这是我所拥有的完美运行的东西:

for (y = 0; y < height; ++y) 
    {
    printf("\n");

    for (x = 0; x < width; ++x) 
        {
        // First two and last two rows do not have patterns and just print filled lines
        if (y == 0 || y == 1 || y == height - 1 || y == height - 2) 
           {
           printf("*");
            }
        else 
        {
            if (y % 2 == 0)
            {
              if(x%6<3)
                {
                    printf("*");
                }
                else
                {
                    printf(" ");
                }

            } else {
                // Odd row
                if(x%6>=3)
                {
                    printf("*");
                }
                else
                {
                    printf(" ");
                }
        }
        }

    }
printf("\n");

【问题讨论】:

  • 考虑使用putchar('*'); 而不是printf("*");,但这是细枝末节,不是一个严重的问题。打印前两行代码的不均匀重复令人担忧,特别是如果最后两行代码还有两个副本。你能弄清楚如何为任意数量的重复打印交错的空间和星号的三元组吗?您如何确定是以空格还是星号开头,并在两个字符之间交替?如果宽度不是三的倍数会怎样?
  • 是的,我朋友提供的代码给了这 4 行正确的位置,但我一生都记不起我是如何把它翻译成 C 的。我打算使用 if 语句"height" % 2 来确定它是偶数还是奇数,但我似乎无法正确实现它。我在前面的几行中进行了一些检查,以确保输入正确。
  • 这是 JavaScript,不是 Java。但是,如果你去掉所有的日志记录并将var 重命名为int,我看不出这些“大差异”会是什么。
  • 我很抱歉。而且我想我不知道如何实现偶数/奇数功能: line += x % 6
  • 不要使用do/while 循环,即使它们似乎很适合目的,它们也容易出错。在您的代码中,当width==0 是有效输入(0 是 6 的倍数)时,您无法生成空行。此外,您忘记初始化循环计数器。使用标准成语:for (i = 0; i &lt; width; i++) { ... }

标签: c ascii-art


【解决方案1】:

编写一个带有 3 个参数 n,a,b 的函数,该函数交替打印 n 每个参数 ab 的 3 个组。您可以调用此函数来打印 4 种不同类型的行。您可以循环重复打印中间部分。玩得开心!

【讨论】:

  • 感谢您的回复!恐怕我现在有点过头了。它看起来会像一个循环和两个嵌套循环,每个循环给出不同的模式吗?对不起,我还是一头雾水。
  • 你会写函数吗?该函数将只有一个循环。主代码将调用函数,循环调用 2 次不同参数的函数,最后调用函数。
  • 提示:ab 参数的值可以是 "***"" "
  • 我刚开始学习函数,所以勉强。我很抱歉。
  • 没关系。 C 中的每个人都从 0 开始,包括数组 ;-)
【解决方案2】:

一个更简单的选择:

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv) {
    int row, col, height = atoi(argv[1]), cols = atoi(argv[2]);
    for (row = 0; row < height; row++) {
        for (col = 0; col < cols; col++) {
            putchar(row < 2 || row >= height - 2 ||
                  col % 6 / 3 == row % 2 ? '*' : ' ');
        }
        putchar('\n');
    }
}

【讨论】:

  • 解释:如果您正在打印前 2 行或后 2 行,或者如果您在偶数行上的一组 6 个字符的前半部分,而在奇数行上的另一半部分,则打印 * .
  • 请记住,您需要了解它是如何工作的!否则,你不会从我做你的任务中得到任何好处。作为练习,您应该重写代码以使用 if 语句而不是您可能尚未研究过的 ? : 三元运算符。
  • 现在正在处理这个问题,我会在这里发布我想出的东西,但它的空间有点太小了——不过我把它作为对我原始帖子的编辑!
  • 是的。你明白了,但你应该使用putchar 而不是printf("%c"...)
  • 我会看看如何做到这一点。不过,我们只学习了如何使用“printf”打印语句!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-31
  • 1970-01-01
  • 1970-01-01
  • 2023-01-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多