Объединение и пересечение двух массивов - C (СИ)

Узнай цену своей работы

Формулировка задачи:

доброго времени суток, нужна помощь со следующим кодом. void BuildGroup(int** group, int* count) функция получающая от пользователя размер группы, создающая динамическую группу, и получающая данные( если даные повторяються то она попросит занести их снова). и в конце возвращает группу. int* Union(int* group1, int size1, int* group2, int size2, int* sizeUnion) получает две группы, и возвращает ихнее обьеденение. int* Intersection(int* group1, int size1,int* group2,int size2, int* sizeInter) получает вде группы и возвращает из пересечение. заранее спасибо.

Решение задачи: «Объединение и пересечение двух массивов»

textual
Листинг программы
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
 
void BuildGroup(int** group, int* count) {/*func to buld a array*/
    int size, flag = 0, *arr = NULL,i,j;/*a size of array,the array to check a equel parameters, flag is for true or false*/
    scanf("%d", &size);
    while (flag != 1) {/*if we have true, exit*/
        if (size == 0) {/*the Empty set*/
            printf("Empty Set\n");/*it will be show with 0*/
            flag = 1;/*need to exit from the loop*/
            *group = (int*)calloc(flag, sizeof(int));/*dinamic memory management*/
            if (!*group) {/*check if dinamic memory managment is falce*/
                printf("ERROR!Not Enough memory!\n");
                exit(1);/*exit from the program*/
            }
        }
        else {
            *group = (int*)calloc(size, sizeof(int));/*dinamic memory management*/
            if (!*group) {/*check if dinamic memory managment is falce*/
                printf("ERROR!Not Enough memory!\n");
                exit(1);/*exit from the program*/
            }
            arr = (int*)calloc(size, sizeof(int));/*temp array*/
            if (!arr) {/*check it*/
                printf("ERRPR!Not Enough memonty!\n");
                exit(1);
            }
            printf("Enter a group: ");
            flag = 1;
            for (i = 0; i < size; i++)
            {
                scanf("%d", &(*group)[i]);/*enter a array*/
                arr[i] = (*group)[i];/*for the check a equel parameters*/
                for (j = 0; j < i; j++)/*loop to check a equel parameters*/
                {
                    if (i == 0) {/*because we it's first number on the array*/
                        break;
                    }/*exit from the loop*/
                    if ((*group)[i] == arr[j]) {/*if parameters are equel*/
                        printf("Wrong Input,Try Again\n");/*the user enter a wrong input*/
                        flag = 0;/*so flag is flase*/
                        free(arr);/*delete a array*/
                        free(*group);/*delete a array*/
                        break;/*exit from the loop*/
                    }
                    else
                        flag = 1;/*if input is corrent, so flag is true*/
                }
                if (flag == 0) {
                    getchar(stdin);
                    break;/*exit*/
                }
            }
        }
    }
    free(arr);/*delete temp array*/
    *count = size;/*the size of the new array*/
}
 
