簡體   English   中英

在數組中查找最小和最大元素(C++)

[英]finding min&max element in an array (C++)

嘗試獲取數組中的最大/最小元素時,結果出現問題。 代碼是:

#include <iostream>
using namespace std;

int main(void){
  int a, b, max, min;
  cin >> a;
  int arr [a] ;
  max,min = arr[0];
  for (int i; i < a; i++){
    cin >> b;
    arr[i]=b;
    
    if (arr[i] > max) max = arr[i];
    if (arr[i] < min) min = arr[i];
    
    
  }
  cout << min << " " << max ;
  return 0;

  
} 

輸入:5 20 30 40 50 60 輸出:0 60

我一直得到 '0' 作為最小元素的答案。 你能看到我的代碼有錯誤嗎?

最重要的是:請打開編譯器警告。 它顯示您的代碼中的錯誤:

:7:7: 警告:ISO C++ 禁止可變長度數組 'arr' [-Wvla]
 7 | int arr [a] ; | ^~~

int arr [a]; 這聲明了一個 VLA(可變長度數組),因為a不是編譯時常量。 VLA 不是標准 C++ 的一部分,它們是某些編譯器(最著名的是 gcc、clang)的擴展。

:8:3: 警告:逗號運算符的左操作數無效 [-Wunused-value]
 8 | max,min = arr[0]; | ^~~

這被解析為(max, min) = arr[0] max, min的逗號運算符計算每個操作數,運算符的結果是最后一個操作數,即max被丟棄,只分配min (不正確,見下文)

:8:11: 警告: '*[0]' 使用未初始化 [-Wuninitialized]
 8 | max,min = arr[0]; | ~~~~^~~~~~~~

arr未初始化,因此arr[0]未初始化。 您從未初始化的對象中讀取。 這是未定義行為的來源之一。

:9:12: 警告: 'i' 可能會在未初始化的情況下使用 [-Wmaybe-uninitialized]
 9 | for (int i; i < a; i++){ | ^

同樣,您從未初始化的變量i讀取。

:18:25: 警告: 'max' 可能在此函數中未初始化使用 [-Wmaybe-uninitialized]
 18 | cout << min << " " << max ; | ^~~

由於上述原因,可以在此處初始化max


用標准 C++ 容器替換 VLA,例如std::vector

始終初始化您的變量。 一個好的經驗法則是在聲明變量時始終初始化它們並盡可能晚地聲明它們。

此外,還有一個標准算法可以找到范圍內的最小值和最大值: std::minmax

並始終使用編譯器警告(gcc/clang 上的-Wall -Wextra ,MSVC 上的/W3

通過將您的min設置為arr[0] ,您將其設置為一個恰好為 0 的未定義值。您需要讀取您的第一個值集並將min設置為該值,以防萬一沒有小於0 所以你不會意外地得到奇數值。

#include <iostream>
using namespace std;

int main(void){
    int a, b, max, min;
    cin >> a;
    int arr[a];

    // Initializing all values to the first value in the array
    cin >> b;
    min = max = arr[0] = b;

    // Since we already filled out the value at index 0, we start i at 1
    for (int i = 1; i < a; i++) {
        cin >> b;
        arr[i]=b;

        if (arr[i] > max) 
            max = arr[i];
        if (arr[i] < min) 
            min = arr[i];
    }
    cout << min << " " << max ;
    return 0;
} 

老實說,你甚至不需要一個數組,因為你在讀取它們時比較值。你可以像這樣實現它:

#include <iostream>
using namespace std;

int main(void){
    int a, b, max, min;
    cin >> a;

    cin >> b;
    min = max = b;

    for (int i = 1; i < a; i++) {
        cin >> b;

        if (b > max) 
            max = b;
        if (b < min) 
            min = b;
    }
    cout << min << " " << max ;
    return 0;
} 

arr[0]尚未初始化時,您正在使用arr[0]初始化minmax 您可以通過在使用它初始化minmax之前將第一個元素存儲在arr[0]來修復它。

如果您進行適當的更改,您的代碼可能如下所示:

#include <iostream>
using namespace std;

int main(void){
  int a, b, max, min;
  cin >> a;
  int arr [a] ;
  
  cin >> arr[0];
  max = min = arr[0];
  for (int i=1; i < a; i++){
    cin >> b;
    arr[i]=b;
    
    if (arr[i] > max) max = arr[i];
    if (arr[i] < min) min = arr[i];
  }
  cout << min << " " << max ;
  return 0;
} 

這不是完美的代碼,但它會起作用。

暫無
暫無

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

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