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);