From 4b03274352943d7998f87394023d01427b0055a0 Mon Sep 17 00:00:00 2001 From: SakurajimaShida Date: Tue, 19 Aug 2025 13:58:39 -0700 Subject: [PATCH 1/2] Skeleton prototype for exercise 1-13. --- KNR C/ex1_13.c | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 KNR C/ex1_13.c diff --git a/KNR C/ex1_13.c b/KNR C/ex1_13.c new file mode 100644 index 0000000..6cc80ef --- /dev/null +++ b/KNR C/ex1_13.c @@ -0,0 +1,41 @@ +#include + +#define IN 1 /*State when selected character is within a word*/ +#define OUT 0 /*State when selected character is any kind of whitespace*/ + + + +int main(){ + + int charCount[10]; /*Array for storing char lengths*/ + + int last, lCount, state, i; /*last stores last character, or 0 at init. lCount increments every time the main for loop encounters a non-newline/whitespace character and then resets when one is encountered after commiting its value to charCount.*/ + /*Begin array initialization*/ + for(i = 0; i < 10; ++i){ + charCount[i] = 0; + } + /*End array init*/ + + + last = lCount = 0; + + for(int a = getchar(); a != EOF; a = getchar()){ + + if(a == '\t' || a == ' ' || a == '\n'){ /*Check if current char is WS. If so, set state to OUT and check if the last character was not. If it was not, then we are exiting a word, and so comitting lCount to charCount.*/ + state = OUT; + if (last != '\t' && last != ' ' && last != '\n'){ /*True on word exit only.*/ + ++charCount[lCount-'0']; + lCount = 0; + } + + } else { + state = IN; + ++lCount; /*Increment lCount when encountering a non-WS character.*/ + } + last = a; + } + printf("Word letter count composition:\n1 2 3 4 5 6 7 8 9 10\n"); + for (i = 0; i < 10; ++i) + printf("%d ", charCount[i]); + return 0; + } From 296d1157a0d73741828359355fde4ac28f93a502 Mon Sep 17 00:00:00 2001 From: SakurajimaShida Date: Tue, 19 Aug 2025 17:45:32 -0700 Subject: [PATCH 2/2] Completed exercise 1-13, with a bonus version that trades an extra 4 bytes in memory for an equally miniscule perfomance gain at execution. --- KNR C/ex1_13_improved.c | 78 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 KNR C/ex1_13_improved.c diff --git a/KNR C/ex1_13_improved.c b/KNR C/ex1_13_improved.c new file mode 100644 index 0000000..6cfd69a --- /dev/null +++ b/KNR C/ex1_13_improved.c @@ -0,0 +1,78 @@ +#include + +/*Slight modification to ex1_13.c that makes charCount an array of ints 11 entries long, in order to circumvent the need for additional mathematical operations down the line as a consequence of ocurrences of the value "1" being store at position 0. This sacrifices 4 bytes of memory in the stack by extending the array, but results a shorter binary. + * + * how much shorter, you ask? + * + * 1 instruction. + * + * lol.*/ + +#define IN 1 /*State when selected character is within a word*/ +#define OUT 0 /*State when selected character is any kind of whitespace*/ + + + +int main(){ + + int charCount[11]; /*Array for storing char lengths*/ + + int last, lCount, state, i; /*last stores last character, or 0 at init. lCount increments every time the main for loop encounters a non-newline/whitespace character and then resets when one is encountered after commiting its value to charCount.*/ + /*Begin array initialization*/ + for(i = 0; i < 11; ++i){ + charCount[i] = 0; + } + /*End array init*/ + + + last = lCount = 0; + + /*Begin input letter count enumeration.*/ + for(int a = getchar(); a != EOF; a = getchar()){ + + /*Check if current char is WS. If so, set state to OUT and check if the last character was not. If it was not, then we are exiting a word, and so comitting lCount to charCount.*/ + if(a == '\t' || a == ' ' || a == '\n'){ + state = OUT; + if (last != '\t' && last != ' ' && last != '\n'){ /*True on word exit only.*/ + if(lCount > 10){ /*Array charCount only stores values up to 10, so we will add any longer words to the column for 10+*/ + ++charCount[10]; + } else { + + ++charCount[(lCount)]; } + lCount = 0; /*Reset lCount when a condition that dumps it to charCount is triggered*/ + } + + } else { + state = IN; + ++lCount; /*Increment lCount when encountering a non-WS character.*/ + } + last = a; + } + /*Input letter count enumeration complete*/ + + /*Print a table of the number of words encountered for each number of characters.*/ + printf("Word letter count composition:\n"); + for (i = 1; i <= 9; ++i) + printf("%3d", (i)); + printf ("%3s", " 10+\n"); + for (i = 1; i <= 10; ++i) + printf("%3d", charCount[i]); + + /*Print a histogram of gathered data.*/ + printf("\nHistogram of char counts by frequency of words enountered with a given count.\n"); + i = 1; /*Reset value of i, since we're reusing it*/ + for (int b = charCount[i]; i <= 10; ++i){ + if (i < 10){ + printf("%d ", (i)); + } else if (i == 10) { + printf("%3s", "10+"); + } + + for (b > 0; b > 0; --b){ + printf("|"); + } + printf("\n"); + b = charCount[(i + 1)]; /*Get the value of the next position in the array; since i hasn't incremented yet, it's i+1*/ + } + return 0; +}