第一章 导言
#include <stdio.h>
int main()
{
printf("hello, world\n");
return 0;
}
#include <stdio.h>
int main()
{
printf("hello, ");
printf("world");
return 0;
}
#include <stdio.h>
int main()
{
int fahr, celsius;
int lower, upper, step;
lower = 0;
upper = 300;
step = 20;
fahr = lower;
while (fahr <= upper)
{
celsius = 5 * (fahr - 32) / 9;
printf("%d\t%d\n", fahr, celsius);
fahr = fahr + step;
}
return 0;
}
#include <stdio.h>
int main()
{
float fahr, celsius;
int lower, upper, step;
lower = 0;
upper = 300;
step = 20;
fahr = lower;
while (fahr <= upper)
{
celsius = (5.0/9.0) * (fahr - 32.0);
printf("%3.0f %6.1f\n", fahr, celsius);
fahr = fahr + step;
}
return 0;
}
#include <stdio.h>
int main()
{
int c;
while ((c=getchar()) != EOF)
{
putchar(c);
}
return 0;
}
#include <stdio.h>
int main()
{
long nc;
nc = 0;
while (getchar()!=EOF)
{
nc++;
}
printf("%ld\n", nc);
return 0;
}
#include <stdio.h>
int main()
{
double nc;
for (nc = 0; getchar() != EOF; ++nc);
printf("%.0f\n", nc);
return 0;
}
练习1-8 编写一个统计空格、制表符与换行符个数的程序
#include <stdio.h>
int main()
{
int c, nb, nt, nl;
nb = nt = nl = 0;
while ((c = getchar())!=EOF)
{
if (c == ' ')
{
nb++;
}
else if (c == '\t')
{
nt++;
}
else if (c == '\n')
{
nl++;
}
}
printf("nb=%d,nt=%d,nl=%d\n", nb, nl, nt);
return 0;
}
#include <stdio.h>
#define NOBLANK 'a'
int main()
{
int c, lastc;
while ((c=getchar())!=EOF)
{
if (c != ' ')
{
putchar(c);
}
else if (lastc != ' ')
{
putchar(c);
}
lastc = c;
}
return 0;
}
练习1-10 编写一个将输入复制到输出的程序,并将其中的制表符替换为\t,把回退符替换为\b,把反斜杠替换为\\。这样可以将制表符和回退符以可见的方式显示出来。
#include <stdio.h>
int main()
{
int c;
while ((c=getchar())!=EOF)
{
if (c == '\t')
{
printf("\\t");
}
else if (c == '\b')
{
printf("\\b");
}
else if (c == '\\')
{
printf("\\\\");
}
else
{
putchar(c);
}
}
return 0;
}
#include <stdio.h>
#define IN 1
#define OUT 0
int 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);
return 0;
}
#include <stdio.h>
int 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);
return 0;
}
练习1-12 编写一个程序, 以每行一个单词的形式打印其输入。
#include <stdio.h>
#define IN 1
#define OUT 0
int main()
{
int c, state;
state = OUT;
while ((c=getchar())!=EOF)
{
if (c==' ' || c=='\n' || c=='\t')
{
if (state == IN)
{
putchar('\n');
state = OUT;
}
}
else if(state == OUT)
{
state = IN;
putchar(c);
}
else
{
putchar(c);
}
}
return 0;
}
#include <stdio.h>
#define MAXHIST 15
#define MAXWORD 11
#define IN 1
#define OUT 0
int main()
{
int c, i, j, nc, state;
int maxvalue;
int ovflow;
int wl[MAXWORD];
state = OUT;
nc = 0;
ovflow = 0;
for (i=0; i<MAXWORD; i++)
{
wl[i] = 0;
}
while ((c=getchar())!=EOF)
{
if (c==' ' || c=='\n' || c=='\t')
{
if (state == IN)
{
if (nc>0)
{
if (nc<MAXWORD)
{
wl[nc]++;
}
else
{
ovflow++;
}
}
state = OUT;
}
nc = 0;
}
else if(state == OUT)
{
state = IN;
nc = 1;
}
else
{
nc++;
}
}
maxvalue = 0;
for (i=1; i<MAXWORD; i++)
{
if (maxvalue < wl[i])
{
maxvalue = wl[i];
}
}
for (i=MAXHIST; i>0; i--)
{
for (j=1; j<MAXWORD; j++)
{
if (wl[j]*MAXHIST/maxvalue>=i)
{
printf(" * ");
}
else
{
printf(" ");
}
putchar('\n');
}
}
for (i=1; i<MAXWORD; i++)
{
printf("%4d ", i);
}
putchar('\n');
for (i = 1; i < MAXWORD; i++)
{
printf("%4d ", wl[i]);
}
putchar('\n');
if (ovflow>0)
{
printf("There are %d words >= %d\n", ovflow, MAXWORD);
}
return 0;
}
练习1-14 编写一个程序,打印输入中各个字符出现频度的直方图。
#include <stdio.h>
#include <ctype.h>
#define MAXHIST 15
#define MAXCHAR 128
int main()
{
int c, i;
int len;
int maxvalue;
int cc[MAXCHAR];
for (i=0; i<MAXCHAR; i++)
{
cc[i] = 0;
}
while ((c=getchar())!=EOF)
{
if (c<MAXCHAR)
{
cc[c]++;
}
}
maxvalue = 0;
for (i=0; i<MAXCHAR; i++)
{
if (maxvalue<cc[i])
{
maxvalue = cc[i];
}
}
for (i=0; i<MAXCHAR; i++)
{
if (isprint(i))
{
printf("%5d- %c -%5d : ", i, i, cc[i]);
}
else
{
printf("%5d- -%5d : ", i, cc[i]);
}
if (cc[i]>0)
{
if ((len=cc[i]*MAXHIST/maxvalue)<=0)
{
len = 1;
}
}
else
{
len = 0;
}
while (len>0)
{
putchar('*');
len--;
}
putchar('\n');
}
return 0;
}
#include <stdio.h>
int power(int m, int n);
int main()
{
int i;
for (i=0; i<10; i++)
{
printf("%d %d %d\n", i, power(2, i), power(-3, i));
}
return 0;
}
int power(int base, int n)
{
int i, p;
p = 1;
for (i=1; i<=n; i++)
{
p = p*i;
}
return p;
}
#include <stdio.h>
#define MAXLINE 1000
int getline(char line[], int maxline);
void copy(char to[], char from[]);
int main()
{
int len;
int max;
char line[MAXLINE];
char longest[MAXLINE];
max = 0;
while ((len=getline(line, MAXLINE))>0)
{
if (max < len)
{
max = len;
copy(longest, line);
}
}
if (max > 0)
{
printf("%s\n", longest);
}
return 0;
}
int getline(char s[], int lim)
{
int c, i;
for (i=0; i<lim-1 && (c=getchar())!=EOF && c!='\n'; ++i)
{
s[i] = c;
}
if (c=='\n')
{
s[i] = c;
++i;
}
s[i] = '\0';
return i;
}
void copy(char to[], char from[])
{
int i;
while ((to[i]=from[i])!='\0')
{
i++;
}
}
第二章 类型、运算符与表达式
#include <stdio.h>
#include <limits.h>
int main()
{
printf("signed char min = %d\n", SCHAR_MIN);
printf("signed char max = %d\n", SCHAR_MAX);
printf("signed short min = %d\n", SHRT_MIN);
printf("signed short max = %d\n", SHRT_MAX);
printf("signed int min = %d\n", INT_MIN);
printf("signed int max = %d\n", INT_MAX);
printf("signed long min = %d\n", LONG_MIN);
printf("signed long max = %d\n", LONG_MAX);
printf("unsigned char max = %d\n", UCHAR_MAX);
printf("unsigned short max = %d\n", USHRT_MAX);
printf("unsigned int max = %d\n", UINT_MAX);
printf("unsigned long max = %d\n", ULONG_MAX);
return 0;
}
#define YES 1
#define NO 0
int htoi(char s[])
{
int i, n, hexdigit, inhex;
i = 0;
if (s[i]=='0')
{
++i;
if (s[i]=='x' || s[i]=='X')
{
++i;
}
}
n = 0;
inhex = YES;
for (;inhex==YES;++i)
{
if (s[i]>='0' && s[i]<='9')
{
hexdigit = s[i] - '0';
}
else if (s[i]>='a' && s[i]<='z')
{
hexdigit = s[i] - 'a' + 10;
}
else if (s[i] >= 'A' && s[i] <= 'Z')
{
hexdigit = s[i] - 'A' + 10;
}
else
{
inhex = NO;
}
if (inhex == YES)
{
n = n * 16 + hexdigit;
}
}
return n;
}