Сохранение, извлечение и обработка данных

Для работы с данными в классе SchoolClass нам понадобятся три метода:

· Метод AddScore для занесения оценки очередного ученика во внутренний массив объекта.

· Метод GetScore для извлечения оценки из внутреннего (закрытого) массива.

· Метод AverageScore для вычисления среднего балла всех учеников по данному предмету.

Эти три метода воплощают основные идеи работы с данными - сохранение данных, их извлечение и обработку.

Методы AddScore и GetScore() выглядят просто, поэтому с них мы и начнем.

Сохранение данных методом AddScore()

Метод AddScore() должен заносить новую оценку во внутренний массив объекта. В нашем примере он будет выглядеть так:
#include <iostream.h>
class SchoolClass {
int *ClassData;
int ClassDataIndex;
public:
SchoolClass(int NumberStudents);
~SchoolClass(void);
void AddScore(int Score);
};
.
.
.
void SchoolClass::AddScore(int Score)
{
ClassData[ClassDataIndex++] = Score;
}

В методе AddScore() мы сохраняем новую оценку, переданную в качестве параметра, во внутреннем массиве и увеличиваем значение индексной переменной. Обратите внимание на то, как это делается: ClassDataIndex++.

Знаменитый оператор ++ языка C++ увеличивает значение аргумента. При использовании постфиксной записи (как в нашем примере) значение аргумента увеличивается после выполнения текущего оператора. Префиксная запись (++ClassDataIndex) увеличивает значение аргумента ClassDataIndex перед выполнением оператора.

 

В C++ также имеется оператор -, который уменьшает значение аргумента. Он также может использоваться в префиксной или постфиксной записи.

 

Следующим идет метод GetScore(), в котором мы извлекаем из массива оценку с заданным индексом и возвращаем ее.

















Извлечение данных методом GetScore()

Когда мы вызываем метод GetScore() и передаем ему значение индекса, необходимо, чтобы он возвращал оценку, которая хранится с заданным смещением во внутреннем массиве данных. Напишем метод GetScore().

Прежде всего метод GetScore() должен проверять, не превышает ли передаваемый индекс общего количества сохраненных оценок. Если переданный индекс будет признан допустимым, метод возвращает его:
#include <iostream.h>
class SchoolClass {
int *ClassData;
int ClassDataIndex;
public:
SchoolClass(int NumberStudents);
~SchoolClass(void);
void AddScore(int Score);
int GetScore(int Index);
.
.
.
};
int SchoolClass::GetScore(int Index)
{
if(Index <= ClassDataIndex)
{
return ClassData[Index];
}
.
.
.
}

В противном случае затребованная оценка еще не была сохранена во внутреннем массиве, поэтому в условии else оператора if мы возвращаем значение -1 (условие else выполняется, если выражение, проверяемое в операторе if, оказалось ложным).
#include <iostream.h>
class SchoolClass {
int *ClassData;
int ClassDataIndex;
public:
SchoolClass(int NumberStudents);
~SchoolClass(void);
void AddScore(int Score);
int GetScore(int Index);
.
.
.
};
int SchoolClass::GetScore(int Index)
{
if(Index <= ClassDataIndex)
{
return ClassData[Index];
}
else
{
return -1;
}
}

На этом завершается наше изучение методов сохранения и извлечения данных AddScore() и GetScore().

Остается написать метод AverageScore() для работы с сохраненными данными. Он возвращает среднее значение по всем сохраненным ранее оценкам.
















































Вычисление средней оценки методом AverageScore()

В методе AverageScore() мы суммируем все оценки в вещественной (float) переменной Sum, а затем делим полученную величину на общее количество сохраненных оценок. Результат вычисления метод возвращает во внешнюю часть программы.

Для работы с вещественной переменной Sum нам придется временно интерпретировать целые значения оценок как вещественные числа. Для этого служит преобразование типов: (float)ClassData[loop_index]. Такая запись временно интерпретирует целое значение ClassData[loop_index] как вещественное, которое прибавляется к текущему значению накапливаемой суммы. Также обратите внимание на то, что при отсутствии данных для вычисления средней оценки возвращается значение -1:
#include <iostream.h>
class SchoolClass {
int *ClassData;
int ClassDataIndex;
public:
SchoolClass(int NumberStudents);
~SchoolClass(void);
void AddScore(int Score);
int GetScore(int Index);
float AverageScore(void);
};
.
.
.
float SchoolClass::AverageScore(void)
{
float Sum = 0;
if(ClassDataIndex == 0)
{
return -1;
}
for(int loop_index = 0; loop_index < ClassDataIndex; loop_index++)
{
Sum += (float) ClassData[loop_index];
}
.
.
.
}

 

В функции AverageScore() мы воспользовались циклом for C++, который выглядит так:
for(начало; конец; действие)
{
[тело цикла]
}

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

 

Возможно, вы обратили внимание на одну интересную особенность - переменная цикла loop_index объявляется прямо внутри цикла (int loop_index = 0):
for(int loop_index = 0; loop_index < ClassDataIndex; loop_index++)
{
Sum += (float) ClassData[loop_index];
}

В этом заключается одна из приятных особенностей C++: объявление переменной можно отложить до того момента, когда она вам понадобится в программе. Вы не обязаны объявлять все переменные в начале функции, как это делалось в языках типа C. Мы сохранили сумму всех оценок в переменной с именем Sum. Остается разделить ее на общее количество оценок, чтобы определить средний балл и передать его как значение, возвращаемое методом AverageScore: #include <iostream.h>
class SchoolClass {
int *ClassData;
int ClassDataIndex;
public:
SchoolClass(int NumberStudents);
~SchoolClass(void);
void AddScore(int Score);
int GetScore(int Index);
float AverageScore(void);
};
.
.
.
float SchoolClass::AverageScore(void)
  {
float Sum = 0;
if(ClassDataIndex == 0)
{
return -1;
}
for(int loop_index = 0; loop_index < ClassDataIndex; loop_index++)
{
Sum += (float) ClassData[loop_index];
}
return Sum / (float) ClassDataIndex;
}

Класс SchoolClass готов; он содержит методы для сохранения, извлечения и обработки данных. Настало время применить его на практике.

































































Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: