2017-02-28 65 views
-1

該任務是從用戶輸入5個整數並使用#define 指令,查找最大值。現在,我使用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); 
} 

該宏使用三元運算符來評估其參數的大小。在程序本身中,只使用當前輸入的局部變量和當前最大值;最大值被初始化爲可能的最小值。

+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'功能,我可以跳過其他部分嗎?或者如果你可以詳細闡述一下。我會很感激! – Hasan

+0

好吧,不。在進行用戶輸入時,您不想跳過任何驗證步驟。 (技術上你可以 - 但這是不好的做法,因爲你知道一隻貓可能會踩在鍵盤上)。除了寫入文件外,'fprintf'與'printf'相同。上面寫着'stderr'(其中'printf'只是寫入'stdout'(你的3個標準文件流:'stdin','stdout'和'stderr')。當您編寫錯誤消息時,應將其寫入'stderr'以允許程序輸出和錯誤的分離。花點時間讓這一切都沉浸其中。C瞭解每個角色。 –

+0

上面的代碼和沒有輸入驗證的代碼之間的區別,如果輸入的不是整數,或者用戶通過生成一個手動的'EOF'(在nix'es上的'ctrl + d','風箏上的ctrl + z')。試試這兩個版本,然後查看哪些版本可以實際恢復並輸入5個值。 –