Программа 2. Диаграмма бросания костей



Главная программа запрашивает пользователя ввести количество бросаний костей для моделирования. Наш запуск программы тестирует случай 500 000 бросаний костей. В конце выполнения задачи система ожидает нажатия клавиши или щелчка кнопкой мыши для завершения работы. Классы Line и Rectangle содержатся в файле figures.h, а класс Dice содержится в файле dice.h. Подпрограммы рисования графических примитивов находятся в graphlib.h.

#include <iostream.h>

#include "figures.h"

#include "dice.h"

#include "graphlib.h"

// Бросание двух костей tossCount раз.

// Запись числа выпавших "двоек" в tossTotal[2],

// "троек" – в tossTotal [3] и так далее

void SimulateDieToss( long tossTotal[], long tossCount )

{

long tossEvent;

int i;

Dice D;

// очистить каждый элемент массива tossTotal

for (i=2; i 12; i++)

tossTotal[i] = 0;

// Бросание костей tossCount раз

for (tossEvent = 1; tossEvent tossCount; tossEvent++ )

{

D.Toss();// бросание костей

tossTotal[D.Total()]++; // увеличение счетчика

}

}

// Нахождение максимального значения в массиве их n элементов

long Max(long а[ ] , int n)

{

long Imax = a[0] ;

int i;

for (i=l; i n; i++)

if (a[i] Imax)

Imax = a [ i ];

return Imax;

}

// Рисование двух осей void DrawAxes (void)

{

const float vertspan = 3.0;

Line VerticalAxis (Point(1.0, vertspan+0.25),

Point(1.0, 0.25) );

 VerticalAxis . Draw ( );

Line HorizontalAxis(Point(0.75,vertspan),Point(0.75,vertspan));

 HorizontalAxis . Draw ( );

}

// Рисование графического столбца

void Plot (long tqssTotal [] )

