今天我分享的代码是自定义函数之整数处理
这道题的题目要求如下:
输入10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。写三个函数; ①输入10个数;②进行处理;③输出10个数。
当读完题目要求后,很容易就能知道可以利用数组的遍历找出最大最小值从而和对应位置进行交换即可。
于是我的第一个代码是这样写的
#includeint main() {int a[10],i,j=0,k=0,min,max; for(i=0;i<10;i++){ scanf("%d",&a[i]);//扫描10个数字 } min=a[0];//设第一个为最大最小作为开始位置 max=a[0]; for(i=0;i<10;i++){//这个循环中,暴力进行逐个之间的比较, //如果有比当前最小值小的或者比当前最大值大的都进行替换。 if(min>=a[i]) { min=a[i]; j=i; //找出对应的位置 } if(max<=a[i]){ max=a[i]; k=i; } } a[j]=a[0]; a[k]=a[9]; a[0]=min; a[9]=max; for(i=0;i<10;i++){ printf("%d ",a[i]); } return 0;
但是我忽略了一个问题,就是当如果出现在第一个位置出现最大值或者最后一个位置出现最小值时,我的代码会将数组中的对应位置数据覆盖掉,导致出现错误。
比如输入数据为:10 9 0 2 5 8 6 7 4 3时
输出的结果为:0 9 10 2 5 8 6 7 4 10
这是因为0 10先交换后,最大值的位置仍然是之前没交换的a[0]位置,但是事实上现在已经是a[2]了,于是导致一开始a[k]=a[9]的代码被覆盖了,使得本应该交换到的3被覆盖了。于是我对代码进行了分类讨论。分成三种情况,如代码所示。
#includeint main() {int a[10],i,j=0,k=0,min,max; for(i=0;i<10;i++){ scanf("%d",&a[i]); } min=a[0]; max=a[0]; for(i=0;i<10;i++){ if(min>=a[i]) { min=a[i]; j=i; } if(max<=a[i]){ max=a[i]; k=i; } } if(a[0]==max){ a[0]=a[9]; a[9]=max; a[j]=a[0]; a[0]=min; } else if(a[9]==min){ a[9]=a[0]; a[0]=min; a[k]=a[9]; a[9]=max; } else { a[j]=a[0]; a[k]=a[9]; a[0]=min; a[9]=max; } for(i=0;i<10;i++){ printf("%d ",a[i]); } return 0; }
分别对第一位是最大值和最后一位是最小值作出了判断,保证了代码不会被覆盖。从而程序不会出错。
以上是我个人的总结,如有错误请指正,有问题也可以在评论区写出,我会尽量解答。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)