我试图在偶数行上打印单词* 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;
}
答案 0 :(得分:0)
使用if而不是while并使用括号来定义优先级。
If ((patternCounter>2) && (patternCounter%2==0))
{
printf("*even*\n");
break;
}
答案 1 :(得分:0)
你的问题有点不清楚你正在尝试做什么,除了“使用6代表宽度,15代表高度我需要总共15行,不多也不少。“从我收集的内容中,如果我错了,请更正我,但您想要为width
和height
以及前两个和最后一个值 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 argc
中char **argv
和int 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
- 如果位0
为1
,则该数字为odd
,请考虑二进制{ {1}} 2
)10
结果为1
,0
(3
)结果为11
,所以你对偶数的测试只是1
if ((index & 1) == 0)
甚至)
您将采取的最后一个操作(如果您还没有继续到下一个索引)只是在转到下一个索引之前输出index
width
。
(注意:当单独输出单个字符时,当需要输出单个字符时,不要调用可变参数'*'s
函数。这就像使用大锤一样苍蝇拍。只需使用printf
或putchar
代替。)
有了这个,你可以做类似以下的事情。
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
可能是你最好的选择。仔细看看,如果您有任何问题,或者我已经理解您要正确完成的工作,请告诉我。如果没有,请告诉我,我很乐意进一步提供帮助。