Тема: Не розумію у чому помилка
Добрий день! Я зараз пишу код для сортування злиттям (Боуза-Нельсона та Неймановське), виникла така проблема: мені потрібно зробити аналіз роботи алгоритмів при різних типів даних. Вирішила використовувати char, int та float, але при виведенні масиву (неважливо якого типу) нічого не виводиться, тільки порожнеча. Підкажіть будь ласка, де саме у мене помилка? Перевіряла все - заповнення, створення - виділення пам'яті, начебто все ок.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
// Глобальні змінні для коректної роботи
int arr_size, arr_c, arr_f;
int *array;
char *arr;
float *arr_flo;
int data_type;
void merge(int arr[], int l, int m, int r) {
int i, j, k;
int n1 = m - l + 1;
int n2 = r - m;
int Ar[n1], Br[n2]; // тимчасові підмасиви
for (i = 0; i < n1; i++)
Ar[i] = arr[l + i];
for (j = 0; j < n2; j++)
Br[j] = arr[m + 1 + j];
i = 0;
j = 0;
k = l;
while (i < n1 && j < n2) {
if (Ar[i] <= Br[j]) {
arr[k] = Ar[i];
i++;
}
else {
arr[k] = Br[j];
j++;
k++;
}
}
while (i < n1) {
arr[k] = Ar[i];
i++;
k++;
}
while (j < n2) {
arr[k] = Br[j];
j++;
k++;
}
}
// функція сортування злиттям
void mergeSort(int arr[], int l, int r) {
if (l < r) {
int m = l + (r - l) / 2;
mergeSort(arr, l, m);
mergeSort(arr, m + 1, r);
merge(arr, l, m, r); // злиття всіх половин
}
}
void boseNelsonSort(int arr[], int n) {
for (int groupSize = 1; groupSize < n; groupSize *= 2) {
for (int left = 0; left < n-1; left += 2*groupSize) {
int mid = left + groupSize - 1;
int right = (left + 2*groupSize - 1 < n-1) ? (left + 2*groupSize - 1) : (n-1);
merge(arr, left, mid, right);
}
}
}
// Вивід масивів 3 типів
void printArray(int A[], int size) {
int i;
for (i = 0; i < size; i++) {
printf("%d ", A[i]);
}
printf("\n");
}
void printChar(char A[], int size) {
for (int i = 0; i < size; i++) {
printf("%c ", A[i]);
}
printf("\n");
}
void printFloat(float A[], int size) {
for (int i = 0; i < size; i++) {
printf("%.2f ", A[i]);
}
printf("\n");
}
// це створення int масиву
int *create_int(int *arr_size) {
system("cls");
printf("\n---------------------");
printf("\nВведіть розмір масиву: ");
scanf("%d", arr_size);
int *arr = (int *)malloc((*arr_size) * sizeof(int));
srand(time(NULL));
for (int i = 0; i < *arr_size; i++) {
arr[i] = rand() % 500;
}
return arr;
}
// створення char масиву
char *create_char(int *arr_c) {
system("cls");
printf("\n---------------------");
printf("\nВведіть розмір масиву: ");
scanf("%d", arr_c);
char *arrchar = (char *)malloc((*arr_c) * sizeof(char));
srand(time(NULL));
for(int i = 0; i < *arr_c; i++) {
arrchar[i] = rand() % 26;
}
return arrchar;
}
// для створення float масиву
float *create_float(int *arr_f) {
system("cls");
printf("\n---------------------");
printf("\nВведіть розмір масиву: ");
scanf("%d", arr_f);
float *arr_flo = (float *)malloc((*arr_f) * sizeof(float));
srand(time(NULL));
for(int i = 0; i < *arr_f; i++) {
arr_flo[i] = 0.1 * (rand() % 1001);
}
return arr_flo;
}
void menu() {
int ch_1;
printf("\n------------------");
printf("\n-------МЕНЮ-------");
printf("\nЯкий тип даних використовувати");
printf("\n|1| - Int\n|2| - Char\n|3| - Float\n");
printf("\nВаш вибір --> ");
scanf("%d", &ch_1);
data_type = ch_1;
switch(ch_1) {
case 1:
if (array != NULL) {
free(array);
}
array = create_int(&arr_size);
break;
case 2:
if (arr != NULL) {
free(arr);
}
arr = create_char(&arr_c);
break;
case 3:
if (arr_flo != NULL) {
free(arr_flo);
}
arr_flo = create_float(&arr_f);
break;
default:
printf("\nОберіть тип даних.");
break;
}
}
int main() {
system("chcp 65001");
int arr_size, arr_c, arr_f;
int choice;
// Для уникнення помилок та для ініціалізації покажчиків
int *array = NULL;
char *arr = NULL;
float *arr_flo = NULL;
menu();
while (1) {
printf("\n|1| - Сортування злиттям Неймана\n|2| - Сортування злиттям Боуза-Нельсона\n|3| - Перегляд масиву\n|4| - Назад\n|5| - Вихід\n");
printf("\nВаш вибір ---> ");
scanf("%d", &choice);
system("cls");
switch (choice) {
case 1:
mergeSort(array, 0, arr_size - 1);
printf("\n---------------------");
printf("\nВідсортований масив:\n\n");
printArray(array, arr_size);
break;
case 2:
boseNelsonSort(array, arr_size);
printf("\n---------------------");
printf("\nВідсортований масив:\n\n");
printArray(array, arr_size);
break;
case 3:
if (data_type == 1) {
printf("\nПочатковий масив:\n\n");
printArray(array, arr_size);
}
else if (data_type == 2) {
printf("\nПочатковий масив:\n\n");
printChar(arr, arr_c);
}
else if (data_type == 3) {
printf("\nПочатковий масив:\n\n");
printFloat(arr_flo, arr_f);
}
break;
case 4:
if(array != NULL) {
free(array);
}
else if(arr != NULL) {
free(arr);
}
else if(arr_flo != NULL) {
free(arr_flo);
}
menu();
break;
case 5:
exit(0);
break;
default:
printf("\nВиберіть дію із запропонованих..\n\n");
break;
}
}
free(array);
return 0;
}