2010-09-26 113 views
1

我必須找到一種方法來顯示數組中的最大和最小數字,數組的大小爲100,並且不會超過這個數字,並且不需要用於輸入驗證。程序會一直詢問輸入,直到遇到0,並且它也會被添加到數組中。如何在數組中找到最大和最小數字c

我有一切想通了,除了如何跟蹤哪些是最大和最小的價值。我會很感激,如果有人可以修復我的代碼或顯示我。我遇到的另一個問題是獲取循環終止並在輸入等於0時在while循環內執行最大/最小計算。

/* 
============================================================================ 
Name  : test.c 
Author  : 
Version  : 
Copyright : Your copyright notice 
Description : Hello World in C, Ansi-style 
============================================================================ 
*/ 

#include <stdio.h> 
#include <stdlib.h> 
#define n 100 
int main(void){ 


int numbers[n]; 
int i = 1; 
int j; 
     int input; 
int maxvalue; 
int minvalue; 

    printf("Enter the next array element>"); 

input = scanf("%d", &numbers[100]); 



while (input != 0){ 

    numbers[i] = input; 
    i++; 
    printf("Enter the next array element, while loop>"); 
    input = scanf("%d", &numbers[n]); 
    if (input == 0){ 
printf("Enter the next array element, if loop"); 
    numbers[i] = 0; 

    for (j =2;j <= i; j++){ 
    minvalue = numbers[1]; 

    j++; 
    if (numbers[j] > minvalue){ 
    maxvalue = numbers[j] ; 
    } 
    else{ 
    minvalue = numbers[j] ; 
    } 

    } 


    } 
} 


printf("%f\t", maxvalue); 

printf("%f\n", minvalue); 
} 

編輯:我把你的所有建議和編輯我的代碼。這是我的代碼如下。但是,它的輸出不是我所期望的。

#include <stdio.h> 
#include <stdlib.h> 
#define N 100 
int main(void){ 


    int numbers[N]; 
    int i = 0; 
    int j; 
     int input; 
    int maxvalue; 
    int minvalue; 

      printf("Enter the next array element>"); 

scanf("%d", &input); 



while (input != 0){ 

     numbers[i] = input; 
     i++; 

     if (input == 0){ 
        i++; 
      numbers[i] = 0; 
         minvalue = numbers[0]; 
         maxvalue = numbers[0]; 
         for (j=0;j<=i-1;j++){ 

          if (minvalue >= numbers[j]){ 
           minvalue = numbers[j]; 
          }else if (maxvalue <= numbers[j]){ 
           maxvalue = numbers[j]; 
          } 


         } 

/* min = value of first array element 
max = value of first array element 

begin loop for each array element, index = 0 to (n-1) 

--- if array element value is less than min, set min to this value 
--- if array element value is more than max, set max to this value 

increment index and repeat loop til last index is completed 

average = sum/number of elements (n). 
max and min will hold their correct values.*/ 




     } 
       printf("Enter the next array element, while loop>"); 
    scanf("%d", &input); 
    } 


printf("%d\t", maxvalue); 
printf("%d", minvalue); 
    } 

這是輸出,我得到了!有人可以爲我解決這個問題嗎?

​​

最後編輯:我解決了這個我自己。我將最小/最大值檢查放在主WHILE循環之外,這允許輸入0輸入到數組中。

#include <stdio.h> 
#include <stdlib.h> 
#define N 100 
int main(void){ 


    int numbers[N]; 
    int i = 0; 
    int j; 
     int input; 
    int maxvalue =1; 
    int minvalue = 1; 
      printf("Enter the next array element>"); 

scanf("%d", &input); 
minvalue = input; 
maxvalue = input; 



while (input != 0){ 
    numbers[i] = input; 

    ++i; 
       printf("Enter the next array element>"); 
    scanf("%d", &input); 

if (input == 0){ 
numbers[i] = 0; 
    ++i; 

    } 

} 
for (j =0;j<i;j++){ 
if (numbers[j] >= maxvalue){ 
           maxvalue = numbers[j]; 
          } 
          if(numbers[j] < minvalue){ 
           minvalue = numbers[j]; 
          } 

} 

printf("%d\t", maxvalue); 
printf("%d\n", minvalue); 

    } 
+2

在C,數組索引從0開始發生什麼。你也許可以在沒有任何錯誤的情況下使用1,因爲你在本地使用它,所以你只是一直跳過第一個元素,但它會嘮叨每一個C程序員。 – tia 2010-09-26 07:24:15

+2

嘗試對n等預處理器常量使用大寫字母,表明它們與變量不同。 – 2010-09-26 07:45:05

+0

請仔細檢查你的代碼 – pmg 2010-09-27 07:06:40

回答

2

首先,你要指定inputscanf()返回值。這是通話分配的項目數,並且由於您說輸入始終是正確的,因此該值始終爲1

其次,你寫過去numbers[]陣列與行的末尾:

input = scanf("%d", &numbers[100]); 

