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