Програма виснет при вызове функций 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;
}

Объяснение кода листинга программы

Список элементов кода:

  1. Тип функции: int find_intersection (int arrsize1, int arrsize2, int array1, int array2, int **pintersection)
  2. Передаваемые параметры: arrsize1, arrsize2, array1, array2, pintersection
  3. Тип возвращаемого значения: int
  4. Проверка на ошибки: проверка на NULL для array1 и array2
  5. Операции с памятью: выделение памяти для intersection с помощью realloc, если intersection == NULL
  6. Условные операторы: проверка условий для array1[i] < array2[j] и array1[i] > array2[j]
  7. Операции с массивами: запись значения array1[i] в intersection[k]
  8. Управление циклами: цикл while для прохода по обоим массивам
  9. Вывод: сообщение об ошибке, если не удалось найти пересечение
  10. Возвращаемое значение: значение k, которое является размером найденного пересечения
  11. Выделение памяти: выделение памяти для intersection с помощью realloc, если intersection == NULL
  12. Возвращаемое значение: адрес intersection, который возвращается в pintersection
  13. Операции с памятью: освобождение памяти для intersection с помощью free, если intersection != NULL
  14. Вывод: сообщение об успешном нахождении пересечения
  15. Возвращаемое значение: значение k, которое является размером найденного пересечения

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 3.909 из 5
Похожие ответы