/**
* @file laba5_3.c
* @author Нездоймишпка А.О., гр. 515б
* @date 27 березня 2024
* @brief Лабораторна робота № 5
*
* Застосування вказівників. Завдання 3
*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <locale.h>
// Функція для транспонування матриці nxn
void matrix_transpose(int* mat, int n) {
int temp;
// Ітерація по кожному елементу над діагоналлю
for (int i = 0; i < n; ++i) {
for (int j = i + 1; j < n; ++j) {
// Поміняти місцями елемент у (i, j) елементом у (j, i)
temp = *(mat + i * n + j);
*(mat + i * n + j) = *(mat + j * n + i);
*(mat + j * n + i) = temp;
}
}
}
// Функція для виводу матриці nxn
void print_matrix(int* mat, int n) {
setlocale(LC_ALL, "ukr");
printf("Матриця:\n");
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
printf("%d\t", *(mat + i * n + j));
}
printf("\n");
}
}
// Функція для заповнення матриці nxn введеними користувачем або випадковими значеннями
void fill_matrix(int* mat, int n, int option) {
setlocale(LC_ALL, "ukr");
if (option == 1) { // Варіант 1: введення користувача
printf("Введіть %d x %d елементів матриці:\n", n, n);
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
int input;
while (scanf("%d", &input) != 1 || input < 0 || input > 100) {
printf("Неправильні дані! Введіть дійсне ціле число від 0 до 100: ");
while (getchar() != '\n'); // Очистити вхідний буфер
}
*(mat + i * n + j) = input;
}
}
}
else { // Варіант 2: Випадкові значення
srand(time(NULL)); // Ініціалізація випадкового початкового числа
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
*(mat + i * n + j) = rand() % 100; // Згенеруйте випадкове число від 0 до 99
}
}
}
}
int main() {
setlocale(LC_ALL, "ukr");
int n;
do {
printf("Введіть розмір матриці (n): ");
if (scanf("%d", &n) != 1 || n <= 0) {
printf("Неправильні дані! Введіть додатне ціле число для розміру матриці.\n");
while (getchar() != '\n'); // Очистити вхідний буфер
}
} while (n <= 0);
// Виділити пам'ять для матриці
int* matrix = (int*)malloc(n * n * sizeof(int));
if (matrix == NULL) {
printf("Помилка виділення пам'яті!\n");
return 1;
}
// Заповнення матриці (Варіант 1: введення користувачем або Варіант 2: Випадкове)
printf("\nВиберіть спосіб заповнення матриці:\n");
printf("1. Введення користувача\n");
printf("2. Випадкові значення\n");
int option;
do {
if (scanf("%d", &option) != 1 || (option != 1 && option != 2)) {
printf("Неправильні дані! Виберіть 1 (введення користувача) або 2 (випадкові значення): ");
while (getchar() != '\n'); // Очистити вхідний буферм
}
} while (option != 1 && option != 2);
fill_matrix(matrix, n, option);
// Друк оригінальної матриці
printf("\nОригінал ");
print_matrix(matrix, n);
// Транспонування матриці
matrix_transpose(matrix, n);
// Друк транспонованої матриці
printf("\nПісля транспонування:\n");
print_matrix(matrix, n);
// Вільна динамічно розподілена пам'ять
free(matrix);
return 0;
}