Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

3 сем / L9

.docx
Скачиваний:
6
Добавлен:
04.07.2024
Размер:
3 Mб
Скачать

МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ

ФЕДЕРАЦИИ

федеральное государственное автономное образовательное учреждение высшего образования

«​САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ АЭРОКОСМИЧЕСКОГО ПРИБОРОСТРОЕНИЯ»

ИНСТИТУТ НЕПРЕРЫВНОГО И ДИСТАНЦИОННОГО ОБРАЗОВАНИЯ

КАФЕДРА

Кафедра вычислительных систем и сетей

ОЦЕНКА

ПРЕПОДАВАТЕЛЬ

Кандидат технических наук, доцент

Л.Н. Бариков

должность, уч. степень, звание

подпись, дата

инициалы, фамилия

ОТЧЕТ О ЛАБОРАТОРНОЙ РАБОТЕ

Динамические массивы

по дисциплине: Основы программирования

РАБОТУ ВЫПОЛНИЛА

СТУДЕНТКА ГР.

№ номер группы подпись, дата инициалы, фамилия

Санкт-Петербург 2021

Вариант 49.

1. Постановка задачи.

А.​ Дан массив a0, a1, a2,…, an-1. Определить количество и произведение значений элементов массива, лежащих между элементами с максимальным по абсолютной величине значением и с минимальным по абсолютной величине значением

Б. ​В заданной квадратной матрице размера 2n*2n поменять местами значения элементов строк с одинаковыми номерами областей 1 и 2 (см. рисунок).

1. Математическая модель.

А) Выполнение программы начинается с выделения памяти под двумерный массив и его последующее заполнение.

Дальше мы получаем минимальное и максимальное по абсолютной величине значение из соответствующих функция, кратко о них:

  1. Берем за минимально значение первое число массива, для максимального - последнее.

  2. Пробегаемся по массиву, сравнивая попадающиеся числа с минимальным (максимальным).

  3. Встретив число меньше минимального (максимального), помещаем его в переменную, содержащую минимальное (максимальное) число.

Стоит обратить внимание, что минимальное число берется последнее из встреченных, максимальное – первое.

Дальше мы возвращаемся в main(), там создаем переменную cnt, которая будет хранить количество чисел между максимальным и минимальным. После этого следует небольшой цикл if, проверяющий, положительное ли получилась cnt, если нет, то меняем местами элементы разности и ставим флаг для функции перемножения, которая перемножает числа от максимального + 1 до минимального, в случае, если флаг остался опущенным, в обратном случае от минимального + 1 к максимальному, далее возвращаем значение в переменную res, выводим данные на экран и чистим выделенную память.

Б) Вторая часть задания работает следующим образом:

Запрашиваем у пользователя n, помещаем ее в переменную m, а n умножаем на 2 для удобства выполнения программы, после этого выделяем в цикле for память под каждую строку массива и просим пользователя ввести массив.

Затем чистим экран командой system(“cls”), печатаем исходный массив, вызываем функцию обмена, работающую следующим образом:

Создаем переменную z типа элемента массива, создаем счетчик, приравниваем его к одному, он нужен для правильного перемещения по столбцам, запускаем два цикла for для строк и столбцов, помещаем элемент массива(​*(*(​a​ + i) + j))​ в переменную z, приравниваем его к соответствующему по условию(​*(*(​a​ + i) + (j + ​m​ - cnt)))​, а последний приравниваем к z, закрываем цикл для столбцов, инкрементируем счетчик и повторяем до окончания цикла по строкам.

Возвращаемся к main(), печатаем результирующий массив, чистим использованную память и возвращаем 0.

2. Код.

А)

#include​<iostream> #include​<locale.h> using​ ​namespace​ std;

typedef​ ​int​ ​elem​; ​//объявление типа элемента массива

typedef​ ​elem​* ​mas​; ​//объявление типа "указатель на elem" int​ MinAbsNum(​mas​, ​int​); int​ MaxAbsNum(​mas​, ​int​); int​ Mul(​mas​, ​int​, ​int​, ​bool​);

int​ main() { setlocale(​LC_ALL​, ​"Russian"​);

int​ n;​//количество элементов cout ​<<​ ​"Введите количество элементов массива: "​; cin ​>>​ n; if​ (n <= 0) {

cout ​<<​ ​"ВВЕДЕНО НЕВЕРНОЕ КОЛИЧЕСТВО

ЭЛЕМЕНТОВ!"​;

return​ 0;

}

mas​ a = ​new​ ​elem​ [n];

elem​ cnt = 0;​// количество элементов между |max| и |min| setlocale(​LC_ALL​, ​"Russian"​);

cout ​<<​ ​"Введите элементы массива: "​;

for​ (​int​ i = 0; i < n; i++) {

cin ​>>​ *(a + i);​//заполнение массива

}

int​ min = MinAbsNum(a, n);

int​ max = MaxAbsNum(a, n);

bool​ flag = ​false​;​//флаг для определения, какое число

стоит раньше, по умолчанию - положительное

cnt = min - max - 1; if​ (cnt < 0) { cnt = max - min - 1; flag = ​true​;

}

int​ res = Mul(a, max, min, flag);

cout ​<<​ ​"Количество элементов между минимальным и максимальным по абсолютной величине равно "​ ​<<​ cnt ​<<​ ​" их произведение составляет "​ ​<<​ res;

delete []​ a; return​ 0;

}

//Функция для определения максимального по абсолютной величине

int​ MaxAbsNum(​mas​ ​a​, ​int​ ​n​) {

n​--; int​ k = ​n​; int​ max = *(​a​ + ​n​);

for​ (​int​ i = ​n​-1; i >= 0; i--) { if​ (abs(*(​a​ + i)) >= abs(max)) { max = *(​a​ + i); k = i;

}

} return​ k;

}

//Функция для определения минимального по абсолютной величине

int​ MinAbsNum(​mas​ ​a​, ​int​ ​n​){

int​ min = *​a​; int​ k = 0;

for​ (​int​ i = 1; i < ​n​; i++) { if​ (abs(*(​a​ + i)) <= abs(min)) { min = *(​a​ + i); k = i;

}

} return​ k;

}

//Функция для подсчета произведения между минимальным и максимальным

int​ Mul(​mas​ ​a​, ​int​ ​max​, ​int​ ​min​, ​bool​ ​flag​) {

elem​ mul = 1;​// произведение элементов if​ (​flag​ == ​false​) { for​ (​int​ i = ​max​ + 1; i < ​min​; i++) { mul *= *(​a​ + i);

}

} else​ { for​ (​int​ i = ​min​ + 1; i < ​max​; i++) { mul *= *(​a​ + i);

}

}

return​ mul;

}

Б)

#include​<iostream>

#include​<cstring>

#include​<locale.h> using​ ​namespace​ std;

typedef​ ​int​ ​elem​; ​//объявление типа элемента массива typedef​ ​elem​* ​tstr​; ​//определение типа "указатель на elem" typedef​ ​tstr​* ​arr​; ​//тип "указатель на указатель на elem" void​ obmen (​arr​ ​a​, ​int​ ​n​, ​int​ ​m​);

void​ outputarr(​arr​ ​a​, ​int​ ​n​);

int​ main() {

int​ n;​//размерность массива

setlocale(​LC_ALL​, ​"Russian"​);

cout ​<<​ ​"Введите n(размер матрицы 2n*2n):"​; cin ​>>​ n; if​ (n <= 0) {

cout ​<<​ ​"ВВЕДЕНО НЕВЕРНОЕ КОЛИЧЕСТВО

ЭЛЕМЕНТОВ!"​;

return​ 0;

} int​ m = n; n *= 2; arr​ a;

a = ​new​ ​tstr​[n]; ​//выделение динамической памяти под массив указателей на строки массива

for​ (​int​ i = 0; i < n; i++) { ​//выделение памяти под каждую строку

*(a + i) = ​new​ ​elem​[n];

}

cout ​<<​ ​"Введите через пробел элементы массива

размера "​ ​<<​ n ​<<​ ​"x"​ ​<<​ n ​<<​ ​"\nПосле ввода строки нажимайте

<Enter>"​ ​<<​ endl; for​ (​int​ i = 0; i < n; i++) { for​ (​int​ j = 0; j < n; j++) { cin ​>>​ *(*(a + i) + j);

}

}

system(​"cls"​);

cout ​<<​ ​"Исходный массив:\n\n"​;

outputarr(a, n);

obmen(a, n, m);

cout ​<<​ ​"\nРезультирующий массив:\n\n"​; outputarr(a, n); cout ​<<​ endl;

for​ (​int​ i = 0; i < n; i++) { delete​* (a + i); delete[]​a; return​ 0;

}

}

//Функция вывода массива void​ outputarr(​arr​ ​a​, ​int​ ​n​){ for​ (​int​ i = 0; i < ​n​; i++){ for​ (​int​ j = 0; j < ​n​; j++){

cout.width(4); ​//ширина поля выводимого

параметра

cout ​<<​ *(*(​a​ + i) + j) ​<<​ ​' '​;

}

cout ​<<​ ​'\n'​;

}

}

//Функция обмена

void​ obmen(​arr​ ​a​, ​int​ ​n​, ​int​ ​m​) { elem​ z; int​ cnt = 1;

for​ (​int​ i = 0; i < ​m​; i++) { for​ (​int​ j = cnt; j < ​m​; j++) {

z = *(*(​a​ + i) + j);

*(*(​a​ + i) + j) = *(*(​a​ + i) + (j + ​m​ - cnt));

*(*(​a​ + i) + (j + ​m​ - cnt)) = z;

} cnt++;

}

}

  1. Схемы алгоритмов.

  1. Тестовые примеры.

Соседние файлы в папке 3 сем