在各行上打印偶数/奇数

时间:2016-06-22 00:09:22

标签: c nested-loops

我试图在偶数行上打印单词* even *而不包括第一行和第二行(最终没有最后两行),但它打印15行然后随机打印*偶* 。宽度为6,高度为15,我需要15行,不多也不少。

#include <stdio.h>

int main ()
{
int heightCounter, height, width, widthCounter, patternCounter;

patternCounter=0;

printf("enter a number\n");
    scanf("%d", &width);

printf("enter a number\n");
    scanf("%d", &height);

for (heightCounter=1; heightCounter<=height; heightCounter++)
{
    patternCounter++;

    while (patternCounter>2 && patternCounter%2==0)
    {
        printf("*even*\n");
        break;
    }


    for (widthCounter=1; widthCounter<=width; widthCounter++)
    {
        printf("*");

    }

printf("\n");
}

return 0;
}

2 个答案:

答案 0 :(得分:0)

使用if而不是while并使用括号来定义优先级。

    If ((patternCounter>2) &&     (patternCounter%2==0))
    {
        printf("*even*\n");
        break;
    }

答案 1 :(得分:0)

你的问题有点不清楚你正在尝试做什么,除了“使用6代表宽度,15代表高度我需要总共15行,不多也不少。“从我收集的内容中,如果我错了,请更正我,但您想要为widthheight以及前两个最后一个值 height 范围内的两条行,您想要什么都不打印。对于介于两者之间的每一行,如果索引甚至,如果行索引奇数,则要打印"even",则要打印width该行'*'s

有许多不同的方法来整理逻辑。但是,几点说明。首先,始终(始终)验证用户输入。使用scanf系列函数时,请至少检查return以确保成功完成预期的转化次数。例如:

printf ("enter a number: ");
    if (scanf (" %d", &width) != 1) {
        fprintf (stderr, "error: invalid input (width).\n");
        return 1;
    }

虽然您可以在需要时自由地接受用户输入,但实际上,所需的值通常作为参数传递。这就是int argcchar **argvint main (int argc, char **argv)的用途。在需要时进行用户输入,尽可能将值作为参数传递给函数。

关于逻辑。如果我正确理解目标,那么无论逻辑是否会归结为迭代 height 的范围并根据每个的高度索引采取适当的操作。 (注意:在您的示例中,您可以迭代for (x = 1; x <= height; ...)但通常在C中,您将看到迭代for (x = 0; x < height; ...)。两者都是100%正确的,您可以自由迭代任何值的任何值,但要注意所有数组等从零开始使0 < x < height成为范围的自然迭代)

当您遍历每个行索引时,您需要检查三个基本条件。第一个是“我是前两行还是最后两行?”。如果是这样,你想要什么都不做,continue到下一个索引(下面的例子只显示该行的索引并输出<noprint>。下一步检查将检查索引是否为< em> even 。如果是这样,您只需将"even"continue打印到下一个索引。

注意:最简单的检查是index & 1 - 如果位01,则该数字为odd,请考虑二进制{ {1}} 210结果为103)结果为11 ,所以你对偶数的测试只是1 if ((index & 1) == 0) 甚至

您将采取的最后一个操作(如果您还没有继续到下一个索引)只是在转到下一个索引之前输出index width

注意:当单独输出单个字符时,当需要输出单个字符时,不要调用可变参数'*'s函数。这就像使用大锤一样苍蝇拍。只需使用printfputchar代替。)

有了这个,你可以做类似以下的事情。

fputc

示例使用/输出

对于#include <stdio.h> #include <stdlib.h> enum { MAXW = 6, MAXH = 15 }; /* constants for width/height */ int main (int argc, char **argv) { int w = argc > 1 ? atoi (argv[1]) : MAXW, /* take values from arguments */ h = argc > 2 ? atoi (argv[2]) : MAXH, /* use MAXW/MAXH for defaults */ i, j; if (w < 0) w = -w; /* prevent negative values */ if (h < 0) h = -h; for (i = 0; i < h; i++) /* for each line */ { printf ("%2d : ", i); /* line index (adjust by 1 if desired */ if (i < 2 || i > h - 3) { /* skip 2 on either end of range */ printf ("<noprint>\n"); continue; } if ((i & 1) == 0) { /* if even (LSB = 0) */ printf ("even\n"); continue; } for (j = 0; j < w; j++) /* otherwise 1 '*' per-width */ putchar ('*'); putchar ('\n'); } return 0; } 范围内的高度,0 - 4就是输出的全部(显示省略范围两端的第一行和最后两行)

<noprint>

对于任何范围$ ./bin/evenstar 6 4 0 : <noprint> 1 : <noprint> 2 : <noprint> 3 : <noprint> ,如果行索引为> 4打印even,否则打印 width even,例如

'*'s

对于 $ ./bin/evenstar 6 7 0 : <noprint> 1 : <noprint> 2 : even 3 : ****** 4 : even 5 : <noprint> 6 : <noprint> w = 6的示例:

h = 15

除了上面的$ ./bin/evenstar 0 : <noprint> 1 : <noprint> 2 : even 3 : ****** 4 : even 5 : ****** 6 : even 7 : ****** 8 : even 9 : ****** 10 : even 11 : ****** 12 : even 13 : <noprint> 14 : <noprint> 语句逻辑之外,您还可以使用if语句对高度索引的每个值采取适当的操作。虽然在这里,简单的switch可能是你最好的选择。仔细看看,如果您有任何问题,或者我已经理解您要正确完成的工作,请告诉我。如果没有,请告诉我,我很乐意进一步提供帮助。