#include #include /** * Test reading integers. */ unsigned long long sumints(FILE* in) { long long int sum =0; int i; while (fscanf(in, "%d ", &i) >= 1) { sum = sum + (long long)i; } return sum; } int compare(const void* aa, const void* bb) { int *a = (int*)aa, *b = (int*)bb; if(*a == *b) return 0; else if(*a < *b) return -1; else return 1; } /** * Test reading integers, and growing and sorting a vector. */ int median(FILE* in) { int vector_size = 4; int* vector = malloc(sizeof(int) * vector_size); int vector_length = 0; int i; while (fscanf(in, "%d ", &i) >= 1) { vector_length++; if(vector_length > vector_size) { vector_size *= 2; vector = realloc(vector, sizeof(int)*vector_size); } vector[vector_length-1] = i; } qsort(vector, vector_length, sizeof(int), &compare); if(/* odd */ vector_length % 2) return vector[vector_length/2]; else return ((vector[vector_length/2] + vector[vector_length/2-1]) / 2); } /** Result struct for wc test. */ typedef struct { int chars, words, lines; } WordCount; /** * Test reading integers (or something else), and growing and sorting a * vector. */ void CountWords(FILE* in, WordCount* result) { int inword = 0; int getvalue; if(!in) { fprintf(stderr, "No input stream in CountWords\n"); exit(1); } if(!result) { fprintf(stderr, "No result struct in CountWords\n"); exit(1); } result->chars = 0; result->words = 0; result->lines = 0; while((getvalue = getc(in)) != EOF) { char ch = (char)getvalue; if(!(ch == ' ' || ch == '\t' || ch == '\n' || ch == '\r')) { inword = 1; } else { if(inword) { result->words++; inword = 0; } } if(ch == '\n') result->lines++; result->chars++; } } int main(int argc, char *argv[]) { int iterations = 1; int do_median = 0, do_sum = 0, do_wc = 0; int i; for(i = 1; i < argc; ++i) { if(argv[i][0] == '-') switch(argv[i][1]) { case 'i': iterations = atoi(argv[++i]); break; case 'm': do_median = 1; break; case 's': do_sum = 1; break; case 'w': do_wc = 1; break; default: fprintf(stderr, "Unknown flag: %s\n", argv[i]); exit(1); } else { fprintf(stderr, "Unknown argument: %s\n", argv[i]); exit(1); } } for(i = 0; i < iterations; ++i) { if(do_median) { FILE* data = fopen("numbers.txt", "r"); if(!data) { fprintf(stderr, "No data.\n"); exit(1); } printf("Median: %d\n", median(data)); } if(do_sum) { FILE* data = fopen("numbers.txt", "r"); if(!data) { fprintf(stderr, "No data.\n"); exit(1); } printf("Sum: %lld\n", sumints(data)); } if(do_wc) { FILE* data = fopen("numbers.txt", "r"); WordCount wc; if(!data) { fprintf(stderr, "No data.\n"); exit(1); } CountWords(data, &wc); printf(" %d %d %d %s\n", wc.lines, wc.words, wc.chars, "numbers.txt"); } } return 0; }