diff options
author | Adam Carpenter <gitlab@53hor.net> | 2019-07-09 16:00:48 -0400 |
---|---|---|
committer | Adam Carpenter <gitlab@53hor.net> | 2019-07-09 16:00:48 -0400 |
commit | 39c0cbcc70aff47e17107826aa76cb525c83b122 (patch) | |
tree | df483af220a11aab49e0e3a76eea54f60efbd424 /ch1 | |
parent | 583fc81152e120ec5873f8057f11a894bb8b0a91 (diff) | |
download | learning-c-39c0cbcc70aff47e17107826aa76cb525c83b122.tar.xz learning-c-39c0cbcc70aff47e17107826aa76cb525c83b122.zip |
ch2
Diffstat (limited to 'ch1')
-rw-r--r-- | ch1/char_hist.c | 30 | ||||
-rw-r--r-- | ch1/copier.c | 29 | ||||
-rw-r--r-- | ch1/counter.c | 29 | ||||
-rw-r--r-- | ch1/ctof.c | 36 | ||||
-rw-r--r-- | ch1/ftoc.c | 37 | ||||
-rw-r--r-- | ch1/hello.c | 8 | ||||
-rw-r--r-- | ch1/line_counter.c | 16 | ||||
-rw-r--r-- | ch1/longest_line.c | 58 | ||||
-rw-r--r-- | ch1/no_trailers.c | 72 | ||||
-rw-r--r-- | ch1/num_digits.c | 29 | ||||
-rw-r--r-- | ch1/one_word.c | 16 | ||||
-rw-r--r-- | ch1/power.c | 28 | ||||
-rw-r--r-- | ch1/reverse.c | 70 | ||||
-rw-r--r-- | ch1/too_long.c | 39 | ||||
-rw-r--r-- | ch1/wc.c | 29 | ||||
-rw-r--r-- | ch1/whitespace_converter.c | 18 | ||||
-rw-r--r-- | ch1/whitespace_counter.c | 22 | ||||
-rw-r--r-- | ch1/whitespace_translator.c | 26 | ||||
-rw-r--r-- | ch1/word_hist.c | 24 |
19 files changed, 616 insertions, 0 deletions
diff --git a/ch1/char_hist.c b/ch1/char_hist.c new file mode 100644 index 0000000..312df76 --- /dev/null +++ b/ch1/char_hist.c @@ -0,0 +1,30 @@ +#include<stdio.h> + +#define CHARSET_LENGTH 128; + +/* + * Prints a histogram of the lengths of words in its input. + */ +main() { + int c, i; + int count; + int length = CHARSET_LENGTH; + int c_counts[length]; + + for (i = 0; i < length; ++i) { + c_counts[i] = 0; + } + + while ((c = getchar()) != EOF) { + ++c_counts[c]; + } + + for (i = 0; i < length; ++i) { + count = c_counts[i]; + + if (count > 0 && (i != ' ' && i != '\t' && i != '\n' )) { + printf("%c\t", i); + printf("%d\n", count); + } + } +} diff --git a/ch1/copier.c b/ch1/copier.c new file mode 100644 index 0000000..eeade8e --- /dev/null +++ b/ch1/copier.c @@ -0,0 +1,29 @@ +#include <stdio.h> + +/* Copy input to output; 1st version */ +//main() { +// int c; +// +// c = getchar(); +// +// while (c != EOF) { +// putchar(c); +// c = getchar(); +// } +//} + +/* Copy input to output; 2nd version */ +main() { + int c; + + while ((c = getchar()) != EOF) { + putchar(c); + } +} + +//main() { +// printf("%d", EOF); +// getchar(); +// printf("%d", getchar()); +// printf("%d", getchar()); +//} diff --git a/ch1/counter.c b/ch1/counter.c new file mode 100644 index 0000000..a1b9927 --- /dev/null +++ b/ch1/counter.c @@ -0,0 +1,29 @@ +#include<stdio.h> + +/* + * Count characters in input; 1st version + */ +//main() { +// long nc; +// +// nc = 0; +// +// while (getchar() != EOF) +// ++nc; +// +// +// printf("%ld\n", nc); +//} + +/* + * Count characters in input; 2nd version + */ +main() { + long nc; + + + for (nc = 0; getchar() != EOF; ++nc) + ; + + printf("%ld\n", nc); +} diff --git a/ch1/ctof.c b/ch1/ctof.c new file mode 100644 index 0000000..b95e20a --- /dev/null +++ b/ch1/ctof.c @@ -0,0 +1,36 @@ +#include<stdio.h> + +#define LOWER 0; +#define UPPER 300; +#define STEP 20; + +float ctof(int c); + +/* + * Print Celcius-Fahrenheit table for celcius = 0, 20, ... 300. + */ +main() { + float fahr, celcius; + int lower, upper, step; + + lower = LOWER; // lower limit of temperature table + upper = UPPER; // upper limit of temperature table + step = STEP; // step size + + celcius = lower; + + printf("%3s %6s\n", "C", "F"); + + while (celcius <= upper) { + fahr = ctof(celcius); + printf("%3.0f %6.1f\n", celcius, fahr); + celcius = celcius + step; + } +} + +/* + * Convert Celcius to Fahrenheit + */ +float ctof(int celcius) { + return (9.0 / 5.0) * celcius + 32.0; +} diff --git a/ch1/ftoc.c b/ch1/ftoc.c new file mode 100644 index 0000000..70b994a --- /dev/null +++ b/ch1/ftoc.c @@ -0,0 +1,37 @@ +#include<stdio.h> + +#define LOWER 0 // lower limit of table +#define UPPER 300 // upper limit of table +#define STEP 20 // step size + +float ftoc(int fahr); + +/* + * Print Fahrenheit-Celcius table for fahr = 0, 20, ... 300. + */ +main() { + float fahr, celcius; + int lower, upper, step; + + lower = LOWER; // lower limit of temperature table + upper = UPPER; // upper limit of temperature table + step = STEP; // step size + + fahr = lower; + + printf("%3s %6s\n", "F", "C"); + + // while (fahr <= upper) { + // celcius = 5.0 / 9.0 * (fahr - 32.0); + // printf("%3.0f %6.1f\n", fahr, celcius); + // fahr = fahr + step; + // } + + for (fahr = UPPER; fahr >= LOWER; fahr = fahr - STEP) { + printf("%3.0f %6.1f\n", fahr, ftoc(fahr)); + } +} + +float ftoc(int fahr) { + return (5.0 / 9.0) * (fahr - 32); +} diff --git a/ch1/hello.c b/ch1/hello.c new file mode 100644 index 0000000..b1ad928 --- /dev/null +++ b/ch1/hello.c @@ -0,0 +1,8 @@ +#include<stdio.h> + +main() { + printf("hello, "); + printf("world."); + printf("\n"); +} + diff --git a/ch1/line_counter.c b/ch1/line_counter.c new file mode 100644 index 0000000..0447aa7 --- /dev/null +++ b/ch1/line_counter.c @@ -0,0 +1,16 @@ +#include<stdio.h> + +/* + * Count lines in input + */ +main() { + int c, nl; + + nl = 0; + + while ((c = getchar()) != EOF) + if (c == '\n') + ++nl; + + printf("%d\n", nl); +} diff --git a/ch1/longest_line.c b/ch1/longest_line.c new file mode 100644 index 0000000..58f2a72 --- /dev/null +++ b/ch1/longest_line.c @@ -0,0 +1,58 @@ +#include<stdio.h> +#define MAXLENGTH 1000 + +int get_line(char line[], int maxlength); +void copy(char to[], char from[]); + +/* + * MAIN + * Prints longest line in STDIN. + */ +main() { + int len; // current line length + int max; // maximum length seen so far + char line[MAXLENGTH]; // current input line + char longest[MAXLENGTH]; // longest line saved here + + max = 0; + while ((len = get_line(line, MAXLENGTH)) > 0) + if (len > max) { + max = len; + copy(longest, line); + } + if (max > 0) // there was a line + printf("%d\t", max); + printf("%s", longest); + return 0; +} + +/* + * GET_LINE + * Read STDIN into LINE up to MAXLENGTH and return its length. + * Returns the length of a the line. + */ +int get_line(char line[], int maxlength) { + int c, i; + + for (i = 0; i < maxlength - 1 && (c = getchar()) != EOF && c != '\n'; ++i) + line[i] = c; + if (c == '\n') { + line[i] = c; + ++i; + } + line[i] = '\0'; + return i; +} + +/* + * COPY + * Copy FROM into TO; assume TO is big enough. + */ +void copy(char to[], char from[]) { + int i; + + i = 0; + while ((to[i] = from[i]) != '\0') + ++i; +} + diff --git a/ch1/no_trailers.c b/ch1/no_trailers.c new file mode 100644 index 0000000..80dbc0f --- /dev/null +++ b/ch1/no_trailers.c @@ -0,0 +1,72 @@ +#include<stdio.h> + +#define MAXLENGTH 1000 + +int get_line(char line[], int maxlength); +void strip_line(char line[], int length); +void copy(char to[], char from[]); + +/* + * MAIN + * Removes all trailing whitespace and blank lines from STDIN. + */ +int main() { + int len; // current line length + char line[MAXLENGTH]; // current input line + + while ((len = get_line(line, MAXLENGTH)) > 0) { + strip_line(line, len); + if (line[0] != '\0') + printf("%s\n", line); + } + return 0; +} + +/* + * GET_LINE + * Read STDIN into LINE up to MAXLENGTH and return its length. + * Returns the length of a the line. + */ +int get_line(char line[], int maxlength) { + int c, i; + + for (i = 0; i < maxlength - 1 && (c = getchar()) != EOF && c != '\n'; ++i) + line[i] = c; + if (c == '\n') { + line[i] = c; + ++i; + } + line[i] = '\0'; + return i; +} + +/* + * STRIP_LINE + * Remove all whitespace from end of LINE of given LENGTH. + */ +void strip_line(char line[], int length) { + int i, c; + + for (i = --length; i >= 0; --i) { + c = line[i]; + + if (c == ' ' || c == '\t' || c == '\n') + line[i] = '\0'; + else + break; + } +} + + +/* + * COPY + * Copy FROM into TO; assume TO is big enough. + */ +void copy(char to[], char from[]) { + int i; + + i = 0; + while ((to[i] = from[i]) != '\0') + ++i; +} + diff --git a/ch1/num_digits.c b/ch1/num_digits.c new file mode 100644 index 0000000..c25fc29 --- /dev/null +++ b/ch1/num_digits.c @@ -0,0 +1,29 @@ +#include<stdio.h> + +/* + * Count digits, whitespace, and other characters. + */ +main() { + int c, i, nwhite, nother; + int ndigit[10]; + + nwhite = nother = 0; + + for (i = 0; i < 10; ++i) + ndigit[i] = 0; + + while ((c = getchar()) != EOF) + if (c >= '0' && c <= '9') + ++ndigit[c - '0']; + else if (c == ' ' || c == '\n' || c == '\t') + ++nwhite; + else + ++nother; + + printf("digits ="); + + for (i = 0; i < 10; ++i) + printf(" %d", ndigit[i]); + printf(", whitespace = %d, other = %d\n", + nwhite, nother); +} diff --git a/ch1/one_word.c b/ch1/one_word.c new file mode 100644 index 0000000..8d50542 --- /dev/null +++ b/ch1/one_word.c @@ -0,0 +1,16 @@ +#include<stdio.h> + +/* + * Print input one word per line. + */ +main() { + int c; + + while ((c = getchar()) != EOF) { + if (c == ' ' || c == '\n' || c == '\t') + putchar('\n'); + else { + putchar(c); + } + } +} diff --git a/ch1/power.c b/ch1/power.c new file mode 100644 index 0000000..8bca4fd --- /dev/null +++ b/ch1/power.c @@ -0,0 +1,28 @@ +#include<stdio.h> + +int power(int m, int n); + +/* + * Test power function + */ +main() { + int i; + + for (i = 0; i < 10; ++i) + printf("%d %d %d\n", i, power(2, i), power(-3, i)); + + return 0; +} + +/* + * Raise base to n-th power; n >= 0 + */ +int power(int base, int n) { + int i, p; + + p = 1; + + for (i = 1; i <= n; ++i) + p = p * base; + return p; +} diff --git a/ch1/reverse.c b/ch1/reverse.c new file mode 100644 index 0000000..98edd98 --- /dev/null +++ b/ch1/reverse.c @@ -0,0 +1,70 @@ +#include<stdio.h> + +#define MAXLENGTH 1000 + +// Prototypes +int get_line(char line[], int maxlength); +void line_copy(char to[], char from[]); +void reverse_copy(char to[], char from[], int length); + +/* + * MAIN + * Reverse all lines on STDIN. + */ +int main() { + int len; // current line length + char line[MAXLENGTH]; // current input line + char reversed_line[MAXLENGTH]; // current reversed line + + while ((len = get_line(line, MAXLENGTH)) > 0) { + reverse_copy(reversed_line, line, len); + printf("%s\n", reversed_line); + } + return 0; +} + +/* + * GET_LINE + * Read STDIN into LINE up to MAXLENGTH. + * Returns the length of LINE. + */ +int get_line(char line[], int maxlength) { + int c, i; + + for (i = 0; i < maxlength - 1 && (c = getchar()) != EOF && c != '\n'; ++i) + line[i] = c; + if (c == '\n') { + line[i] = c; + ++i; + } + line[i] = '\0'; + return i; +} + +/* + * LINE_COPY + * Copy FROM into TO; assume TO is big enough. + */ +void line_copy(char to[], char from[]) { + int i; + + i = 0; + while ((to[i] = from[i]) != '\0') + ++i; +} + +/* + * REVERSE_COPY + * Copy FROM into TO (of length LENGTH) in reverse order; assume TO is big + * enough. + */ +void reverse_copy(char to[], char from[], int length) { + int i; + + for (i = 0; i < length; ++i) { + to[length - 1 - i] = from[i]; + } + + to[length] = '\0'; +} + diff --git a/ch1/too_long.c b/ch1/too_long.c new file mode 100644 index 0000000..dcc6ed4 --- /dev/null +++ b/ch1/too_long.c @@ -0,0 +1,39 @@ +#include<stdio.h> + +#define MAXLENGTH 1000 + +int get_line(char line[], int maxlength); +void copy(char to[], char from[]); + +/* + * MAIN + * Print all lines larger than 80 characters. + */ +main() { + int len; // current line length + char line[MAXLENGTH]; // current input line + + while ((len = get_line(line, MAXLENGTH)) > 0) + if (len > 80) { + printf("%s", line); + } + return 0; +} + +/* + * GET_LINE + * Read STDIN into LINE up to MAXLENGTH and return its length. + * Returns the length of a the line. + */ +int get_line(char line[], int maxlength) { + int c, i; + + for (i = 0; i < maxlength - 1 && (c = getchar()) != EOF && c != '\n'; ++i) + line[i] = c; + if (c == '\n') { + line[i] = c; + ++i; + } + line[i] = '\0'; + return i; +} diff --git a/ch1/wc.c b/ch1/wc.c new file mode 100644 index 0000000..4a5007d --- /dev/null +++ b/ch1/wc.c @@ -0,0 +1,29 @@ +#include<stdio.h> + +#define IN 1 // inside a word +#define OUT 0 // outside a word + +/* + * Count lines, words, and characters in input. + */ +main() { + int c, nl, nw, nc, state; + + state = OUT; + nl = nw = nc = 0; + + while ((c = getchar()) != EOF) { + ++nc; + + if (c == '\n') + ++nl; + if (c == ' ' || c == '\n' || c == '\t') + state = OUT; + else if (state == OUT) { + state = IN; + ++nw; + } + } + + printf("%d %d %d\n", nl, nw, nc); +} diff --git a/ch1/whitespace_converter.c b/ch1/whitespace_converter.c new file mode 100644 index 0000000..6fee3bd --- /dev/null +++ b/ch1/whitespace_converter.c @@ -0,0 +1,18 @@ +#include<stdio.h> + +/* + * Convert concurrent blanks to single blank. + */ +main() { + int c; + + while ((c = getchar()) != EOF) { + if (c == ' ') { + while ((c = getchar()) == ' ') + ; + putchar(' '); + } + + putchar(c); + } +} diff --git a/ch1/whitespace_counter.c b/ch1/whitespace_counter.c new file mode 100644 index 0000000..ea441e2 --- /dev/null +++ b/ch1/whitespace_counter.c @@ -0,0 +1,22 @@ +#include<stdio.h> + +/* + * Count whitespace in input + */ +main() { + int c, n_whitespace; + + n_whitespace = 0; + + while ((c = getchar()) != EOF) { + if (c == '\n') + ++n_whitespace; + if (c == '\t') + ++n_whitespace; + if (c == ' ') + ++n_whitespace; + } + + + printf("%d\n", n_whitespace); +} diff --git a/ch1/whitespace_translator.c b/ch1/whitespace_translator.c new file mode 100644 index 0000000..efb52b2 --- /dev/null +++ b/ch1/whitespace_translator.c @@ -0,0 +1,26 @@ +#include<stdio.h> + +/* + * Translate invisible whitespace characters to visible + * representations. + */ +main() { + int c; + + while ((c = getchar()) != EOF) { + if (c == 8) { + printf("\\b"); + continue; + } + if (c == 9) { + printf("\\t"); + continue; + } + if (c == '\\') { + printf("\\\\"); + continue; + } + + putchar(c); + } +} diff --git a/ch1/word_hist.c b/ch1/word_hist.c new file mode 100644 index 0000000..965c1b9 --- /dev/null +++ b/ch1/word_hist.c @@ -0,0 +1,24 @@ +#include<stdio.h> + +/* + * Prints a histogram of the lengths of words in its input. + */ +main() { + int c; + int count; + + while ((c = getchar()) != EOF) { + if (c == '\n' || c == '\t' || c == ' ') { + + while (count > 0) { + printf("%s", "*"); + --count; + } + + if (count > 0) { + printf("\n"); + } + } else + ++count; + } +} |