简体   繁体   中英

Swapping largest and smallest numbers in C

I want to write a program that reads 10 int values from the user and swaps the largest and smallest numbers on the first and second values, then the rest of the numbers should be in the order.

Please check the code and help me what the wrong is.

For instance:

1
9
4
5
6
7
8
2
4
5

New order should be 9 1 4 5 6 7 8 2 4 5

    #include <stdio.h>

    int main() {

    int a[10],i,min,max=0,pos=0;

    printf("Please enter 10 int values :\n");
    do{
    scanf("%d", &a[pos++]);
    } while (pos<10);

    for (i=0; i<10;i++) {
    printf("%i\n",a[i]);

    if (max<a[i])
    {
max=a[i];
}

    if (min>a[i])

    {
min=a[i];
    }

    for (i=0;i<10;i++) {

    if (a[i]==max) 
a[i]=max;

    if (a[i] == min) a[i] = min;

    }  

    printf("The new order is : %d %d %d ", max, min, ...);

    return 0;   
    }

EDIT:

It is the new form

    #include <stdio.h>

    int main() {

        int a[10],i,pos,temp,min = 0,max = 0;

        printf("Please enter 10 int values :\n");

        do {

        scanf("%d", &a[pos++]);

        } while (pos < 10);

        for ( =1; i<10;i++) {

        if (a[i]>a[max]) 
{
max=i;
}

        if (a[i]<a[min]) 
{
min=i;
}
        }

        temp=a[max];

        a[max]=a[min];

        a[min]=temp;

        printf("%d %d",a[max],a[min]);

        for (i=0;i<10;i++){

        if ((i != min) && (i != max)) {

        printf("%d ", a[i]);
        }

        }

        printf("\n");

        return 0;   
    }

As others have noted, your code does not properly identify the maximum and minimum values in the array because you are writing min and max back into the array instead of the other way around.

Since you want to swap these values, what you actually want are the indices of the min and max values of the array, and swap those.

It is best to break this code into functions instead of having everything in main. Here is a solution that will do what you want:

#include <stdio.h>

int indexofmax(int *data, int len)
{
    int max = 0;
    int i;
    for(i = 0; i < len; i++)
    {
        if(data[i]>data[max]) max = i;
    }
    return max;
}


int indexofmin(int *data, int len)
{
    int min = 0;
    int i;
    for(i = 0; i < len; i++)
    {
        if(data[i]<data[min]) min = i;
    }
    return min;
}

void swap(int *a, int *b)
{
    int temp = *a;
    *a = *b;
    *b = temp;
}

int main()
{
   // user enters in 10 ints...
   int max = indexofmax(a, 10);
   int min = indexofmin(a, 10);
   int i;
   swap(&a[min], &a[max]);
   for(i = 0; i < 10; i++)
   {
       printf("%d ", a[i]);
   }
   return 0;
}

You're not actually altering the array.

In the second loop, you say "if the current element is the max, set it to the max". In other words, set it to its current value. Similarly for the min.

What you want is to swap those assignments.

if(a[i]==max) a[i]=min;

if(a[i]==min) a[i]=max;

Also, your initial values for min and max are no good. min is unitialized, so its initial value is undefined. You should initialize min to a very large value, and similarly max should be initialized to a very small (ie large negative) value.

A better way to do this would be to keep track of the index of the largest and smallest values. These you can initialize to 0. Then you can check a[i] > a[max] and a[i] < a[min] . Then you print the values at indexes min and max , then loop through the list and print the others.

int i, temp, min=0, max=0;

for (i=1; i<10; i++) {
    if (a[i] > a[max]) max = i;
    if (a[i] < a[min]) min = i;
}

printf("%d %d ", a[max], a[min]);
for (i=0; i<10; i++) {
    if ((i != min) && (i != max)) {
        printf("%d ", a[i]);
    }
}
printf("\n");

This initialization min=0,max=0 is not right.

Instead have min = INT_MAX and max = INT_MIN .

By setting min=0 , you would never get the lowest number in the array if it is greater than 0.

Similarly by setting max=0 , you would never get the greatest number in the array if it is lower than 0.

You are gaining nothing by this code:

for(i=0;i<10;i++)

{ if(a[i]==max) a[i]=max;

  if(a[i]==min) a[i]=min; }  

It is evident that this loop

for(i=0;i<10;i++)

{ if(a[i]==max) a[i]=max;

if(a[i]==min) a[i]=min; }  

does not make sense.

Moreover variable min is not initialized while variable max is initialized incorrectly.

int a[10],i,min,max=0,pos=0;

For example the array can contain all negative elements. In this case you will get incorrect value of the maximum equal to 0.

And I do not see where the elements are moved to the right to place the maximum and the minimum to the first two positions of the array.

If I have understood correctly then what you need is something like the following. To move the elements you could use standard function memmove declared in header <string.h> . However it seems you are learning loops.

#include <stdio.h>

#define N 10

int main( void )
{
    int a[N] = { 4, 5, 9, 6, 7, 1, 8, 2, 4, 5 };

    for (size_t i = 0; i < N; i++) printf("%d ", a[i]);
    printf("\n");

    size_t min = 0;
    size_t max = 0;

    for (size_t i = 1; i < N; i++)
    {
        if (a[max] < a[i])
        {
            max = i;
        }
        else if (a[i] < a[min])
        {
            min = i;
        }
    }

    if (max != min)
    {
        int min_value = a[min];
        int max_value = a[max];

        size_t j = N;
        for (size_t i = N; i != 0; --i)
        {
            if (i - 1 != min && i - 1 != max)
            {
                if (i != j)
                {
                    a[j - 1] = a[i - 1];
                }
                --j;
            }
        }

        a[--j] = min_value;
        a[--j] = max_value;
    }

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

The program output is

4 5 9 6 7 1 8 2 4 5
9 1 4 5 6 7 8 2 4 5

Just keep it nice and simple, like this:

#include <stdio.h>
#include <stdlib.h>

#define MAXNUM 10

int find_biggest(int A[], size_t n);
int find_smallest(int A[], size_t n);
void print_array(int A[], size_t n);
void int_swap(int *a, int *b);

int
main(void) {
    int array[MAXNUM], i, smallest, biggest;

    printf("Please enter 10 int values:\n");
    for (i = 0; i < MAXNUM; i++) {
        if (scanf("%d", &array[i]) != 1) {
            printf("invalid input\n");
            exit(EXIT_FAILURE);
        }
    }

    printf("Before: ");
    print_array(array, MAXNUM);

    smallest = find_smallest(array, MAXNUM);
    biggest = find_biggest(array, MAXNUM);

    int_swap(&array[smallest], &array[biggest]);

    printf("After: ");
    print_array(array, MAXNUM);

    return 0;
}

int
find_biggest(int A[], size_t n) {
    int biggest, i, idx_loc;

    biggest = A[0];
    idx_loc = 0;
    for (i = 1; i < n; i++) {
        if (A[i] > biggest) {
            biggest = A[i];
            idx_loc = i;
        }
    }

    return idx_loc;
}

int
find_smallest(int A[], size_t n) {
    int smallest, i, idx_loc;

    smallest = A[0];
    idx_loc = 0;
    for (i = 1; i < n; i++) {
        if (A[i] < smallest) {
            smallest = A[i];
            idx_loc = i;
        }
    }

    return idx_loc;
}

void
print_array(int A[], size_t n) {
    int i;

    for (i = 0; i < n; i++) {
        printf("%d ", A[i]);
    }
    printf("\n");
}

void
int_swap(int *a, int *b) {
    int temp;
    temp = *a;
    *a = *b;
    *b = temp;
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM