用for循环理解我的错误

时间:2014-01-21 22:12:41

标签: c for-loop

我是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");
  }
}

2 个答案:

答案 0 :(得分:1)

你们都增加j并递减temp,这会导致奇怪的效果。你可能不想减少temp。或者您需要在内循环之前重置temp,而不是在外循环之前重置。{/ p>

或者,实际上,您根本不需要temp。以下是代码的两个变体,一个创建三角形增长,另一个创建三角形缩小。两者都不需要temp(尽管t-dn.c可以使用变量代替表达式num - i + 1,但编译器可能会处理它 - 它是一个基本的优化。)

叔up.c

#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");
  }
}

叔dn.c

#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
$

叔ok.c

另一个变体,保持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- = 1
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");
}

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");
}

更简单的代码。