From 5018e06c580dd21c958ec1672c26a3448faf0c55 Mon Sep 17 00:00:00 2001 From: zlg Date: Wed, 13 Feb 2013 20:48:44 -0600 Subject: Add license file, reorganize project --- ch1/1-13_word-length-histogram.c | 76 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 ch1/1-13_word-length-histogram.c (limited to 'ch1/1-13_word-length-histogram.c') diff --git a/ch1/1-13_word-length-histogram.c b/ch1/1-13_word-length-histogram.c new file mode 100644 index 0000000..d3115a5 --- /dev/null +++ b/ch1/1-13_word-length-histogram.c @@ -0,0 +1,76 @@ +#include +#define IN 1 +#define OUT 0 +#define MINWLENGTH 2 +#define MAXWLENGTH 20 + +int main(void) { + /* Rundown of variables: + * i, j = reusable placeholder variables + * state = inside or outside a word + * ltrs = letter count + * wrds = word count + * lines = you should be shot if you don't know + * lengths = an array that keeps track of how often words up to x chars long + * occur. + */ + + int state, ltrs, wrds, lines, wlen, i, j; + int lengths[MAXWLENGTH]; + for (i = 0; i <= MAXWLENGTH; ++i) { + lengths[i] = 0; + } + + ltrs = wrds = wlen = 0; + lines = 1; + state = OUT; + // Capture input until it ends + while ((i = getchar()) != EOF) { + // If it's whitespace, we've exited a word + if (i == '\n' || i == ' ' || i == '\t') { + if (state == IN) { + ++wrds; // ...and should increase the count. + state = OUT; + /* Check to see if the word is eligible to be counted. */ + if (wlen <= MAXWLENGTH) { + ++lengths[wlen]; + } + // Reset our word length now. + wlen = 0; + } + /* If it's a new line, we're still out of a word but need to increment the + line count */ + if (i == '\n') { + ++lines; + } + } else { + /* If nothing else, we know it's just a random character or a letter. */ + state = IN; + ++wlen; + } + /* Everything that's input counts as a letter. */ + ++ltrs; + } + + printf("\nWORD LENGTH FREQUENCY\n "); + for (i = 5; i < 80; i += 5) { + printf(" %2d", i); + } + + printf("\n"); // End the chart heading. + j = MINWLENGTH; + while (j <= MAXWLENGTH) { + i = lengths[j]; + if (i > 0) { + printf("%2d | ", j); + while (i > 0) { + printf("#"); + i = i-1; + } + printf("\n"); + } + ++j; + } + printf("%d words, %d chars, %d lines.\n", wrds, ltrs, lines); + return 0; +} -- cgit v1.2.3-54-g00ecf