Пример решения задачи (вариант 30)



Лабораторная работа ╧8

Работа с массивами

Цель работы

Целью лабораторной работы является получение практических навыков в работе с массивами в языке C.

Темы для предварительной проработки

  • Операторы цикла языка C. Вложенные циклы.
  • Условный оператор языка C.
  • Массивы.

Задание

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

Для всех вариантов задания следует иметь в виду следующее:

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

Варианты индивидуальных заданий

 

╧ варианта Размерность массива Диапазон значений Что нужно сделать
1 50 -100 - 100 Заменить все элементы с отрицательным значением на значение минимального не равного 0 положительного элемента

 

╧ варианта Размерность массива Диапазон значений Что нужно сделать
2 200 -50 - 50 Подсчитать количество пар соседних элементов с одинаковыми значениями

 

╧ варианта Размерность массива Диапазон значений Что нужно сделать
3 200 0 - 100 Подсчитать количество участков, которые образуют непрерывные последовательности чисел с неуменьшающимися значениями

 

╧ варианта Размерность массива Диапазон значений Что нужно сделать
4 200 -50 - 50 Подсчитать количество пар соседних элементов, которые имеют противоположные знаки

 

╧ варианта Размерность массива Диапазон значений Что нужно сделать
5 100 -100 - 100 Вывести начальные индексы всех непрерывных последовательностей неотрицательных чисел, длина которых больше 5

 

╧ варианта Размерность массива Диапазон значений Что нужно сделать
6 100 -100 - 100 Найти ту непрерывную последовательность положительных чисел, сумма элементов в которой максимальная

 

╧ варианта Размерность массива Диапазон значений Что нужно сделать
7 100 -100 - 100 Разместить все элементы с положительными значениями в левой части массива, элементы с отрицательными значениями - в правой, а нули - между ними

 

╧ варианта Размерность массива Диапазон значений Что нужно сделать
8 100 -100 - 100 Заменить все элементы с отрицательными значениями средним арифметическим значением всех положительных элементов

 

╧ варианта Размерность массива Диапазон значений Что нужно сделать
9 200 0 - 100 Найти непрерывный участок из 10 элементов, сумма которых максимальна

 

╧ варианта Размерность массива Диапазон значений Что нужно сделать
10 200 0 - 100 Найти значение 3-го по величине элемента и значения всех элементов массива, которые его превышают, заменить на найденное значение

 

╧ варианта Размерность массива Диапазон значений Что нужно сделать
11 100 -50 - 50 Найти количество пар соседних элементов, которые имеют одинаковые абсолютные значения, но противоположные знаки

 

╧ варианта Размерность массива Диапазон значений Что нужно сделать
12 200 -100 - 100 Во всех последовательностях положительных чисел заменить значения элементов с максимальным и минимальным значением на среднее для этой последовательности

 

╧ варианта Размерность массива Диапазон значений Что нужно сделать
13 200 0 - 100 Найти непрерывный участок из 10 элементов, который имеет наибольшее среднее значение элементов

 

╧ варианта Размерность массива Диапазон значений Что нужно сделать
14 100 -50 - 50 Во всех последовательностях положительных чисел изменить порядок элементов на противоположный

 


 

╧ варианта Размерность массива Диапазон значений Что нужно сделать
15 200 -100 - 100 Во всех последовательностях положительных чисел ограничить снизу значения тех элементов, значения которых меньше среднего для этой последовательности

 

╧ варианта Размерность массива Диапазон значений Что нужно сделать
16 100 -50 - 50 Заменить все элементы с положительными значениями абсолютным значением отрицательного элемента с максимальным абсолютным значением

 

╧ варианта Размерность массива Диапазон значений Что нужно сделать
17 200 -50 - 50 Вывести начальные индексы всех непрерывных последовательностей чисел с неувеличивающимися значениями

 

╧ варианта Размерность массива Диапазон значений Что нужно сделать
18 100 -50 - 50 Вывести начальные индексы всех непрерывных знакопеременных последовательностей чисел

 

╧ варианта Размерность массива Диапазон значений Что нужно сделать
19 200 -50 - 50 Подсчитать количество всех, непрерывных последовательностей положительных чисел, длина которых больше 7

 

╧ варианта Размерность массива Диапазон значений Что нужно сделать
20 200 -50 - 50 Найти из непрерывных последовательностей отрицательных чисел ту, которая имеет наибольшее абсолютное значение среднего арифметического ее элементов

 

