我是C的新手,我正在尝试通过自己的程序练习我的知识而不使用互联网。我遇到了一个小而且可能是愚蠢的错误,但我似乎无法理解它是什么。我正在尝试制作沙漏,但在此之前,我需要了解印刷三角形。我真的会一步一步地走这条路,而且我已经试着很长时间地理解我的错误了。 我有下面的代码,我正在尝试打印j我需要j正常打印12345然后1234,123等..但是当我使用temp--它跳过打印123,1,1并关闭程序。 有人可以看看它并告诉我第二个循环问题是什么?
#include <stdio.h>
int main()
{
int i,j,k,num, temp=0;
printf("Enter a number: ");
scanf("%d", &num);
temp=num;
for (i=1; i<=num; i++) // Step1: Take care of the rows --> check
{
for (j=1; j<=temp; j++)
{
printf("%d", j);
temp-=1;
}
printf("\n");
}
}
答案 0 :(得分:1)
你们都增加j
并递减temp
,这会导致奇怪的效果。你可能不想减少temp
。或者您需要在内循环之前重置temp
,而不是在外循环之前重置。{/ p>
或者,实际上,您根本不需要temp
。以下是代码的两个变体,一个创建三角形增长,另一个创建三角形缩小。两者都不需要temp
(尽管t-dn.c
可以使用变量代替表达式num - i + 1
,但编译器可能会处理它 - 它是一个基本的优化。)
#include <stdio.h>
int main(void)
{
int i,j,num;
printf("Enter a number: ");
scanf("%d", &num);
for (i=1; i<=num; i++)
{
for (j=1; j<=i; j++)
printf("%d", j);
printf("\n");
}
}
#include <stdio.h>
int main(void)
{
int i,j,num;
printf("Enter a number: ");
scanf("%d", &num);
for (i=1; i<=num; i++)
{
for (j=1; j<=num-i+1; j++)
printf("%d", j);
printf("\n");
}
}
$ ./t-up
Enter a number: 5
1
12
123
1234
12345
$ ./t-dn
Enter a number: 5
12345
1234
123
12
1
$
另一个变体,保持temp
变量:
#include <stdio.h>
int main(void)
{
int i,j,num,temp;
printf("Enter a number: ");
scanf("%d", &num);
temp=num;
for (i=1; i<=num; i++)
{
for (j=1; j<=temp; j++)
printf("%d", j);
printf("\n");
temp--;
}
}
它产生了我认为你想要的减少的金字塔。它将减量放在内循环之外。
答案 1 :(得分:1)
你正在减少j循环中的j循环条件。这意味着每次打印数字时,您也会减小循环的大小(根本不是您想要的)。要解决此问题,您需要从
移动temp- = 1for (i=1; i<=num; i++) // Step1: Take care of the rows --> check
{
for (j=1; j<=temp; j++)
{
printf("%d", j);
temp-=1;
}
printf("\n");
}
到
for (i=1; i<=num; i++) // Step1: Take care of the rows --> check
{
for (j=1; j<=temp; j++)
{
printf("%d", j);
}
temp-=1;
printf("\n");
}
这会减少你完成它后的j-loop的大小,所以你应该得到适量的数字。
你甚至可以通过像这样的
反转i-loop来取消你的临时变量for ( i = num ; i > 0 ; i-- ) {
for ( j = 1 ; j <= i ; j++ ) {
printf("%d", j);
}
printf("\n");
}
更简单的代码。