Variables and Arithmetic Expression
Notes from The C Programming Language
A decimal point in a constant indicates that it is floating point, however, so $5.0/9.0$ i not truncated because it is the ratio of two floating-point values.
printf specification
- %3.0f says that a floating-point number is to be printed at least three characters wide, with no decimal point and no fraction dgits.
- %6.1f describes another number that is to be printed at least six characters wide, with 1 digit after the decimal point.
Width and precision may be omitted from a specification: %6f says that the number is to be at least six characters wide; %.2f specifies two characters after the decimal point, but the width is not constrained.
- %o for octal
- %x for hexadecimal
- %c for character
- %s for character string
- %% for % itself
for statement:
#include <stdio.h> #define LOWER 0 /* lower limit of table */ #define UPPER 300 /* upper limit */ #define STEP 20 /* step size */ /* print Fahrenheit-Celsius table */ main() { int fahr; for(fahr = LOWER; fahr <= UPPER; fahr = fahr + STEP) printf("%3d %6.1f\n", fahr, (5.0/9.0)*(fahr-32)); }
Character input and output
The standard library provides getchar() and putchar() for reading and writing one character at a time. getchar() reads the next input character from a text stream and returns that as its value:
c = getchar();
The function putchar prints a character each time:
putchar(c);
prints the contents of the integer variable c as a character, usually on the screen.
File copy: a program that copies its input to its output one character at a time:
#include <stdio.h> /* copy input to output; 1st version */ main() { int c; c = getchar(); while(c != EOF) { putchar(c); c = getchar(); } }
EOF is defined in <stdio.h>.
As an expression has a value, which is the left hand side after the assignment, the code can be concise:
#include <stdio.h> /* copy input to output; 2nd version */ main() { int c; while((c = getchar()) != EOF) putchar(c); }
The next program counts characters:
#include <stdio.h> /* count characters in input; 1st version */ main() { long nc; nc = 0; while(getchar() != EOF) ++nc; printf("%ld\n", nc); }
long integers are at least 32-bits.
It may be possible to cope with even bigger numbers by using a double(double precision float).
#include <stdio.h> /* count characters in input; 2nd version */ main() { double nc; for(nc = 0; getchar() != EOF; ++nc) ; printf("%.0f\n", nc); }
printf uses %f for both float and double; %.0f suppresses printing of the decimal point and the fraction part, which is zero.
Counts lines:
#include <stdio.h> /* count lines in input */ main() { int c, nl; nl = 0; while((c = getchar()) != EOF) { if(c == '\n') ++n1; printf("%d\n", nl); } }
Word counting with loose definition that a word is any sequence of characters that does not contain blank, tab or newline. This is a bare-bones version of the UNIX program wc:
#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); }
Every time the program encouters the first character of a word, it counts one more word.
Count the number of occurrences of each digit, of white space character(blank, tab, newline), and of all other characters:
#include <stdio.h> /* count digits, white space, others */ 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(", white space = %d, other = %d\n", nwhite, nother); } }