
3 сем / L9
.docxМИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ
ФЕДЕРАЦИИ
федеральное государственное автономное образовательное учреждение высшего образования
«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ АЭРОКОСМИЧЕСКОГО ПРИБОРОСТРОЕНИЯ»
ИНСТИТУТ НЕПРЕРЫВНОГО И ДИСТАНЦИОННОГО ОБРАЗОВАНИЯ
КАФЕДРА
Кафедра вычислительных систем и сетей
ОЦЕНКА ПРЕПОДАВАТЕЛЬ
|
|
|
|
|
Кандидат технических наук, доцент |
|
|
|
Л.Н. Бариков |
должность, уч. степень, звание |
|
подпись, дата |
|
инициалы, фамилия |
ОТЧЕТ О ЛАБОРАТОРНОЙ РАБОТЕ
Динамические массивы
по дисциплине: Основы программирования
РАБОТУ ВЫПОЛНИЛА
СТУДЕНТКА ГР.

№ номер группы подпись, дата инициалы, фамилия
Санкт-Петербург 2021
Вариант 49.
1. Постановка задачи.
А. Дан массив a0, a1, a2,…, an-1. Определить количество и произведение значений элементов массива, лежащих между элементами с максимальным по абсолютной величине значением и с минимальным по абсолютной величине значением
Б. В заданной квадратной матрице размера 2n*2n поменять местами значения элементов строк с одинаковыми номерами областей 1 и 2 (см. рисунок).
1. Математическая модель.
А) Выполнение программы начинается с выделения памяти под двумерный массив и его последующее заполнение.
Дальше мы получаем минимальное и максимальное по абсолютной величине значение из соответствующих функция, кратко о них:
Берем за минимально значение первое число массива, для максимального - последнее.
Пробегаемся по массиву, сравнивая попадающиеся числа с минимальным (максимальным).
Встретив число меньше минимального (максимального), помещаем его в переменную, содержащую минимальное (максимальное) число.
Стоит обратить внимание, что минимальное число берется последнее из встреченных, максимальное – первое.
Дальше мы возвращаемся в 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++;
}
}
Схемы алгоритмов.
Тестовые примеры.