cs50x马里奥金字塔不画
cs50x Mario Pyramid does not draw
我开始做CS50x习题集1;但是我的程序似乎在输入高度数字后停止。
即该程序将要求输入一个 8 到 23 之间的数字(重复直到它获得正确的输入),一旦我这样做,代码就会停止。
我做错了什么?
下面是我写的代码。非常感谢所有帮助,因为我已经在此处查看了各种问题 S.E。但 none 解决了这个问题。
include stdio.h
include cs50.h
int main (void)
{
printf("ok lets make a pyramid :)\n");
// height = x
int x;
// spaces = z
int z;
// hashes = a
int a;
// Get correct number for height
do
{
printf("Give me a positive number between 8 and 23 for the height of the pyramid\n");
x = GetInt();
}
while (x < 8 || x > 23);
// Build the phantom pyramid
for (int q = 0; q == x; q++)
{
// Spaces
for (z = x - 1; z == 0 ; z--)
{
printf(" ");
}
// Hashtags
for (a = 1; a == q; a++)
{
printf("#\n");
}
}}
除此之外,您的 #include
语法错误 (#include <stdio.h>
),您这里的根本问题,以及您的程序不打印任何内容就退出的原因,是主要的 for
永远不会进入循环。 C for
循环在控制表达式为真时执行,直到 is 为真。你有:
for (int q = 0; q == x; q++){ ... }
由于 q == x
的计算结果为 0
(假),因为 q
是 0
而 x
介于 8 和 23 之间,因此此循环永远不会执行, 程序退出。你的每个循环都有这个问题。您可以修复它:
for (int q = 0; q < x; q++)
{
// Spaces
for (z = x - 1; z > 0 ; z--)
{
printf(" ");
}
// Hashtags
for (a = 0; a <= q; a++)
{
printf("#");
}
printf("\n");
}
这里,请注意,在第一次循环中,q
为 0,因此 a
必须从 0 开始才能在第一行打印单个散列。此外,在循环完成打印行之前,不会打印换行符。这些更改为高度 8 提供了此输出:
#
##
###
####
#####
######
#######
########
我不确定这是否是您想要的输出。左边的间距与金字塔的高度有关。如果你想要左边的金字塔台阶,你可以更改关联的for
语句:
for (z = x - 1; z > q ; z--)
但我的印象是马里奥金字塔左边有台阶,顶行有两个哈希值。您可以修改循环来执行此操作,但这是一个不同的循环。您不需要变量 a
,而不是将 z
视为 "spaces",而是将其视为代表行位置:
for (int q = x; q > 0; q--) {
// print spaces at beginning of line
for (z = 1; z < q; z++) {
printf(" ");
}
// print hashes at end of line
for ( ; z < x + 2; z++) {
printf("#");
}
// print newline when finished printing line
printf("\n");
}
新循环给出高度为 8 的输出:
##
###
####
#####
######
#######
########
#########
我开始做CS50x习题集1;但是我的程序似乎在输入高度数字后停止。
即该程序将要求输入一个 8 到 23 之间的数字(重复直到它获得正确的输入),一旦我这样做,代码就会停止。
我做错了什么?
下面是我写的代码。非常感谢所有帮助,因为我已经在此处查看了各种问题 S.E。但 none 解决了这个问题。
include stdio.h
include cs50.h
int main (void)
{
printf("ok lets make a pyramid :)\n");
// height = x
int x;
// spaces = z
int z;
// hashes = a
int a;
// Get correct number for height
do
{
printf("Give me a positive number between 8 and 23 for the height of the pyramid\n");
x = GetInt();
}
while (x < 8 || x > 23);
// Build the phantom pyramid
for (int q = 0; q == x; q++)
{
// Spaces
for (z = x - 1; z == 0 ; z--)
{
printf(" ");
}
// Hashtags
for (a = 1; a == q; a++)
{
printf("#\n");
}
}}
除此之外,您的 #include
语法错误 (#include <stdio.h>
),您这里的根本问题,以及您的程序不打印任何内容就退出的原因,是主要的 for
永远不会进入循环。 C for
循环在控制表达式为真时执行,直到 is 为真。你有:
for (int q = 0; q == x; q++){ ... }
由于 q == x
的计算结果为 0
(假),因为 q
是 0
而 x
介于 8 和 23 之间,因此此循环永远不会执行, 程序退出。你的每个循环都有这个问题。您可以修复它:
for (int q = 0; q < x; q++)
{
// Spaces
for (z = x - 1; z > 0 ; z--)
{
printf(" ");
}
// Hashtags
for (a = 0; a <= q; a++)
{
printf("#");
}
printf("\n");
}
这里,请注意,在第一次循环中,q
为 0,因此 a
必须从 0 开始才能在第一行打印单个散列。此外,在循环完成打印行之前,不会打印换行符。这些更改为高度 8 提供了此输出:
#
##
###
####
#####
######
#######
########
我不确定这是否是您想要的输出。左边的间距与金字塔的高度有关。如果你想要左边的金字塔台阶,你可以更改关联的for
语句:
for (z = x - 1; z > q ; z--)
但我的印象是马里奥金字塔左边有台阶,顶行有两个哈希值。您可以修改循环来执行此操作,但这是一个不同的循环。您不需要变量 a
,而不是将 z
视为 "spaces",而是将其视为代表行位置:
for (int q = x; q > 0; q--) {
// print spaces at beginning of line
for (z = 1; z < q; z++) {
printf(" ");
}
// print hashes at end of line
for ( ; z < x + 2; z++) {
printf("#");
}
// print newline when finished printing line
printf("\n");
}
新循环给出高度为 8 的输出:
##
###
####
#####
######
#######
########
#########