题目
题目描述: 输入10个整数,将其中最小的数与第一个数交换,把最大的数与最后一个数交换。 程序运行结果范例(蓝色字体表示输入): 请输入10个整数:2 3 4 23 5 78 0 1 6 12 交换后的结果为:0 3 4 23 5 12 2 1 6 78 请输入10个整数:1 25 7 40 5 6 12 8 30 19 交换后的结果为:1 25 7 19 5 6 12 8 30 40 提示: 要求用数组及数组传参方式实现上述程序。 要求写3个函数:(1)输入10个数;(2)进行处理;(3)输出10个数。 这个程序有多种实现思路,尝试使用数组和指针两种方法实现。 |
数组的形式
#include<stdio.h>
void getnum(int a[],int n)
{
int i;
printf("你要输入的数据个数是%d:\n",n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
}
void swap(int * p,int * q)
{
int temp=*p;
*p=*q;
*q=temp;
//这两个都是void类型
}
void process(int arr[],int n)
{
int i,temp;
int maxnum=arr[0];
int minnum=arr[0];
int max=0,min=0;//所以这里要有初始值
for(i=0;i<n;i++)
{
if(arr[i]>maxnum)
{
maxnum=arr[i];
max=i;
}
if(arr[i]<minnum)
{
minnum=arr[i];
min=i;
//如果0是最小值的话,是进不来的,那么这个i或者说min是不对的
}
}
}
if(min!=0)
{
swap(arr,&arr[min]);//这里如果是&arr[0]可以,但是如果是&arr就不行,这表示两次求指针
}
if(max!=n-1)
{
swap(&arr[n-1],&arr[max]);
}
//你看这种函数都是void类型
}
void print(int arr[],int n)
{
printf("结果是:\n");
int i;
for(i=0;i<n;i++)
{
printf("%d ",arr[i]);
}
}
int main()
{
int n,arr[100];
scanf("%d",&n);
getnum(arr,n);
process(arr,n);
print(arr,n);
return 0;
}
指针方法
#include<stdio.h>
void getnum(int a[],int n)
{
int i;
printf("你要输入的数据个数是%d:\n",n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
}
void swap(int * p,int * q)
{
int temp=*p;
*p=*q;
*q=temp;
//这两个都是void类型
}
void process(int*arr,int n)
{
int *min,*max;
int*p;
p=max=min=arr;//指针相等,是所指向的地址相等
for(;p<arr+n;p++)
//这是在使用指针,数组用指针的方式去表示,arr表示第一个数据,arr+i表示第i个
//数据,p++实际上是后面的i在++
{
if(*p<*min)//解引用,去比较数据大小
{
min=p;//赋值地址
}
if(*p>*max)
{
max=p;
}
}//别把if判断放在for循环里面
if(min!=arr)//这是在看地址是否相等,能起到比较地址后面的数据是否相等的作用
{
swap(arr,min);
}
if(max!=arr+n-1)
{
if(max==arr)
{
swap(arr+n-1,min);//当max==arr时,经历上面的交换,arr的值到了min里面,所以这里是交换min
}
else if(max!=arr)
{
swap(arr+n-1,max);
}
}
}
void print(int arr[],int n)
{
printf("结果是:\n");
int i;
for(i=0;i<n;i++)
{
printf("%d ",arr[i]);
}
}
int main()
{
int n,arr[100];
scanf("%d",&n);
getnum(arr,n);
process(arr,n);
print(arr,n);
return 0;
}