2 sinat 34654042 sinat_34654042 于 2016.05.06 22:46 提问

C++ 数组内元素互换的简单问题

//输入10个整数,将其中最小的数与第一个数交换,把最大的数与最后一个数交换。用指针实现
int main()
{

    int a[10]; 
    int *max,*min,*p,temp;
    cout<<"输入10个数"; 
    for (int i=0;i<10;i++)
        cin>>a[i];
        max=min=a;
    for(p=a+1;p<a+10;p++) 
        if(*p>*max) max=p;  
    else if(*p<*min) min=p; 
            temp=a[0];a[0]=*min;*min=temp;
        if(*max!=a[0]) 
        {       
            temp=a[9];a[9]=*max;*max=temp;
        }   
        else 
        { 
            temp=a[9];a[9]=*min;*min=temp; 
        }   
                cout<<"交换后的数组:";   
        for(p=a;p<a+10;p++) 
        cout<<*p<<" "; 
        cout<<endl;

}

这是段可以运行的能得到预期结果的程序,可是程序实现的思路让我很困惑,这里面的for···if···else if···if···else具体是怎样执行的?大神们可以详细解释一下这段程序吗?又或是,这段程序本身并不好读,那可以修改一下或提供一个更易执行的解决问题的思路吗?

3个回答

tcg_gd
tcg_gd   2016.05.06 23:18
已采纳

int main()
{
int a[10];
int *max,*min,*p,temp;
cout<<"输入10个数";
for (int i=0;i cin>>a[i];//输入了10个数
max=min=a;
for(p=a+1;p if(*p>*max) max=p; //遍历,使max指向最大的数
else if(*p<*min) min=p; //遍历,使min指向最小的数

        temp=a[0];a[0]=*min;*min=temp;//把a[0]和min的数交换
    if(*max!=a[0]) //这个if判断根本没用
    {       
        temp=a[9];a[9]=*max;*max=temp; //把a[9]和max交换。
    }   
    else  //这个根本没有用,因为只有一种情况,即当10个数都相等的时候才会if为假,走进else,并且根本不要这个if判断
    { 
        temp=a[9];a[9]=*min;*min=temp;//此时max=min,当然可以这么换了啊
    }   
            cout<<"交换后的数组:";   
    for(p=a;p<a+10;p++) 
    cout<<*p<<" "; 
    cout<<endl;

}

///简化之:
int main()
{
int a[10];
int *max,*min,*p,temp;
cout<<"输入10个数";
for (int i=0;i cin>>a[i];//输入了10个数
max=min=a;
for(p=a+1;p if(*p>*max) max=p; //遍历,使max指向最大的数
else if(*p<*min) min=p; //遍历,使min指向最小的数

        temp=a[0];a[0]=*min;*min=temp;//把a[0]和min的数交换

        temp=a[9];a[9]=*max;*max=temp; //把a[9]和max交换。 
            cout<<"交换后的数组:";   
    for(p=a;p<a+10;p++) 
    cout<<*p<<" "; 
    cout<<endl;

}

这样就行。

----建议研究下排序算法。

jfieet
jfieet   2016.05.06 23:30

int a[10];
int *max,*min,*p,temp; //max指针指向最大值所在的位置,min指向最小值所在的位置,p是用来对数组的遍历
cout<<"输入10个数";
for (int i=0;i {
cin>>a[i];
}
max=min=a; //设置数组的第一个元素等于最大值并且等于最小值,相当于如果只有一个元素,那么这个元素既是最大值也是最小值
for(p=a+1;p {
if(*p>*max) max=p; //如果p指向的数组元素大于当前的max指向的元素值,那么就将max指向p指向的数组元素
else if(*p<*min) min=p; //同理,如果p指向的数组元素小于当前min指向的元素,那么将min指向p指向的数组元素
}
//上面的for循环可以得到最大值与最小值所在的地址,分别是max指针指向的地址与min指针指向的地址
temp=a[0];a[0]=*min;*min=temp; //将最小值与a[0]交换位置
if(*max!=a[0]) //对最大值进行判断,如果最大值不等于a[0],就是如果最大值不等于最小值
{

temp=a[9];a[9]=*max;*max=temp; //将最大值与最后一个元素a[9]交换位置
}

else //否则如果最大值对于最小值
{
temp=a[9];a[9]=*min;*min=temp; //直接将最小值与最后一个元素交换位置
}

cout<<"交换后的数组:";

for(p=a;p<a+10;p++)
cout<<*p<<" ";
cout<<endl;

jfieet
jfieet   2016.05.06 23:34

后面对最大值的判断没什么用,直接将最大值与a[9]交换就行了,就是将对最大值进行判断的if else 删掉换成temp=a[9];a[9]=*max;*max=temp;就可以了。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!