- •Часть 1
- •Лабораторная работа №1 Следование
- •Варианты индивидуальных заданий Выполнить поразрядные логические операции над машинными кодами
- •Пример программы
- •Лабораторная работа №2 Операторы ветвления
- •3. Построить схему алгоритма решения задачи.
- •Варианты индивидуальных заданий
- •Пример разработки математической модели и схемы алгоритма решения задачи для варианта задания вида:
- •Текст программы
- •Лабораторная работа №3 Операторы цикла: заданное число повторений
- •Варианты индивидуальных заданий
- •Лабораторная работа №4 Статические одномерные массивы
- •Варианты индивидуальных заданий
- •Федеральное государственное автономное образовательное учреждение высшего образования
Лабораторная работа №4 Статические одномерные массивы
Цель лабораторной работы: изучение структурной организации массивов и способов доступа к их элементам; совершенствование навыков процедурного программирования на языке C/C++ при решении задач обработки статических одномерных массивов.
Задание на программирование: используя технологию процедурного программирования, разработать программу обработки одномерных статических массивов в соответствии с индивидуальным заданием.
Порядок выполнения работы:
1. Получить у преподавателя индивидуальное задание и выполнить постановку задачи: сформулировать условие, определить входные и выходные данные, их ограничения.
2. Разработать математическую модель: описать с помощью формул и рисунков структуру массивов и процесс их преобразования.
3. Построить схемы алгоритмов основных функций и задачи в целом.
4. Составить программу на языке C/C++.
5. Входные данные на этапах тестирования и демонстрации работы преподавателю должны задаваться либо с использованием специально подобранных арифметических формул, либо вводиться с клавиатуры по запросу. Датчики псевдослучайных чисел использовать запрещается.
Если это явно не оговорено в конкретном варианте задания, значения элементов в каждом исходном массиве должны быть разными.
Выходные данные должны выводиться на экран с пояснениями.
6. Проверить и продемонстрировать преподавателю работу программы на полном наборе тестов, в том числе с ошибочными входными данными. Входные и выходные массивы должны выводиться в одном и том же формате.
7. Использовать стандартные потоковые объекты ввода/вывода cin и cout.
8. Оформить отчет о лабораторной работе в составе: постановка задачи, математическая модель, схема алгоритма решения, текст программы, контрольные примеры (скриншоты).
9. Вариант задания определяется как две последних цифры номера зачетной книжки (цц), взятых по модулю 50, плюс 1 (цц mod 50 + 1). Например, 00 – 1-й вариант, 01 – 2-ой вариант, 49 – 50-ый вариант, 60 – 11-ый вариант, и т.д.
Варианты индивидуальных заданий
1.
Дан массив a0, a1,…, a2m-1. Определить количество и произведение абсолютных значений элементов массива с нечётными номерами, лежащих между элементом с наименьшим среди неотрицательных элементов значением и первым элементом с отрицательным значением, имеющим номер больше, чем m-1.
2.
Дан массив b0, b1,…, bn-1. Определить сумму значений элементов массива с чётными номерами, лежащих между первым элементом массива с отрицательным значением и последним элементом с положительным значением.
3.
Дан массив c0, c1,…, c2n-1. Определить абсолютную величину суммы значений элементов массива, лежащих между элементом с наименьшим среди неотрицательных элементов значением и первым элементом с отрицательным значением, имеющим номер больше, чем n-1.
4.
Дан массив d0, d1,…, d2n-1. Определить сумму значений элементов массива с чётными номерами, лежащих между элементом с наименьшим по абсолютной величине значением и первым элементом массива с положительным значением, имеющим номер больше, чем n-1.
5.
Дан массив x0, x1, x2,…, xm-1. Определить произведение суммы положительных значений элементов массива, лежащих между элементом с наибольшим среди неположительных элементов значением и последним элементом массива с отрицательным значением, на их количество.
6.
Дан массив y0, y1,…, yn-1. Определить произведение суммы отрицательных значений элементов массива, предшествующих последнему элементу с положительным значением, на общее количество элементов массива с отрицательными значениями.
7.
Дан массив z0, z1,…, zn-1. Определить произведение суммы абсолютных значений элементов массива с чётными номерами, предшествующих последнему элементу массива с отрицательным значением, на общее количество элементов массива с отрицательными значениями.
8.
Дан массив a0, a1,…, a2m-1. Написать программу преобразования массива в массив с элементами, соответственно равными значениям элементов исходного массива a2m-1, a2m-2, a2m-3,…, am, a0, a1, a2,…, am-1. Дополнительные массивы не использовать.
9.
Дан массив b0, b1,…, b3n-1. Построить новый массив с элементами, значения которых соответственно равны b0, b3,…, b3n-3, b1, b4,…, b3n-2, b2, b5,..., b3n-1.
10.
Дан массив c0, c1,…, c2n-1. Определить сумму абсолютных значений элементов массива, лежащих между элементом с наименьшим среди неотрицательных элементов значением и элементом с номером n-1.
11.
Дан массив d0, d1,…, d2n-1. Определить произведение положительных значений элементов массива, лежащих между элементом с наибольшим среди неположительных элементов значением и элементом с номером n-1.
12.
Дан массив x0, x1, x2,…, x2m-1. Определить количество и сумму отрицательных значений элементов массива, лежащих между элементом с наименьшим среди неотрицательных элементов значением и элементом с номером m-1.
13.
Дан массив y0, y1,…, y2n-1. Определить количество и произведение положительных значений элементов массива, лежащих между элементом с наименьшим по абсолютной величине значением и элементом с номером n-1.
14.
Дан массив z0, z1,…, z2n-1. Определить сумму значений элементов массива с чётными номерами, лежащих между элементом с наибольшим среди неположительных элементов значением и элементом с номером n-1.
15.
Дан массив a0, a1,…, a2m-1. Определить произведение значений элементов массива с чётными номерами, лежащих между элементом с наименьшим по абсолютной величине значением и первым элементом с отрицательным значением, имеющим номер больше, чем m-1.
16.
Дан массив b0, b1,…, b2n-1. Определить сумму значений элементов массива с нечётными номерами, лежащих между элементом с наибольшим среди неположительных элементов значением и последним элементом с положительным значением, имеющим номер меньше, чем n.
17.
Дан массив c0, c1,…, c2n-1. Определить произведение значений элементов массива с чётными номерами, лежащих между элементом с наименьшим по абсолютной величине значением и последним элементом с отрицательным значением, имеющим номер больше, чем n-1.
18.
Дан массив d0, d1,…, d2n-1. Определить произведение отрицательных значений элементов массива, лежащих между элементом с наименьшим по абсолютной величине значением и элементом с номером n-1.
19.
Дан массив x0, x1, x2,…, xm-1. Определить количество и сумму положительных значений элементов массива с нечётными номерами, лежащих между элементами с наименьшим значением и с наибольшим значением.
20.
Дан массив y0, y1,…, yn-1. Найти число элементов этого массива, значения которых принадлежат отрезку [c, d] и предшествуют последнему по порядку элементу массива с отрицательным значением.
21.
Дан массив z0, z1,…, z2n-1. Построить новый массив с элементами, значения которых соответственно равны z2n-1, z0, z2n-2, z1,…, zn, zn-1.
22.
Дан массив a0, a1,…, am-1. Значения всех элементов массива, предшествующих элементу с наибольшим среди неположительных элементов значением, заменить их квадратами.
23.
Дан массив b0, b1,…, b2n-1. Построить новый массив с элементами, значения которых соответственно равны b0, bn, b1, bn+1,… , bn-1, b2n-1.
24.
Дан массив c0, c1,…, cn-1. Если значения элементов этого массива не образуют неубывающую арифметическую последовательность, то значения всех его отрицательных элементов заменить их квадратами.
25.
Даны упорядоченные по возрастанию значений их элементов массивы a0, a1,…, am-1 и b0, b1,…, bn-1. Построить из них новый массив c0, c1,…, cn+m-1, также упорядоченный по возрастанию значений его элементов.
26.
Дан массив d0, d1,…, dn-1. Определить произведение значений элементов этого массива с чётными номерами и сумму значений элементов с нечётными номерами.
27.
Дан массив x0, x1, x2,…, xm-1. Определить произведение абсолютных значений элементов массива с чётными номерами и сумму значений элементов с нечётными номерами, номера которых больше номера элемента с наибольшим значением.
28.
Дан массив y0, y1,…, yn-1. Определить произведение суммы отрицательных значений элементов массива, лежащих между элементами с наибольшим и наименьшим значениями, на их количество.
29.
Дан массив z0, z1,…, zn-1. Определить количество и произведение значений элементов массива, лежащих между элементами с наибольшим неположительным значением и с наименьшим по абсолютной величине значением.
30.
Дан массив a0, a1,…, am-1. Определить количество и произведение положительных значений элементов массива, лежащих между элементами с наименьшим по абсолютной величине значением и с наименьшим неотрицательным значением.
31.
Дан массив b0, b1,…, bn-1. Определить сумму, произведение и количество компонент этого массива, принадлежащих отрезку [x, y].
32.
Преобразовать исходный массив c0, c1,…, c2n-1 так, чтобы его элементы расположились в следующем порядке: c0, c2n-1, c1, c2n-2,…, cn-1, cn. Дополнительных массивов не использовать.
33.
Дан массив d0, d1,…, dn-1. Если в этом массиве есть хотя бы один элемент, значение которого меньше числа Р, то значения всех отрицательных элементов этого массива, предшествующих этому элементу, заменить их квадратами, в противном случае значения всех элементов массива умножить на число B.
34.
Из массива x0, x1, x2,…, x3m-1. получить массив y0, y1,…, ym-1, очередная компонента которого равна среднему арифметическому тройки очередных компонент массива x.
35.
Дан массив z0, z1,…, zn-1. Если значения элементов этого массива не образуют убывающую арифметическую последовательность, то заменить отрицательные значения его элементов единицами, а положительные значения удвоить.
36.
Дан целочисленный массив a0, a1,…, am-1, среди элементов которого могут быть элементы с равными значениями. Построить новый массив, включив в него из каждой группы равных между собой элементов только один, выбросив все остальные и сохранив исходный порядок их следования.
37.
Дан массив b0, b1,…, bn-1. Построить новый массив, значения элементов которого равны b0, b0+b1, b0+b1+b2, , b0+b1+b2+…+bn-1.
38.
Дан массив c0, c1,…, cn-1. Если количество элементов этого массива с положительным значением больше количества элементов с отрицательным значением, обнулить значения всех отрицательных элементов. В противном случае обнулить значения всех положительных элементов.
39.
Дан массив d0, d1,…, dn-1. Из всех непрерывных участков этого массива, состоящих из элементов с нулевым значением, выбрать наибольший по длине. Вывести индексы его начала и конца.
40.
Дан массив x0, x1, x2,…, xm-1. Если сумма положительных значений элементов этого массива больше абсолютной величины суммы отрицательных значений элементов массива, у всех элементов с отрицательным значением инвертировать знак. В противном случае инвертировать знак у всех элементов с положительным значением.
41.
Дан массив y0, y1,…, y2n-1. Если сумма положительных значений элементов с индексами от 0 до n-1 больше абсолютной величины суммы отрицательных значений элементов с индексами от n до 2n-1, все отрицательные значения элементов массива заменить их квадратами. В противном случае удвоить все положительные значения элементов массива с индексами от 0 до n-1.
42.
Дан целочисленный массив z0, z1,…, zn-1. Из абсолютных величин его элементов выбрать наибольшую. Далее построить новый массив, i-й элемент которого равен нулю, если |zi| не совпадает с выбранным значением, и равен 1 в противном случае.
43.
Дан упорядоченный по возрастанию значений массив a0, a1,…, am-1 и величина x. Известно, что a0<x<am-1.
Определить целое число k, удовлетворяющее условию ak-1≤x≤ak.
44.
Дан массив b0, b1,…, b2n-1. Построить новый массив с элементами, значения которых соответственно равны bn-1, bn-2, …, b0, b2n-1, b2n-2, …, bn. Исходный массив оставить без изменения.
45.
Дан массив c0, c1,…, c4n-1. Построить новый массив с элементами, значения которых соответственно равны c4n-2, c4n-1, c0, c1, c4n-4, c4n-3, c2, c3, …, c2n, c2n+1, c2n-2, c2n-1. Исходный массив оставить без изменения.
46.
Дан массив d0, d1,…, d4n-1. Преобразовать исходный массив так, чтобы его элементы расположились в следующем порядке: d4n-2, d4n-1, d0, d1, d4n-4, d4n-3, d2, d3, …, d2n, d2n+1, d2n-2, d2n-1. Дополнительных массивов не использовать.
47.
Дан массив x0, x1, x2,…, xm-1. Преобразовать исходный массив так, чтобы его элементы расположились в следующем порядке: xn-1, xn-2, …, x0, x2n-1, x2n-2, …, xn. Дополнительных массивов не использовать.
48.
Дан массив y0, y1,…, y2n-1. Построить новый массив с элементами, значения которых соответственно равны y0, y2n-1, y1, y2n-2,…, yn-1, yn. Исходный массив оставить без изменения.
49.
Дан массив z0, z1,…, z2n-1. Построить новый массив с элементами, значения которых соответственно равны zn, zn+1, ,…, z2n-1, zn-1, zn-2,…, z0. Исходный массив оставить без изменения.
50.
Дан массив a0, a1,…, am-1. Найти сумму положительных и число отрицательных элементов этого массива, значения которых кратны 3.
Пример 1 решения задачи для варианта задания вида:
Дан массив a0, a1,…, a2m-1. Значения элементов массива, лежащих между элементом с наименьшим среди неотрицательных элементов значением и первым элементом с отрицательным значением, имеющим номер больше, чем m-1, удвоить. У всех остальных элементов массива инвертировать знак.
Математическая модель решения
Решение задачи начинается с ввода исходных данных. Из формулировки задачи понятно, что исходный массив имеет чётное число (2m) элементов. Следовательно, прежде всего, необходимо ввести значение (m) половины размера массива.
После этого необходимо задать значения всех элементов массива. Доступ к элементам массива осуществляется по их индексу (номеру данного элемента массива). Поэтому перебираем все индексы элементов массива от 0 до 2m-1 (нумерация элементов массива начинается с 0) и задаём значения элементов с текущими номерами.
Пусть исходный массив имеет вид (m=5):
0 |
1 |
|
|
m-1 |
m |
|
|
2m-2 |
2m-1 |
1 |
2 |
0 |
-3 |
4 |
5 |
6 |
-7 |
-8 |
9 |
Теперь можно приступать к решению задачи. Вначале определяем индекс элемента массива, имеющего минимальное неотрицательное значение. Для этого находим первый элемент массива с неотрицательным значением. Если такой элемент в массиве есть, фиксируем факт его обнаружения в переменной flag и индекс этого элемента imin. Величину этого элемента массива принимаем за исходное минимальное неотрицательное значение элемента.
Далее, перебирая индексы остальных элементов массива с imin+1 до 2m-1, для неотрицательных элементов сравниваем их значения со значением элемента с индексом imin. Если значение элемента массива с текущим индексом меньше значения элемента массива с индексом imin, запоминаем индекс этого элемента, меняя значение imin. В результате индекс элемента массива, имеющего минимальное неотрицательное значение, зафиксирован в переменной imin.
Если ни один элемент массива с неотрицательным значением не найден, выполнение решения всей задачи прекращается.
Далее определяем индекс первого элемента массива, имеющего отрицательное значение для элементов с индексами >m-1. Для этого перебираем индексы элементов массива с m до 2m-1. Если такой элемент в массиве есть, фиксируем факт его обнаружения в переменной flag и индекс этого элемента iotr.
Если ни один элемент массива с индексом >m-1 и отрицательным значением не найден, выполнение решения всей задачи прекращается.
Если в обоих случаях элементы массива найдены, то результат в нашем случае выглядит следующим образом:
0 |
1 |
|
|
m-1 |
m |
|
|
2m-2 |
2m-1 |
1 |
2 |
0 |
-3 |
4 |
5 |
6 |
-7 |
-8 |
9 |
|
|
imin |
|
|
|
|
iotr |
|
|
При этом возможны два случая: imin>iotr и imin<iotr. Поскольку по условию задачи необходимо удвоить значения элементов массива, лежащих между элементами с индексами iotr и imin, необходимо сравнить iotr и imin.
Если imin<iotr, то индекс начального элемента интервала удвоения значений i_beg=imin+1, а индекс конечного элемента этого интервала i_end=iotr-1. В противном случае i_beg=iotr+1, а i_end=imin-1.
Теперь инвертируем значения элементов массива с индексами от 0 до ibeg-1 и от i_end+1 до 2m-1, а значения элементов с индексами от i_beg до i_end удваиваем.
В результате для рассматриваемого примера преобразованный массив имеет вид:
-1 |
-2 |
0 |
-6 |
8 |
10 |
12 |
7 |
8 |
-9 |
|
|
|
ibeg |
|
|
iend |
|
|
|
Задача решена.
Схема алгоритма поиска индекса элемента массива, имеющего минимальное неотрицательное значение (функция nomer_min)
nomer_min(a, n)
flag=0
i=0; i<n; i++
a[i]>=0
нет
imin=i
да
flag=1
break
flag==1
нет
i=imin+1; i<n; i++
да
a[i]>=0&&a[i]<a[imin]
exit(3)
нет
да
imin=i
return(imin)
Схема алгоритма поиска индекса первого отрицательного элемента массива с номером >m-1 (функция nomer_otr)
nomer_otr(a, m)
flag=0
i=m; i<2m; i++
a[i]<0
нет
iotr=i
да
flag=1
break
flag==0
нет
да
exit(3)
return(iotr)
Схема алгоритма преобразования массива (функция obrabotka_mas)
obrabotka_mas(a, n, i_min, i_otr)
i_min<i_otr
да нет
i_beg=i_min+1
i_beg=i_otr+1
i_end=i_otr
i_end=i_min
i=i_beg; i<i_end; i++
a[i]×=2
i=0; i<i_beg; i++
a[i]=-a[i]
i=i_end; i<n; i++
a[i]=-a[i]
return
Текст программы (пример 1)
//Дан массив a[2m]. Значения элементов массива, лежащие между элементом
//с наименьшим неотрицательным значением и первым отрицательным элементом,
//имеющим индекс >=m, удвоить. У остальных элементов массива инвертировать знак.
#include<iostream.h>
#include<stdlib.h>
#include<locale.h>
using namespace std ;
const int RAZ = 10 ; //предельный размер массива
typedef int telem ; //определение типа элементов массива
typedef telem tmas[RAZ] ; //определение типа массива
int nomer_min(const tmas, int) ;
int nomer_otr(const tmas, int) ;
void inputmas(tmas, int) ;
void outputmas(const tmas, int) ;
void obrabotka_mas(tmas, int, int ,int) ;
//main_begin______________________________________________________________
int main()
{tmas a ; //массив
int m, //половина размера массива
i_otr, //индекс первого отрицательного элемента >m
i_min ; //индекс наименьшего неотрицательного элемента
setlocale(LC_ALL,"Russian") ;
//Ввод исходных данных
cout << "\n Введете половину размера массива <= " << RAZ / 2 << " : " ;
cin >> m ;
//Контроль ввода размера массива
if(2*m > RAZ || m <= 0)
{cout << " Введено недопустимое значение размера массива" << endl ;
return 1 ;
}
//Ввод исходного массива
inputmas(a, 2*m) ;
//Вывод исходного массива
cout << " Исходный массив:" << endl ;
outputmas(a, 2*m) ;
//Поиск индекса элемента с наименьшим неотрицательным значением
i_min = nomer_min(a, 2*m) ;
cout << "\n Индекс min неотр. элемента массива = " << i_min << endl ;
//Поиск индекса первого отрицательного элемента с номером >= m
i_otr = nomer_otr(a, m) ;
cout << " Индекс первого отр. элемента >=" << m << " = " << i_otr << endl ;
//Преобразование массива
obrabotka_mas(a, 2*m, i_min, i_otr) ;
//Вывод измененного массива
cout << " Измененный массив:" << endl ;
outputmas(a, 2*m) ;
return 0 ;
}
//main_end________________________________________________________________
//nomer_min_begin_________________________________________________________
//Поиск индекса элемента с наименьшим неотрицательным значением
int nomer_min(const tmas a, int n)
{int imin, //индекс минимального неотр. элемента
flag = 0 ; //факт наличия неотрицательного элемента
//Ищем первый неотрицательный элемент
for(int i = 0 ; i < n ; i++)
if(a[i] >= 0)
{imin = i ;
flag = 1 ;
break ;
}
if(flag)
{for(int i = imin + 1 ; i < n ; i++)
if(a[i] >= 0 && a[i] < a[imin]) imin = i ;
}
else{cout << "\n Неотрицательных элементов в массиве нет" ;
exit(3) ; //прекращение исполнения программы
}
return imin ;
}
//nomer_min_end___________________________________________________________
//nomer_otr_begin_________________________________________________________
//Поиск индекса первого отрицательного элемента с номером >= m
int nomer_otr(const tmas a, int m)
{int iotr, //индекс первого отрицательного элемента
flag = 0 ; //факт наличия отрицательного элемента
//Ищем первый отрицательный элемент с индексом >m
for(int i = m ; i < 2 * m ; i++)
if(a[i] < 0)
{iotr = i ;
flag = 1 ;
break ;
}
if(!flag)
{cout << "\n Отрицат. элементов с индексом >=" << m << " в массиве нет" ;
exit(3) ; //прекращение исполнения программы
}
return iotr ;
}
//nomer_otr_end___________________________________________________________
//inputmas_begin__________________________________________________________
//Ввод исходного массива
void inputmas(tmas a, int n)
{cout << " Введите в одной строке элементы массива, состоящего из " << n ;
cout << "\n чисел, и нажмите <Enter>" << endl ;
for(int i = 0 ; i < n ; i++)
cin >> a[i] ;
}
//inputmas_end____________________________________________________________
//outputmas_begin__________________________________________________________
//Вывод массива
void outputmas(const tmas a, int n)
{for(int i = 0 ; i < n ; i++)
{cout.width(4) ; //ширина поля для вывода значения элемента массива
cout << a[i] << " " ;
}
}
//outputmas_end____________________________________________________________
//obrabotka_mas_begin______________________________________________________
//Преобразование массива
void obrabotka_mas(tmas a, int n, int i_min, int i_otr)
{int i_beg, //начало интервала
i_end, //конец интервала
i ; //текущий номер элемента
if(i_min < i_otr)
{i_beg = i_min + 1 ;
i_end = i_otr ;
}
else{i_beg = i_otr + 1 ;
i_end = i_min ;
}
for(i = i_beg ; i < i_end ; i++) //удваиваем значения внутри интервала
a[i] *= 2 ;
for(i = 0 ; i < i_beg ; i++) //инвертируем знак у остальных
a[i] = -a[i] ;
for(i = i_end ; i < n ; i++) //инвертируем знак у остальных
a[i] = -a[i] ;
}
//obrabotka_mas_end________________________________________________________
Скриншоты результатов выполнения программы
МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ
