我正在用C编写一个程序,首先提示用户输入一个整数,然后输出两个字符串:一个空格和一个变量号上的#,这样结果将是一个右侧金字塔,如下所示:
#
##
###
####
#####
######
我在for循环中存在的问题,这就是它的样子:
(n
是用户提示的整数)
for (int i = 0 ; i < n ; i++)
{
printf("%c",n-1,' '); // printing the blank spaces gradually
printf("%c\n",i+2,'#'); // printing the hashes gradually
}
这个想法是打印越来越少的空格和越来越多的散列,具体取决于int。
P.S:请考虑帮助我说出我的代码有什么问题,而不是给我一个真正的新工作。答案 0 :(得分:1)
首先,代码存在问题。它基于对printf
的错误理解。 printf
不能以代码中所需的方式使用。此外,即使这样做,也不会逐渐打印空间。因为你有固定的&n-1&#39;你可能意味着&#39; n-i&#39;所以它可以逐渐缩小。
无论如何,修复: 有许多解决方案,包括用新逻辑重写。但是,对于您的作业,代码仍然可以修复&#39;通过编写具有所需功能的printf变体。 e.g:
void mprintf(const char *fmt, int n, char c)
{
while (n--)
{
printf("%c", c);
}
}
您的代码变为:
for (int i = 0 ; i < n ; i++)
{
mprintf("%c",n-i,' '); // printing the blank spaces gradually
mprintf("%c",i,'#'); // printing the hashes gradually
printf("\n");
}
额外信用: 了解如何通过删除某些无用的东西来简化此代码。
答案 1 :(得分:0)
你知道每一行都有相同数量的字符,计算空格和#,即n。在第一行中你只有一个#,所以n - 1个空格,第二行你有2个#,所以n - 2个空格,依此类推。所以你从0迭代到n - 1,并在每次迭代时打印一个char,你只需要计算你已经打印了多少个字符。开始打印空间,一旦打印出足够的空格,就打印#。代码:
for (int i = 0 ; i < n ; i++)
{
int j = 0;
while (j < n)
{
if (j < n - i - 1)
printf(" ");
else
printf("#");
j++;
}
printf("\n");
}
答案 2 :(得分:0)
你说:
请考虑帮助我说出我的代码有什么问题,而不是给我一个真正的新工作。
忽略外观更改,您的循环体当前是:
T = me()
print T
问题包括:
for (int i = 0; i < n; i++)
{
printf("%c", n-1, ' '); // printing the blank spaces gradually
printf("%c\n", i+2, '#'); // printing the hashes gradually
}
来电的参数太多。printf()
需要一个参数,即要打印的字符。%c
,您将打印 Control-E ,而不是第一次打印的任何空白。您可以使用:
n = 6
打印适当宽度的空白字段。但是,您不能使用printf("%.*s", n - i - 1, " ");
重复单个字符,因此您必须使用其他一些技术(例如使用printf()
的循环)来打印适当数量的哈希值。
您应该阅读并重新阅读并重新阅读printf()
的规范。我必须每年阅读几次才能保持最新状态;在给定的重读时,我通常会发现一些新的(或被遗忘的)。当然,我只用C编写了30年,这些年来规范已经改变了几次(并且它还没有变得更简单!),所以这并不是很令人惊讶。