Не вводятся данные в программу.

Написал прогу по мотивам 10 урока (Классы в С++). Ошибок вроде нет, но после компиляции программа принимает только один параметр, выводит приглашение к вводу второго, но ввести параметр невозможно — программа перестает реагировать на любые нажатия клавиш.
Вот код заголовочного файла:

class Students {
public:
    //Balls
    void set_ball(int ball_number, int ball) {
        student_balls[ball_number] = ball;
    }
    int get_ball(int ball_number){
        return student_balls[ball_number];
    }
    //Average ball
    void calculate_average_ball() {
        int cab_ball_sum = 0;
        int i = 0;
        while (i < 5) {
            cab_ball_sum += student_balls[i];
        }
        av_ball = cab_ball_sum / 5;;
    }
    float get_average_ball() {
        return av_ball;
    }
    //Initials
    void set_student_first_name(char first_name) {
        f_name = first_name;
    }
    char get_student_first_name() {
        return f_name;
    }
    void set_student_last_name(char last_name) {
        l_name = last_name;
    }
    char get_student_last_name() {
        return l_name;
    }
private:
    char f_name;
    char l_name;
    float av_ball;
    int student_balls[5];
};

Вот основной код:

#include <iostream>
#include "students.h"

int main()
{
    using namespace std;
    Students student;
    char fn;
    char ln;
    cout << "Enter student's first name: ";
    cin >> fn;
    cout << "Enter student's last name: ";
    cin >> ln;
    student.set_student_first_name(fn);
    student.set_student_last_name(ln);
    int ball;
    for (int i = 5; i < 5; i++) {
        cout << "Enter " << i << " student's ball: ";
        cin >> ball;
        student.set_ball(i, ball);
    }
    student.calculate_average_ball();
    cout << "Student's name: " << student.get_student_first_name() << " " << student.get_student_last_name() << endl;
    cout << "Ball's list: ";
    for (int i = 5; i < 5; i++) {
        cout << student.get_ball(i) << " ";
    }

    cout << endl << "Average ball is " << student.get_average_ball() << ". " << endl;
    system("pause");
    return 0;
}

В чем может быть проблема?
P.S. С английским у меня довольно туго)

При беглом взгляде, одна ошибка в том, что ты определил тип переменных для имени и фамилии как char. В заголовочном файле:

private:
    char f_name;    // <-- это ошибка
    char l_name;    // <-- и это ошибка
    float av_ball;
    int student_balls[5];

И в основном коде:

    char fn;    // <-- здесь ошибка
    char ln;    // <-- и здесь ошибка
    cout << "Enter student's first name: ";
    cin >> fn;
    cout << "Enter student's last name: ";
    cin >> ln;

Ты не можешь ввести имя или фамилию в переменную типа char, если ты конечно не будешь вводить только заглавные буквы. Это можно сделать либо в массив типа char, либо как уроке в переменную типа string. Естественно нужно будет существенно исправить твой код.

Здесь счетчик цикла инициализирован неправильно и программа пропускает этот цикл, поэтому ты не можешь ввести оценки

for (int i = 5; i < 5; i++) {            // int i = 0; нужно так
    cout << "Enter " << i << " student's ball: ";
    cin >> ball;
    student.set_ball(i, ball);
}

Здесь программа уходит в бесконечный цикл т.к. переменная i не инкрементируется. Переменной cab_ball_sum лучше определить тип float, т.к. в этом месте av_ball = cab_ball_sum / 5; целочисленное деление даст целочисленный результат, а средняя оценка в большинстве случаев величина вещественная.

//Average ball
void calculate_average_ball() {
    int cab_ball_sum = 0;   // float cab_ball_sum = 0.0;
    int i = 0;    
    while (i < 5) {   // переменная i не инкрементируется (бесконечный цикл)
        cab_ball_sum += student_balls[i];
        // i++; здесь нужно сделать так
    }    
    av_ball = cab_ball_sum / 5;;    // ошибка вторая точка с запятой и этот оператор лучше переписать так av_ball = cab_ball_sum / 5.0;
}

В общем, если на скорую руку переписать твою программу, то можно получить нечто следующее, корректно работающее и сохранившее твою концепцию :)

#include <iostream>
#include <string>

using namespace std;

class Students
{

public:

    // установить параметры студента
    void setParametersOfStudent(string fName, string lName)
    {
        firstName = fName;
        lastName = lName;
        averageGrade = 0;
    }   // end setParametersOfStudent

    // получить полное имя студента
    string getNameOfStudent() const
    {
        return firstName + " " + lastName;
    }   // end getNameOfStudent

    // установить оценки и вычислить сумму всех оценок
    void setGrades(int i, int grade)
    {
        gradesOfStudent[i] = grade;     // инициализируем массив оценками
        averageGrade += grade;          // считаем сумму оценок
    }   // end setGrades

    // отобразить список оценок
    void displayListOfGrades(const int amount) const
    {
        for (int i = 0; i < amount; i++)
            cout << gradesOfStudent[i] << " ";
    }   // end displayListOfGrades

    // получить средний балл
    double getAverageGrade(const int amount) const
    {
       return averageGrade / amount;
    }   // end getAverageGrade

private:

    string firstName;
    string lastName;
    double averageGrade;
    int gradesOfStudent[5];

};  // end class Students

const int AMOUNT_GRADES = 5;    // кол-во оценок

int main()
{
    string fn;  // имя студента

    cout << "Enter student's first name: ";
    cin >> fn;

    string ln;  // фамилия студента

    cout << "Enter student's last name: ";
    cin >> ln;

    Students student;

    student.setParametersOfStudent(fn, ln);

    int grade;

    cout << "Enter " << AMOUNT_GRADES << " student's grades" << endl;

    for (int i = 0; i < AMOUNT_GRADES; i++) {
        cout << i + 1 << " grade: ";
        cin >> grade;
        student.setGrades(i, grade);
    }

    student.getAverageGrade(AMOUNT_GRADES);

    cout << "Student's name: " << student.getNameOfStudent() << endl;
    cout << "Ball's list: ";

    student.displayListOfGrades(AMOUNT_GRADES);

    cout << endl << "Average ball is " << student.getAverageGrade(AMOUNT_GRADES) << ". " << endl;

    system("pause");
    return 0;
}

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

Ответить

Вы можете использовать разметку markdown для оформления комментариев и постов. Используйте функцию предпросмотра для проверки корректности разметки.

Пожалуйста, оформляйте исходный код в соответствии с правилами разметки. Для того, чтобы вставить код в комментарий, скопируйте его в текстовое поле ниже, после чего выделите то, что скопировали и нажмите кнопку «код» в панели инструментов. Иначе ваш код может принять нечитаемый вид.

Либо производите оформление кода вручную, следующим образом:

``` #include <iostream> using namespace std; int main() { // ... } ```

Предпросмотр сообщения

Ваше сообщение пусто.