Пример решения задачи (вариант 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; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!
