* Как программировать на C++ Дейтел, стр.221
* В главе разбирается методика разработки алгоритма на псевдокоде путём нисходящего последовательно уточнения.
[xcut]
* Метод нисходящего последовательного уточнения, тезисы:
ul
-
Каждое уточнение, как и сам верхний уровень является полной спецификацией алгоритма, меняется только уровень детализации.
- Другими словами каждый уровень должен давать исчерпывающий ответ на то, что должно получиться в итоге работы алгоритма.
-
Когда алгоритм на псевдокоде специфицирован со степенью детализации, достаточной для того, чтобы вы могли преобразовать его в программу на C++, завершите процесс нисходящего уточнения. /ul
- Псевдокод: [spoiler=показать/спрятать] ul
-
Верхний уровень
- Определить среднюю по группе оценку за контрольную
-
Первое уточнение
- Инициализировать переменные
- Ввести, просуммировать и подсчитать оценки за контрольную
- Вычислить и напечатать общую сумму оценок студентов и среднее по группе
-
Второе уточнение
- [s]Инициализировать переменные[/s]
- Инициализировать нулём сумму
- Инициализировать нулём счётчик
- [s]Ввести, просуммировать и подсчитать оценки за контрольную[/s]
- Предложить пользователю ввести первую оценку
- Ввести первую оценку(возможно контрольное значение)
- Пока пользователь не ввел контрольное значение
Прибавить данную оценку к текущей сумме
Прибавить единицу к счётчику оценок
Предложить пользователю ввести следующую оценку
Ввести следующую оценку (возможно контрольное значение)
- [s]Вычислить и напечатать общую сумму оценок студентов и среднее по группе[/s]
- Если счётчик не равен нулю Установить среднее равное сумме, поделённой на счётчик
Напечатать сумму оценок всех студентов в группе
Напечатать среднее по группе
* Иначе
Напечатать "Оценки не были введены"
-
Итоговый псевдокод
- Инициализировать нулём сумму
- Инициализировать нулём счётчик
* Предложить пользователю ввести первую оценку
* Ввести первую оценку(возможно контрольное значение)
* Пока пользователь не ввел контрольное значение
Прибавить данную оценку к текущей сумме
Прибавить единицу к счётчику оценок
Предложить пользователю ввести следующую оценку
Ввести следующую оценку (возможно контрольное значение)
* Если счётчик не равен нулю
Установить среднее равное сумме, поделённой на счётчик
Напечатать сумму оценок всех студентов в группе
Напечатать среднее по группе
* Иначе
Напечатать "Оценки не были введены"
[/spoiler] * Заметки: *
* *Код:*
[spoiler=показать/спрятать]
* *Интерфейс класса*
// Определение класса GradeBook, усредняющего оценки в группе
#include <string>
using std::string;
class GradeBook
{
public:
GradeBook( string ); // конструктор инициализирует название курса
void setCourseName ( string ); // функция установки названия курса
string getCourseName (); // функция для получения имени курса
void displayMessage(); // вывести привтственное сообщение
void determineClassAverage(); // усредняет введённые значения
private:
string courseName; // название курса для данного GradeBook
}; //конец класса GradeBook
* *Реализация класса*
// Определение элементов-функций класса gradeBook, реализующего программу вычисления среднего с повторением по счётчику.
#include <iostream>
using std::cout;
using std::cin;
using std::endl;
using std::fixed; // гарантирует вывод десятичной точки
#include <iomanip> // параметризированные манипуляторы потока
using std::setprecision; // устанавливает точность вывода чисел
#include "GradeBook.h"
// Конструктор инициализирует courseName переданный строкой
GradeBook::GradeBook(string name)
{
setCourseName(name);
}// Конец конструктора GradeBook
// функция установки названия курса
void GradeBook::setCourseName(string name)
{
if ( name.length() <= 25 ) // если не более 25 символов
{
courseName = name; // сохранить название курса в объекте
}
else
{
courseName = name.substr( 0, 25 ); // сохранить н.к. в об. начать с 0, длина 25
cout << "Имя "" << name << "" за пределами максимальной длины.
"
<< "ограничение courseName - первые 25 символов
" << endl;
}
} // конец функции setCourseName
string GradeBook::getCourseName()
{
return courseName;
} // конец функции getCourseName
void GradeBook::displayMessage()
{
cout << "Добро пожаловть в классный журнал
" << getCourseName() << "!" << endl;
}// конец функции displayMessage
// определить среднее по группе, исходя из 10 введённых оценок
void GradeBook::determineClassAverage()
{
int total; // сумма оценок, введённых пользователем
int gradeCounter; // номер следующей вводимой оценки
int grade;
double average; // средняя оценка
// этап инициализации
total = 0;
gradeCounter = 0;
// этап обработки
// запросить ввод и прочитать введённую пользователем оценку
cout << "Введите оценку от 1 до 100 или -1 для выхода: ";
cin >> grade; // ввести оценку или контрольное значение
while (grade != -1) // повторить 10 раз
{
total = total + grade; // прибавить оценку к total
gradeCounter = gradeCounter + 1; // увеличить счётчик на 1
cout << "Введите оценку от 1 до 100 или -1 для выхода: ";
cin >> grade; // ввести оценку или контрольное значение
} // конец while
// этап завершения
if (gradeCounter != 0) //если введена хотя-бы одна оценка
{
// вычислить среднее по всем введённым оценкам
average = static_cast< double >( total ) / gradeCounter; // явное приведение типа, при этом создаётся копия аргумента (total) и уже эта копия делится на целое тотал
// вывести сумму и среднее значение оценок
cout << "
В сумме: " << total << endl;
cout << "Среднее значение:" << setprecision( 2 ) << fixed << average << endl;
/*
*setprecision - парметризированный
*манипулятор потока, требует #include
*округляет до заданного кол-ва знаков после
*запятой
*<iomanip>, endl - непараметризированный
*манипулятор потока, iomanip не трубует.
*fixed - манипулятор потока, указывает, что значения с плавающей точкой
*должны выводиться в так называемом формате
*с фиксированной точкой, в
*противополоэность научной нотации
*стр.232
*/
}
else // ничего не введено, gradeCounter = 0
{
cout << "Не введено никаких оценок" << endl;
}
} // конец функции determineClassAverage
* *Тестирование класса*
// Тестирование GradeBook
// Создать GradeBook и вызвать его функцию determineClassAverage
#include "GradeBook.h"
int main ()
{
// создать объект myGradeBook класса GradeBook
// передать конструктору название курса
GradeBook myGradeBook ( "CS101 C++ Programming" );
myGradeBook.displayMessage(); // вывести приветствие
myGradeBook.determineClassAverage(); // найти среднее 10 оценок
return 0;
} // конец main
[/spoiler] * Код на codepad: codepad * Файлы исходного кода: ul
- GradeBook.cpp
- GradeBook.h
-
main.cpp /ul
- ОС: ArchLinux
- IDE: Geany