/**
* @file main.c
* @author Нездоймишапка А.О., гр. 515б
* @date 13 березня 2024
* @brief Лабораторна робота № 4, варіант 15
*
* Функції. Швидке сортування. Робота з відлагоджувачем. Завдання 1
*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <locale.h>
#define N 10
// Функція швидкого сортування
void quicksort(int a[], int low, int high);
// Функція розділу масива
int split(int a[], int low, int high);
// Функція для заповнення масиву випадковими числами
void fill_random(int arr[], int n) {
srand((unsigned int)time(NULL)); // Приведення time_t до unsigned int
for (int i = 0; i < n; i++) {
arr[i] = rand() % 100; // обмеження чисел до 0-99 для простоти
}
}
// Функція для введення масиву користувачем з перевіркою на коректність введення
void fill_from_user(int arr[], int n) {
char buffer[100]; // буфер для зчитування рядка
int success; // змінна для перевірки успішності перетворення
printf("Введіть %d чисел:\n", n);
for (int i = 0; i < n; i++) {
do {
printf("Введіть число %d: ", i + 1);
if (fgets(buffer, sizeof(buffer), stdin) == NULL) {
printf("Помилка зчитування. Спробуйте ще раз.\n");
success = 0; // не вдалося зчитати рядок
} else {
success = sscanf(buffer, "%d", &arr[i]); // спроба перетворення рядка в число
if (success != 1) {
printf("Некоректне введення. Введіть ціле число.\n");
// Очищення буфера введення до нового рядка
int c;
while ((c = getchar()) != '\n' && c != EOF);
}
}
} while (success != 1);
}
}
int main() {
int a[N], i, choice;
printf("Оберіть метод заповнення масиву:\n");
printf("1. Випадковими числами\n");
printf("2. Введенням користувачем\n");
scanf("%d", &choice);
// Очищення залишкового символу нового рядка після scanf
int c;
while ((c = getchar()) != '\n' && c != EOF);
switch (choice) {
case 1:
fill_random(a, N);
break;
case 2:
fill_from_user(a, N);
break;
default:
printf("Некоректний вибір.\n");
return 1;
}
printf("Вхідний масив: ");
for (i = 0; i < N; i++)
printf("%d ", a[i]);
printf("\n");
quicksort(a, 0, N - 1);
printf("Відсортований масив за спаданням: ");
for (i = 0; i < N; i++)
printf("%d ", a[i]);
printf("\n");
return 0;
}
// Функція швидкого сортування
void quicksort(int a[], int low, int high) {
int middle;
if (low >= high) return;
middle = split(a, low, high);
quicksort(a, low, middle - 1);
quicksort(a, middle + 1, high);
}
// Функція розділу масива
int split(int a[], int low, int high) {
int part_element = a[low];
for (;;) {
while (low < high && part_element >= a[high])
high--;
if (low >= high) break;
a[low++] = a[high];
while (low < high && a[low] >= part_element)
low++;
if (low >= high) break;
a[high--] = a[low];
}
a[high] = part_element;
return high;
}