Програма виснет при вызове функций find_intersection - C (СИ)
Формулировка задачи:
доброго времени суток, возникла проблема с програмкой
програма виснет при вызове функций
#include <stdio.h> #include <stdlib.h> #include <time.h> #define MAX_VALUE 100 void print_menu(); void back_to_main_menu(); void selection (int *select); void set_size (int *size); void create_array (int size, int **data); void fill_array (int size, int *data); void print_array (int size, int *data); int comparison(const void *element1, const void *element2); int find_intersection (int arrsize1, int arrsize2, int *array1, int *array2, int **intersection); int main() { srand(time(NULL)); int arrsize1 = 0; int arrsize2 = 0; int select = 0; int number_of_elements = 0; int *array1 = NULL; int *array2 = NULL; int *intersection = NULL; Begining : system("cls"); printf("Current data:\n"); printf("Size of first Array: %d\n",arrsize1); printf("Size of second Array: %d\n\n", arrsize2); print_menu(); printf("Enter your option\n"); selection(&select); switch(select) { case 1: printf("set size of first array:\n"); set_size(&arrsize1); printf("set size of second array:\n"); set_size(&arrsize2); back_to_main_menu(); goto Begining; break; case 2: create_array(arrsize1, &array1); create_array(arrsize2, &array2); back_to_main_menu(); goto Begining; break; case 3: fill_array(arrsize1, array1); fill_array(arrsize2, array2); back_to_main_menu(); goto Begining; break; case 4: printf("\nFirst array:\n"); print_array(arrsize1, array1); printf("\nSecond array:\n"); print_array(arrsize2, array2); back_to_main_menu(); goto Begining; break; case 5: if(array1 != NULL && array2 != NULL) { qsort(array1, arrsize1, sizeof(int), comparison); qsort(array2, arrsize2, sizeof(int), comparison); printf("arrays sorted successfully\n"); back_to_main_menu(); goto Begining; } else printf("Arrays are empty!\n"); back_to_main_menu(); goto Begining; break; case 6: number_of_elements = find_intersection(arrsize1, arrsize2, array1, array2, &intersection); back_to_main_menu(); goto Begining; break; case 7: system("cls"); printf("intersection between two arrays is:\n"); if (number_of_elements != 0) { print_array(number_of_elements, intersection); back_to_main_menu(); goto Begining; } else { printf("there is no Intersection between arrays\n"); back_to_main_menu(); goto Begining; } default: break; case 8: exit(0); break; } free(array1); free(array2); free(intersection); return 0; } void print_menu() { printf("================MENU===============\n\n"); printf("1.Set size\n"); printf("2.Create array\n"); printf("3.Fill array\n"); printf("4.View data\n"); printf("5.Sort arrays\n"); printf("6.Find intersection\n"); printf("7.Print answer\n"); printf("8.Exit\n\n"); } void back_to_main_menu() { printf("press any key to get back to main menu\n"); getchar(); } void selection(int *select) { while (1) { if ((scanf("%d", select) == 1) && (getchar() == '\n') && ((*select > 0) || (*select <= 8))) break; else { printf("\nWrong input!!!\n"); while (getchar() != '\n') {} } } } void set_size(int *size) { printf("Enter positive integer number to define array size: \n"); while (1) { if ((scanf("%d", size) == 1) && (getchar() == '\n') && (*size > 0)) break; else { printf("\nWrong input!!!\n"); printf("Size of array must be positive integer number!\n"); while (getchar() != '\n') {} } } } void create_array(int size, int **data) { if(*data == NULL && size > 0) { *data = malloc(size * sizeof(int)); printf("Memory allocated successfully\n"); } else if (*data != NULL && size > 0) { *data = realloc(data, size); printf("Memory reallocated successfully\n"); } else printf("Unable to allocate memory!, undefined array size\n"); } void fill_array(int size, int *data) { if (data != NULL) { int fill_option; printf("Choose option, how array will be filled: \n"); printf("1. Automatically by random numbers.\n"); printf("2. Manual input.\n"); printf("your option: "); while (1) { if ((scanf("%d", &fill_option) == 1) && ((fill_option == 1) || (fill_option == 2)) && (getchar() == '\n')) break; else { printf("\nWrong input!!!\n"); printf("Option must be 1 or 2\n"); while (getchar() != '\n') { } } } switch (fill_option) { case 1: printf("\nyour array will be filled automatically by random numbers \n"); for (int i = 0; i < size; i++) { data[i] = rand()%MAX_VALUE; } printf("\nArray successfully filled\n"); break; case 2: printf("\nYour array will be filled manually: \n"); for (int i = 0; i < size; i++) { while(1) { printf("\n enter value of %d element of array: ", i + 1); if((scanf("%d", &data[i]) == 1) && (getchar()=='\n') ) { // continue; break; } else { printf("\nWrong input!\n"); printf("\nArray member must be a number!\n"); while(getchar() != '\n') { } } } } printf("\nArray successfully filled\n"); break; default: break; } } else printf("Memory for array is undeclared\n"); } void print_array (int size, int *data) { if(data != NULL) { for (int i=0; i<size; i++) printf("%d\t",data[i]); } else printf("Array is undeclared\n"); } int comparison(const void *element1, const void *element2) { return(*(int*)element1 - *(int*)element2); } int find_intersection (int arrsize1, int arrsize2, int *array1, int *array2, int **intersection) { int i=0, j=0, k=1; //i - counter for array1, j - counter for array2, k - counter for intersection_array. if(array1 != NULL && array2 != NULL) { while((i < arrsize1)&&(j < arrsize2)) { intersection = realloc(intersection, k*sizeof(int)); if(array1[i] < array2[j]) { i++; } else if (array1[i] > array2[j]) { j++; } else { *intersection[k] = array1[i]; i++; j++; k++; } } } else printf("unable to find intersection\n"); return k; }
find_intersection
, помогите найти и исправить причину зависона. о самой програме, эта програма создает 2 массива (размер, способ заполнения выбирает пользователь на своё усмотрения) цель програмы состойт в том чтоб наити пересечение этих 2ух массив, и запольнит третий массив обшими элементами и отпечатать ихРешение задачи: «Програма виснет при вызове функций find_intersection»
textual
Листинг программы
int find_intersection (int arrsize1, int arrsize2, int *array1, int *array2, int **pintersection) { int *intersection = NULL; int i=0, j=0, k=0; //i - counter for array1, j - counter for array2, k - counter for intersection_array. if(array1 != NULL && array2 != NULL) { while((i < arrsize1)&&(j < arrsize2)) { intersection = realloc(intersection, (k+1)*sizeof(int)); if(array1[i] < array2[j]) { i++; } else if (array1[i] > array2[j]) { j++; } else { intersection[k] = array1[i]; i++; j++; k++; } } } else printf("unable to find intersection\n"); // возвращаем из функции массив *pintersection = intersection; return k; }
Объяснение кода листинга программы
Список элементов кода:
- Тип функции: int find_intersection (int arrsize1, int arrsize2, int array1, int array2, int **pintersection)
- Передаваемые параметры: arrsize1, arrsize2, array1, array2, pintersection
- Тип возвращаемого значения: int
- Проверка на ошибки: проверка на NULL для array1 и array2
- Операции с памятью: выделение памяти для intersection с помощью realloc, если intersection == NULL
- Условные операторы: проверка условий для array1[i] < array2[j] и array1[i] > array2[j]
- Операции с массивами: запись значения array1[i] в intersection[k]
- Управление циклами: цикл while для прохода по обоим массивам
- Вывод: сообщение об ошибке, если не удалось найти пересечение
- Возвращаемое значение: значение k, которое является размером найденного пересечения
- Выделение памяти: выделение памяти для intersection с помощью realloc, если intersection == NULL
- Возвращаемое значение: адрес intersection, который возвращается в pintersection
- Операции с памятью: освобождение памяти для intersection с помощью free, если intersection != NULL
- Вывод: сообщение об успешном нахождении пересечения
- Возвращаемое значение: значение k, которое является размером найденного пересечения
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д