2017-01-04 6 views
0

関数を使って配列内の最大値と最小値を探したいと思います。ここに私のコードだ:配列の中で最大の数を見つけると、最大のint値が返されます。

#include <stdio.h> 

void findLowHigh(int* numbers, int size, int* min, int* max) { 
    for(int i = 0; i < size; i++) { 
     if (*min > numbers[i]) *min = numbers[i]; 
     else if (*max < numbers[i]) *max = numbers[i]; 
    } 
} 

int main() { 
    printf("##### Find lowest and highest number in collection #####"); 
    printf("\n Array checked: [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]"); 
    int min, max; 
    int numbers1[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; 
    findLowHigh(numbers1, 10, &min, &max); 
    printf("\nMin: %d\nMax: %d", min, max); 

    printf("\n Array checked: [ 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 ]"); 
    int numbers2[10] = { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 }; 
    findLowHigh(numbers2, 10, &min, &max); 
    printf("\nMin: %d\nMax: %d", min, max); 

    return 0; 
} 

と出力があります:

##### Find lowest and highest number in collection ##### 
Array checked: [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ] 
Min: 1 
Max: 32767 
Array checked: [ 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 ] 
Min: 1 
Max: 32767 
Process finished with exit code 0 

私はポインタに何か問題があると推測しているが、それは何ですか?

+3

デバッガを使用してコードをステップ実行する方法を学ぶ必要があるようです。良いデバッガを使用すると、プログラムを1行ずつ実行し、どこからずれているかを確認することができます。これはプログラミングをする場合に不可欠なツールです。さらに読む:** [小さなプログラムをデバッグする方法](http://ericlippert.com/2014/03/05/how-to-debug-small-programs/)** – NathanOliver

+0

あなたの変数は初期化されていないので、設定されていますあなたのケースでは32767であるunitialisedの値になりますので、maxがあなたの配列のあなたの値よりも小さいことは決してありません。あなたは '0'のような賢明な値か、 – EdChum

+0

のどちらの初期値を低くして初期化するべきですか? – RyanP

答えて

1

if (*min > numbers[i])*minには既に有効な値が含まれているものとします。

ただし、アドレスが渡された整数は初期化されません。 (limits.h(またはclimitsを含めた後、あなた本当には、C++)をコンパイルしている場合)が可能修正:

int min=INT_MAX; 
int max=INT_MIN; 

ネイサンオリバーはコメントで示唆したようにします。より頑強な解決策は、配列の最初の要素にminmaxを設定することです。

if (min && max && numbers && size > 0) { 
    *min = numbers[0]; 
    *max = numbers[0]; 
} 
+0

この関数は、常にminとmaxとして 'INT_MIN'と' INT_MAX'を返します。 –

+0

@KrzysztofKraszewskiそして、あなたはそこに 'else'を置くことはできません。少なくとも' i == 0'ではそうはできません。 – LogicStuff

+0

@KrzysztofKraszewski - それはできません。整数は 'INT_MAX'より小さい。したがって、 'numbers [0]'は直ちに新しいminとして選択されます。 – StoryTeller

2

あなたの最小/最大を初期化する必要があります。

int min, max; 

のように:Cで

int min=INT_MAX, max=INT_MIN; 

もっと++あなたが#include <limits>および使用するスタイル:

int min = std::numeric_limits<int>::max(); 
int max = std::numeric_limits<int>::min(); 

[編集]

また、(それがコメントにあったように)から、あなたのロジックでelseを削除する必要があります。

if (*min > numbers[i]) *min = numbers[i]; 
    else if (*max < numbers[i]) *max = numbers[i]; 

そうでない場合、あなたはあなたの結果で最大値を見つけないかもしれません。

1

値を関数に渡す前に、min = INT_MAXおよびmax = INT_MINの値を初期化する必要があります。

0

int min, max;のような変数を初期化するときは、数値ではなく空白のままにします。これは、minとmaxが自動的に未定義数として設定されることを意味します。

+1

nope - min、maxは初期化されていないとランダムな(未定義の)値を含んでいます – marcinj

+0

@marcinj実際には、プログラムがUBを持つためにmin maxに含まれる値は関係ありません。 – Slava

1

int min, max;は初期化されていませんが、任意の値を含めることができます。 findLowHighの冒頭で初期化する必要があります。 findLowHighを呼び出す前にリセットすることが重要です。過去の結果が将来の結果に影響を与えます。

両方の要素を最初の要素numbersに設定し、ループ内のその要素をスキップできます。最初にsizeがゼロでないことを確認してください。

void findLowHigh(int* numbers, int size, int* min, int* max) 
{ 
    if(size > 0) 
    { 
     *min = numbers[0]; 
     *max = numbers[0]; 

     for(int i = 1; i < size; i++) { 
      if (*min > numbers[i]) *min = numbers[i]; 
      if (*max < numbers[i]) *max = numbers[i]; // Also, remove this else 
     } 
    } 
} 

編集:sizeがゼロの場合に何が起こるかを決める必要があります。空リストの最小値と最大値は何ですか?

関連する問題