Отчёт по лабораторной работе 4. Остапчук Андрей Вячеславович а1221 Отчёт по лабораторной работе 4. Вариант 12 Задание
![]()
|
Остапчук Андрей Вячеславович А-12-21 Отчёт по лабораторной работе №4. Вариант 12 Задание В одномерном массиве, состоящем из п элементов, вычислить: 1) номер максимального по модулю элемента массива; 2) сумму элементов массива, расположенных после первого положительного элемента. 3) преобразовать массив таким образом, чтобы сначала располагались все элементы, целая часть которых лежит в интервале [а,b], а потом — все остальные. 1. Постановка задачиРазработать объектно-ориентрованную программу в соответствии с заданием. Функции программы: Выбор типа элементов, с которыми будет работать программа (int, float и double) Ввод числа элементов массива Ввод и вывод элементов массива Вывод номера максимального по модулю элемента массива Вывод суммы элементов массива, расположенных после первого положительного Сортировка элементов массива: сначала элементы целая часть которых лежит в заданном интервале, потом – все остальные. Входные данные: Число элементов массива n (типа int). Элементы массива A[i] того типа, который выбрал пользователь. Выходные данные: Элементы массива A[i]; целочисленный номер максимального по модулю элемента массива - imax; сумма модулей элементов массива, расположенных после первого положительного элемента- sum (тип суммы зависит от типа элементов). Ограничения: Число элементов массива n, элемент массива A[i] - не число, а некорректные символы Реакция -> вывод сообщения о необходимости повторного ввода числа. Вид приложения - консольное приложение на языке C++. Среда разработки – Visual Studio 2022 Preview 2. Разработка программы 2.1 Разработка структуры приложения Для корректной работы данной программы необходимо создать класс Funct. Далее определяются функции и методы класса, которые нужны для решения задачи. Диаграмма класса представлена на (Рис.1). Диаграмма класса Funct ![]() Рис.1 В таблицах: Табл. 1, Табл. 2. описаны методы и шаблоны функций программы. Табл.1. Методы
Табл.2. Шаблоны функций
2.2 Разработка интерфейса 2.3 Описание пользовательского интерфейса Категории пользователей: для широкого круга пользователей; Функции пользователя: выбор типа элементов и работа с одним из них: нахождение максимального по модулю элемента массива, вычисление суммы элементов массива, стоящих после первого положительного элемента, сортировка массива; Диалог с пользователем в консольном приложении: На Рис.2 . представлено первое меню программы, с выбором действий: ![]() Рис. 2. Пример первоначального меню 3. Реализация и тестирование программы3.1 Описание разработанной программы Все программы представляют собой объектно-ориентированные приложения, написанные на языке C++ в среде разработки Visual Studio 2022 Preview В классе Funct реализован один метод: poisk, который объединяет в себе все функции (через меню): void vvod(T* A, const int n) позволяет ввести элементы массива различных типов void maximum(T* A, int n, T max = 0, int mi = 0) ищет номер максимального элемента массива void summa(T* A, int n, T sum = 0, int k = 0) ищет сумму элементов массива, расположенных после первого положительного элемента. void perestanovka(T* A, int n, T a, T b, T p) сортирует массив: сначала элементы входящие в заданный интервал, затем все остальные; вывод массива Функции шаблонные, описываются с использование template Обработка исключительных ситуаций осуществляется с помощью ввода с клавиатуры строки, с последующим преобразованием её в соответствующий объекту тип. При не возможности преобразования в консоли выходит сообщение «Error! Повторите ввод <имя переменной>=» 3.2 Тестирование программы Объект испытаний – программа ConsoleApplication12.cpp Цель испытаний – проверить работу программы. Средства испытаний – локальный отладчик Windows. Метод испытаний - функциональное тестирование при средних, граничных и аномальных значениях. Тесты представлены в Табл.3. Табл. 3. Тесты
![]() ![]() Продолжение Табл. 3. Тесты Продолжение Табл.3. Вывод: В ходе выполнения лабораторной были применены шаблонные функции для решения задачи. Исходя из результатов тестирования, можно сказать, что программы работают корректно с нормальными и граничными значениями. Приложение. Код программы//Остапчук Андрей Вячеславович А-12-21, Лаба 4, Вариант 12 #include #include #include #include using namespace std; template void vvod(T* A, const int n) { T u; cout << "\nМассив типа int:\n" << endl << "Введите элементы массива:" << endl; for (int i = 0; i < n; i++) { while (!(cin >> u) || (cin.peek() != '\n')) { cin.clear(); while (cin.get() != '\n'); cout << "Ошибка! Если вы вводили массив через enter - повторно введите элемент, если через пробел - введите все элементы массива заново = "; } T m = u; A[i] = m; } } template void maximum(T* A, int n, T max = 0, int mi = 0) { for (int i = 0; i < n; i++) { if (abs(A[i]) > max) { max = abs(A[i]); mi = i + 1; } } cout << "Номер максимального по модулю элемента массива:" << mi; return; } template void summa(T* A, int n, T sum = 0, int k = 0) { cout << endl; for (int i = 0; i < n; i++) { k = i + 1; if (A[i] > 0) break; } for (int i = k; i < n; i++) { sum = sum + A[i]; } cout << "Cумма элементов массива, расположенных после первого положительного элемента=" << sum << endl; return; } template void perestanovka(T* A, int n, T a, T b, T p) { cout << "Введите левую границу интервала" << endl << "a="; cin >> a; if (cin.fail()) { cout << "Ошибка: такой формат ввода недопустим!" << endl; exit(0); } cout << "Введите правую границу интервала" << endl << "b="; while (cin >> b && b < a) { cout << "Правая граница не может быть меньше левой" << endl; cout << "Введите правую границу интервала ещё раз" << endl << "b="; } if (cin.fail()) { cout << "Ошибка: такой формат ввода недопустим!" << endl; exit(0); } cout << "Массив выглядит теперь так:" << "\n"; cout << endl; for (int i = 0; i < n; i++) { int j = i - 1; while (j >= 0 && (A[j] < a) || (A[j] > b) && A[j + 1] >= a && A[j + 1] <= b) { swap(A[j], A[j + 1]); j--; } } return; } int main() { setlocale(LC_ALL, "ru"); int mi = 0, k = 0; int* iA, imax = 0, isum = 0, ia = 0, ib = 0, ip = 0; double* dA, dmax = 0, dsum = 0, da = 0, db = 0, dp = 0; float* fA, fmax = 0, fsum = 0, fa = 0, fb = 0, fp = 0; cout << "\t\t Шаблон функции вывода массива на экран\n\n"; char c; while (1) { cout << "1 - Решение задачи с массивом типа int через шаблон;\n"; cout << "2 - Решение задачи с массивом типа double через шаблон;\n"; cout << "3 - Решение задачи с массивом типа float через шаблон;\n"; cout << "4 - конец;\n"; scanf_s("%c", &c); switch (c) { case '1': { int s; cout << "Введите размер массива: n= "; while (!(cin >> s) || (cin.peek() != '\n')) { cin.clear(); while (cin.get() != '\n'); cout << "Ошибка! Повторите ввод n="; }int n = s; iA = new int[n]; vvod(iA, n); maximum(iA, n, imax, mi); summa(iA, n, isum, k); perestanovka(iA, n, ia, ib, ip); for (int i = 0; i < n; i++) { cout << iA[i] << "\n"; } delete[] iA; break; } case '2': { int ds; cout << "Введите размер массива: n= "; while (!(cin >> ds) || (cin.peek() != '\n')) { cin.clear(); while (cin.get() != '\n'); cout << "Ошибка! Повторите ввод n="; }int dn = ds; dA = new double[dn]; vvod(dA, dn); maximum(dA, dn, dmax, mi); summa(dA, dn, dsum, k); perestanovka(dA, dn, da, db, dp); for (int i = 0; i < dn; i++) { cout << dA[i] << "\n"; } delete[] dA; break; } case '3': { int fs; cout << "Введите размер массива: n= "; while (!(cin >> fs) || (cin.peek() != '\n')) { cin.clear(); while (cin.get() != '\n'); cout << "Ошибка! Повторите ввод n="; }int fn = fs; fA = new float[fn]; vvod(fA, fn); maximum(fA, fn, fmax, mi); summa(fA, fn, fsum, k); perestanovka(fA, fn, fa, fb, fp); for (int i = 0; i < fn; i++) { cout << fA[i] << "\n"; } delete[] fA; break; } case '4': return 0; break; default: cout << ("Нет такой команды!\nPress ENTER\n"); } scanf_s("%c", &c); } system("pause"); return 0; } |