Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа 4.doc
Скачиваний:
16
Добавлен:
14.03.2016
Размер:
69.63 Кб
Скачать

5.1.2. Определение переменных программы

Память для массива целых чисел в нашей работе не выделяется на этапе компиляции, так что нам достаточно объявить в программе только переменную - указатель на начало массива:

int *Ar;

Размерность массива определяется при выполнении программы, так что для ее сохранения нужна отдельная переменная:

int size;

Вместо переменных, которые в работе ╧8 являются индексами элементов массива, мы будем применять указатели:

int *Cr;

это будет указатель на текущий элемент массива при его полном переборе, и:

int *Ir;

в этом указателе будет сохраняться адрес начала отрицательной последовательности, а потом - при обработке последовательности - адрес текущего ее элемента.

Переменные для сохранения суммы элементов и среднего значения и количества элементов в последовательности остаются те же самые:

int av;

int nn;

5.1.3. Разработка текста программы

#include <stdio.h>

#include <time.h>

#include <stdlib.h>

В файле stdio.h описания функций стандартного ввода-вывода, в файле stdlib.h - функции генерации случайных чисел. В описании функции randomize() мы нашли примечание, что она является макросом, который обращается к функции time(), следовательно, перед файлом stdlib.h в программу должен быть включен файл time.h.

Также включаем файл malloc.h, в котором содержатся описания функций динамического выделения/освобождения памяти:

#include <alloc.h>

Начинаем главную функцию и объявляем в ней переменные программы по п.5.2. Кодовая часть программы начинается с инициализации датчика случайных чисел и получения случайного числа для размера массива:

randomize();

size=random(151)+50;

Функция rand возвращает нам число в диапазоне 0 - 150, прибавлением к нему 50 мы переводим его в диапазон 50 - 200. Полученный размер массива сразу выводим на экран:

printf("size=%d\n",size);

Обращаемся к функции выделения памяти:

Ar=(int far *)malloc(size*sizeof(int));

Функция malloc()требует параметр - размер запрошенной памяти в байтах. Переменнаяsize- это количество элементов в массиве; для задания размера памяти в байтах умножаем ее на размер одного элемента. Функцияmalloc()возвращает нетипизированный указатель, мы преобразуем его в указатель наintи записываем в переменнуюAr.

Далее организуем цикл перебора массива:

for (Cr=Ar; Cr<Ar+size; Cr++) {

В начальных установках цикла мы записываем в переменную Cr адрес начала массива, т.е. Cr показывает на элемент с индексом 0. В конце каждой итерации Cr увеличивается на 1, т.е. показывает на следующий элемент массива. Последняя итерация происходит при значении Cr=Ar+size-1, т.е. Cr будет показывать на последний элемент. В каждой итерации мы обращаемся к текущему элементу массива как *Cr, т.е. обращаемся к тому, на что показывает указатель Cr.

Далее идет заголовок цикла перебора массива, который организуется та же, как предыдущий, но в начальных установках мы еще присваиваемо начальное значение счетчику nn.

Там, где нам требуется запомнить начало отрицательной последовательности, мы просто сохраняем текущее значение указателя Cr в переменной-указателе Ir.

Внутренний цикл, в котором обрабатывается отрицательная последовательность:

for (av/=nn; Ir<Cr; Ir++)

if (*Ir<av) *Ir=av;

Начальные установки этого цикла - только усреднение значения в av, переменная Ir уже содержит в себе указатель на первый элемент отрицательной последовательности. В конце каждой итерации Ir увеличивается на 1, т.е. показывает на следующий элемент последовательности (обращение к этому элементу - *Ir). Последняя итерация происходит при значении Ir=Cr-1, поскольку Cr показывает на первый положительный элемент за отрицательной последовательностью.

Остаток программы повторяет предыдущие фрагменты.

Предпоследний оператор - обращение к функции free() для освобождения памяти, которая была выделена функцией malloc(): free(Ar);