Code:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
float *culc_U (const float *a, const float *b, const float *c , int size_a, int size_b, int size_c, int *pSize) // calculate unification
{
float *temp, *result, temp_v = 0;
int i, j,k,l, counter = 0;
temp = (float *) malloc ((size_a + size_b+ size_c) * sizeof(float));
if (temp == NULL)
{
printf("Failed to allocate memory\n");
exit(1);
}
for (i=0; i<size_a; i++)
{
temp[i] = a[i];
}
j = i;
for (i=0; i<size_b; i++)
{
temp[j] = b[i];
j++;
}
l = i;
for (i=0; i<size_c; i++)
{
temp[k] = b[i];
k++;
}
for (i=0; i<(size_a + size_b + size_c); i++) // sign with zero on the returning values
{
for (j=i+1; j<(size_a + size_b+size_c); j++)
{
if (temp[i] == temp[j])
{
temp[j] = 0;
}
}
}
for (i=0; i<(size_a + size_b + size_c); i++) // count how many numbers returning
{
if (temp[i] != 0)
{
counter++;
}
}
result = (float *) malloc (counter * sizeof(float));
if (result == NULL)
{
printf("Failed to allocate memory\n");
exit(1);
}
j=0;
for (i=0; i<(size_a + size_b + size_c); i++) // copying the array without the zero
{
if (temp[i] != 0)
{
result[j] = temp[i];
j++;
}
}
for (i=0; i<counter; i++) //bubble sort
{
for (j=i+1; j<counter; j++)
{
if (result[i] > result[j])
{
temp_v = result[i];
result[i] = result[j];
result[j] = temp_v;
}
}
}
pSize[0] = counter; // return by pointer the size of the result array
if (counter == 0) // case that the group is empty
{
result = NULL;
}
return result;
}
float *culc_C (const float *a, const float *b, int size_a, int size_b, int *pSize)
{
float *temp, *result, temp_v = 0;
int i, j, counter = 0;
temp = (float *) malloc ((size_a + size_b) * sizeof(float));
if (temp == NULL)
{
printf("Failed to allocate memory\n");
exit(1);
}
for (i=0; i<size_a; i++) //copy arr a to temp
{
temp[i] = a[i];
}
j = i;
for (i=0; i<size_b; i++) //copy arr b to temp
{
temp[j] = b[i];
j++;
}
for (i=0; i<(size_a + size_b); i++) // sign with zero on the returning values to see the cutting
{
counter = 0;
for (j=i+1; j<(size_a + size_b); j++)
{
if (temp[i] == temp[j])
{
counter++;
}
}
if (counter == 0)
{
temp[i] = 0;
}
}
counter = 0;
for (i=0; i<(size_a + size_b); i++) //counting the size of the array
{
if (temp[i] != 0)
{
counter ++;
}
}
result = (float *) malloc (counter * sizeof(float));
if (result == NULL)
{
printf("Falied to allocate memory\n");
exit(1);
}
j=0;
for (i=0; i<(size_a + size_b); i++) //copying the result of the cutting to an array
{
if (temp[i] != 0)
{
result[j] = temp[i];
j++;
}
}
for (i=0; i<counter; i++) //bubble sort
{
for (j=i+1; j<counter; j++)
{
if (result[i] > result[j])
{
temp_v = result[i];
result[i] = result[j];
result[j] = temp_v;
}
}
}
pSize[0] = counter; // return by pointer the size of the result array
if (counter == 0) // case that the group is empty
{
result = NULL;
}
return result;
}
float *culc_Dif (const float *a, const float *b, int size_a, int size_b, int *pSize)
{
float *temp, *temp_x, *result, temp_v = 0;
int i, j, counter = 0;
temp = culc_C (a, b, size_a, size_b, pSize); // the array of the cutting
temp_x = (float *) malloc (size_a * sizeof(float));
if (temp_x == NULL)
{
printf("Failed to allocate memory\n");
exit(1);
}
for (i=0; i<size_a; i++) // copy "a" array
{
temp_x[i] = a[i];
}
for (i=0; i<size_a; i++) // set zero on repeated numbers
{
for (j=0; j<pSize[0]; j++)
{
if (temp_x[i] == temp[j])
{
temp_x[i] = 0;
}
}
}
for (i=0; i<size_a; i++) // count without the zero
{
if (temp_x[i] != 0)
{
counter++;
}
}
result = (float *) malloc (counter * sizeof(float));
if (result == NULL)
{
printf("Failed to allocate memory\n");
exit(1);
}
j=0;
for (i=0; i<size_a; i++) // copying the array
{
if (temp_x[i] != 0)
{
result[j] = temp_x[i];
j++;
}
}
for (i=0; i<counter; i++) //bubble sort
{
for (j=i+1; j<counter; j++)
{
if (result[i] > result[j])
{
temp_v = result[i];
result[i] = result[j];
result[j] = temp_v;
}
}
}
pSize[0] = counter; // return by pointer the size of the result array
if (counter == 0) // case that the group is empty
{
result = NULL;
}
return result;
}
float *culc_SymDif (const float *a, const float *b, int size_a, int size_b, int *pSize)
{
float *temp, *temp2, *result, temp_v = 0;
int i, j, counter;
temp = culc_C (a, b, size_a, size_b, pSize);
temp2 = (float *) malloc ((size_a + size_b) * sizeof (float));
if (temp2 == NULL)
{
printf("Failed to allocate memory");
exit(1);
}
for (i=0; i<size_a; i++) //copy the 2 arrays
{
temp2[i] = a[i];
}
j = i;
for (i=0; i<size_b; i++)
{
temp2[j] = b[i];
j++;
}
for (i=0; i<(size_a + size_b); i++) // sign with zero
{
for (j=0; j<pSize[0]; j++)
{
if (temp2[i] == temp[j])
{
temp2[i] = 0;
}
}
}
counter = 0;
for (i=0; i<(size_a + size_b); i++) // counting the array without the zero
{
if (temp2[i] != 0)
{
counter++;
}
}
result = (float *) malloc (counter * sizeof (float));
if (result == NULL)
{
printf("Failed to allocate memory");
exit(1);
}
j = 0;
for (i=0; i<(size_a + size_b); i++) // copy the variables without the zero to the new array
{
if (temp2[i] != 0)
{
result[j] = temp2[i];
j++;
}
}
for (i=0; i<counter; i++) //bubble sort
{
for (j=i+1; j<counter; j++)
{
if (result[i] > result[j])
{
temp_v = result[i];
result[i] = result[j];
result[j] = temp_v;
}
}
}
pSize[0] = counter; // return by pointer the size of the result array
if (counter == 0) // case that the group is empty
{
result = NULL;
}
return result;
}
void main()
{
FILE *fp1;
FILE *fp2;
FILE *fp3;
int j, groups_num, size_u, size_x, size_y, size_z, size_exp = 0, size_t = 0, *p_size; // defining variables of how many groups and their size.
char Gu, Gx, Gy, Gz, exp, *expression; // variables that contain the group name. and the expression
float read = 0, *u_arr, *x_arr, *y_arr, *z_arr ,*t_arr; // assist variable and the arrays
fp1 = fopen ("C:\\groups.txt", "r");
if (fp1 == NULL)
{
printf("Error opening file\n");
exit(1);
}
fp2 = fopen ("C:\\expression.txt", "r");
if (fp2 == NULL)
{
printf("Error opening file\n");
fclose (fp1);
exit(1);
}
fp3 = fopen ("C:\\output.txt", "w");
if (fp3 == NULL)
{
printf("Error opening file\n");
fclose (fp1);
fclose(fp2);
exit(1);
}
fscanf (fp1,"%d\n%c%d", &groups_num ,&Gu , &size_u);
u_arr = (float *) calloc (size_u ,sizeof(float)); // alocate memory and zero all the array
if (u_arr == NULL)
{
printf("Failed to allocate memory!!!");
exit(1);
}
for (int i=0; i<size_u && !feof(fp1); i++) // stop condition - size and end line
{
fscanf(fp1, "%f", &read);
u_arr[i] = read;
}
fscanf(fp1, "\r%c%d", &Gx, &size_x);
x_arr = (float *) calloc (size_x, sizeof(float));
if (x_arr == NULL)
{
printf("Failed to allocate memory!!!");
exit(1);
}
for (int i=0; i<size_x && !feof(fp1); i++)
{
fscanf(fp1, "%f", &read);
x_arr[i] = read;
}
fscanf(fp1, "\r%c%d", &Gy, &size_y);
y_arr = (float *) calloc (size_y, sizeof(float));
if (y_arr == NULL)
{
printf("Failed to allocate memory!!!");
exit(1);
}
for (int i=0; i<size_y && !feof(fp1); i++)
{
fscanf(fp1, "%f", &read);
y_arr[i] = read;
}
fscanf(fp1, "\r%c%d", &Gz, &size_z);
z_arr = (float *) calloc (size_z, sizeof(float));
if (z_arr == NULL)
{
printf("Failed to allocate memory!!!");
exit(1);
}
for (int i=0; i<size_z && !feof(fp1); i++)
{
fscanf(fp1, "%f", &read);
z_arr[i] = read;
}
fscanf(fp2, "%c", &exp);
expression = (char *) malloc (1 * sizeof(char));
if (expression == NULL)
{
printf("Failed to allocate memory");
exit(1);
}
expression[0] = exp;
for (int i=0; !feof(fp2); i++)
{
char *temp;
temp = expression;
size_exp++;
expression = (char *) malloc ((size_exp + 1) * sizeof(char));
if (expression == NULL)
{
printf("Failed to allocate memory!!!");
exit(1);
}
for (j=0; j<size_exp; j++)
{
expression[j] = temp[j];
}
fscanf(fp2, "%c", &exp);
expression[j] = exp;
free(temp);
}
p_size = (int *) malloc (1 * sizeof(int));
if (p_size == NULL)
{
printf("Failed to allocate memory\n");
exit(1);
}
for (int i=0; i<size_exp; i++)
{
char ch = 0;
ch = expression[i];
if (ch == 'U') // unification
{
if (((expression[i-1] == 'x') && (expression[i+1] == 'y') && (expression[i+1] == 'z')) || ((expression[i-1] == 'y') && (expression[i+1] == 'x') && (expression[i+1] == 'z')) || ((expression[i-1] == 'z') && (expression[i+1] == 'x') && (expression[i+1] == 'y')))
{
t_arr = culc_U (x_arr, y_arr, z_arr , size_x, size_y, size_z ,p_size);
expression[i+1] = 't';
}
else if (((expression[i-1] == 'x') && (expression[i+1] == 'u')) || ((expression[i-1] == 'u') && (expression[i+1] == 'x')))
{
t_arr = culc_U (x_arr, u_arr, size_x, size_u, p_size);
expression[i+1] = 't';
}
else if (((expression[i-1] == 'y') && (expression[i+1] == 'u')) || ((expression[i-1] == 'u') && (expression[i+1] == 'y')))
{
t_arr = culc_U (y_arr, u_arr, size_y, size_u, p_size);
expression[i+1] = 't';
}
else if (((expression[i-1] == 'z') && (expression[i+1] == 'u')) || ((expression[i-1] == 'u') && (expression[i+1] == 'z')))
{
t_arr = culc_U (z_arr, u_arr, size_z, size_u, p_size);
expression[i+1] = 't';
}
else if (((expression[i-1] == 't') && (expression[i+1] == 'x')) || ((expression[i-1] == 'x') && (expression[i+1] == 't')))
{
t_arr = culc_U(t_arr, x_arr, size_t, size_x, p_size);
expression[i+1] = 't';
}
else if (((expression[i-1] == 't') && (expression[i+1] == 'y')) || ((expression[i-1] == 'y') && (expression[i+1] == 't')))
{
t_arr = culc_U(t_arr, y_arr, size_t, size_y, p_size);
expression[i+1] = 't';
}
else if (((expression[i-1] == 't') && (expression[i+1] == 'z')) || ((expression[i-1] == 'z') && (expression[i+1] == 't')))
{
t_arr = culc_U(t_arr, z_arr, size_t, size_z, p_size);
expression[i+1] = 't';
}
else
{
if (((expression[i-1] == 't') && (expression[i+1] == 'u')) || ((expression[i-1] == 'u') && (expression[i+1] == 't')))
{
t_arr = culc_U(t_arr, u_arr, size_t, size_u, p_size);
expression[i+1] = 't';
}
}
}
if (ch == '^') //cutting
{
if (((expression[i-1] == 'x') && (expression[i+1] == 'y')) || ((expression[i-1] == 'y') && (expression[i+1] == 'x')))
{
t_arr = culc_C (x_arr, y_arr, size_x, size_y, p_size);
expression[i+1] = 't';
}
else if (((expression[i-1] == 'x') && (expression[i+1] == 'u')) || ((expression[i-1] == 'u') && (expression[i+1] == 'x')))
{
t_arr = culc_C (x_arr, u_arr, size_x, size_u, p_size);
expression[i+1] = 't';
}
else if (((expression[i-1] == 'y') && (expression[i+1] == 'u')) || ((expression[i-1] == 'u') && (expression[i+1] == 'y')))
{
t_arr = culc_C (y_arr, u_arr, size_y, size_u, p_size);
expression[i+1] = 't';
}
else if (((expression[i-1] == 't') && (expression[i+1] == 'x')) || ((expression[i-1] == 'x') && (expression[i+1] == 't')))
{
t_arr = culc_C (t_arr, x_arr, size_t, size_x, p_size);
expression[i+1] = 't';
}
else if (((expression[i-1] == 't') && (expression[i+1] == 'y')) || ((expression[i-1] == 'y') && (expression[i+1] == 't')))
{
t_arr = culc_C (t_arr, y_arr, size_t, size_y, p_size);
expression[i+1] = 't';
}
else
{
if (((expression[i-1] == 't') && (expression[i+1] == 'u')) || ((expression[i-1] == 'u') && (expression[i+1] == 't')))
{
t_arr = culc_C (t_arr, u_arr, size_t, size_u, p_size);
expression[i+1] = 't';
}
}
}
if (ch == '-') // difference
{
if ((expression[i-1] == 'x') && (expression[i+1] == 'y'))
{
t_arr = culc_Dif (x_arr, y_arr, size_x, size_y, p_size);
expression[i+1] = 't';
}
else if ((expression[i-1] == 'y') && (expression[i+1] == 'x'))
{
t_arr = culc_Dif (y_arr, x_arr, size_y, size_x, p_size);
expression[i+1] = 't';
}
else if ((expression[i-1] == 'x') && (expression[i+1] == 'u'))
{
t_arr = culc_Dif (x_arr, u_arr, size_x, size_u, p_size);
expression[i+1] = 't';
}
else if ((expression[i-1] == 'u') && (expression[i+1] == 'x'))
{
t_arr = culc_Dif (u_arr, x_arr, size_u, size_x, p_size);
expression[i+1] = 't';
}
else if ((expression[i-1] == 'y') && (expression[i+1] == 'u'))
{
t_arr = culc_Dif (y_arr, u_arr, size_y, size_u, p_size);
expression[i+1] = 't';
}
else if ((expression[i-1] == 'u') && (expression[i+1] == 'y'))
{
t_arr = culc_Dif (u_arr, y_arr, size_u, size_y, p_size);
expression[i+1] = 't';
}
else if ((expression[i-1] == 't') && (expression[i+1] == 'x'))
{
t_arr = culc_Dif (t_arr, x_arr, size_t, size_x, p_size);
expression[i+1] = 't';
}
else if ((expression[i-1] == 'x') && (expression[i+1] == 't'))
{
t_arr = culc_Dif (x_arr, t_arr, size_x, size_t, p_size);
expression[i+1] = 't';
}
else if ((expression[i-1] == 't') && (expression[i+1] == 'y'))
{
t_arr = culc_Dif (t_arr, y_arr, size_t, size_y, p_size);
expression[i+1] = 't';
}
else if ((expression[i-1] == 'y') && (expression[i+1] == 't'))
{
t_arr = culc_Dif (y_arr, t_arr, size_y, size_t, p_size);
expression[i+1] = 't';
}
else if ((expression[i-1] == 't') && (expression[i+1] == 'u'))
{
t_arr = culc_Dif (t_arr, u_arr, size_t, size_u, p_size);
expression[i+1] = 't';
}
else
{
if ((expression[i-1] == 'u') && (expression[i+1] == 't'))
{
t_arr = culc_Dif (u_arr, t_arr, size_u, size_t, p_size);
expression[i+1] = 't';
}
}
}
if (ch == '*') // symmetrical difference
{
if (((expression[i-1] == 'x') && (expression[i+1] == 'y')) || ((expression[i-1] == 'y') && (expression[i+1] == 'x')))
{
t_arr = culc_SymDif (x_arr, y_arr, size_x, size_y, p_size);
expression[i+1] = 't';
}
else if (((expression[i-1] == 'x') && (expression[i+1] == 'u')) || ((expression[i-1] == 'u') && (expression[i+1] == 'x')))
{
t_arr = culc_SymDif (x_arr, u_arr, size_x, size_u, p_size);
expression[i+1] = 't';
}
else if (((expression[i-1] == 'y') && (expression[i+1] == 'u')) || ((expression[i-1] == 'u') && (expression[i+1] == 'y')))
{
t_arr = culc_SymDif (y_arr, u_arr, size_y, size_u, p_size);
expression[i+1] = 't';
}
else if (((expression[i-1] == 't') && (expression[i+1] == 'x')) || ((expression[i-1] == 'x') && (expression[i+1] == 't')))
{
t_arr = culc_SymDif (t_arr, x_arr, size_t, size_x, p_size);
expression[i+1] = 't';
}
else if (((expression[i-1] == 't') && (expression[i+1] == 'y')) || ((expression[i-1] == 'y') && (expression[i+1] == 't')))
{
t_arr = culc_SymDif (t_arr, y_arr, size_t, size_y, p_size);
expression[i+1] = 't';
}
else
{
if (((expression[i-1] == 't') && (expression[i+1] == 'u')) || ((expression[i-1] == 'u') && (expression[i+1] == 't')))
{
t_arr = culc_SymDif (t_arr, u_arr, size_t, size_u, p_size);
expression[i+1] = 't';
}
}
}
if ((i%2) != 0) // change later to another stopping condition - if i have ~ or - or * or * or U
{
size_t = p_size[0]; // update the size of the array
}
}
if (t_arr == NULL) // case the final group is empty
{
printf("Empty Group\n");
fprintf(fp3, "Empty Group\n");
}
else // not empty
{
for (int i=0; i<p_size[0]; i++) // loop to check and print the array on the screen
{
printf("%f ", t_arr[i]);
}
for (int i=0; i<p_size[0]; i++) // print the result array to file "output.txt"
{
fprintf(fp3, "%f ", t_arr[i]);
}
}
}