簡體   English   中英

交換C中最大和最小的數字

[英]Swapping largest and smallest numbers in C

我想編寫一個程序,該程序從用戶讀取10個int值,並在第一個和第二個值上交換最大和最小的數字,然后其余數字應按順序排列。

請檢查代碼,並幫助我找出問題所在。

例如:

1
9
4
5
6
7
8
2
4
5

新訂單應為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;   
    }

編輯:

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;   
    }

正如其他人指出的那樣,您的代碼無法正確識別數組中的最大值和最小值,因為您正在將minmax寫回到數組中,而不是相反。

由於要交換這些值,因此實際需要的是數組的最小值和最大值的索引 ,然后交換它們。

最好將此代碼分解為函數,而不是將所有內容都保留在函數中。 這是可以滿足您需求的解決方案:

#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;
}

您實際上並沒有改變數組。

在第二個循環中,您說“如果當前元素是最大值,則將其設置為最大值”。 換句話說,將其設置為當前值。 分鍾也一樣。

您要交換的是這些作業。

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

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

另外,您的minmax初始值也不好。 min是單位化的,因此其初始值是不確定的。 您應該將min初始化為一個非常大的值,類似地, max應該被初始化為一個非常小的(即大的負數)值。

更好的方法是跟蹤最大和最小值的索引 可以將它們初始化為0。然后可以檢查a[i] > a[max]a[i] < a[min] 然后,您可以在索引minmax處打印值,然后遍歷列表並打印其他內容。

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");

初始化min=0,max=0是不正確的。

取而代之的是min = INT_MAXmax = INT_MIN

通過設置min=0 ,如果它大於min=0 ,則永遠不會獲得數組中的最低數字。

同樣,通過設置max=0 ,如果數組中的數字小於0,則永遠不會得到最大的數字。

通過以下代碼您一無所獲

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

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

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

顯然,這個循環

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

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

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

沒有道理。

此外,變量min未初始化,而變量max未正確初始化。

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

例如,數組可以包含所有否定元素。 在這種情況下,您將獲得不正確的最大值,該值等於0。

而且我沒有看到將元素移到右側的位置,以將最大值和最小值移到數組的前兩個位置。

如果我正確理解,那么您需要的是以下內容。 要移動元素,可以使用標頭<string.h>聲明的標准函數memmove 但是,看來您正在學習循環。

#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");
}

程序輸出為

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

只需保持它的簡潔漂亮即可,如下所示:

#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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM