diff --git a/distribution.c b/distribution.c new file mode 100644 index 0000000000000000000000000000000000000000..974c2d29a892b80c065e8eb5436086bc4a31ec6e --- /dev/null +++ b/distribution.c @@ -0,0 +1,94 @@ +#include <stdio.h> +#include <stdlib.h> +#include <stddef.h> +#include <ctype.h> +#include <string.h> +#include <assert.h> +#include "distribution.h" + +unsigned long distribution_update(unsigned long *dist, const char *progname, + const char *filename) { + unsigned int currentCharacter; + unsigned long filesize = 0; + FILE *file = fopen(filename, "rb"); + if (file == NULL) { + fprintf(stderr, "%s cannot open file (dist) %s \n", progname, filename); + exit(EXIT_FAILURE); + } + while ((currentCharacter = fgetc(file)) != EOF) { + dist[currentCharacter]++; + filesize++; + } + fclose(file); + + return filesize; +} + +/*void distribution_show(const unsigned long *dist) +{ + int i; + + for (i = 0; i <= UCHAR_MAX; i++) + { + if (dist[i] > 0) + { + if (iscntrl(i)) + printf("\\%d: %lu\n",i,dist[i]); + else + printf("%c: %lu\n",(char) i,dist[i]); + } + } +}*/ + +const unsigned long *binarysearch(const unsigned long *leftptr, + const unsigned long *rightptr, + unsigned long key) +{ + const unsigned long *midptr; + while (leftptr <= rightptr) + { + midptr = leftptr + (unsigned long) (rightptr-leftptr)/2; + if (key < *midptr) + { + rightptr = midptr - 1; + } else + { + if (key > *midptr) + { + leftptr = midptr + 1; + } else + if (key == *midptr) + { + while (*(midptr - 1) == key) { + midptr--; + } + return midptr; + } + } + } + if (key < *midptr) + return midptr; + return NULL; +} + +int main (void) { + + const unsigned long array1[] = {10, 13, 15, 15, 17, 18, 20, 22, 25, 27}; + const unsigned long array2[] = {10, 13, 15, 15, 17, 18, 18, 18, 20, 22}; + const unsigned long array3[] = {20, 22, 25, 27}; + + printf("Adresse: %lu\n", (unsigned long) &array2[5]); + + const unsigned long *element1 = binarysearch(&array1[0], &array1[9], 18); + const unsigned long *element2 = binarysearch(&array2[0], &array2[9], 18); + const unsigned long *element3 = binarysearch(&array3[0], &array3[3], 18); + + printf("element array 1: %lu\n", *element1); + printf("element array 2: %lu\nAdresse: %lu\n", *element2, (unsigned long) element2); + printf("element array 3: %lu\n", *element3); + + + return EXIT_SUCCESS; +} + +