(你應該做的,而不是scanf("%d, &input),並在你的循環分配numbers[i]輸入

最後,你不需要重複計算maxvalueminvalue,你可以循環遍歷numbers[],而只需將它們與input進行比較,然後相應地分配它們。

希望這會讓你走上正軌。

+0

您的提示幫了我很大忙,但現在的問題是輸出,出於某種原因,它會輸出異常大的數字。 – 2010-09-27 00:01:12

+0

編輯:我現在解決了。謝謝。 – 2010-09-27 05:22:29

+0

祝賀:)我很高興你明白了。 – 2010-09-27 05:29:54

-3
int cmp(const void *a,const void *b) 
{ 
    return *(const int*)a-*(const int*)b; 
} 
... 
qsort(numbers, 100, sizeof(numbers[0]), cmp); 
printf("\nmin: %d\nmax: %d",numbers[0],numbers[99]); 
+0

-1輸入停在0處。沒有把握確定陣列中會有100個元素。*爲什麼你覺得'qsort()'是OP的不錯選擇?* – pmg 2010-09-26 10:27:47

+2

哇,這是找到最小和最大的最低效率的方法,更不用說所有其他問題了。 (好吧,我誇大了一點點,但仍然,O(n log n)與O(n)相當糟糕。) – Domenic 2010-09-27 00:25:54

+0

@Domenic:雖然我同意這種方法效率很低,但是'O(n log n) ''和'O(n)'在'n'適合機器字時也可以相同。 32(或64)是一個很小的常數。如果它不適合機器字,那麼在「線性搜索」數據中增加位置計數器就是一個「O(log n)」操作,使得整個任務「O(n log n)」成爲可能。 。:-) – 2010-09-27 04:17:05

2

它看起來像你的問題的關鍵是你比較每個號碼只針對minvalue。這是很好的決定是否要取代目前的minvalue,但顯然它沒有告訴你任何關於每個元素與maxvalue的關係。

另一個問題:從第一個元素初始化minvalue是有意義的,但是如果在循環中執行它,則不是。這隻會使你以前的工作無效。

您還需要使用maxvalue進行相同的初始化。您應該將該數字初始化爲第一個值。

您還應該在計算累積數據時計算最小值和最大值,或者在完成數據傳遞時做出決定。然而,你不想做的事是循環過去的每一個新元素。這給你的程序二次時間複雜性沒有好處。

最後,不要容忍糟糕的格式。調試總是涉及到學習代碼,你會希望它永遠是完美的格式,既是專業的事情,也便於閱讀你自己的工作。

2

您提出了兩個問題,即有關最小/最大計算和循環的策略。不要那樣做(對自己),但一次解決一個問題。所以首先把類似

signed int input[] = { 8, -5 , /* some more values */ }; 
size_t const n = sizeof input/ sizeof input[0]; 

在開始時忘記你的scanf問題。

然後在適當的循環指令中包含最小/最大檢測。

然後編譯您的代碼,並附帶警告:例如-Wall代碼爲gcc,但這可能因您的編譯器而異。

礦告訴我的東西:

測試numbers.c:21:警告: 'MAXVALUE' 可以在這 功能測試numbers.c使用未初始化:22:警告: 「 MINVALUE」可在此功能

這告訴你,你正在做的事情在不考慮你的算法的起點也非常錯誤的使用未初始化 。

0

我reindented你的代碼和替換它的地段和`/ * ... ...佔位符*/

#include <stdio.h> 
#include <stdlib.h> 
#define N 100 
int main(void) { 
    int numbers[N]; 
    int i = 0; 
    int input; 
    int maxvalue; 
    int minvalue; 

    printf("Enter the next array element>"); 
    scanf("%d", &input); 

    while (input != 0) { 
     numbers[i] = input; 
     i++; 

     if (input == 0) { 
      /* ...PLACEHOLDER... */ 
     } 
     printf("Enter the next array element, while loop>"); 
     scanf("%d", &input); 
    } 
    printf("%d\t", maxvalue); 
    printf("%d", minvalue); 
} 

希望你可以看到,當你進入1會發生什麼,或2,或3當你enetr 0.

提示:maxvalueminvalue值永遠不會改變。

另一個提示:while()行執行多少次?


編輯與例如運行

對於這個例子來說,代碼是在左側,是在左側

 
     printf("Enter the next array element>"); | 
     scanf("%d", &input);      | Enter 42 
               | 
     while (input != 0) {      | input is 42, so you do the loop 
      numbers[i] = input;     | numbers[0] = 42 
      i++;         | i = 1 
               | 
      if (input == 0) {     | input != 0; skip placeholder 
       /* ...PLACEHOLDER... */   | 
      }         | 
      printf("Enter the next ...>");  | 
      scanf("%d", &input);     | enter 3 
     }          | 
     while (input != 0) {      | input is 3 
      numbers[i] = input;     | numbers[1] = 3 
      i++;         | i = 2 
               | 
      if (input == 0) {     | input != 0; skip placeholder 
       /* ...PLACEHOLDER... */   | 
      }         | 
      printf("Enter the next ...>");  | 
      scanf("%d", &input);     | enter 0 
     }          | 
     while (input != 0) {      | input is 0, skip while body 
      /* ...PLACEHOLDER... */    | 
     }          | 
     printf("%d\t", maxvalue);    | maxvalue hasn't been initialized 
     printf("%d", minvalue);     | minvalue hasn't been changed 
+0

我不確定你想告訴我什麼。最小值/最大值如何改變值? – 2010-09-27 01:14:26

+0

請參閱我的編輯中帶註釋的運行 – pmg 2010-09-27 07:14:28

相關問題