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币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
C 交换数组中的元素
1.题目 有一个字符数组的内容为:”student a am i”,请你将数组的内容改为”i am a student”. 要求:不能使用库函数。只能开辟有限个空间(空间个数和字符串的长度无关)。 2.程序代码 #define _CRT_SECURE_NO_WARNINGS 1 #include &amp;lt;stdio.h&amp;gt; #include &amp;lt;Windows.h&amp;gt; ...
交换数组中两个位置的元素值
static void swap(int[] array, int index1,int index2){ int t = array[index1]; array[index1] = array[index2]; array[index2] = t; }
C#中数组内容前后交换代码
string[] Name = new string[] { "张三", "李四", "朱浪", "浪子" }; 让上面的数字输出的顺序是 浪子 朱浪 李四 张三  算法思路是  1)先考虑要循环几次;数组的长度为 Name.Length; 0和3交换 1和2交换 最后推导出交换的次数是 Name.Length/2 2)是那两个元素在交换呢? 经过推到 是第一个 和数组的最后一个进
数组中两个元素交换位置
arr[oneIndex] = [arr[twoIndex], arr[twoIndex] = arr[oneIndex]][0] 更简单的:let x = 1let y = 2[x, y] = [y, x]
C语言用指针实现两个数组值互换
C语言用指针实现两数组的值互换#include <stdio.h> #define N 10 void ReadData(int a[], int n); void PrintData(int a[], int n); void Swap(int *x, int *y); int main() { int a[N], b[N], i,n,k; printf("Input arra
四种方法实现数组交换
方法一: //该方法主要用逻辑运算将数组对应的每个元素进行交换,然后用for循环将整个数组元素进行交换 #include&amp;lt;stdio.h&amp;gt; int main() { int i,j,k; int A[10]; int B[10]; int C[10]; printf(&quot;请输入A数组的内容:\n&quot;); for(i=0;i&amp;lt;10;i++) {scan...
交换一个数组前两个元素位置(@的用法)
def swap2(a: Array[Int]) = a match { case Array(a, b, end@_*) => Array(b, a) ++ end } assert(swap2(Array(1, 2, 3, 4)).deep == Array(2, 1, 3, 4).deep)
数组内数值的排序
对数组内的数值从小到大进行排序 1、选择排序 原理:数组内第0个元素与第一个元素进行比较,如果第0个元素大于第一个元素,则交换位置,否则不变。第0个位置元素再与第2个元素进行比较,若第0个元素比较大,交换位置,否则不变,依此类推,直至第0个元素与最后一个元素进行比较。比较的结果是第0位存放的是数组内的最小值。     第0个元素比较结束后,进行第1个元素的比较,步骤如第0个元素一样,比较结束
数组与矩阵---在数组中找到一个局部最小的位置
【题目】  定义局部最小的概念。arr长度为1时,arr[0]是局部最小。arr的长度为N(N>1)时,如果arr[0] < arr[1],那么arr[0]是局部最小;如果arr[N-1] < arr[N-2],那么arr[N-1]是局部最小;如果 0 < i < N-1,既有 arr[i] < arr[i-1],又有arr[i] < arr[i+1],那么arr[i]是局部最小。   给定无序数
【C语言】数组对应位置交换值
#include <stdio.h> #include <stdlib.h> #define SIZE 10 int a[SIZE]={1,2,3,4,5,6,7,8,9,10},b[SIZE]={101,102,103,104,105,106,107,108,109,110}; //数组对应位置交换值 void max_min_pos(int *a,int *b){ int tmp,i;