aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzlg <zlg@zlg.space>2012-11-29 14:44:25 -0600
committerzlg <zlg@zlg.space>2012-11-29 14:44:25 -0600
commitb6b22b5c5acbe317d7ad992b58169b0678e64a9a (patch)
treedf8e968e05d8fd85d88c5f1db6cda37fb152aa84
parentCorrect 1-13's chart heading (diff)
downloadknr-b6b22b5c5acbe317d7ad992b58169b0678e64a9a.tar.gz
knr-b6b22b5c5acbe317d7ad992b58169b0678e64a9a.tar.bz2
knr-b6b22b5c5acbe317d7ad992b58169b0678e64a9a.tar.xz
knr-b6b22b5c5acbe317d7ad992b58169b0678e64a9a.zip
Clean up 1-13 and 1-20, correct 1-21
1-13 uses less variables and a for loop for the chart header 1-20 has minor changes 1-21 was rewritten to behave properly README has been rewritten to reflect the limitations of my solutions
-rw-r--r--1-13_word-length-histogram.c36
-rw-r--r--1-20_detab.c5
-rw-r--r--1-21_entab.c43
-rw-r--r--README.mdown22
4 files changed, 60 insertions, 46 deletions
diff --git a/1-13_word-length-histogram.c b/1-13_word-length-histogram.c
index 1e21378..d3115a5 100644
--- a/1-13_word-length-histogram.c
+++ b/1-13_word-length-histogram.c
@@ -6,18 +6,17 @@
int main(void) {
/* Rundown of variables:
- c = current input char
- 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.
- */
+ * 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 c, state, ltrs, wrds, lines, wlen;
+ int state, ltrs, wrds, lines, wlen, i, j;
int lengths[MAXWLENGTH];
- int i;
for (i = 0; i <= MAXWLENGTH; ++i) {
lengths[i] = 0;
}
@@ -26,9 +25,9 @@ int main(void) {
lines = 1;
state = OUT;
// Capture input until it ends
- while ((c = getchar()) != EOF) {
+ while ((i = getchar()) != EOF) {
// If it's whitespace, we've exited a word
- if (c == '\n' || c == ' ' || c == '\t') {
+ if (i == '\n' || i == ' ' || i == '\t') {
if (state == IN) {
++wrds; // ...and should increase the count.
state = OUT;
@@ -41,7 +40,7 @@ int main(void) {
}
/* If it's a new line, we're still out of a word but need to increment the
line count */
- if (c == '\n') {
+ if (i == '\n') {
++lines;
}
} else {
@@ -59,19 +58,18 @@ int main(void) {
}
printf("\n"); // End the chart heading.
- int iter;
- iter = MINWLENGTH;
- while (iter <= MAXWLENGTH) {
- i = lengths[iter];
+ j = MINWLENGTH;
+ while (j <= MAXWLENGTH) {
+ i = lengths[j];
if (i > 0) {
- printf("%2d | ", iter);
+ printf("%2d | ", j);
while (i > 0) {
printf("#");
i = i-1;
}
printf("\n");
}
- ++iter;
+ ++j;
}
printf("%d words, %d chars, %d lines.\n", wrds, ltrs, lines);
return 0;
diff --git a/1-20_detab.c b/1-20_detab.c
index e1549e6..dc8f5b5 100644
--- a/1-20_detab.c
+++ b/1-20_detab.c
@@ -11,9 +11,8 @@
* worked with and it's not susceptible to scope. Though, in this simple
* program it really doesn't matter.
*
- * To be correct, this file should use the isprint() function to ensure that
- * 'column' only gets incremented when a printable character is being read. I'll
- * come back to this when I learn more of the stdlib.
+ * The "correct" solution uses the isprint() stdlib function, but it's not
+ * covered by this point in the book, so I did not use it.
*/
#define TABWIDTH 8
diff --git a/1-21_entab.c b/1-21_entab.c
index 0f25706..6037a14 100644
--- a/1-21_entab.c
+++ b/1-21_entab.c
@@ -15,30 +15,41 @@
#define TABWIDTH 8
int main(void) {
- int c, spaces;
- spaces = 0;
+ int column, c, spaces;
+ spaces = column = 0;
while ((c = getchar()) != EOF) {
- // Make sure the character is a space...
+ // First thing's first, advance by a column.
+ column++;
+
if (c == ' ') {
- ++spaces;
- // When spaces is equal to TABWIDTH, we can add a tab
- if (spaces == TABWIDTH) {
+ /* Add to 'spaces' immediately, we'll decide if it needs to be
+ * output later.
+ */
+ spaces++;
+
+ if (column % TABWIDTH == 0 && spaces > 0) {
putchar('\t');
- spaces = 0;
+ spaces = 0; // No spaces are left when we tab!
}
+
} else {
- /* As soon as we hit a non-space character, we need to make sure
- * there aren't 1-7 spaces leftover. These need to be output before
- * we output the non-space character itself! This little loop is
- * interesting because it solves the problem of leftover spaces
- * _and_ gets the 'spaces' back to zero, which it needs to be once
- * we hit a non-space character.
+ /* Be sure to output any leftover spaces when we come across a
+ * non-space character. This should allow for spaces between words
+ * that don't fall along the tabstop lines.
*/
- while (spaces != 0) {
+
+ while (spaces > 0) {
putchar(' ');
- --spaces;
+ spaces--;
}
- // Output the non-space character.
+
+ // As usual, reset things on a newline.
+ if (c == '\n') {
+ column = 0;
+ spaces = 0;
+ }
+
+ // Now we can output whatever it is.
putchar(c);
}
}
diff --git a/README.mdown b/README.mdown
index 7af39e0..1fafb61 100644
--- a/README.mdown
+++ b/README.mdown
@@ -1,9 +1,15 @@
-As I was reading Kernighan and Ritchie's *The C Programming Language*, I felt
-like I was learning the syntax and other superficial things, but not learning
-the more practical lessons that I was sure I'd run into once I tried to make
-something. So I chose to do the exercises. I didn't start until the middle of
-Chapter 1, but better late than never!
+These files are my solutions to Kernighan and Ritchie's *The C Programming
+Language, 2nd Edition*. My aim is to deepen my understanding of C, using only
+the concepts covered in content that comes before each exercise. That means no
+"cheating" by using standard library features that aren't been covered in the
+book yet. As a result, many of my solutions will probably not be "the best", but
+suitable for the goal at hand: *learning*.
-If you have suggestions or pointers, message me! I really want to learn C "the
-right way". It's a fascinating, spartan, pretty language, and I want to become
-good with it.
+I chose this route because as I was reading the K&R, I didn't feel like I was
+learning anything new, but I knew C was known for its simplicity and efficiency.
+If I wasn't learning anything about efficiency and simplifying my programs, then
+why was I learning C? I tackled a few exercises and found that I was beginning
+to learn a few things I hadn't ran into before.
+
+Critique is welcome, but please keep in mind the limitations I've outlined in
+the first paragraph.
zlg2-2/+9 This filter is used to get an idea of which games you're currently playing through, so you can prioritize games to play when you're bored and detect it when you've beaten a game but haven't marked it as such. 2018-03-13Update helpers a bitzlg1-2/+9 At present, user modification is needed to make these seamless. vgup() may need to be axed in favor of telling the user to make an alias. 2018-03-13Make VGSTASH_DB_LOCATION point to a filezlg2-21/+20 It used to point to a directory, which would then look for .vgstash.db. This behavior was kind of backwards and I don't remember why I did it that way. This change gives users more control over where they put their DB. Be sure to update your environment variable if you have it set! 2016-11-18Remove settings from helpers.shZe Libertine Gamer1-5/+0 Sourcing them in .bash_profile screws up login if they're set. 2016-11-15Correct phrasing in README.Ze Libertine Gamer1-4/+4 2016-11-13DerpZe Libertine Gamer1-0/+1 2016-11-03Improve error handling in shell scriptsZe Libertine Gamer4-3/+23 2016-10-24Correct run_again, add recursionZe Libertine Gamer1-0/+4 Loops and functions -- oh my, what a useful combination. :) 2016-10-21Add quotes to correct behavior for arglistZe Libertine Gamer1-1/+1 2016-10-14updater.sh: add recursion, error handlingZe Libertine Gamer1-43/+101 2016-10-14Correct pipe-handling behaviorZe Libertine Gamer1-1/+9 2016-10-12Clarify a method to move between platformsZe Libertine Gamer1-2/+5 Also correct a typo.