int* Union(int* group1, int size1, int* group2, int size2, int* sizeUnion) {
    int count=size1+size2,j=0,i=0,k=0,flag=0,*UnionArr=NULL,size;
    if (size1 == 0) {/*if we have a Empty set*/
        *sizeUnion = size2;/*A union 0 = A*/
        return group2;
    }
    else if (size2 == 0) {
        *sizeUnion = size2;/*B union 0 = B*/
        return group1;
        }
    else {
        size = (size1 >= size2) ? size1 : size2;/*if size1>size2,size = size1,else size=size2*/
        for (i = 0; i < size; i++)/*loop to check a equel parameters*/
        {
            if (size == size1) {/*if the bigest array is group1*/
                for (j = i - 1; j < size2; j++)/*check a group2*/
                {
                    if (group1[i] != group2[j])/*if parameters are different, up the j*/
                        continue;
                    else
                        count--;/*esle down a sum of number of parameters of two groups*/
                }
            }
            else if (size == size2) {/*if the bigest array is group2*/
                for (j = i - 1; j < size2; j++)
                {
                    if (group2[i] != group1[j])
                        continue;
                    else
                        count--;
                }
            }
        }
        UnionArr = (int*)calloc(count, sizeof(int));/*build union array*/
        flag = 0;/*true false parameter*/
        if (size == size1) {/*if bigest array is group1*/
            for (i = 0; i < size1;i++)/*loop to add parameters for union array*/
            {
                UnionArr[i] = group1[i];/*coppy a bigest group to Union*/
            }
            for (j = 0; j < size2; j++)/*check a parameters of smallest group*/
            {
                for (k = j - 1; k < size1; k++)/*check a parameters of Union*/
                {
                    if (group2[j] == UnionArr[k]) {/*if the parameters are equel, flag is false, and exit from the loop*/
                        flag = 0;
                        break;
                    }
                    else
                        flag = 1;
                }
                if (flag == 1) {
                    UnionArr[i] = group2[j];
                    i++;
                }
            }
        }
        else if (size == size2) {/*if bigest array is group1*/
            for (i = 0; i < size2;i++)/*loop to add parameters for union array*/
            {
                UnionArr[i] = group2[i];/*coppy a bigest group to Union*/
            }
            for (j = 0; j < size1; j++)/*check a parameters of smallest group*/
            {
                for (k = j - 1; k < size2; k++)/*check a parameters of Union*/
                {
                    if (group1[j] == UnionArr[k]) {/*if the parameters are equel, flag is false, and exit from the loop*/
                        flag = 0;
                        break;
                    }
                    else
                        flag = 1;
                }
                if (flag == 1) {
                    UnionArr[i] = group1[j];
                    i++;
                }
            }
        }
        *sizeUnion = count;
        return UnionArr;
    }
}
 
int* Intersection(int* group1, int size1, int* group2, int size2, int* sizeInter) {
    int size,count=0,*InterArr = NULL, i, j,k=0,flag=0;
    if (size1 == 0) {/*if we have a empty set*/
        *sizeInter = size1+1;/*to output a 0*/
        return group1;/*A inter 0 = 0*/
    }
    else if (size2 == 0) {
        *sizeInter = size2+1;
        return group2;/*B inter 0 = 0*/
    }
    else {
        size = (size1 >= size2) ? size1 : size2;/*if size1>size2,size = size1,else size=size2*/
        if (size == size1) {/*the bigest size*/
            for (i = 0; i < size; i++)
            {
                for (j = 0; j < size2; j++)
                {
                    if (group1[i] == group2[j])/*if the parameters are equel*/
                        count++;/*up*/
                }
            }
        }
        else if (size == size2) {/*the bigest size*/
            for (i = 0; i < size; i++)
            {
                for (j = 0; j < size1; j++)
                {
                    if (group2[i] == group1[j])
                        count++;
                }
            }
        }
        InterArr = (int*)calloc(count, sizeof(int));/*build new array*/
        if (size == size1) {
            for (i = 0; i < size2; i++)
            {
                for (j = 0; j < size1; j++)
                {
                    if (group1[j] == group2[i]) {
                        InterArr[k] = group1[j];
                        k++;
                    }
                }
            }
        }
        else if (size == size2) {
            for (i = 0; i < size1; i++)
            {
                for (j = 0; j < size2; j++)
                {
                    if (group2[j] == group1[i]) {
                        InterArr[k] = group2[j];
                        k++;
                    }
                }
            }
        }
        *sizeInter = count;
        return InterArr;
    }
}
 
int main() {
    int *group1 = NULL,*group2=NULL, size1, size2, sizeUnion,*UnionArr=NULL,*InterArr=NULL,sizeInter;
    printf("Enter a size of first group: ");
    BuildGroup(&group1, &size1);
    printf("Enter a size of second group: ");
    BuildGroup(&group2, &size2);
    UnionArr = Union(group1, size1, group2, size2, &sizeUnion);
    printf("The Union of the groups is:{ ");
    for (int i = 0; i < sizeUnion; i++)
    {
        printf("%d ", UnionArr[i]);
    }
    printf("}\n");
    InterArr=Intersection(group1,size1,group2,size2,&sizeInter);
    printf("The Inetsection of the groups is:{ ");
    for (int i = 0; i < sizeInter; i++)
    {
        printf("%d ", InterArr[i]);
    }
    printf("}\n");
    return 0;
}

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


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

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

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