Archive: Студенческий бложик

4.9 Формулирование алгоритмов: повторение, управляемое контрольным значением

2015-10-03

* Как программировать на 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