Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <time.h>
- #include <string.h>
- // Структура для представления матрицы
- struct Matrix {
- double **data; // Двумерный массив
- int rows; // Количество строк
- int cols; // Количество столбцов
- };
- // Функция для создания матрицы
- struct Matrix createMatrix(int rows, int cols) {
- struct Matrix mat;
- mat.rows = rows;
- mat.cols = cols;
- // Выделение памяти для двумерного массива
- mat.data = (double **)malloc(rows * sizeof(double *));
- for (int i = 0; i < rows; i++) {
- mat.data[i] = (double *)malloc(cols * sizeof(double));
- }
- return mat;
- }
- // Функция для удаления матрицы и освобождения памяти
- void deleteMatrix(struct Matrix mat) {
- for (int i = 0; i < mat.rows; i++) {
- free(mat.data[i]);
- }
- free(mat.data);
- }
- // Функция для заполнения матрицы случайными числами
- void fillMatrix(struct Matrix mat) {
- srand(time(NULL)); // Инициализация генератора случайных чисел
- for (int i = 0; i < mat.rows; i++) {
- for (int j = 0; j < mat.cols; j++) {
- mat.data[i][j] = rand() % 100; // Случайное число от 0 до 99
- }
- }
- }
- // Функция для вывода матрицы на экран
- void printMatrix(struct Matrix mat) {
- printf("Матрица:\n");
- for (int i = 0; i < mat.rows; i++) {
- for (int j = 0; j < mat.cols; j++) {
- printf("%.2f\t", mat.data[i][j]); // Разделитель - табуляция
- }
- printf("\n");
- }
- }
- // Функция для вычисления следа матрицы
- double trace(struct Matrix mat) {
- double sum = 0.0;
- int min_dimension = (mat.rows < mat.cols) ? mat.rows : mat.cols;
- for (int i = 0; i < min_dimension; i++) {
- sum += mat.data[i][i];
- }
- return sum;
- }
- // Функция для вычисления суммы строки или столбца
- double sumRowOrCol(struct Matrix mat, int index, char type) {
- double sum = 0.0;
- if (type == 'r') { // Сумма строки
- for (int j = 0; j < mat.cols; j++) {
- sum += mat.data[index][j];
- }
- } else if (type == 'c') { // Сумма столбца
- for (int i = 0; i < mat.rows; i++) {
- sum += mat.data[i][index];
- }
- }
- return sum;
- }
- // Функция для поиска максимального элемента по модулю в строке или столбце
- void findMax(struct Matrix mat, int index, char type) {
- double max_val = 0.0;
- int max_index = 0;
- index--; // Переводим индекс из формата пользователя в формат программы
- if (type == 'r') { // Поиск в строке
- for (int j = 0; j < mat.cols; j++) {
- if (abs(mat.data[index][j]) > max_val) {
- max_val = abs(mat.data[index][j]);
- max_index = j;
- }
- }
- printf("Максимальное по модулю значение в строке %d: %.2f по индексу %d\n", index + 1, max_val, max_index+1);
- } else if (type == 'c') { // Поиск в столбце
- for (int i = 0; i < mat.rows; i++) {
- if (abs(mat.data[i][index]) > max_val) {
- max_val = abs(mat.data[i][index]);
- max_index = i;
- }
- }
- printf("Максимальное по модулю значение в столбце %d: %.2f по индексу %d\n", index + 1, max_val, max_index+1);
- }
- }
- int main() {
- int M, N;
- printf("Введите количество строк и столбцов матрицы: ");
- scanf("%d %d", &M, &N);
- struct Matrix mat = createMatrix(M, N);
- fillMatrix(mat);
- printMatrix(mat);
- printf("Доступные команды:\n");
- printf("trace - вычисляет и выводит на экран след матицы - сумму элементов на диагонали\n");
- printf("row i j - вычисляет и выводит на экран вектор, соответствующей сумме i-й и j-й строки матрицы.\n");
- printf("col i j - аналогично, но суммируются столбцы.\n");
- printf("max i - находит максимальный по модулю элемент в i-м стоблце и выводит на экран номер элемента и его значение. То же самое делает и для i-й строки, так что эта команда приводит к выводу на экран двух похожих сообщений.\n");
- printf("exit - выход из программы.\n");
- char command[10];
- while (1) {
- printf("Введите команду: ");
- scanf("%s", command);
- if (strcmp(command, "trace") == 0) {
- printf("След матрицы: %.2f\n", trace(mat));
- } else if (strcmp(command, "row") == 0) {
- int i, j;
- scanf("%d %d", &i, &j);
- printf("Сумма строки %d и %d: %.2f\n", i, j, sumRowOrCol(mat, i, 'r') + sumRowOrCol(mat, j, 'r'));
- } else if (strcmp(command, "col") == 0) {
- int i, j;
- scanf("%d %d", &i, &j);
- printf("Сумма столбца %d и %d: %.2f\n", i, j, sumRowOrCol(mat, i, 'c') + sumRowOrCol(mat, j, 'c'));
- } else if (strcmp(command, "max") == 0) {
- int index;
- scanf("%d", &index);
- findMax(mat, index, 'r');
- findMax(mat, index, 'c');
- } else if (strcmp(command, "exit") == 0) {
- break;
- } else {
- printf("Неверная команда!\n");
- }
- }
- deleteMatrix(mat); // Освобождение памяти
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement