2017-02-28 4 views
-1

タスクは、ユーザーからの入力を5つの整数に対して受け取り、#define ディレクティブを使用して、最大値を見つけます。さて、私は定数を定義するためのdefineディレクティブを使用しましたが、さらに小さな関数でも、この背後にあるロジックを理解することはできません。 #defineで機能を定義したり、タスク全体を実行する必要がありますか?定義を使用する最大値

#include <stdio.h> 
#define LARGEST(y) ((y[0]>y[1])?y[0]:y[1]) 
int main() 
{ 
    int i,y; 
    int x[5]; 
    for(i=0;i<5;i++){ 
    printf("Enter the value of X:\n"); 
    scanf("%d", &x[i]);}  
    int a=LARGEST(x); 
    printf("%d", a); 
} 

これはプログラムのコードです。どんな説明や助けもありがとう!

+4

入力が入力されたループで最大の数値を計算してみませんか?すべての番号を格納する配列は必要ありません。 –

+3

要素は配列内になければならないので、このマクロはあまり役に立ちません。最後の3つの要素はすべてコードで無視されます。 –

+0

配列に関する多くの経験がない、私はこのような複数の入力を取ろうとしなければならないと思った。 他の値を考慮するロジックを理解できません。 – Hasan

答えて

0

最大値の検索は、以下のようにオンザフライで行うことができます。マクロやプログラム自体には配列を必要としません。

#include <stdio.h> 
#include <limits.h> 
#define LARGEST(x,y) ((x) > (y) ? (x) : (y)) 
int main() 
{ 
    int a = INT_MIN; 
    int i = 0; 
    for(i=0; i<5; i++) 
    { 
     int x = 0; 
     printf("Enter the value of X:\n"); 
     scanf("%d", &x); 
     a = LARGEST(x, a); 
    }  
    printf("%d", a); 
} 

マクロは、3項演算子を使用して、より大きな引数を評価します。プログラム自体では、現在の入力のローカル変数と現在の最大値のみが使用されます。最大値は最小値に初期化されます。

+1

マクロを使わずにコードを改善したいですか? –

+0

@EdHeal私はそう思います。 OPは明示的にマクロを要求した。 – Codor

+1

コードの一部を私に説明できますか? - limits.hが含まれているのはなぜですか? - 変数a?それは機能か何ですか? – Hasan

0

コメントを続けて入力が行われるたびに最大のものを確認するか、すべての入力を配列に格納してから配列の各値をループすることができます。最初のアプローチはずっと簡単です:

#include <stdio.h> 

#define MAX 5 
#define LARGEST(a,b) ((a) > (b) ? (a) : (b)) 

int main (void) 
{ 
    int largest = 0, n = 0, x; 

    while (n < MAX) { 
     int ret; 
     printf ("enter value %d of %d: ", n + 1, MAX); 
     ret = scanf ("%d", &x); /* validate conversion */ 
     if (ret == 1) {   /* input is valid */ 
      if (n)    /* not the first value */ 
       largest = LARGEST(largest,x); 
      n++; 
     } 
     else if (ret == EOF) { /* always check EOF */ 
      fprintf (stderr, "user canceled input.\n"); 
      return 0; 
     } 
     else {   /* input was not an integer */ 
      fprintf (stderr, "error: invalid input.\n"); 
      int c;  /* flush stdin to avoid loop */ 
      while ((c = getchar()) != '\n' && c != EOF) {} 
     } 
    } 

    printf ("\nlargest: %d\n", largest); 

    return 0; 
} 

ご質問がある場合は、私に連絡してください。

+0

'fprintf'関数を使用したことがないので、elseの部分をスキップできますか?またはちょっとだけ精巧にできれば。私はそれをお願い申し上げます! – Hasan

+0

まあ、いいえ。ユーザーの入力を受けているときに*検証ステップをスキップしたくない。 (技術的にはできますが、悪い習慣です。猫がキーボードを踏んでいる可能性があることはすべて知っているからです)。 'fprintf'はファイルに書き込む以外は' printf'と同じです。上の 'stderr'(' printf'は単に 'stdout'に書きます)(あなたの3つの標準ファイルストリーム:' stdin'、 'stdout'と' stderr')に書き込みます。エラーメッセージを書くときは、プログラムの出力とエラーの分離を可能にするために、それらを 'stderr'に書き出す必要があります。時間をかけてすべてのことができるようにしてください。Cはあらゆる性格を理解しています。 –

+0

上記のコードと入力の検証をしないコードとの違いは、整数以外のものが入力された場合や、ユーザーが手動で 'EOF'(nix'es、 ctrl + z'をウインドウ表示)。両方のバージョンを試してみて、実際に回復して5つの値を入力できるようにしてください。 –

関連する問題