原题链接:[编程入门]自定义函数之整数处理
解题思路:
我的解题思路比较简单,具体实现方法为:
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、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复