Определенимепеременных программы
Поможем в ✍️ написании учебной работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой

Для реализации алгоритмабудут необходи следующие переменные.

Массив целых чисел, который будет обрабатываться:

іnt Ar[100];

Массив должен располагаться в статической памяти.

Индексы элементов массива для внешнего (блоки 3–17) и внутреннего (блоки 14–16) циклов:

int i,j;

Переменные, в которых будут храниться параметры очередной последовательности: сумма элементов, а потом среднее значение —av, количество элементов в последовательности —nn, индекс начала последовательности —ib.

Отметим, что для большинства данных, которые представляются переменными программы, достаточно было бы и типа short или char, т.к. их значения укладываются в диапазон: –128 — 128.выбираем тип intсогласно с общим стилем программирования на языке C. Отдельного рассмотрения требует переменная av, т.к. в ней накапливается сумма, а значит, ее значение может значительно превысить значения остальных переменных. Но в наихудшем случае (когда все элементы массива будут иметь максимальные значения) ее значение не превысит 100*50=5000, следовательно, типа int достаточно и для нее.

 

 

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

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

#include <stdio.h>
#include <time.h>
#include <stdlib.h>

В файле stdіo.h описания функций стандартного ввода-вывода, в файле std lib .h— функции генерации случайных чисел. В описании функции randomіze() нашли примечание, что она является макросом, который обращается к функции tіme(), следовательно, перед файлом std lib .h в программу должен быть включен файл time .h.

массив должен размещаться в статической памяти. Еслиобъявим массив до открытия тела главной функции, то он будет размещен именно в статической памяти. Поэтому далее у нас идет объявление массива.

int Ar[100];

Далее ставим заголовок главной функции maіnи открываем ее тело:

int main(void){

Главная функция начинается с объявления остальных переменных программы см. п.5.2.

Кодовая часть программы начинается с обращения к функции инициализации датчика случайных чисел (блок 2):

randomize(100);

Далее организуем простой цикл со счетчиком (блок 3), в каждой итерации которого в следующий элемент массива записывается случайное число (блок 4). Обращение к функции rand() возвращаетчисло в пределах 0–100; вычитая из него 50,приводим его к диапазону –50 — +50.

for (i=0; i<100; Ar[i++]=random(101)-50);

Заполненный таким образом массив в цикле выводим на экран (блок 5). Формат вывода каждого элемента — %3d — обеспечивает отображение числа из двух цифр со знаком. Между числами задаеv еще два пробела, таким образом, каждый элемент занимает 5 позиций, а в одной строке экрана разместится целое число (16) элементов, что обеспечит удобное представление массива.

printf(" Начальныймассив :\n");
for (i=0; i<100; printf("%3d ",Ar[i++]));
putchar('\n');
putchar('\n');

Далее идет заголовок цикла перебора массива (блок 7), в котором также присваиваем начальное значение счетчику nn (блок 6):

for (nn=i=0; i<100; i++) {

Все тело цикла состоит из одного условного оператора. В этом операторе проверяем (блок 8) знак i-го элемента массива:

if (Ar[i]<0)

Если это условие — истина, то проверяем, не равен ли 0 счетчик элементов последовательности nn(блок 9):

if (!nn)

При выполнении этого условия выполняется ряд действий (блок 10), которыеберем в операторные скобки:

{ib=i; av=Ar[i]; nn=1;}

Если же условие ложно, то выполняется сложный оператор (блок 11):

else { av+=Ar[i]; nn++; }

Если же элемент положительный, то выполняется часть else первого условного оператора, в которой анализируется nn— нет ли у нас необработанной отрицательной последовательности (блок 12):

else if (nn) {

Если есть необработанная последовательность, выполняем усреднение значенияav (блок 13):

av/=nn;

и организуем цикл с параметром j, который изменяется отіb до і–1 (блок 14):

for (j=ib; j<i; j++)

В каждой итерации этого цикла j-й элемент массива сравнивается с средним значением (блок 15) и, если он больше, заменяется на среднее значение (блок 16). Это реализуется одним условным оператором:

if ( Ar [ j ]< av ) Ar [ j ]= av ;

При выходе из цикла записываем 0 в счетчик nn (блок 17):

nn=0;

На этом заканчивается и внешний цикл.

Несколько операторов, которые следуют после выхода из цикла (блок 18), обеспечивают обработку последней последовательности и в основном являются копией тех операторов, которые реализуют блоки 12–17. Разница состоит в том, что тутвнесли усреднение в начальное действие цикла и убрали присваивание nn=0, т.к. значение nn больше не понадобится.

Операторы вывода массива-результата — копия вывода начального массива.

Полный текст программы приведен ниже.

/***************************************************/
/* Р f бота c ма сс ивами */
/* Пример р е шения 1. */
/***************************************************/
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int Ar[100]; /* массив, который обрабатывается*/
int main(void)
{ int i,j; /* индексы в массиве */
int av; /* среднее значение */
int nn; /* количество эл-тов в последовательности */
int ib; /* индекс начала последовательности */
randomize(); /* ініціалізація rand */
for (i=0; i<100; Ar[i++]=random(101)-50 ); /* заполнение
массиваслучайными числами */
printf("Начальный массив:\n");/*вывод начального массива*/
for (i=0; i<100; printf("%3d ",Ar[i++]));
putchar('\n');
putchar('\n');
for (nn=i=0; i<100; i++) /* перебор массива */
{ if (Ar[i]<0)
if (!nn) { /*обработка отрицательногоэлемента*/
/*начало последовательности */
/* запомнитьиндекс начала, начальное
значение накопителя суммыи
счетчикаэлементов */
ib=i; av=Ar[i]; nn=1;
}
else { av+=Ar[i]; nn++;
/* накопление суммы, подсчет количества*/
}
/* конец обработки отрицат. элемента */
else /* обработка положительного элемента */
if (nn)
{/*еслиесть неообработаннаяотрицат.
последовательность */
av/=nn; /* усреднение */
/* перебор всей последовательности с
ограничением*/
for (j=ib; j<i; j++)
if (Ar[j]>av) Ar[j]=av;
nn=0; /* последовательность обработана*/
} /* конец еслиесть необработанная */
} /* конец переборамассива */
if (nn)/*если не обработана последняя отрицательная
последовательность */
for (av/=nn, j=ib; j<i; j++)
if (Ar[j]>av) Ar[j]=av;
printf("Массив-результат:\n"); /* вывод результатов */
for (i=0; i<100; printf("%3d ",Ar[i++]));
putchar('\n');
return 0;
}



























































Отладка программы

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

Если же обнаруживаются ошибки в результатах, то можно использовать пошаговый метод отладки, при этом следует проверять работу алгоритма отдельно по ветвям: 7–8–9–10; 7–8–9–11; 7–8–12–13–14–15–16–17. При пошаговой отладке следует отслеживать в первую очередь значения тех переменных, которые отвечают за преобразование— іb, nn, av.

Отдельно следует проверять работу программы для случаев, когда массив начинается отрицательной последовательностью и когда массив заканчивается отрицательной последовательностью.

ПРИМЕР 2

Описание решения задачи приводится со ссылками на решение примера 1. Описываются только решения, отличные от тех, что принимались в примере 1.

Дата: 2018-12-21, просмотров: 257.