资源描述
习题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.
展开阅读全文