2011-10-28 2 views
0

나는 사용자 입력 (마크)을 취하고 이러한 마크의 평균을 문자 등급으로 출력하는 프로그램을 만들려고합니다. 나는 프로그램을 성공적으로 평균을 계산하는 데 성공했다고 믿지만 올바른 문자 등급을 출력하지 않을 것입니다.do-while 루프 프로그램이 필요하십니까? (C++)

제안 사항? 편집 : 내 출력은 항상 "F"등급으로 비율을 제공하기 때문에 아마도 그것은 계산에 뭔가가 ..., 사물의

// Used iomanip to display averages for possible three digit or greater answers. 
#include <iostream> 
#include <iomanip> 
using namespace std; 

// Set up my program using only main() 
int main() 
{ 
    //Created the variable 'mark' so the user input can be stored and tested in the do-while condition. 
    //Variable 'sum' and 'average' to calculate mark and then be tested against letter grades. 
    //'counter' used to keep track of number of terms being averaged. 
    double mark=0, sum=0, average=0; 
    int counter=-1; 

    // Do-while statement to test the loop. Gets input from user, and tests whether it is a a valid letter grade. 
    // Marks below 0 or above 100 will test true and loop back re-promting the user for another mark. 
    // If tested condition is false, then if statements then test the mark and output the letter grade. 

    cout << "Please enter marks to calculate average, and enter -1 to stop and find letter equivalence. " << endl; 

    do 
    { 
     if (mark < 0 || mark > 100) 
     { 
      cout << "Entered mark is invalid. Please try again, or enter -1 to stop and find letter equivalence. " << endl; 
      break; 
     } 

     sum = sum + mark; 
     counter++; 
     cin >> mark; 

    } 
    while (mark != -1); 

    average = sum/counter ; 

    //What happens when above statement is false... 
    if (mark >= 90) 
     { 
      cout << "The average of "<<setprecision(2)<<average<<"% is equivalent to a letter grade of A+ "; 
     } 
    else if (mark >=80) 
     { 
      cout << "The average of "<<setprecision(2)<<average<<"% is equivalent to a letter grade of A "; 
     } 
    else if (mark >=70) 
     { 
      cout << "The average of "<<setprecision(2)<<average<<"% is equivalent to a letter grade of B "; 
     } 
    else if (mark >=60) 
     { 
      cout << "The average of "<<setprecision(2)<<average<<"% is equivalent to a letter grade of C "; 
     } 
    else if (mark >=50) 
     { 
      cout << "The average of "<<setprecision(2)<<average<<"% is equivalent to a letter grade of D "; 
     } 
    else 
     { 
      cout << "The average of "<<setprecision(2)<<average<<"% is equivalent to a letter grade of F "; 
     } 
return 0; 
} 
+0

무엇이 문제입니까? – jman

답변

1

커플 고려해야 할

  1. 성적을 할당은 average이 아닌 marks을 고려해야합니다. 마크를 사용하면 마지막으로 입력 한 값인 -1이 do while 루프를 빠져 나와 등급을 매기는데 항상 F 등급이됩니다.

  2. 문에 모두 endl을 추가하십시오 (do-while 루프 이후). 출력 스트림이 버퍼링되어 모니터에 cout 문이 표시되지 않을 수 있습니다. endl은 출력 스트림을 비 웁니다.

예를 들어.
cout << "The average of "<<setprecision(2)<<average<<"% is equivalent to a letter grade of A+ " << endl;

+0

제안 사항 중 일부는 do-while 루프 이후에 평균 계산이 이루어질 때 어떻게해야합니까? 나는 이것을 컴파일러에서 시도했는데 결과물이 출력되지 않았다. 감사합니다 –

+0

그것은 내게 숙제 같다. 나는 코드를 제공하지 않을 것이다. 편집기가 디버깅을 지원하면 코드를 단계별로 실행하고 변수를주의 깊게 살펴보십시오. 그렇지 않다면 디버그 문을 추가하여 잘못된 위치를 확인하십시오. – srikanta

+0

저는 디버거를 처음 사용합니다. 그러나 몇 가지 시도를 해보면 그 일을 처리하여 불쌍한 실수를 깨달았습니다. D : 인내심을 가져 주셔서 감사합니다. 정말로 감사드립니다! –

0

if 문을 다시 확인하십시오. 나는 당신이 항상 정확한 평균이 F와 동등하다는 것을보고 싶습니다.

+0

정확한 평균치가 항상 'F'가되지 않도록하려면 어떻게합니까? 평균 계산을하는 동안 while 문을 사용하기 때문에 아래의 if 문과 평균을 비교하는 방법을 잘 모르겠습니다. –

0

루프가 끝날 때 mark은 항상 -1입니다. 그래서 모든 테스트가 실패하면 else 절로 넘어가 F를 출력합니다. mark이 아니라 average을 테스트합니다.

+0

내 평균 계산이 내 루프 밖에 있고 테스트 할 수 없을 때 어떻게 평균을 테스트 할 수 있습니까? –

+0

아니, 평균을 출력하는'if' /'else if' 트리를 의미합니다. –

+0

if/else if 트리는 사용자 입력이 유효한지를 결정합니다. if 문은 사용자가 유효한 mark를 입력했는지 테스트합니다. 대신 평균을 테스트하는 이유가 확실하지 않습니다. –