因此,作为学校的一部分,我正在使用For循环,我有一些代码可以工作,但我很难理解为什么它可以工作。对我来说,重要的是要真正理解为什么一块代码能做它不能做的事情,而不仅仅是它能工作。
所以有一点背景。这个小程序利用for循环,根据用户输入打印一系列#
字符。其思想是用户输入一个介于1和8之间的数字,程序将打印一个#
字符,然后移动到下一行再打印两个,移动到下一行再打印三个等等,并打印用户输入的行数。
Output:
#
##
###
####
#####
程序在这里:
#include <stdio.h>
int main(void) {
int rows = 1, height, hash = 1;
printf("Enter a number between 1-8: ");
scanf("%i", &height);
if (height >= 1 || height <= 8) {
for (rows; rows <= height; rows++) {
for (hash; hash <= rows; hash++) {
printf("#");
}
printf("\n");
}
}
return 0;
}
我已经写下了循环,并试图理解它如下。如果有人能澄清,我了解这些嵌套循环是如何工作的,我将不胜感激:
因此,这里是我的主要问题:我很难理解程序在转到新行时如何以及为什么能够使用printf语句打印多个。由于嵌套for循环中包含的
行
变量,我认为printf语句正在打印两个字符。
我假设当我将嵌套for循环中的代码更改为(hash; hash==row; hash)时,每行只打印一个#
字符。就像我将代码更改为(hash; hash)的一样
如能澄清,并对我的学业有所帮助,我将不胜感激。我提前感谢大家!
语句中的第一个参数"rows"表示您正在迭代行的整数
对于furst循环,它迭代5次,如下所示:
rows = 1
rows = 2
rows = 3
rows = 4
rows = 5
第二个循环根据行数打印哈希。当riws为1时,只打印一个哈希。在每个循环之后,打印一条新的线。
变量应该在使用它们的地方声明。
当变量声明和使用之间存在大量代码时,这是导致各种错误的原因。
变量row
和hash
仅在循环中使用。所以它们应该在这些循环中声明。在这种情况下,您可以避免忘记在内部循环中重新初始化变量hash
的错误。
如果假设变量的值不应该为负,则声明该变量具有无符号整数类型,而不是有符号整数类型。
不清楚为什么在你的程序中使用了神奇的数字8
。为什么图形的高度不能大于8呢?
程序可以看起来如下。
#include <stdio.h>
int main(void)
{
while ( 1 )
{
const char c = '#';
unsigned int height;
printf( "Enter the height of a pyramid (0 - exit): " );
if ( scanf( "%u", &height ) != 1 || height == 0 ) break;
putchar( '\n' );
for ( unsigned int i = 0; i < height; i++ )
{
for ( unsigned int j = 0; j < i + 1; j++ )
{
putchar( c );
}
putchar( '\n' );
}
putchar( '\n' );
}
return 0;
}
它的输出可能看起来像
Enter the height of a pyramid (0 - exit): 1
#
Enter the height of a pyramid (0 - exit): 2
#
##
Enter the height of a pyramid (0 - exit): 3
#
##
###
Enter the height of a pyramid (0 - exit): 4
#
##
###
####
Enter the height of a pyramid (0 - exit): 5
#
##
###
####
#####
Enter the height of a pyramid (0 - exit): 6
#
##
###
####
#####
######
Enter the height of a pyramid (0 - exit): 7
#
##
###
####
#####
######
#######
Enter the height of a pyramid (0 - exit): 8
#
##
###
####
#####
######
#######
########
Enter the height of a pyramid (0 - exit): 9
#
##
###
####
#####
######
#######
########
#########
Enter the height of a pyramid (0 - exit): 10
#
##
###
####
#####
######
#######
########
#########
##########
Enter the height of a pyramid (0 - exit): 0
现在让我们考虑一下程序是如何工作的。
外环
while ( 1 )
{
//...
}
是一个无限循环,因为它的条件是永远不能等于0。
当用户输入无效数据或输入0时,循环中断。
if ( scanf( "%u", &height ) != 1 || height == 0 ) break;
现在一切都准备好输出金字塔了。
这个环路
for ( unsigned int i = 0; i < height; i++ )
{
//...
putchar( '\n' );
}
事实上,他是直线经理。通过注释内部循环尝试该程序,您将看到输出的空行数与i 1的值相对应
内部循环输出与表达式
i 1
的值相对应的符号“#”的编号。即当i等于0时,输出一个符号“#”。当i=1时,当输出两个(i 1)符号“#”
时,依此类推。
因此,内部循环输出一行
i1
符号“#”
,外部循环转到下一行。。
您的问题是hash
变量。当内部for
循环再次启动时,它不会重置为1
。
下面是正确的代码:
int main(void) {
int rows = 1, height, hash = 1;
printf("Enter a number between 1-8: ");
scanf("%i", &height);
if (height >= 1 || height <= 8) {
for (rows; rows <= height; rows++) {
for (hash = 1; hash <= rows; hash++) {
printf("#");
}
printf("\n");
}
}
return 0;
}
在你的代码作用域中,哈希在两个循环之外,所以在下一次运行内部循环时,你实际上是用等于2
、3
、的
,哈希
开始的45
。
您已设置hash=1
在代码的开头,当程序启动时将其设置为
1
。但在内部循环完成后,您从未重置过散列
变量。
以下是代码中值的更改方式:
iteration row hash
--------------------------------
1 1 1 -> #
1 2 -> inner loop end
2 2 2 -> #
2 3 -> inner loop end
3 3 3 -> #
3 4 -> inner loop end
4 4 4 -> #
4 5 -> inner loop end
5 5 5 -> #
5 6 -> inner loop end
6 6 6 -> outer loop end
问题内容: 我想做的是请用户输入一些字符串以读入数组,然后要求用户输入该数量的字符串并将其读入数组。当我运行此代码时,它从不要求我在第一个for循环的第一个循环中输入内容,只打印出“字符串#0:字符串#1:”,然后我就可以输入文本了。为什么会这样,我做错了什么? 问题答案: 缓冲。 输入输入数量时,不会在输入缓冲区中占用换行符的位置。在for循环的迭代0中,缓冲区中已经有一行输入,并且可以立即完成
然而,Antlr似乎不喜欢我在两个不同的地方使用“函数”。据我所知,语法甚至没有歧义。 在下面的语法中,如果我删除第1行,生成的解析器解析示例输入没有问题。另外,如果我更改第2行或第3行中的令牌字符串,使它们不相等,解析器就会工作。 我得到的语法错误是: 测试生成的解析器的程序:
考虑这个简单的C++函数来计算数组的前缀和: 它是4个融合的UOP1,这个CPU可以支持4个融合的OPs/周期。 有通过和携带的依赖链,每个都是一个循环,但是这些UOP可以到4个ALU端口中的任何一个,所以似乎不太可能冲突。融合的需要转到p6,这是一个更令人担忧的问题,但我只测量到p6的1.1 UOPS/迭代。这将解释每次迭代1.1个循环,但不是1.4个循环。如果我将循环展开2倍,端口压力会低得多
我发现这样的php代码: 我希望这个循环会执行4次,因为$I变成了对$的引用(对吗?)。然而,循环只执行一次,并输出: a=10,i=10 我不明白为什么它会这样工作。有什么想法吗?
问题内容: boolean r = false ; int s = 0 ; while (r == false) ; { s = getInt() ; if (!(s>=0 && s<=2)) System.out.println (“try again not a valid response”) ; else r = true ; } 即使输入3或123,循环也不会终止,文本也不会显示。怎么了
问题内容: 我在程序中看到了与程序中此特定循环相关的不同行为,但我不确定我为什么理解它的行为方式。 的输出是 的输出是 我去网上看了以下内容 在切片上进行测距时,每次迭代都会返回两个值。第一个是索引,第二个是该索引处的元素的副本 它说一个副本,这是否意味着它返回了字符串的副本,但这实际上是指向变量的指针?在这种情况下,在循环结束时对will的任何引用都实际上引用了数组中的最后一个元素,例如?这是否