/*
* @file lab5_3.cpp
* @author Гавалян Д.Є, гр. 515i
* @date 8 травня 2025
* @brief Лабораторна робота № 5, варіант 19
*
* Застосування вказiвникiв. Завдання 3
*/
#include <stdio.h>
#include <locale.h>
#include <stdlib.h>
#include <time.h>
#include "module.h"
int main() {
setlocale(LC_ALL, "Ukr");
srand((unsigned int)time(NULL));
int matrix[SIZE][SIZE];
int choice;
// Запит користувача про спосіб заповнення матриці
printf("Виберiть спосiб заповнення матрицi:\n");
printf("1 - введення з клавiатури\n");
printf("2 - автоматичне заповнення (rand)\n");
printf("Ваш вибiр: ");
scanf("%d", &choice);
// Використовую switch для обробки вибору користувача
switch (choice) {
case 1:
// Ручне введення елементiв матрицi
printf("Введiть елементи матрицi розмiром %dx%d:\n", SIZE, SIZE);
for (int i = 0; i < SIZE; i++) {
for (int j = 0; j < SIZE; j++) {
printf("Елемент [%d][%d]: ", i, j);
scanf("%d", &matrix[i][j]);
}
}
break;
case 2:
// Автоматичне заповнення матрицi випадковими числами
for (int i = 0; i < SIZE; i++) {
for (int j = 0; j < SIZE; j++) {
matrix[i][j] = MIN_RAND + rand() % (MAX_RAND - MIN_RAND + 1);
}
}
printf("Матриця заповнена випадковими числами.\n");
break;
default:
// Якщо користувач ввiв невiрне значення
printf("Невiрний вибiр: Такої функцiї не iснує!\n");
return 1;
}
// Виводимо початкову матрицю на екран
printf("\nПочаткова матриця:\n");
for (int i = 0; i < SIZE; i++) {
for (int j = 0; j < SIZE; j++) {
printf("%4d ", matrix[i][j]);
}
printf("\n");
}
// Запит на кількість позицій для зсуву
int k;
printf("\nВведiть кiлькiсть позицiй для зсуву: ");
scanf("%d", &k);
// Викликаємо функцію зсуву
matrix_shift_bottom(&matrix[0][0], SIZE, k);
// Виводимо змінену матрицю на екран
printf("\nМатриця пiсля зсуву на %d позицiй вниз:\n", k);
for (int i = 0; i < SIZE; i++) {
for (int j = 0; j < SIZE; j++) {
printf("%4d ", matrix[i][j]);
}
printf("\n");
}
return 0;
}
#include "module.h"
// Функція для циклічного зсуву стовпців матриці вниз на k позицій
void matrix_shift_bottom(int* mat, int n, int k) {
// Якщо k більше за розмір матриці, беремо модуль
k = k % n;
if (k == 0) return; // Якщо зсув на 0, нічого не робимо
// Використовуємо статичний масив максимального розміру
int temp[SIZE]; // SIZE визначено в module.h як 4
// Обробляємо кожен стовпець окремо
for (int col = 0; col < n; col++) {
// Копіюємо елементи стовпця у тимчасовий масив
for (int i = 0; i < n; i++) {
temp[i] = mat[i * n + col];
}
// Виконуємо зсув
for (int i = 0; i < n; i++) {
int new_pos = (i + k) % n;
mat[i * n + col] = temp[new_pos];
}
}
}
#ifndef MODULE_H
#define MODULE_H
#include <stdio.h>
#include <stdlib.h>
// Розмір квадратної матриці 4x4
#define SIZE 4
// Мінімальне значення для rand()
#define MIN_RAND -20
// Максимальне значення для rand()
#define MAX_RAND 20
/**
* @brief Циклічно зсуває елементи стовпців матриці вниз на k позицій
* @param mat Вказівник на початок матриці (як одномірного масиву)
* @param n Розмір квадратної матриці (n x n)
* @param k Кількість позицій для зсуву (додатнє значення - вниз)
* @details Функція виконує циклічний зсув елементів кожного стовпця матриці.
*
* @note Функція модифікує вхідну матрицю без повернення нового масиву.
* Якщо k більше за розмір матриці, використовується k % n.
*/
void matrix_shift_bottom(int* mat, int n, int k);
#endif