2015-06-06 4 views
1

я должен написать программу, которая считывает студент идентификаторы и классы из файла, с 3-мя функции:C++ Program Boolean? Ошибка

  • getResults: эта функция считывает из файла и рассчитывает, сколько не удалось (если оценка < 55) вычисляет среднее значение и возвращает количество студентов.

  • display: отображает все на экране

  • isF: проверяет, является ли оценка меньше, чем 55, и возвращает истину, если она есть. (Другими словами, если студент не смог он возвращает истину.)

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

#include <iostream> 
#include <fstream> 
using namespace std; 

int getResults(ifstream &input, int &failed, double &average); 
bool isF(int score); 
void display(int num_students, double average, int num_failed); 

int main() { 
    int numfailed, numOfStudents; 
    double avg; 
    ifstream in_stream("grades.txt"); 

    numOfStudents = getResults(in_stream, numfailed, avg); 
    display(numOfStudents, avg, numfailed); 
    system("PAUSE"); 
    return 0; 
} 

int getResults(ifstream &input, int &failed, double &average) { 
    int studentID, studentGrade, total = 0, numberOfStudents = 0; 

    while (input >> studentID >> studentGrade) { 
     total = total + studentGrade; 
     numberOfStudents = numberOfStudents + 1; 
     failed = isF(studentGrade); 
    } 
    average = total/numberOfStudents; 
    return numberOfStudents; 
} 

bool isF(int score) { 
    if (score < 55) 
     return true; 
    else 
     return false; 
} 

void display(int num_students, double average, int num_failed) { 
    cout << "Number of Students: " << num_students << endl; 
    cout << "Class Average: " << average << endl; 
    cout << "Number of students failed: " << num_failed << endl; 
} 

Мой пример файла выглядит следующим образом:

- 333 95 
- 123 40 
- 111 88 
- 121 70 
- 110 55 
- 909 45 

Пример вывода:

Количество студентов: 6

Класс Средний: 65

Количество студентов не удалось: 2

Выход, который я получаю, точно такой же, за исключением того, что я получил 1 студент.

+2

* Мой вопрос в том, что моя программа работает нормально до проверки того, сколько провалилось. Я почти уверен, что это логическая ошибка, но я не могу понять, где. * Каков ваш вопрос? – Daqs

+3

Вам нужно аккумулировать сбои. –

+0

Вы можете заменить 'if (score <55) return true; else return false; 'with' return (score <55); '. Но вы не считаете неудачи. –

ответ

3

Первая инициализирует ваши numfailed к 0 (спасибо @ Питера), то изменить это:

failed = isF(studentGrade); 

Для этого:

failed += isF(studentGrade); 

Или это:

failed += isF(studentGrade) ? 1 : 0; 
+0

Я пробовал это. Я получаю значения мусора. – msafar95

+2

'numFailed' необходимо инициализировать до нуля в' main() '. Он не инициализирован - и не инициализирован до нуля, если вы явно не делаете этого. – Peter

+0

Получите привычку инициализировать вашу переменную вообще (по крайней мере, для C/C++). –

1

Есть два вещи, которые вам нужно изменить. Первая инициализация завершилась неудачей в вашей функции до нуля, а затем измените ее, чтобы добавить количество сбоев. Вот измененная функция:

int getResults(ifstream &input, int &failed, double &average) 
{ 
    int studentID, studentGrade, total = 0, numberOfStudents = 0; 
    failed = 0; 

    while (input >> studentID >> studentGrade) 
    { 
     total = total + studentGrade; 
     numberOfStudents = numberOfStudents + 1; 
     failed += isF(studentGrade); //this ensures that every time a student fails, it is added 
    } 
    average = total/numberOfStudents; 
    return numberOfStudents; 

}