习题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.