Объединение и пересечение двух массивов - 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; }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д