这是我的代码的副本:
#include <cs50.h>
#include <stdio.h>
int main(void)
{
int height = get_int("Please enter a height between 1 and 8 (inclusive)\nHeight: ");
if(0 < height && height < 9)
for(int i = 0; i <= height; i++)
{
for(int s = (height - 1); s >= 1; s--)
{
printf("a");
}
for(int h = 1; h <= i; h++)
{
printf("#");
}
printf("\n");
}
else
printf("Please try again.\n"),
main();
}
我似乎无法正确理解的部分是打印正确的空格数,因为它似乎没有减少每个循环后的变量“ s”。 (我已经用字母“ a”替换了空格,以便可以看到代码出了问题的地方。) 该代码的目的是打印右对齐的#的金字塔。 我在哪里错了?
例如,如果用户输入高度3,则输出将为:
aa
aa#
aa##
aa###
但是,我希望输出为:
aa#
a##
###
答案 0 :(得分:1)
主要问题是打印“ a”时代码中的第二个for循环。每当您打入该特定循环时,基本上就打印(高度-1)次“ a”。实际上,您每次都应少打印一个“ a”(又增加一个哈希)。为此,我们需要调整s的条件。 代替这个
int s = height - 1; s >= 1
使用此
int s = height - i; s > 1
由于您的主循环具有迭代器i
,因此我们可以在这里使用它。
第二个问题是,根据CS50问题集的描述,您应该实际打印" "
(空格),而不是"a"
。为此,应将"a"
替换为" "
。
第三期是您的代码在开头打印了一行多余的空格。您需要在这种情况下调整main for循环以删除多余的一行。
i < height
在打印#
符号的for循环中,您需要从零开始迭代器h,以便它从第一行开始立即打印。
int h = 0
答案 1 :(得分:0)
更好的解决方案是使用printf
的内置功能,将问题减少到一个简单的循环中。
#include <stdio.h>
int main(void) {
int height = get_int("Please enter a height between 1 and 8 (inclusive)\nHeight: ");
unsigned char blocks[height];
memset(blocks, '#', height);
for(int i=0; i<height; ++i)
{
printf("%*.*s\n", height, i+1, blocks);
}
return 0;
}
Success #stdin #stdout 0s 4212KB
#
##
###
####
#####