c语言程序设计序言习题答案续

习题1-13(垂直方向直方图):编写一个程序打印输入中单词长度的垂直方向的直方图。

View Code
 1 #include <stdio.h>
 2 #define IN 1     /* 在单词内部 */
 3 #define OUT 0    /* 在单词外部 */
 4 #define MAXLEN  15 /* 单词的最大长度 */
 5 #define MAXHIST 15 /* 直方图的最大长度 */
 6 #define MAXWORD 100 /* 限制输入单词的上限 */
 7 
 8 int wl[MAXWORD];    /* 用于存放单词长度的数组 */
 9 
10 /* 打印垂直方向的直方图 */
11 void main()
12 {
13     char c;
14     int i, j;
15     int len = 0;    /* 当前单词的长度 */
16     int wc = 0; /* 统计单词的个数 */
17     int state = OUT;  /* 状态初始化为在单词外部 */
18     int maxvalue;     /* 单词中最大长度 */
19     for (int k=0; k<MAXWORD; k++)
20         wl[MAXWORD] = 0;            /* 数组进行初始化 */
21     while ((c=getchar()) != EOF) {
22         if (c == ' ' || c == '\t' || c == '\n') {
23             if (state == IN) {
24                 if (len > MAXLEN)
25                     len = MAXLEN;
26                 wl[++wc] = len;
27             }
28             len = 0;
29             state = OUT;
30         } else if (state == OUT) {
31             state = IN;
32             len++;
33         } else
34             len++;
35     }
36     if (wc < 1) {
37         printf("no words!\n");
38         return;
39     }else if (wc > MAXWORD)
40         wc = MAXWORD;
41     maxvalue = 0;
42     for (i=1; i<=wc; i++) {
43         if (wl[i] > maxvalue)
44             maxvalue = wl[i];
45     }
46     /* 实现垂直直方图 */
47     for (i=MAXHIST; i>0; --i) {
48         for (j=1; j<=wc; j++)
49             if (wl[j] % MAXHIST >= i) {
50                 printf(" * ");
51             } else
52                 printf("   ");
53         putchar('\n');
54     }
55     for (i=1; i<=wc; i++)
56         printf(" %d ", wl[i]);
57     putchar('\n');
58 }

RT:

垂直直方图和水平直方图程序在统计单词个数之前都是一致的,垂直直方图使用另外一种处理方式。

习题1-14:编写一个程序,打印输入中各个字符出现频度的直方图。

View Code
 1 #include <stdio.h>
 2 #include <ctype.h>
 3 #define MAXHIST 15    /* 直方图长度上限 */
 4 #define MAXCHAR 128   /* 出现的字符上限 */
 5 
 6 /* 统计输入中各个字符的直方图 */
 7 void main()
 8 {
 9     char c;
10     int i;
11     int charlen;       /* 字符出现的频度 */
12     int ch[MAXCHAR];   /* 保存所有字符的数组 */
13     for (i = 0;i < MAXCHAR; i++)
14         ch[i] = 0;
15     while ((c=getchar()) != EOF) {
16         if (c < MAXCHAR)
17             ++ch[c];
18     }
19     for (i = 1; i < MAXCHAR; ++i) {
20         if (ch[i] > MAXHIST)
21             ch[i] = MAXHIST;
22     }
23     /* 输出水平方向直方图 */
24     for (i = 1; i < MAXCHAR; ++i) {
25         charlen = ch[i];
26         if (charlen < 1) 
27             continue;
28         if (isprint(i))   /* 可显示的字符 */
29             printf("%c %d\t", i, charlen);
30         else
31             printf("  %d\t", charlen);
32         while (ch[i] > 0) {
33             putchar('*');
34             --ch[i];
35         }
36         putchar('\n');
37     }
38 }    

RT:

从打印的结果来看,第一个是不可显示的换行符,第二个是空格,其余是字母。

习题:重新编写1.2节中温度转换程序,使用函数实现温度转换计算。

View Code
 1 #include <stdio.h>
 2 #define MAXHIGH 300 /* 温度表的上限 */
 3 
 4 int getcelsius(int); /* 函数声明 */
 5 
 6 /* 使用函数来实现温度转换功能 */
 7 void main()
 8 {
 9      int low, temp, celsius;
10      low = 0;     /* 温度表的下限 */
11      temp = 20;   /* 步长 */
12      for (; low <= MAXHIGH; low += temp) {
13          celsius = getcelsius(low);  /* 使用函数获取转换后的温度 */
14          printf("%d\t%d\n", low, celsius);
15      }
16 }
17 
18 /* getcelsius:获取转换后的温度 */
19 int getcelsius(int temp)
20 {
21     return (5 * (temp-32) /9);
22 }

RT:

本题结果和习题1-3一样,只是本程序在原来的基础上使用了函数。

习题1-16:修改打印最长文本行的程序的主程序main,使之可以打印任意长度的输入行的长度,并尽可能的多打印文本。

View Code
 1 #include <stdio.h>
 2 #define MAXLINE 1000
 3 
 4 int getline(char line[], int maxline);
 5 void copy(char to[], char from[]);
 6 
 7 /* 打印出输入中最长的行 */
 8 main() 
 9 {
10     char line[MAXLINE];                /* 当前输入的行 */
11     char maxline[MAXLINE];             /* 用于保存最长的行 */
12     int len, maxlen;                   /* 当前行的长度以及保存最长行的长度 */
13     len = maxlen = 0;
14     while ((len = getline(line, MAXLINE)) > 0) {
15         printf("%d, %s\n", len, line);
16         if (len > maxlen) {
17             maxlen = len;
18             copy(maxline, line);
19         }
20     }
21     if (maxlen > 0)
22         printf("%s\n",maxline);/* 字符数组即字符串,相当于双引号内的赋值 */
23     return 0;
24 }
25 
26 /* getline:获取当前行 */
27 int getline(char s[], int max) {
28     int c, i, j;
29     j = 0;
30     for (i = 0; (c = getchar()) != EOF && c != '\n'; ++i) {
31         if (i < max -2) {
32             s[j] = c;
33             ++j;
34         }
35     }
36     if (c == '\n') {
37         s[i] = c;
38         ++i;
39         ++j;
40     }
41     s[i] = '\0';
42     return i;
43 }
44 
45 /* copy:字符数组的拷贝 */
46 void copy(char to[], char from[]) {
47     int i = 0;
48     while ((to[i] = from[i]) != '\0')
49         i++;
50 }

RT:

回车开始输出当前行,数字表示当前行的长度,后面为输出当前行,最后结束时输出所有行中最长的行。

话说,欧洲杯的比赛开始了...明天继续码代码0_0.

posted @ 2012-06-14 00:09  飘零de思绪  阅读(1581)  评论(1编辑  收藏  举报