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);
	}
}

 

posted @ 2015-02-02 20:46  kid551  阅读(330)  评论(0编辑  收藏  举报