{

const float vertspan =3.0, scaleHeight = 2 .75;

float x, rectHeight, dx;

long maxTotal;

int i;

// Нахождение максимального значения в массиве tossTotal.

// Поиск для индексов в диапазоне 2-12

maxTotal = Max (stossTotal [2] , 11);

// теперь создаем прямоугольники

dx = 6.0/23.0; х= 1.0 +dx;

// Цикл- 11 раз.

// В цикле :

//определяется высота столбца для рисования в текущем положении;

//создается объект Rectangle для соответствующего

//положения, высота и ширина;

//рисуется столбец и происходит переход к следующему столбцу

for (i=2; i 12; I++)

rectHeight = (float (tossTotal [i] ) /maxTotal) *scaleHeight;

Rectangle CurrRect(Point(x,vertspan-rectHeight), Point(x+dx,

vertspan);

CurrRect . Draw ( );

x += 2.0*dx;

void main (void)

{

long numTosses;

long tossTotal [13] ;

// запрос числа моделирования бросаний

cout << "Введите число бросаний: ";

cin >> numTosses;

SimulateDieToss(tossTotal, numTosses); //бросание

InitGraphics();// инициализация графической системы

DrawAxes();// рисование осей

Plot(tossTotal); // построение графика

ViewPause();// ожидание нажатия клавиши или щечка мышью

ShutdownGraphics (); // закрытие графической системы

 

Тестирование и сопровождение программы

Использование объектно-ориентированного программирования способствует созданию систем, позволяющих выполнять независимое тестирование объектов и повторно использовать написанные ранее классы. Эти преимущества уменьшают риск появления ошибок при создании сложных программных систем, поскольку они развиваются, расширяясь из меньших систем, в которых вы уверены. Тестирование выполняется в процессе разработки программной системы.

1.7.1. Объектное тестирование

Тип класса – это самодостаточная структура данных, которая может передавать информацию внешнему компоненту программы и от него. Мы можем тестировать каждый класс, создав короткую программу, вызывающую каждый public-метод. Эта дополнительная программа иллюстрирует тестирование методов в классе Dice.

 

1.7.2. Тестирование управляющего модуля

Программа должна быть до конца протестирована путем ее выполнения с тщательно отобранными данными. Перед началом выполнения этой задачи правильность программы часто может быть оценена с помощью структурного сквозного контроля (structure walk-through), в котором программист показывает полную структуру и реализацию другому программисту и объясняет, что именно происходит, от объектной разработки и до разработки управляющих модулей. Этот процесс часто вскрывает концептуальные ошибки, проясняет логику программы и подсказывает тесты, которые могут быть выполнены.

Современные компиляторы поддерживают отладчик на уровне исходного кода (source-level debugger), который позволяет отслеживать отдельные команды и останавливает работу в выбранных контрольных точках. Во время управляемого выполнения значения переменных могут отображаться на экране, позволяя сравнивать выборочные части программы до и после возникновения ошибки.

Основной проверкой правильности программы является ее выполнение с наборами хорошо подобранных данных. Выполняя тестирование, программист убеждается в правильности программы. Программисту следует также использовать неверные входные данные для проверки кода на устойчивость к ошибкам (robustness), которая определяет способность программы идентифицировать неверные данные и возвращать сообщения об ошибках.

Данные для тестирования отбираются с помощью различных подходов. Одним из методов является так называемый метод "надеюсь и молюсь", когда программист запускает программу несколько раз с простыми данными и, если она работает, то он (или она) продолжает разработку. Более разумным подходом является выбор серии входных данных, которая тестирует различные алгоритмы в программе. Ввод должен включать простые, типовые и экстремальные данные, которые тестируют специальные случаи в программе, и неверные данные, проверяющие способность программы реагировать на ошибки ввода.

Полностью структурированный тест рассматривает логическую структуру программы. Этот подход предполагает, что программа не тестируется до конца, если некоторая часть кода не была уже выполнена. Исчерпывающее тестирование требует от программиста выбора данных для проверки различных алгоритмов в программе: каждого условного оператора, каждой конструкции цикла, каждого вызова функции и так далее. Некоторые компиляторы предоставляют функции протоколирования, которые указывают количество вызовов функций в программе.

1.7.3. Программное сопровождение и документирование

Для удовлетворения дополнительным требованиям компьютерные программы часто нуждаются в обновлении. Объектно-ориентированное программирование упрощает программное сопровождение. Наследование классов делает возможным повторное использование существующих программ. Эти инструменты эффективны при поддержке хорошим программным документированием, описывающим классы и управляющие модули для того, чтобы помогать пользователям понимать программу и ее правильное выполнение. Большие программы обычно поддерживаются руководством пользователя, которое включает информацию по установке программного обеспечения и одну или более обучающие программы для иллюстрации центральных возможностей программного продукта.

Объектные спецификации и структурные диаграммы управляющих модулей являются превосходными инструментами программного документирования. В исходном программном коде комментарии описывают действие отдельных функций и классов. Комментарии также помещаются там, где логика какого-либо алгоритма является особенно трудной.

1.8. Язык программирования C++

Эта книга знакомит читателя со структурами данных, используя язык объектно-ориентиро­ванного программирования C++. Несмотря на существование ряда объектно-ориентированных языков, C++ обладает преимуществом, благодаря своим корням в популярном языке программирования С и качеству компиляторов.

Язык С был разработан в начале 70-х годов как структурный язык для системного программирования. Он содержал средства для вызова системных подпрограмм низкого уровня и реализации конструкций высокого уровня. С годами быстрые и эффективные компиляторы С появились на большинстве компьютерных платформ. Вся операционная система Unix, кроме небольшой части, написана на языке С, и С является основным языком программирования в среде Unix. Язык программирования C++ был разработан в Bell Laboratories Бьерном Страуструпом в качестве развития языка С. Использование языка С означало, что C++ не пришлось разрабатывать с самого начала, в эта связь с С дала новому языку широкую аудиторию квалифицированных программистов. Первоначально C++ назывался "С с классами" и стал доступен для пользователей в начале 80-х годов. Были написаны трансляторы для преобразования исходного кода С с классами в код С перед вызовом компилятора С для создания машинного кода.

Название C++ было придумано Риком Масситти в 1983г. Он использовал оператор приращения ++ языка С, чтобы отразить его эволюцию из языка С и то, что он расширяет язык С. Многие спрашивали, должен ли C++ сохранять совместимость с С, в частности, поскольку C++ разрабатывает новые мощные конструкции и средства, которые не присутствуют в С. На практике этот язык, вероятно, будет продолжать оставаться развитием языка С. Количество существующих программ на языке С и количество функций библиотеки С будет заставлять разработчиков C++ сохранять крепкую связь с языком С. Определение C++ продолжает обеспечивать то, что общие конструкции С и C++ имеют одно и то же значение на обоих языках.

Идеи многих конструкций C++ развивались в 70-е годы из языков Си-67 и Алгол-68. Эти языки ввели в употребление серьезную проверку типов, понятия класса и модульность. Министерство обороны содействовало разработке Ада, который привел в систему многие ключевые идеи конструкции компилятора. Язык Ада стимулировал использование параметризации для возможности появления обобщенных классов. C++ использует похожую шаблонную конструкцию и имеет также общие с языком Ада механизмы обработки особых ситуаций.

Популярность C++ и его миграция на многие платформы привели к необходимости стандартизации. Компания AT&T активно развивает этот язык. Сознательные усилия прилагаются для связи тех, кто пишет компилятор , с разработчиками оригинального языка и с растущей популяцией пользователей. AT&T развивает свой успех с Unix и работает совместно с пользователями для координации разработки стандартов ANSI C++ и опубликованиия окончательного справочного руководства по C++. Ожидается, что стандарт ANSI (Американский национальный институт стандартов) по C++ станет яастью стандарта ISO (Международная организация по стандартам).


Дата добавления: 2018-10-25; просмотров: 175; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!