欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。错误写法以及正确写法。

程序员文章站 2022-03-02 12:13:42
...

题目:输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。
先看一种解法:

#include<stdio.h>
void swap(int *a, int *b)
{
    int t;
    t = *a;
    *a = *b;
    *b = t;
    return;
}

int main(int argc, char *argv[])
{
    int a[10] = {0};
    int i, min, max;
    min = 0;
    max = 0;
    printf("请输入10个数\n");
    for (i=0; i<=9; i++) 
    scanf("%d", &a[i]);
    for (i=0; i<=9; i++) 
    {
        if (a[min] > a[i])
        min = i;
        if (a[max] < a[i])
        max = i;
    }

   swap(&a[0], &a[max]);
   swap(&a[9], &a[min]);

   for (i=0; i<=9; i++) 
   printf("-->%d", a[i]);
   printf("\n");
}

这种解法乍一看没什么问题,符合题意,但我无意中发现了这种写法的BUG——即如果你输入的10个数, 最小的数刚好在第一位或者最大的数刚好在最后一位的时候,上述代码的处理就会出现错误,按题目的意思,是想让最小的数放在最后一位,最大的数放在第一位。举个例子,假如最小的数在第一位,即a[0];最大的数在第五位,即a[5]。按上述代码处理如下:交换a[5]与a[0],接着交换a[0]与a[9],这样最小的数跑到了第六位的位置,最大的数跑到了最后一位上。显然不符合题目要求。

所以正确的应该是下面的代码:

#include<stdio.h>
void swap(int *a, int *b)
{
    int t;
    t = *a;
    *a = *b;
    *b = t;
    return;
}

int main(int argc, char *argv[])
{
    int a[10] = {0};
    int i, min, max;
    min = 0;
    max = 0;
    printf("请输入10个数\n");
    for (i=0; i<=9; i++) 
    scanf("%d", &a[i]);
    for (i=0; i<=9; i++) 
    {
        if (a[min] > a[i])
        min = i;
        if (a[max] < a[i])
        max = i;
    }
    if (min!=0 && max!=9) 
    {
        swap(&a[0], &a[max]);
        swap(&a[9], &a[min]);
    }
    else if (0==min && 9!=max)
    {
        swap(&a[min], &a[max]);
        swap(&a[9], &a[max]);
    }
    else if (0!=min && 9==max)
    {
        swap(&a[min], &a[max]);
        swap(&a[0], &a[min]);
    }
    else if (0==min && 9==max)
    {
        swap(&a[min], &a[max]);
    }
    for (i=0; i<=9; i++) 
    printf("-->%d", a[i]);
    printf("\n");

}
相关标签: c# c