2015-12-05 178 views
-1

在此代碼中,用戶必須在主題上輸入他/她的成績(1-10)和他/她的缺席(0-14)。如果他/她得到> = 5等級並且< = 2缺席,則學生通過。C:邏輯運算符

我有一個問題,可能是分數和缺勤數字都超出了程序的限制。這是 「正確的」 邏輯運算符在此:

#include <stdio.h> 
#include <stdlib.h> 
int main() 
{ 
    int gr, ap; 

    printf("GIVE YOUR SUBJECT GRADE:\n"); 
    scanf("%d", &gr); 
    printf("GIVE YOUR SUBJECT ABSENCES\n"); 
    scanf("%d", &ap); 

    if (ap >= 0 && ap <= 14 && gr >= 0 && gr <= 10) 
    { 
     if (gr >= 5 && ap <= 2) 
      printf("YOU PASSED!\n"); 
     else if (gr < 5 && ap <=2) 
      printf("FAILED DUE TO YOUR GRADE\n"); 
     else if (gr >= 5 && ap > 2) 
      printf("FAILED DUE TO YOUR ABSENCES\n"); 
     else if (gr < 5 && ap > 2) 
      printf("FAILED DUE TO YOUR GRADE AND ABSENCES\n"); 
    } 
    else 
    {      
     if (ap >= 0 && ap <= 14 && gr < 0 || gr > 10) 
      printf("FALSE GRADE NUMBER\n");  
     else if (gr >= 0 && gr <= 10 && ap < 0 || ap > 14) 
      printf("FALSE ABSENCES NUMBER\n"); 
//here is the problem 
     else if (gr < 0 || gr > 10 && ap < 0 || ap > 14) 
      printf("FALSE ABSENCES AND GRADE NUMBERS\n"); 
     }  
    system("pause"); 
    return 0; 
} 

回答

1

由於&&超過||優先,你需要括號這裏:

ap >= 0 && ap <= 14 && (gr < 0 || gr > 10) 
//     ^    ^

否則,條件將被解釋爲

(ap >= 0 && ap <= 14 && gr < 0) || (gr > 10) 

這會導致問題發生。

同去的另外兩個條件 - 他們應該是如下:

(gr >= 0 && gr <= 10) && (ap < 0 || ap > 14) 
(gr < 0 || gr > 10) && (ap < 0 || ap > 14) 

注意,當你不斷地評估在相同的條件遍地是更好地使一旦存儲他們的結果的變量,並使用該變量之後:

int validGrade = gr > 0 && gr <= 10; 
int validAbsences = ap >= 0 && ap < 14; 

現在你可以這樣寫代碼:

if (validGrade && validAbsences) { 
    ... 
} else { 
    if (validAbsences && !validGrade) { 
     ... 
    } else if (!validAbsences && validGrade) { 
     ... 
    } else { 
     ... 
    } 
} 
0

您首先檢查gr是否超出範圍,但不是ap,那麼您檢查ap是否超出範圍,但不是gr,如果它們都不是真的,則兩者都必須超出範圍,爲此,您只需要一個else聲明最後。

但是,上述兩個條件都是錯誤的,請將||更改爲&&。事實上,你不會真的檢查apgr,因爲如果你在範圍內,你知道另一個超出範圍。所以,你可以把它簡化這樣的:

// If ap is in range, that means gr must be out of range 
if (ap >= 0 && ap <= 14) 
    printf("FALSE GRADE NUMBER\n"); 
// else if gr is in range then ap must be out of range 
else if (gr >= 0 && gr <= 10) 
    printf("FALSE ABSENCES NUMBER\n"); 
// else both ap and gr are out of range 
else 
    printf("FALSE ABSENCES AND GRADE NUMBERS\n"); 

我也有另一對夫婦的建議,如使用unsigned int代替,則值不能低於零。您也可以使用宏來簡化代碼的可維護性和可讀性。

也許是這樣的:

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

#define AP_IN_RANGE(ap) ((ap) <= 14) 
#define GR_IN_RANGE(gr) ((gr) <= 10) 

int main(void) 
{ 
    unsigned int gr, ap; 

    printf("GIVE YOUR SUBJECT GRADE:\n"); 
    scanf("%u", &gr); 
    printf("GIVE YOUR SUBJECT ABSENCES\n"); 
    scanf("%u", &ap); 

    if (AP_IN_RANGE(ap) && GR_IN_RANGE(gr)) 
    { 
     if (gr >= 5 && ap <= 2) 
      printf("YOU PASSED!\n"); 
     else if (gr < 5 && ap <=2) 
      printf("FAILED DUE TO YOUR GRADE\n"); 
     else if (gr >= 5 && ap > 2) 
      printf("FAILED DUE TO YOUR ABSENCES\n"); 
     else 
      printf("FAILED DUE TO YOUR GRADE AND ABSENCES\n"); 
    } 
    else 
    {      
     if (AP_IN_RANGE(ap)) 
      printf("FALSE GRADE NUMBER\n");  
     else if (GR_IN_RANGE(gr)) 
      printf("FALSE ABSENCES NUMBER\n"); 
     else 
      printf("FALSE ABSENCES AND GRADE NUMBERS\n"); 
    }  
} 

當然,你應該確保用戶輸入如果有效,所以你需要檢查什麼scanf回報。這將防止用戶輸入一些字母而不是有效的無符號數字。