Содержание
Постановка задания
Задание для всех вариантов звучит так (или, возможно, немного изменено, т к могут быть разные издания учебного пособия):
Для решения задачи следует применить указатель на указатель на массив и функции: ввода количества строк $n$ и столбцов $m$ и элементов двумерного массива, вывода элементов массива на экран, обработки массива в соответствии с заданием.
В главной функции нужно использовать указатель на указатель для динамического выделения памяти. При обработке заданного массива нельзя использовать дополнительные массивы.
Варианты заданий
Вариант | Задание |
1. | Дана квадратная вещественная матрица $A$ размером $n • n$. Вычислить $k$-ую степень этой матрицы. |
2. | Дана вещественная матрица размером $n • m$. Переставляя ее строки и столбцы, добиться того, чтобы наименьший элемент оказался в верхнем левом углу. |
3. | Дана вещественная матрица размером $n • m$. Упорядочить ее строки по возрастанию наименьших элементов в строках матрицы. |
4. | Задан массив размером $n • n$, состоящий из нулей и единиц. Повернуть элементы массива на 90° против хода часовой стрелки. |
5. | Элемент матрицы называется седловой точкой, если он является наименьшим в своей строке и наибольшим в своем столбце (или наоборот, наибольшим в своей строке и наименьшим в своем столбце). Для заданной целочисленной матрицы размером $n • m$ определить все седловые точки. |
6. | Дана вещественная матрица размером $n • n$, все элементы которой различны. Найти скалярное произведение строки, в которой находится наименьший элемент матрицы, и столбца с наибольшим элементом. |
7. | Дана вещественная матрица размером $n • m$, Определить строки, содержащие хотя бы один нулевой элемент; столбец, в котором находится самая длинная серия одинаковых элементов. |
8. | Определить, является ли произведение двух вещественных матриц размером $n • n$ магическим квадратом. Для магического квадрата сумма элементов во всех строках и столбцах одинакова. |
9. | Даны две вещественные матрицы $A$ и $B$ размером $n • n$. Показать, что произведения матриц $A·B \neq B·A$. |
10. | Даны вещественная матрица $A$ и единичная матрица $E$ одинаковых размеров $n • n$. Показать, что произведения матрица $A·E \neq E·A$. |
11. | Дана вещественная матрица размером $n • m$. Найти сумму наименьших элементов ее нечетных строк и наибольших элементов ее четных строк. |
12. | Дана вещественная матрица $A$ размером $n • n$. Удалить из матрицы строку и столбец, где находится минимальный элемент, и затем определить обратную матрицу. |
13. | Дана вещественная матрица $A$ размером $n • n$. Составить матрицу $B$, в которой находятся все элементы матрицы $A$ между минимальным и максимальным элементами. |
14. | Дана действительная квадратная матрица порядка $2 • n$. Получить новую матрицу, переставляя ее блоки размером $n • n$: |
15. | Дана действительная квадратная матрица порядка $2 • n$. Получить новую матрицу, переставляя ее блоки размером $n • n$: |
16. | Дана вещественная матрица размером $n • m$. Определить максимальные элементы матрицы, лежащие выше главной диагонали, и все элементы, находящиеся в «окрестности» этих элементов. |
17. | Дана вещественная матрица $A$ размером $n • n$. Найти максимальную сумму элементов из всех диагоналей, параллельных главной, начиная с двухэлементной диагонали. |
18. | Дана вещественная матрица $A$ размером $n • n$. Найти минимальную сумму элементов из всех диагоналей, параллельных побочной, начиная с одноэлементной диагонали. |
19. | Дана вещественная матрица размером $n • m$. Определить минимальные элементы матрицы, лежащие ниже побочной диагонали, и все элементы, находящиеся в «окрестности» этих элементов. |
20. | Элемент матрицы называется седловой точкой, если он является наименьшим в своей строке и наибольшим в своем столбце (или наоборот, наибольшим в своей строке и наименьшим в своем столбце). Для заданной целой матрицы размером $n • m$ удалить все строки и столбцы, где находятся седловые точки. |
21. | Дана вещественная матрица размером $n • m$. Удалить из матрицы все строки и столбцы, где находятся минимальные элементы. |
22. | Дана вещественная матрица размером $n • m$. Удалить из матрицы все строки и столбцы с нулевыми элементами, которые лежат выше главной и побочной диагоналей матрицы. |
23. | Дана вещественная матрица размером $n • m$. Элемент матрицы назовем локальным минимумом, если он меньше всех окружающих его элементов. Заменить все локальные минимумы матрицы на значение, задаваемое с клавиатуры. |
24. | Дана вещественная матрица размером $n • m$. Составить новую матрицу, состоящую из строк и столбцов исходной матрицы, где находятся минимальные элементы матрицы. |
25. | Дана вещественная матрица размером $n • m$. Составить новую матрицу, состоящую из строк и столбцов исходной матрицы, где находятся максимальные элементы матрицы. |
Лабораторная работа $№7$ предполагает написание программы на языке Си. При заказе работы своего варианта вы получите качественно написанную и хорошо прокомментированную программу.
➡ Дополнительно заказав алгоритм решения вашей задачи (мы крайне рекомендуем это сделать), получите аккуратно оформленный отчет-алгоритм, поясняющий все тонкости решения поставленной задачи.
Образец выполнения (вариант №18)
Условие задания
Дана вещественная матрица $A$ размером $n • n$. Найти минимальную сумму элементов из всех диагоналей, параллельных побочной, начиная с одноэлементной диагонали.
Алгоритм решения задачи
Прежде чем переходить непосредственно к кодированию данной лабораторной работы, нужно провести ее алгоритмизацию. Данный этап является обязательным и ни один профессиональный программист не опускает его в своей работе.
💡 Сразу хочется отметить, что работать с побочной диагональю, нежели с главной, менее приятно и более сложно!
Вспомним визуальные и формульные отличия главной и побочной диагоналей. Рассмотрим $2$ матрицы размером $5 • 5$. Не забывайте, что в языке программирования «чистый» Си индексация элементов любых массивов начинается с $0$, а не с $1$.
Работа с главной диагональю | Работа с побочной диагональю | ||||||||||||||||||||||||||||||||||||||||||||||||||
|
| ||||||||||||||||||||||||||||||||||||||||||||||||||
Нужна зависимость, которая, например, получает индекс колонки элемента по индексу строки этого же элемента (иногда удобнее выражать индекс строки через индекс колонки): индекс_колонки = ФУНКЦИЯ(индекс_строки) Такая функция есть, при этом она достаточно простая:
Действительно, если посмотреть на элементы главной диагонали (эти элементы имеют лазурный фон), то, очевидно, что у каждого из этих элементов номер строки и номер колонки совпадают: $A[0][0] = 7$ | индекс_колонки = ФУНКЦИЯ(индекс_строки) Такая функция есть, при этом она гораздо сложнее, чем соответствующая функция для главной диагонали:
Действительно, если посмотреть на элементы побочной диагонали (эти элементы имеют желтый фон), то, очевидно, что для каждого из этих элементов работает вышеприведенная зависимость: $A[0][4] = 8$ |
Рассмотрим квадратную матрицу размером $4 • 4$ (для удобства восприятия информации заполним матрицу натуральными числами, идущими по возрастанию):
💡 Нас интересуют элементы, стоящие на диагоналях, параллельные побочной диагонали. Как таковая побочная диагональ нас не интересует, так как принадлежащие ей элементы в расчетах участия не принимают.
Данная матрица имеет $6$ диагоналей, параллельных побочной диагонали (нумерация диагоналей условная):
$№$ диагонали | $1$ | $2$ | $3$ | $4$ | $5$ | $6$ |
Элементы диагонали | $1$ | $2, 5$ | $3, 6, 9$ | $8, 11, 14$ | $12, 15$ | $16$ |
Наша конечная цель — найти минимальную сумму элементов из всех диагоналей, параллельных побочной.
То есть нам нужно будет пройтись по каждой из этих шести диагоналей и просуммировать принадлежащие ей элементы. Следовательно, нам нужно получить формулы, позволяющие просканировать элементы нужной нам диагонали, параллельной побочной.
Например, зададимся вопросом, как пройтись по элементам диагонали $№2$, то есть просуммировать элементы $2$ и $5$? Для этого мы должны рассмотреть лишь фрагмент заданной матрицы размером $2 • 2$; для этого фрагмента искомая диагональ $№2$ будет являться главной побочной диагональю. А работать с формулой, позволяющей обрабатывать элементы побочной диагонали, мы уже умеем.
Значит, выделяя фрагмент нужного размера из заданной матрицы, мы сможем обращаться к элементам нужной нам диагонали, параллельной побочной исходной матрицы.
➡ Все это можно достаточно просто закодировать через циклические структуры (идеально подойдет управляющий цикл $for(;;)$).
С пробежкой по диагоналям $№1$, $№2$ и $№3$ проблем нет вообще. А как правильно обработать диагонали под $№4$, $№5$ и $№6$? Снова пытаться выводить зависимость? Есть способ более простой! Рассмотрим следующее изображение:
Элемент $A[0][1]$ имеет значение равно $2$. Обратимся к элементу, симметричному относительного «красной точки». Это элемент $A[3][2] = 15$. Нам нужно попытаться вывести зависимость, которая получает индекс строки и индекс колонки этого симметричного элемента. А эта зависимость, оказывается, есть!
➡ Для получения индекса строки:
индекс_строки_симметричного_элемента = размер_матрицы — индекс_строки — 1.
➡ Для получения индекса колонки:
индекс_колонки_симметричного_элемента = размер_матрицы — индекс_колонки — 1.
Проверяем (не забываем, что для данного примера размер матрицы равен $4$)!
- $3 = 4 — 0 — 1$ — верно!
- $2 = 4 — 1 — 1$ — верно!
Проверьте «желтые» элементы самостоятельно.
Теперь у нас все готово, чтобы перейти к анализу функций, требующихся для успешного программирования поставленной задачи.
Необходимые программные функции для кодирования
Ниже представлен список необходимых функций, требующихся для успешного решения поставленной задачи (самое главное — помнить о том, что функция должна строго решать какую-то конкретную одну задачу).
№ | Название функции | Назначение функции |
1 | FillMatrix | Ввод размера квадратной матрицы (порядка матрицы) и заполнение данной вещественной матрицы числами вводом с клавиатуры |
2 | PrintMatrix | Вывод квадратной матрицы в табличном виде на экран |
3 | GetMinSumSecondaryDiagonal | Нахождение минимальной суммы элементов из всех диагоналей, параллельных побочной диагонали |
😡 Также составители хотят, чтобы студенты использовали для динамического выделения памяти оператор new, а для удаления динамической памяти оператор delete.
Все хорошо, да вот только это операторы языка программирования С++ и к языку «чистый» Си они не имеют абсолютно никакого отношения.
В языке Си для динамического перераспределения памяти используют функции malloc, calloc, realloc и free. По идее, именно эти функции и нужно бы применять…
Реализация задачи на языке Си
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 | #include <stdio.h> // для ввода, вывода (scanf, printf) #include <locale.h> // для руссификации (setlocale) #include <conio.h> // для задержки программы (getch) #define MAX_N 10 // предельно возможное количество строк/колонок матрицы //----------------------------------------------- // ввод порядка матрицы и заполнение матрицы // pn - активное кол-во строк/колонок матрицы //----------------------------------------------- float** FillMatrix(int* pn) { float** matrix; int i, j; do { printf("Введите кол-во строк/колонок матрицы из отрезка [1 .. %d]: ", MAX_N); scanf("%d", pn); } while((*pn < 1) || (*pn > MAX_N)); printf("\n"); // выделяем память под динамическую матрицу matrix = new float*[*pn]; // выделяем память под каждую строку матрицы for(i = 0; i < *pn; i++) matrix[i] = new float[*pn]; // заполняем элементы матрицы вводом с клавиатуры for(i = 0; i < *pn; i++) { for(j = 0; j < *pn; j++) { printf("Введите элемент матрицы A[%d][%d]: ", (i + 1), (j + 1)); scanf("%f", &(*(*(matrix + i) + j))); } } return matrix; // вернули в качестве ответа динамическую матрицу } //----------------------------------------------- // вывод матрицы в табличном виде на экран // pmatrix - печатаемая матрица // pn - количество строк/колонок матрицы //----------------------------------------------- void PrintMatrix(float** pmatrix, const int pn) { int i, j; printf("\n\nЭлементы матрицы имеют вид:\n"); for(i = 0; i < pn; i++) { for(j = 0; j < pn; j++) printf("%10.3f", *(*(pmatrix + i) + j)); printf("\n\n"); } } //----------------------------------------------- // нахождение минимальной суммы элементов из всех // диагоналей, параллельных побочной // pmatrix - матрица с данными // pn - количество строк/колонок матрицы //----------------------------------------------- float GetMinSumSecondaryDiagonal(float** pmatrix, const int pn) { int size; int indexRow; // индекс строки суммируемого элемента int indexColumn; // индекс колонки суммируемого элемента float minSum = **pmatrix; // обращение к элементу матрицы с индексами [0][0] float currentSum; // сумма элементов текущей диагонали, параллельной побочной // анализируются диагонали, находящиеся слева (и выше) от побочной for(size = 1; size < (pn - 1); size++) { currentSum = 0; for(indexRow = 0; indexRow <= size; indexRow++) { indexColumn = size - indexRow; currentSum += *(*(pmatrix + indexRow) + indexColumn); } if(currentSum < minSum) minSum = currentSum; } // анализируются диагонали, находящиеся справа (и ниже) от побочной for(size = 0; size < (pn - 1); size++) { currentSum = 0; for(indexRow = 0; indexRow <= size; indexRow++) { indexColumn = pn - (size - indexRow) - 1; currentSum += *(*(pmatrix + (pn - indexRow - 1)) + indexColumn); } if(currentSum < minSum) minSum = currentSum; } // в качестве ответа возвращается минимальная сумма элементов return minSum; } //----------------------------------------------- // главная функция программы (точка входа) //----------------------------------------------- int main(void) { float** A; // входная динамическая матрица int i; // счетчик цикла int n; // кол-во строк/колонок матрица А setlocale(LC_ALL, "rus"); // настройка руссификации диалогов A = FillMatrix(&n); // вводим габариты матрицы и заполняем дробными числами вводом с клавиатуры PrintMatrix(A, n); // выводим заданную матрицу на экран в табличном формате // запускаем поиск минимальной суммы элементов и сразу выводим результат поиска на экран printf("\nМинимальная сумма элементов из всех диагоналей, параллельных побочной: %0.3f", GetMinSumSecondaryDiagonal(A, n)); // удаляем память из-под динамической матрицы (в 2 этапа) for(i = 0; i < n; i++) delete []A[i]; delete []A; printf("\n\nДля завершения работы программы нажмите клавишу ENTER..."); getch(); // задержка работы программы, чтобы можно было просмотреть результат return 0; // завершение работы программы и передача управления в ОС } //----------------------------------------------- |
Результаты работы программы
№ теста | Результаты |
1 | ![]() |
2 | ![]() |
3 | ![]() |
Стоимость заказа работы
➡ Стоимость программы из любого варианта составляет $250$ рублей.
➡ Стоимость детального алгоритма из любого варианта составляет $250$ рублей (заказывается опционально на ваше усмотрение, чтобы детально разобраться с решением лабораторной работы, например, не прибегая к консультации репетитора).
Также дополнительно вы можете заказать у нас:
- Построение аккуратной ГОСТовой блок-схемы. Ориентировочная стоимость $250$ рублей.
- Отчет о проделанной работе (иногда в вузах есть требование — предоставить отчет к лабораторной работе). Ориентировочная стоимость $150$ рублей.
Для оформления заказа пишите на почту: proglabs@mail.ru.
Время нашего ответа обычно составляет не более 10 минут.
Добавить комментарий