原题链接:[编程入门]自定义函数之整数处理
解题思路:
我的解题思路比较简单,具体实现方法为:
1.创建一个数组,用于输入10个整数,之后将这10个整数进行排序,并储存进另一个数组里。
2.此时另一个数组里的第一项为最小值,最后一项为最大值,这样就找到了最大、最小值。
3.之后将最大、最小值赋值给变量min,max,然后在原数组里进行交换。
注意事项:
第3点交换时有一个坑,代码里我写了注释。
参考代码:
#include"stdio.h" //定义全局变量 int a[10],n=0; //因为自定义函数定义在main函数后面,所以要声明一下函数 void input(); void calculate(int m[]); void output(int m[]); int main(){ input(); calculate(a); output(a); return 0; } //输入 void input(){ for(int i=0;i<10;i++){ scanf("%d",&a[i]); ++n;//统计循环次数,下面冒泡排序会用到 } } //计算 void calculate(int m[]){ int x[10],y,z,min,max; //将a[]复制出一个副本,用于冒泡排序找出最大、最小值 for(int i = 0; i < n; ++i){ x[i] = m[i]; } //冒泡排序 for(int i=0;i<n-1;++i){ for(int j=0;j<n-i-1;++j){ if(x[j]>x[j+1]){ y=x[j+1]; x[j+1]=x[j]; x[j]=y; } } } //将最大、最小值赋给max、min min=x[0];max=x[9]; //找最小数并交换位置 for(int i=0;i<n;++i){ if(m[i]==min){ z=m[0]; m[0]=m[i]; m[i]=z; break; //找到最小值后交换位置并退出循环 ,下同 } } //找最大数并交换位置 for(int i=0;i<n;++i){ if(m[i]==max){ z=m[9]; m[9]=m[i]; m[i]=z; break; } } /* 为什么用双循环而不是合并成一个循环? 这里有个坑, 合并成一个循环的话,会导致只能交换最小值或最大值。 举一个简单的例子 如果代码这样写: for(int i=0;i<n;++i){ if(m[i]==max){ z=m[9]; m[9]=m[i]; m[i]=z; break; }else if(m[i]==min){ z=m[0]; m[0]=m[i]; m[i]=z; break; } } 那么此时执行代码会出现: 输入:9 2 3 4 10 5 6 7 8 1 输出:9 2 3 4 1 5 6 7 8 10 (交换最大值还是交换最小值,取决于你最先进行的判断) 可见,这里只交换了最大值,并没有交换最小值。 */ } //输出 void output(int m[]){ for(int i = 0; i < 10; ++i){ printf("%d ", m[i]); } }
最后,我也是个初学者,解释可能有误,欢迎大佬指出错误!
0.0分
2 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复