Ошибка, отображаемая при печати переменной

#c #user-experience

#c #пользовательский интерфейс

Вопрос:

Хотел бы я знать, была ли ошибка в этом, но я этого не делаю. Вот класс:

 class Student
{
public:
float grade[10];
float averageGrade;

float average();
Student() : averageGrade(0.0f) {}

};
  

Вот функция:

 float Student::average()
{ 

    cout << "How many grades would you like to enter? (Up to ten)n";
    float x;
    cin >> x;

cout << "What is your first grade?";
cin >> grade[0];
for (int i = 1; i < x; i  )
{
cout << "What is the next number?n";
cin >> grade[i];
}
averageGrade = accumulate(grade, grade 10, 0.0);
averageGrade = averageGrade / x;

return averageGrade;
    }
  

И здесь главное:

     int main()
{
Student s;

s.average();

cout << s.averageGrade;
system ("PAUSE");
return 0;
}
  

Поэтому всякий раз, когда он выводит s.averageGrade, я просто получаю то, что выглядит как адрес памяти или что-то в этом роде. При компиляции ошибок нет.

Вот результат:

 1>------ Build started: Project: Weapons, Configuration: Debug Win32 ------
1>Compiling...
1>weapon.cpp
1>c:usershastudentdocumentsvisual studio 2008projectsweaponsweaponsweapon.cpp(31) : warning C4244: '=' : conversion from 'double' to 'float', possible loss of data
1>Linking...
1>Embedding manifest...
1>Build log was saved at "file://c:UsersHAStudentDocumentsVisual Studio 2008ProjectsWeaponsWeaponsDebugBuildLog.htm"
1>Weapons - 0 error(s), 1 warning(s)
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========
  

Комментарии:

1. что делает accumulate() ? Можете ли вы опубликовать исходный код?

2. За исключением этого system("PAUSE") — понятия не имею, что там происходит! — для меня это выглядит нормально, должно работать нормально.

3. @Kevin — accumulate() <numeric> включен, это часть стандартной библиотеки.

Ответ №1:

Одна из проблем заключается в том, что вы переходите grade 10 к накоплению, даже если пользователь не вводит десять записей. Это может привести к накоплению для чтения нежелательных данных, что может иметь непредсказуемые последствия.

Вы можете исправить это, изменив значение x с float на int и изменив вызов accumulate на averageGrade = accumulate(grade, grade x, 0.0);

Комментарии:

1. И она отображается в научной нотации, «указатель». Хороший улов, Кевин.

Ответ №2:

Вы распечатываете averageGrade элемент, который вы никогда не назначали, поэтому он имеет случайное значение. Вместо этого вы хотите распечатать выходные данные функции: std::cout << s.average()

Комментарии:

1. Он назначает участника, а затем возвращает то же самое.

Ответ №3:

Вы добавляете 10 числа, даже если пользователь указал меньше 10 .

 averageGrade = accumulate(grade, grade 10, 0.0);
  

Эта строка должна быть

 averageGrade = accumulate(grade, grade x, 0.0);
  

Значения grade [10] не инициализируются автоматически 0.0 .

Комментарии:

1. боже! Я видел это раньше, но предположил, что он инициализировал массив по умолчанию.

2. @MooingDuck Все в порядке, в любом случае спасибо за вашу помощь. Что вы подразумеваете под инициализацией по умолчанию?

3. Student() : averageGrade(0.0f), grade() {} которая инициализирует элементы значением grade по умолчанию, равным нулю.

4. или float grade[10] = {}; если grade бы была локальная переменная вместо члена.

5. @MooingDuck — Используется grade() ли для инициализации массива элементов в стандарте?