Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Подбельский Фомин_Программирование на языке СИ_...doc
Скачиваний:
234
Добавлен:
10.08.2019
Размер:
53.81 Mб
Скачать

Программная реализация.

Программная реализация. Рассмотрим основные принципы построения программы для решения поставленной задачи.

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

Рис. 8.2. Состав программы для оценки последовательности псевдослучайных чисел

Алгоритм получения псевдослучайных нормально распределенных чисел оформим в виде функции pseudorand( ) без параметров, возвращающей целочисленные значения в диапазоне от 0 до 16383. Так как при получении очередного (i-го) псевдослучайного значения Si необходимо использовать предыдущие значения последовательностей xj-1, yi-1, zi-1, Si-1, то в теле функции предусмотрим их сохранение в статических (static) переменных. Предлагаемый вариант функции :

Разработаем функцию count( ) для формирования массива гистограммы с одновременным вычислением сумм

Исходные данные для функции count( ):

Nколичество формируемых псевдослучайных чисел;

К - число интервалов гистограммы;

smin - минимально допустимое значение анализируемых псевдослучайных чисел;

smax - максимально допустимое значение анализируемых псевдослучайных чисел.

Результаты, формируемые функцией count( ):

gisto[K] - массив значений nj количества псевдослучайных чисел Si, сгруппированных в К интервалов гистограммы;

sum - сумма всех N анализируемых псевдослучайных чисел Si, i =

sum2 - сумма квадратов всех N анализируемых псевдослучайных чисел.

Как исходные данные функции count( ), так и результаты ее выполнения нужны в следующей функции estimate( ), назначение которой - собственно вычисление оценок средних и дисперсий анализируемой совокупности из N псевдослучайных чисел. Исходя из этого определим переменные N, К, smin, smax, sum, sum2 как внешние объекты, а участок памяти для гистограммы будем формировать динамически по известному значению К перед обращением к функции count (). Для связи с этим участком памяти определим внешний указатель int * gisto.

Текст функции :

На основе данных гистограммы следующая функция estimate( ) будет вычислять оценку математического ожидания mg и две оценки дисперсии vg и dg (последняя с учетом поправки Шеппарда).

Исходные данные для функции estimate( ):

К - число интервалов гистограммы;

gisto[K] массив значений в интервалах гистограммы (доступен в функции с помощью внешнего указателя gisto);

smin, smax - пределы гистограммы (по абсциссе);

N - количество анализируемых псевдослучайных чисел, помещенных в гистограмму.

Результаты, формируемые функцией estimate( ):

mg - оценка математического ожидания по данным из гистограммы (double *);

vg - оценка дисперсии по гистограмме (double *);

dg - уточненная оценка дисперсии по гистограмме (double *).

Исходные данные передаются в функцию estimate( ) через внешние переменные. Для передачи результатов из функции estimate( ) будем использовать аппарат параметров. Как неоднократно подчеркивалось, это потребует работы с указателями и адресами, так как параметры в функциях на языке Си передаются только по значениям.

Обратите внимание на операцию разыменования, применяемую к параметрам-указателям mg, vg, dg. При обращении к функции estimate( ) вместо формальных параметров должны подставляться адреса тех объектов (переменных), в которые функция поместит результаты вычислений.

Введем функцию, реализующую вычисления по аналитическому выражению для кривой нормального (Гауссова) распределения :

При известных значениях математического ожидания (m) и дисперсии (v) по заданному значению аргумента (х) функция вычисляет точку кривой нормального распределения.

Функция gauss( ) используется в следующей функции compare( ), где выполняется сравнение сформированной гистограммы с теоретической гауссовой кривой. Функция compare( ) печатает (выводит на экран) таблицу со значениями из гистограммы и теоретической кривой. Теоретическая кривая строится для полученных оценок математического ожидания и дисперсии анализируемой последовательности из n псевдослучайных чисел.

Кроме печати таблицы, в цикле вычисляется среднее квадратическое отклонение данных гистограммы от теоретических значений гауссовой кривой:

где ni - значение ординаты гистограммы;

уi- теоретическое значение, полученное для х=Сi (i=1, К).

Теперь все готово к разработке функции main( ), которая, вызывая по мере необходимости определенные выше функции, решает основную задачу - печатает таблицу гистограммы и вычисляет оценки математических ожиданий и дисперсий анализируемой последовательности из п псевдослучайных чисел.

Исходные данные для программы :

N- количество анализируемых псевдослучайных чисел;

К- число интервалов гистограммы.

Для обмена с функциями нужно до заголовка main() определить объекты внешней памяти.

Текст основной функции программы :

В программе введена защита от неверно вводимых значений N и К, а также проверяется успешность выделения динамической памяти для массива гистограммы.

Результаты выполнения программы :

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