From 563cced7ea9c03e9113703ae12ee1fd8602d5737 Mon Sep 17 00:00:00 2001 From: Ivaylo Ivanov Date: Wed, 12 Dec 2018 22:06:56 +0100 Subject: [PATCH] Refactor cpair and add initial forking --- cpair/Makefile | 2 +- cpair/cpair.c | 102 ++++++++++++++++++++++++++++++++++++++++--------- 2 files changed, 84 insertions(+), 20 deletions(-) diff --git a/cpair/Makefile b/cpair/Makefile index 8bdf922..61c13ca 100644 --- a/cpair/Makefile +++ b/cpair/Makefile @@ -4,7 +4,7 @@ TARGET = cpair all: $(TARGET).c $(CC) $(CFLAGS) $(TARGET).c - $(CC) $(TARGET).o -o $(TARGET) + $(CC) $(TARGET).o -o $(TARGET) -lm install: cp $(TARGET) /usr/local/bin/$(TARGET) diff --git a/cpair/cpair.c b/cpair/cpair.c index 8921f1d..1e8457b 100644 --- a/cpair/cpair.c +++ b/cpair/cpair.c @@ -38,13 +38,28 @@ #include #include #include +#include +#include +#include -float get_x_mean(float *points[2], int arr_len); +/// Node struct for linked list +typedef struct node { + float points[2]; + struct node * next; +} node_t; -int main () { +float get_x_mean(node_t * head); +float get_distance(float x1, float x2, float y1, float y2); + +int main(void) { char input[__UINT8_MAX__] = ""; ///< An array to save the input to - float *points[2]; ///< A pointer to a two-valued array to save the points to int point_num = 0; ///< Save the number of points + node_t * head = NULL; + pid_t child_a, child_b; + + head = malloc(sizeof(node_t)); + + node_t * current = head; while(fgets(input, __INT8_MAX__, stdin) != NULL) { ///< Read line by line /// Split the input by whitespace as delimiter @@ -52,10 +67,12 @@ int main () { char *y = strtok(NULL, " "); if(x != NULL && y != NULL) { - /// Convert to float and save to the array - points[point_num][0] = strtof(x, NULL); - points[point_num][1] = strtof(y, NULL); - point_num++; ///< Increase the array length + /// Convert to float and save to the list + current -> points[0] = strtof(x, NULL); + current -> points[1] = strtof(y, NULL); + current -> next = malloc(sizeof(node_t)); + current = current -> next; + point_num++; ///< Increase the list length } else { puts("ERROR: Ill-formed line found"); exit(EXIT_FAILURE); @@ -71,28 +88,75 @@ int main () { exit(EXIT_SUCCESS); if(point_num == 2) { - printf("%f %f\n", points[0][0], points[0][1]); - printf("%f %f\n", points[1][0], points[1][1]); + printf("%f %f\n", head -> points[0], head -> points[1]); + printf("%f %f\n", head -> next -> points[0], head -> next -> points[1]); exit(EXIT_SUCCESS); } - float x_mean = get_x_mean(points, point_num); + float x_mean = get_x_mean(head); + + child_a = fork(); + child_b = fork(); + + switch(child_a){ + case -1: + puts("ERROR: Coudn't fork child"); + exit(EXIT_FAILURE); + case 0: + puts("Child"); + break; + default: + break; + } + + switch(child_b){ + case -1: + puts("ERROR: Coudn't fork child"); + exit(EXIT_FAILURE); + case 0: + puts("Child"); + break; + default: + break; + } + + int status; + + waitpid(child_a, &status, 0); + waitpid(child_b, &status, 0); exit(EXIT_SUCCESS); } /** - * @brief Function to calculate the mean of the X coordinates from a points array - * @details Loops through the points array, gets the sum of X coordinates and returns the mean - * @param points - a pointer to an array with the points - * point_num - number of points in the array + * @brief Function to calculate the mean of the X coordinates from a points list + * @details Loops through the points list, gets the sum of X coordinates and returns the mean + * @param head - a pointer to a list with the points * @return mean of all X coordinates * **/ -float get_x_mean(float *points[2], int point_num) { +float get_x_mean(node_t * head) { + node_t * current = head; float x_sum = 0; - for(int i = 0; i< point_num; i++) { - x_sum += points[i][0]; + int i = 0; + while(current -> next != NULL) { + x_sum += current -> points[0]; + current = current -> next; + i++; } - return x_sum/point_num; -} \ No newline at end of file + + return x_sum/i; +} + +/** + * @brief Function to calculate the distance between 2 points + * @details The function calculates the distance between 2 points + * in a Cartesian coordinate system, given their coordinates + * @param x1, y1 - pair of coordinates for the first point + * x2, y2 - pair of coordinates for the second point + * @return distance between the two points + * + **/ +float get_distance(float x1, float x2, float y1, float y2) { + return sqrt(pow((x2 - x1), 2) + pow((y2 - y1), 2)); +}