1-12
Q:编写一个程序,以每行一个单词的形式打印输出。
#include <stdio.h>
#define IN 1
#define OUT 0
int main()
{
int c;
int 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;
}
1-13
Q:编写一个程序,打印输入中单词长度的直方图。分别画出水平和垂直直方图。
#include <stdio.h>
#define IN 1
#define OUT 0
#define MAXWORD 11/*max length of a word*/
#define MAXHIST 15/*max length of histgram*/
int main()
{
int c;
int nc = 0;
int state = OUT;
int wl[MAXWORD];
int len;
int maxvalue;
int overflow = 0;
for(int i = 0;i < MAXWORD;i++)
wl[i] = 0;
while((c = getchar()) != EOF)
{
if(c == ' '||c == '\t'||c == '\n')
{
state = OUT;
if(nc > 0)
if(nc < MAXWORD)
wl[nc]++;
else
overflow++;
nc = 0;
}
else if(state = OUT)
{
nc = 1;
state = IN;
}else
nc++;
}
maxvalue = 0;
for(int i = 1;i < MAXWORD;i++)
if(wl[i] > maxvalue)
maxvalue = wl[i];
for(int i = 1;i < MAXWORD;i++)
{
printf("%5d - %d:",i,wl[i]);
if(wl[i] > 0)
{
len = wl[i] * MAXHIST / maxvalue;
if(len <= 0)
len = 1;
}else
len = 0;
while(len > 0)
{
putchar('*');
len--;
}
putchar('\n');
}
printf("There are %d words >= %d\n",overflow,MAXWORD);
return 0;
}
#include <stdio.h>
#define IN 1
#define OUT 0
#define MAXWORD 11/*max length of a word*/
#define MAXHIST 15/*max length of histgram*/
int main()
{
int c;
int nc = 0;
int state = OUT;
int wl[MAXWORD];
int len;
int maxvalue;
int overflow = 0;
for(int i = 0;i < MAXWORD;i++)
wl[i] = 0;
while((c = getchar()) != EOF)
{
if(c == ' '||c == '\t'||c == '\n')
{
state = OUT;
if(nc > 0)
if(nc < MAXWORD)
wl[nc]++;
else
overflow++;
nc = 0;
}
else if(state = OUT)
{
nc = 1;
state = IN;
}else
nc++;
}
maxvalue = 0;
for(int i = 1;i < MAXWORD;i++)
if(wl[i] > maxvalue)
maxvalue = wl[i];
for(int i = MAXHIST;i > 0;i--)
{
for(int j = 1;j < MAXWORD;j++)
{
if(wl[j] * MAXHIST / maxvalue >= i)
putchar('*');
else
putchar(' ');
}
putchar('\n');
}
for(int i = 1;i < MAXWORD;i++)
printf("%4d",i);
putchar('\n');
for(int i = 1;i < MAXWORD;i++)
printf("%4d",wl[i]);
putchar('\n');
printf("There are %d words >= %d\n",overflow,MAXWORD);
return 0;
}
1-14
Q:编写一个程序,打印输入中各个字符出现频度的直方图。
#include <stdio.h>
#include <ctype.h>
#define IN 1
#define OUT 0
#define MAXCHAR 128/*max different characters*/
#define MAXHIST 15/*max length of histgram*/
int main()
{
int c;
int nc[MAXCHAR];
int maxvalue;
int len = 0;
for(int i = 0;i < MAXCHAR;i++)
nc[i] = 0;
while((c = getchar()) != EOF)
{
if(c < MAXCHAR)
nc[c]++;
}
maxvalue = 0;
for(int i = 1;i < MAXCHAR;i++)
if(nc[i] > maxvalue)
maxvalue = nc[i];
for(int i = 1;i < MAXCHAR;i++)
{
if(isprint(i))
printf("%5d-%c-%5d:",i,i,nc[i]);
else
printf("%5d- -%5d:",i,nc[i]);
if(nc[i] > 0)
{
len = nc[i] * MAXHIST / maxvalue;
if(len <= 0)
len = 1;
}else
len = 0;
while(len > 0)
{
putchar('*');
len--;
}
putchar('\n');
}
return 0;
}