谭浩强C程序设计习题6-5思考
Posted teamcolt
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了谭浩强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 ", 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 ", 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 ", 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 ", 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: "); 8 for (i = 0; i < N; i++) 9 scanf("%d", &a[i]); 10 printf("array a: "); 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(" now, array a: "); 20 for (i = 0; i < N; i++) 21 printf("%4d", a[i]); 22 printf(" "); 23 return 0; 24 }
以上是关于谭浩强C程序设计习题6-5思考的主要内容,如果未能解决你的问题,请参考以下文章
谭浩强版C语言程序设计(第三版)课后习题完整答案附源码--高等教育出版社