From a049db580776ed41bb4583bfb331d97c5a80900a Mon Sep 17 00:00:00 2001 From: Mattias Andrée Date: Sun, 19 Jun 2016 02:50:31 +0200 Subject: Add examples: sum, prod, avg, median MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Mattias Andrée --- examples/04-median.c | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 examples/04-median.c (limited to 'examples/04-median.c') diff --git a/examples/04-median.c b/examples/04-median.c new file mode 100644 index 0000000..7acff70 --- /dev/null +++ b/examples/04-median.c @@ -0,0 +1,63 @@ +/* Calculates the median of $@ */ + +#include +#include + +#include + +int +main(int argc, char *argv[]) +{ + struct zahl *values; + z_t med, medmod; + jmp_buf env; + char *buf, *argv0; + int i, j; + + argv0 = *argv++, argc--; + + if (!argc) { + fprintf(stderr, + "%s: cannot calculate median of the empty bag\n", + argv0); + return 1; + } + + values = calloc(argc, sizeof(*values)); + if (!values) + return perror(argv0), 1; + + if (setjmp(env)) + return zperror(argv0), 1; + + zsetup(env); + zinit(med); + zinit(medmod); + + /* Since `values` where allocated with + * `calloc` it is already cleared and + * `zinit` is not necessary. */ + + for (i = 0; i < argc; i++) + zsets(&values[i], argv[i]); + + qsort(values, argc, sizeof(*values), + (int (*)(const void *, const void *))zcmp); + i = argc / 2; + j = i - !(argc & 1); + zadd(med, &values[i], &values[j]); + zsetu(medmod, 2); + zdivmod(med, medmod, med, medmod); + + printf("%s%s\n", buf = zstr(med, NULL, 0), + (const char *[]){"", ".5"}[zodd(medmod)]); + free(buf); + + zfree(medmod); + zfree(med); + for (i = 0; i < argc; i++) + zfree(&values[i]); + free(values); + zunsetup(); + return 0; +} -- cgit v1.2.3-70-g09d2