注册 登录
编程论坛 C语言论坛

高手求解,一直不懂哪里出问题了

kr0 发布于 2020-07-13 19:09, 2732 次点击
//这个程序用来输入一维数组的10个元素,并将最小值与第一个数交换,最大值与最后一个数交换.
运行结果  :98 24 56 78 1 32 36 44 29 6
            24 6 56 78 1 32 36 44 29 98
一直找不出问题在哪,各位大神帮忙看一下,谢谢。

#include<stdio.h>
int Min(int *, int n);
int Max(int *, int n);
int main(void)
{
    int i,mi,ma,temp;
    int a[10];
    for (i = 0; i < 10; i++)
        scanf_s("%d", &a[i]);
   
    if (mi=Min(a, 10)!=0)
    {
        temp = a[0];
        a[0] = a[mi];
        a[mi] = temp;
    }
   
    if (ma = Max(a, 10)!=9)
    {
        temp = a[9];
        a[9] =a[ma];
        a[ma] = temp;
    }
    for (i = 0; i < 10; i++)
        printf("%d ", a[i]);
    printf("\n");
    return 0;
}
int Min(int *t, int n)
{
    int i, j, k;
    int z=0;
    for (i = 0; i < n - 1; i++)
    {
        k = i;
        for (j = 1; j < n; j++)
        {
            z=(t[k]>t[j]) ?  j : k;
            
        }
               
    }
    return z ;
}
int Max(int *t,int n)
{
    int i, j, k;
    int z=0;
    for (i = 0; i < n - 1; i++)
    {
        k = i;
        for (j = 1; j < n; j++)
        {
            z=(t[k] < t[j]) ?  j : k;
            
        }
    }

    return z;
}
5 回复
#2
吕孟伟2020-07-13 20:45
程序代码:
#include<stdio.h>
int Min(int *, int n);
int Max(int *, int n);
int main(void)
{
    int i, temp1, temp2;
    int a[10];
    int index_min;
    int index_max;
    for (i = 0; i < 10; i++)
        scanf("%d", &a[i]);
   
    if ((index_min = Min(a, 10))!=0)
    {
       temp1 = a[0];
       a[0] = a[index_min];
       a[index_min] = temp1;
    }
   
    if ((index_max = Max(a, 10))!=9)
    {
        temp2 = a[9];
        a[9] =a[index_max];
        a[index_max] = temp2;
    }
    for (i = 0; i < 10; i++)
         printf("%d ", a[i]);
    printf("\n");
    return 0;
}
int Min(int *t, int n)
{
   
    int index;
    int min = 10000;
    for(int i = 0; i < n; ++i){
        if(t[i] < min){
            min = t[i];
            index = i;
        }
    }
    return index;
}
int Max(int *t,int n)
{
   
    int index;
    int max = -1;
    for(int i = 0; i < n; ++i){
        if(t[i] > max){
            max = t[i];
            index = i;
        }
    }
    return index;
}
#3
吹水佬2020-07-13 21:02
#include<stdio.h>
int main(void)
{
    int i,mi=0,ma=0,temp;
    int a[10];
    for (i = 0; i < 10; i++)
    {
        scanf_s("%d", &a[i]);
        if (a[i] < a[mi])
            mi = i;
        else if (a[i] > a[ma])
            ma = i;
    }
    if (mi != 0)
    {
        temp = a[0];
        a[0] = a[mi];
        a[mi] = temp;
    }
    if (ma == 0)
        ma = mi;
    if (ma != 9)
    {
        temp = a[9];
        a[9] =a[ma];
        a[ma] = temp;
    }
    for (i = 0; i < 10; i++)
        printf("%d ", a[i]);
    printf("\n");
    return 0;
}
#4
流氓小哥2020-07-17 08:17
两个函数体写的有问题,按你给的数字看一下z=(t[k]>t[j]) ?  j : k;,98 24 56 78 1 32 36 44 29 6
拿最小值来说,当最后一次循环时i = 9时k = 9
j = 1, 6与24比返回k,z = 9
j = 2, 6与56比返回k,z = 9
j = 3, 6与78比返回k,z = 9
j = 4, 6与 1比返回j,z = 4
...
j = 9, 6与 6比返回k,z = 9
发现问题了吗?前面一大堆的循环都没有用,6比6才是最后的结果
#5
流氓小哥2020-07-17 09:19
还有一个问题就是if语句, if (mi=Min(a, 10)!=0),经测试mi的结果并不是9,而是先计算Min(a, 10)!=0,Min(a, 10)=6,6!=0为真,值为1,所以该if语句中mi的值为1,所以第一个if执行后的结果是24 98 56 78 1 32 36 44 29 6
第二个if中返回的z = 8,同样8 != 9, ma = 1, a[1]和a[9]换后结果为24 6 56 78 1 32 36 44 29 98
#6
fulltimelink2020-07-17 11:01
考虑到 最大值在第一位 或者 最小值在最后一位的情况下,或者最大在第一位同时最小在最后一位的情况下, 而且兼容“将最小值与第一个数交换,最大值与最后一个数交换”两个操作任意顺序的情况下
应该先标记最后进行交换,这样才能保证不管先换小的,还是先换大的,结果 都是一样的
1