╧ варианта Размерность массива Диапазон значений Что нужно сделать
21 100 -100 - 100 Разместить все элементы с нулевыми значениями в левой части массива, элементы с отрицательными значениями - за ними, а за ними - элементы с положительными значениями

 

╧ варианта Размерность массива Диапазон значений Что нужно сделать
22 100 -100 - 100 Ограничить значения всех элементов, абсолютные значения которых превышают среднее для положительных и отрицательных элементов

 

╧ варианта Размерность массива Диапазон значений Что нужно сделать
23 100 -100 - 100 Заменить каждый элемент на среднее арифметическое его и его соседей слева и справа.

 

╧ варианта Размерность массива Диапазон значений Что нужно сделать
24 200 -50 - 50 Найти непрерывные участки, на которых сумма элементов равна 0

 

╧ варианта Размерность массива Диапазон значений Что нужно сделать
25 200 -50 - 50 Для каждого положительного элемента определить, есть ли в массиве отрицательный элемент с противоположным значением; если да, заменить эти элементы на 0

 

Пример решения задачи (вариант 30)

╧ варианта Размерность массива Диапазон значений Что нужно сделать
30 100 -50 - 50 Во всех последовательностях отрицательных чисел ограничить значения тех элементов, абсолютное значение которых превышает абсолютное среднее для этой последовательности

 

Разработка алгоритма.

Схема алгоритма показана на рисунке ниже.

В первой фазе выполнения программы нам необходимо будет сформировать массив случайных чисел. Перед тем как мы будем обращаться к датчику случайных чисел, необходимо его проинициализировать (блок 2). Далее организуем цикл со счетчиком (блок 3), в каждой итерации которого генерируется следующее случайное число и записывается в следующий элемент массива (блок 4). После окончания цикла заполнения массива выводим массив на экран (блок 5).

Нам необходимо будет вычислять среднее значение последовательности, следовательно - подсчитывать количество элементов в ней. Для этого мы вводим переменную nn - счетчик элементов, нулевое значение этой переменной будет показывать, что у нас нет последовательности для обработки. В начале обработки мы устанавливаем nn=0 (блок 6).

Далее организуем цикл со счетчиком (блок 7), в котором перебираем элементы массива. Для каждого элемента в первую очередь проверяется его знак (блок 8). Если это отрицательный элемент, то это может быть первый или не первый элемент последовательности. Это можно определить, проверяя значение переменной nn: если она 0 - это первый элемент (блок 9). Для первого элемента мы запоминаем в переменной ib индекс начала последовательности, устанавливаем счетчик элементов nn в 1, а в переменную av записываем значение этого элемента (блок 10). Для не первого элемента мы увеличиваем счетчик на 1, а значение элемента суммируем со занчением переменной av (блок 11). Таким образом, переменная av у нас играет роль накопителя суммы элементов последовательности.

Если же очередной элемент последовательности положительный, то возникает вопрос - не является ли этот элемент первым положительным элементом после отрицательной последовательности? Это можно проверить по счетчику nn. Если элемент первый, то значение nn должно быть больше 0 (блок 12). Если нет, то нам необходимо обработать ту отрицательную последовательность, которая только что закончилась. Для обработки мы в первую очередь получаем среднее значение (блок 13). Потом организуем цикл (блок 14) со счетчиком j, который изменяется от ib (индекс начала отрицательной последовательности, который мы сохранили раньше) до i-1 (i - это индекс первого положительного элемента после отрицательной - это индекс первого положительного элемента после отрицательной последовательности, следовательно i-1 - индекс последнего элемента отрицательной последовательности). В каждой итерации этого цикла мы сравниваем j-й элемент массива со средним значением av (блок 15). Если значение элемента меньше среднего (т.е. больше по абсолютному значению), то среднее значение записывается в j-й элемент (блок 16), если же нет - ничего не происходит. По выходу из цикла мы устанавливаем счетчик nn в 0 (блок 17), как признак того, что у нас нет необработанной последовательности. Для не первого положительного элемента нет необходимости что-либо делать.

После выхода из того цикла, который начался в блоке 7, необходимо проверить, не осталась ли у нас необработанная последовательность и, если да, обработать ее. На схеме алгоритма мы показали это одним блоком 18, действия, которые выполняются в этом блоке тождественны действиям, которые детально показаны в блоках 12 - 17.

По окончанию обработки мы выводим массив-результат (блок 19) и заканчиваем программу.


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

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






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