谭浩强C程序设计习题6-5思考

  题目:将一个数组中的值按逆序重新存放。例如,原来顺序为8,6,5,4,1。要求改为1,4,5,6,8。这道题看起来很简单,直接两两交换就行了。不过在实际调试过程中还是出现了很多问题,归根到底还是基础不够扎实。在这里我把踩过的坑都贴出来,分析一下出现的原因,避免以后再犯。

  1、第一个error是:- Stack around the variable 'num' was corrupted。代码如下:

 1 #include<stdio.h>
 2 #define N 5
 3 
 4 int main()
 5 {
 6     int i, j, temp;
 7     int num[N] = {0};
 8     for (int k = 0; k < N; k++)
 9     {
10         scanf("%d", &num[k]);
11     }
12 
13     for(i = 0; i< N; i++)
14         for (j = N - 1-i; j >= 0; j++)
15         {
16             if (i < j) { temp = num[i]; num[i] = num[j]; num[j] = temp; }
17             else break;
18         }
19     for (int k = 0; k < N; k++)
20     {
21         printf("%d\t", num[k]);
22     }
23     return 0;
24 }

可以看到,在14行的时候赋给j的初始值就是最后一个元素的下标,后面习惯性的写上了j++,直接导致数组num越界出错。

  2、修改后第一个错误,想着直接赋值给数组,避免每次调试都要输入数值,直接对数组赋值,报了个语法错误。代码如下:

 1 #include<stdio.h>
 2 #define N 5
 3 
 4 int main()
 5 {
 6     int i, j, temp;
 7     int num[N] = { 0 };
 8     num[N] = { 8,6,5,4,1 };
 9     /*
10     for (int k = 0; k < N; k++)
11     {
12         scanf("%d", &num[k]);
13     }
14     */
15     for(i = 0; i< N; i++)
16         for (j = N - 1-i; j >= 0; j--)
17         {
18             if (i < j) { temp = num[i]; num[i] = num[j]; num[j] = temp; }
19             else break;
20         }
21     for (int k = 0; k < N; k++)
22     {
23         printf("%d\t", num[k]);
24     }
25     return 0;
26 }

这里直接注释掉了键盘输入数值的语句,然后直接对num进行了赋值,报错了才想起来要在定义时才能这样对数组赋值,其他时候必须要一个一个元素进行赋值。

  3、在定义时给数组赋值,在语法上没有什么错误,不过逻辑上得到的结果不是预想中的结果。

 1 #include<stdio.h>
 2 #define N 5
 3 
 4 int main()
 5 {
 6     int i, j, temp;
 7     int num[N] = { 8,6,5,4,1 };
 8     /*
 9     for (int k = 0; k < N; k++)
10     {
11         scanf("%d", &num[k]);
12     }
13     */
14     for(i = 0; i< N; i++)
15         for (j = N - 1-i; j >= 0; j--)
16         {
17             if (i < j) { temp = num[i]; num[i] = num[j]; num[j] = temp; }
18             else break;
19         }
20     for (int k = 0; k < N; k++)
21     {
22         printf("%d\t", num[k]);
23     }
24     return 0;
25 }

得到的结果是6,4,1,5,8。分析了一下代码,发现在第二重循环体里面,即17行,在i=0的时候,j分别等于4,3,2,1并与num[0]进行了一次交换,i等于其他值时也是这个逻辑,所以最后得不到想要的结果。

  要想得到想要的结果,在num[i]和num[j]交换了一次之后就要跳出第二层循环,所以在17行最后加上break跳出就可以得到正确的答案。代码如下:

 1 #include<stdio.h>
 2 #define N 5
 3 
 4 int main()
 5 {
 6     int i, j, temp;
 7     int num[N] = { 8,6,5,4,1 };
 8     /*
 9     for (int k = 0; k < N; k++)
10     {
11         scanf("%d", &num[k]);
12     }
13     */
14     for(i = 0; i< N; i++)
15         for (j = N - 1-i; j >= 0; j--)
16         {
17             if (i < j) { temp = num[i]; num[i] = num[j]; num[j] = temp; break; }
18             else break;
19         }
20     for (int k = 0; k < N; k++)
21     {
22         printf("%d\t", num[k]);
23     }
24     return 0;
25 }

  学习辅导给出的参考答案如下:

 1 #include<stdio.h>
 2 #define N 5
 3 
 4 int main()
 5 {
 6     int a[N], i, temp;
 7     printf("enter array a:\n");
 8     for (i = 0; i < N; i++)
 9         scanf("%d", &a[i]);
10     printf("array a:\n");
11     for (i = 0; i < N; i++)
12         printf("%4d", a[i]);
13     for (i = 0; i < N / 2; i++)
14     {
15         temp = a[i];
16         a[i] = a[N - i - 1];
17         a[N - i - 1] = temp;
18     }
19     printf("\nnow, array a:\n");
20     for (i = 0; i < N; i++)
21         printf("%4d", a[i]);
22     printf("\n");
23     return 0;
24 }

猜你喜欢

转载自www.cnblogs.com/teamcolt/p/12925649.html