From d5ab2288237a7f59d5e382b466ecb5da415ded4b Mon Sep 17 00:00:00 2001 From: Zachary MacDonald Date: Thu, 25 Sep 2014 16:17:39 -0300 Subject: [PATCH 01/12] Created new file mm.c --- mm.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 mm.c diff --git a/mm.c b/mm.c new file mode 100644 index 0000000..ff1779f --- /dev/null +++ b/mm.c @@ -0,0 +1,52 @@ +#include +#include + +#define debug 0 + +// Comparison function for qsort() +int numcmp (const void *a, const void *b) { + int x = *((int*) a); + int y = *((int*) b); + if (x > y) return 1; + if (x < y) return -1; + return 0; +} + +int main(int argc, char *argv[]) { + + int i, length, *pt; + + // Check for proper usage + if (argc < 2) { + fprintf(stderr, "%s: Aborting, not enough arguments.\n", argv[0]); + return (-1); + } + + // Determine amount of numbers from argc + length = argc - 1; +#if debug + fprintf(stderr, "%s: DEBUG: %d numbers were passed.\n", argv[0], length); +#endif + + // Allocate memory for array of number (and error check) + if ((pt = malloc(length * sizeof(int))) == NULL) { + fprintf(stderr, "%s: Could not allocate memory.\n", argv[0]); + } + + // Read numbers into array + for (i = 0; i < length; i++) { + pt[i] = (int) strtol(argv[i+1], NULL, 10); + } + + // Sort numbers + qsort(pt, length, sizeof(int), numcmp); + + // Print out numbers + fprintf(stdout, "%s: Sorted output is: \n", argv[0]); + for (i=0; i Date: Thu, 2 Oct 2014 00:17:14 -0300 Subject: [PATCH 02/12] Added "mean" function, resolves #2. --- mm.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/mm.c b/mm.c index ff1779f..5342152 100644 --- a/mm.c +++ b/mm.c @@ -12,6 +12,15 @@ int numcmp (const void *a, const void *b) { return 0; } +// Function to calculate the mean of a vector +int mean (int *v, int length) { + int i; + int sum = 0; + for(i = 0; i < length; i++) { + sum = sum + v[i]; + } +} + int main(int argc, char *argv[]) { int i, length, *pt; From c7f9d8f8a16567c92396bfc048082e95b4caba0f Mon Sep 17 00:00:00 2001 From: Zachary MacDonald Date: Thu, 2 Oct 2014 00:22:40 -0300 Subject: [PATCH 03/12] Added function Median, resolves #3. --- mm.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/mm.c b/mm.c index 5342152..76807ac 100644 --- a/mm.c +++ b/mm.c @@ -19,6 +19,14 @@ int mean (int *v, int length) { for(i = 0; i < length; i++) { sum = sum + v[i]; } + return sum/length; +} + +int median (int *v, int length) { + if (length%2 == 1) + return v[(length/2)]; + if (length%2 == 0) + return ((v[(length/2)-1]+v[(length)/2])/2); } int main(int argc, char *argv[]) { From becb0cf297ac9a11ac380aa25c90a55d7f873e74 Mon Sep 17 00:00:00 2001 From: Zachary MacDonald Date: Thu, 2 Oct 2014 00:30:35 -0300 Subject: [PATCH 04/12] Process Forks. Child runs median, parent runs Mean. --- mm.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/mm.c b/mm.c index 76807ac..5de78b2 100644 --- a/mm.c +++ b/mm.c @@ -55,8 +55,16 @@ int main(int argc, char *argv[]) { pt[i] = (int) strtol(argv[i+1], NULL, 10); } - // Sort numbers - qsort(pt, length, sizeof(int), numcmp); + int rc = fork(); + if (rc == -1) { + // could not fork another process + fprintf(stdout, "Fork failed.\n"); + exit(-1); + } else if (rc == 0) { // child runs median: + median(pt, length); + } else if (rc > 0) { // parent runs mean: + mean(pt, length); + } // Print out numbers fprintf(stdout, "%s: Sorted output is: \n", argv[0]); From 41f0bca17f9249f292a52140791d581f79e5a9c8 Mon Sep 17 00:00:00 2001 From: Zachary MacDonald Date: Thu, 2 Oct 2014 00:40:14 -0300 Subject: [PATCH 05/12] Parent and Child now print their results. Fixes #5 and Fixes #6. --- mm.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/mm.c b/mm.c index 5de78b2..1ddbc08 100644 --- a/mm.c +++ b/mm.c @@ -61,9 +61,11 @@ int main(int argc, char *argv[]) { fprintf(stdout, "Fork failed.\n"); exit(-1); } else if (rc == 0) { // child runs median: - median(pt, length); + int med = median(pt, length); + fprintf(stdout, "%d ", med); } else if (rc > 0) { // parent runs mean: - mean(pt, length); + int avg = mean(pt, length); + fprintf(stdout, "%d ", avg); } // Print out numbers From d2590a710e823fb3a0ec11e4afdb61aa36b5a268 Mon Sep 17 00:00:00 2001 From: Zachary MacDonald Date: Thu, 2 Oct 2014 00:41:36 -0300 Subject: [PATCH 06/12] Parent now waits for child. Resolves #7 issue. --- mm.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mm.c b/mm.c index 1ddbc08..fdfdf22 100644 --- a/mm.c +++ b/mm.c @@ -64,7 +64,8 @@ int main(int argc, char *argv[]) { int med = median(pt, length); fprintf(stdout, "%d ", med); } else if (rc > 0) { // parent runs mean: - int avg = mean(pt, length); + int wc = wait(NULL); // waits until child has finished + int avg = mean(pt, length); fprintf(stdout, "%d ", avg); } From 47f4206adafed9f26b93d4fea4792698c880facc Mon Sep 17 00:00:00 2001 From: Zachary MacDonald Date: Thu, 2 Oct 2014 00:59:55 -0300 Subject: [PATCH 07/12] Fixed Median to not give warnings (changed an if to an else) --- mm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mm.c b/mm.c index fdfdf22..92037be 100644 --- a/mm.c +++ b/mm.c @@ -25,7 +25,7 @@ int mean (int *v, int length) { int median (int *v, int length) { if (length%2 == 1) return v[(length/2)]; - if (length%2 == 0) + else return ((v[(length/2)-1]+v[(length)/2])/2); } From b4113c60c6f0c06f848260ec15443f090c31b91d Mon Sep 17 00:00:00 2001 From: Zachary MacDonald Date: Thu, 2 Oct 2014 01:03:28 -0300 Subject: [PATCH 08/12] Added library files for system calls. --- mm.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mm.c b/mm.c index 92037be..5371340 100644 --- a/mm.c +++ b/mm.c @@ -1,3 +1,5 @@ +#include +#include #include #include From 21b62f6fb33f05c4fd2511762fd02a59351e778c Mon Sep 17 00:00:00 2001 From: Zachary MacDonald Date: Thu, 2 Oct 2014 01:06:46 -0300 Subject: [PATCH 09/12] Readded the sort because it is needed for median and I had forgotten that. --- mm.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mm.c b/mm.c index 5371340..a7c93e2 100644 --- a/mm.c +++ b/mm.c @@ -57,6 +57,9 @@ int main(int argc, char *argv[]) { pt[i] = (int) strtol(argv[i+1], NULL, 10); } + // Sort numbers + qsort(pt, length, sizeof(int), numcmp); + int rc = fork(); if (rc == -1) { // could not fork another process From c646a946ded87d3c7a14b8fc9412589d6ccda17a Mon Sep 17 00:00:00 2001 From: Zachary MacDonald Date: Thu, 2 Oct 2014 01:19:03 -0300 Subject: [PATCH 10/12] Removed unused wc int. --- mm.c | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/mm.c b/mm.c index a7c93e2..dedb476 100644 --- a/mm.c +++ b/mm.c @@ -67,18 +67,13 @@ int main(int argc, char *argv[]) { exit(-1); } else if (rc == 0) { // child runs median: int med = median(pt, length); - fprintf(stdout, "%d ", med); + fprintf(stdout, "Median = %d ", med); } else if (rc > 0) { // parent runs mean: - int wc = wait(NULL); // waits until child has finished + wait(NULL); // waits until child has finished int avg = mean(pt, length); - fprintf(stdout, "%d ", avg); + fprintf(stdout, "Mean = %d ", avg); } - // Print out numbers - fprintf(stdout, "%s: Sorted output is: \n", argv[0]); - for (i=0; i Date: Thu, 2 Oct 2014 01:25:01 -0300 Subject: [PATCH 11/12] Finishing touches, formatting. --- mm.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/mm.c b/mm.c index dedb476..b0df6fe 100644 --- a/mm.c +++ b/mm.c @@ -1,7 +1,7 @@ #include -#include #include #include +#include #define debug 0 @@ -19,7 +19,7 @@ int mean (int *v, int length) { int i; int sum = 0; for(i = 0; i < length; i++) { - sum = sum + v[i]; + sum = sum + v[i]; } return sum/length; } @@ -64,14 +64,15 @@ int main(int argc, char *argv[]) { if (rc == -1) { // could not fork another process fprintf(stdout, "Fork failed.\n"); - exit(-1); + exit(-1); } else if (rc == 0) { // child runs median: int med = median(pt, length); - fprintf(stdout, "Median = %d ", med); + fprintf(stdout, "Median = %d \n", med); } else if (rc > 0) { // parent runs mean: wait(NULL); // waits until child has finished - int avg = mean(pt, length); - fprintf(stdout, "Mean = %d ", avg); + int avg = mean(pt, length); + fprintf(stdout, "Mean = %d ", avg); + } fprintf(stdout, "\n%s: FIN. \n", argv[0]); From 56fb7f38c4ecb768f4c80984c3f3b6bd9dbe9436 Mon Sep 17 00:00:00 2001 From: Zachary MacDonald Date: Thu, 2 Oct 2014 01:29:10 -0300 Subject: [PATCH 12/12] Made meaningless change to note that I fixed #4 issue but forgot to say so --- mm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mm.c b/mm.c index b0df6fe..5aafa92 100644 --- a/mm.c +++ b/mm.c @@ -41,7 +41,7 @@ int main(int argc, char *argv[]) { return (-1); } - // Determine amount of numbers from argc + // Determine amount of numbers from argc length = argc - 1; #if debug fprintf(stderr, "%s: DEBUG: %d numbers were passed.\n", argv[0], length);