2013-11-13 5 views
1

Я новичок в C++, но у меня хорошая ручка. Я пытаюсь взять список имен и оценок и найти самый большой. Все работает, за исключением того, что моя функция запускается каждый раз, когда я проверяю наивысшую оценку.Функция C++ работает, даже если это не так?

//Compares to find highest grade 
    void highestTest(studentType info[]){ 
      int testValue, i; 
      testValue = 0; 
      i = 0; 
      for(i; i < 20; i++){ 
       if(info[testValue].testScore < info[i].testScore){ 
        testValue = i; 
       } 
      } 
      //Should run at the very end of the function 
      if(i == 20) 
        outPut(testValue, info); 
    } 

    void outPut(int highTest, studentType info[]){ 
      cout << "The highest test score goes to " << info[highTest].studentFName << " " << info[highTest].studetnLName << " with a grade of " << info[highTest].testScore << endl; 
      cout << "~~~~~~~~~~~~~~~~~~Students~~~~~~~~~~~~~~~~~~~~~~~" << endl; 
      for(int i = 0; i < 20; i++){ 
        cout << info[i].studetnLName << ", " << info[i].studentFName << info[i].grade << endl; 
      } 
    } 

Остальная часть кода следующим образом, я знаю, что это не самый лучший способ сделать это, но я не позволил включить что-нибудь еще в основной и даны конкретные требования, как к какому типу функций.

#include <iostream> 
#include <fstream> 
#include <string> 

using namespace std; 

struct studentType{ 
    string studentFName; 
    string studetnLName; 
    int testScore; 
    char grade; 
}; 

void fillArray(studentType info[]); 
void labelGrades(studentType info[]); 
void highestTest(studentType info[]); 
void outPut(int highTest, studentType info[]); 
    string first[20] = {"student", "student", "student", "student", "student", "student", "student", "student", "student", "student", "student", "student", "student", "student", "student", "student", "student", "student", "student", "student"}; 
    string last[20] = {"student", "student", "student", "student", "student", "student", "student", "student", "student", "student", "student", "student", "student", "student", "student", "student", "student", "student", "student", "student"}; 
    int grades[20] = {97, 98, 96, 99, 86, 94, 88, 84, 85, 86, 89, 100, 84, 97, 91, 82, 92, 83, 89, 95}; 
    studentType info[20]; 

int main() { 
    fillArray(info); 
    return 0; 
} 

void fillArray(studentType info[]){ 
    for(int i = 0; i < 20; i++){ 
     info[i].studentFName = first[i]; 
     info[i].studetnLName = last[i]; 
     info[i].testScore = grades[i]; 
    } 
    labelGrades(info); 
} 

void labelGrades(studentType info[]){ 
    int i = 0; 
    for(i; i < 20; i++){ 
     if(info[i].testScore >= 90 && info[i].testScore <= 100){ 
      info[i].grade = 'A'; 
      highestTest(info); 
     }else if(info[i].testScore >= 80 && info[i].testScore <= 89) 
      info[i].grade = 'B'; 
     else if(info[i].testScore >= 70 && info[i].testScore <= 79) 
      info[i].grade = 'C'; 
     else if(info[i].testScore >= 60 && info[i].testScore <= 69) 
      info[i].grade = 'D'; 
     else if(info[i].testScore <= 59) 
      info[i].grade = 'F'; 
     else 
      cout << "An error occured please let the developer know" << endl; 
    } 
} 

Я изменил все имена (первый/последний), чтобы ученик не раскрывал одноклассников. Если кто-нибудь знает, почему void outPut запускается каждый раз, когда есть «A» и любые возможные исправления, которые были бы замечательными!

+2

Исправлено форматирование кода только в ожидании экспертной оценки – Chad

+0

Это будет всегда верно после завершения цикла: 'for (i; i <20; i ++) ... if (i == 20)' –

ответ

6

Значение i при выходе из цикла для for(i; i < 20; i++){ будет я == 20. так что тест if (i == 20) всегда будет проходить и outPut() будет называться каждый раз.

+0

Я вижу, глупый ошибка. Благодаря!! –

2

Этот цикл заканчивается, когда я = 20

for(i; i < 20; i++){ 
    if(info[testValue].testScore < info[i].testScore){ 
     testValue = i; 
    } 
} 

и тогда ваша следующая строка является ли утверждение, что тесты для я == 20, поэтому каждый раз при вызове этой функции он будет вызывать выходных.

Смежные вопросы