2017-07-05 17 views
-2

配列内の隣接する2つの値の最大の差異を検出したいとします。たとえば、配列int tab[6] = {1,2,8,4,5,6};の場合、82の違いのため最大差は6です。残差は1です。だから、私のプログラムの結果は6でなければなりません。しかし、私のプログラムのプリント1と私はどこの問題だかわからない:アレイ内の隣接する2つの値の最大差C

#include <stdio.h> 

int main(int argc, char **argv) 
{ 
    int n = 6; 
    int tab[6] = {1,2,8,4,5,6}; 
    int diff = tab[1] - tab[0], maxdiff = diff, i; 

    for(i=2; i<n-1; i++) 
    { 
     if(diff > maxdiff) 
      maxdiff = diff; 

     diff = tab[i] - tab[i-1]; 
    } 

    printf("%d\n", diff); 

    return 0; 
} 
+2

これは、より多くの(https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)[ラバーダックのジョブ] ...あなたますように見えますこのようなことをデバッグすることを自分自身に奨励してください。 –

+0

@George: '6'を' 26'に変更しても、 '21'ではなく' 6'が表示されます。 –

+0

デバッガを使用してください。 –

答えて

5

さて、あなたはmaxdiffに最大の相違点についての情報を保持していますが、常にこの例では数字の最後のペアの前に1(の差ですdiffを印刷1)。

iは、< nになる必要があります。そうしないと、最後のペアは考慮されません。

  • コードを少しきれいにして、n<=1コーナーケースを確認します。
  • の絶対値の違いに興味があると思います。 absを使用するか、それに応じてオペランドの順序を変更することにより、減算が結果に負の影響を与えないようにしてください。 (absが簡単です)

ここでは、私の提案です:

int main(int argc, char **argv) { 
    const int n = 6; 
    int tab[n] = {1, 2, 8, 4, 5, 26}; 
    if (n <= 1) 
    return 0; //or whatever you have to do in this corner case 
    else { 
    int maxdiff = INT_MIN; 
    for (int i = 1; i < n; i++) 
     maxdiff = max(maxdiff, abs(tab[i] - tab[i - 1])); 

    printf("%d\n", maxdiff); 
    } 
    return 0; 
} 
2
  • i<n-1tab の最後の二つの値の差をテストしないであろうとi<nでなければなりません。
  • ifは、計算された最終的な差が最大であるかどうかを判断するために差分計算の下にある必要があります。
  • あなたはまた、(@Felix Palmenで指摘したように)第二より大きい最初の数を考慮して、あなたの差分計算に絶対値をとるべきであるmaxdiff
  • を印刷する必要があります。 stdlib.hで定義されたabs関数を使用するか、自分でdiff > 0? diff : -diffと書くことができます。

固定コード:

int main(int argc, char **argv) 
{ 
    int n = 6; 
    int tab[6] = {1,2,8,4,5,6}; 
    int diff = abs(tab[1] - tab[0]), maxdiff = diff, i; 

    for(i=2; i<n; i++) 
    { 
     diff = abs(tab[i] - tab[i-1]); 

     if(diff > maxdiff) 
      maxdiff = diff; 
    } 

    printf("Max difference: %d\n", maxdiff); 

    return 0; 
} 
+2

また、ちょっとした微妙なバグに注意してください: '2'と' 8'の場所を入れ替えたらどうなりますか? –

1

二つの問題があります。まず、maxdiffの代わりにdiffを印刷しています。だから、あなたは最後の差分の結果を得ています。

第2に、あなたは絶対値をとっていません。つまり、{8,2,4}は、6ではなく2になります。

最後に、これはバグではありませんが、maxdiff = 0から始めると重複が削除されます。

スタイルノート:1行に複数の変数を宣言するのは難しいです。 を宣言し、を1行に初期化することは非常に読みにくいです。それをしないでください。

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

int main() { 
    int n = 6; 
    int tab[] = {1,2,8,4,5,6}; 
    int maxdiff = 0; 

    for(int i=1; i < n; i++) { 
     int diff = abs(tab[i] - tab[i-1]); 
     if(diff > maxdiff) { 
      maxdiff = diff; 
     } 
    } 

    printf("%d\n", maxdiff); 

    return 0; 
} 
関連する問題