每日一语:
按值调用
在c语言中,所有函数变元都是“按值”传递的,这意味着,被调用函数所得到的变元值放在临时变量中而不是放在原来的变量中。被调用函数不能直接更改调用函数中变量的值,只能更改其私有临时拷贝的值
练习1-13:编写一个程序,打印其输入的文件中单词长度的直方图。
思路:将单词长度分别为1、2、3、、、放入到一个数组中。并初始化为0;
先统计出每个单词的长度以及每个长度的单词出现的次数。然后用双重循环分别扫描x轴和y轴绘制直方图
1 #include <stdio.h> 2 #define MAXWORDLEN 10 /*定义单词的最大长度*/ 3 #define IN 1 /*在单词中*/ 4 #define OUT 0 /*在单词外*/ 5 6 /**/ 7 int main() 8 { 9 while(1){ 10 int i,c,wordlen,overflow,thisval,thisidx,maxval; 11 wordlen=0; 12 overflow=thisval=thisidx=maxval=0; 13 int state; //判断输入的新字符是在单词中还是单词外 14 int flag=1;//判断 是否单词的首字符 输入(如果去掉这个标志,当出现多个回车符时会出错) 15 state = OUT; 16 int lenArr[MAXWORDLEN+1]; //存放每个单词长度的数字,最大为宏定义10 17 for(i=0;i<=MAXWORDLEN;i++) 18 lenArr[i]=0; //给每个单词长度初始化为0 19 20 while((c=getchar())!=EOF) 21 { 22 if(c==' '||c=='\t'||c=='\n') 23 { 24 if(state==IN) 25 { 26 27 /*统计长度为1-10的单词个数*/ 28 state = OUT; 29 if(wordlen<=MAXWORDLEN) 30 { 31 if(wordlen>0) 32 { 33 if(flag==0) 34 { 35 flag=1; 36 thisval = ++lenArr[wordlen-1]; 37 if(thisval>maxval) 38 { 39 maxval=thisval; 40 } 41 } 42 43 } 44 } 45 /*统计长度大于10的单词个数*/ 46 else 47 { 48 thisval = ++lenArr[MAXWORDLEN]; 49 if(thisval>maxval) 50 { 51 maxval=thisval; 52 } 53 } 54 } 55 } 56 57 else 58 { 59 if(state==OUT||flag==1) //state==OUT 表示在单词外面即遇到空格;flag==0表示单词的第一个字符 60 { 61 flag=0; 62 state =IN; 63 wordlen=0; 64 } 65 wordlen++; 66 } 67 68 /*没遇到空格,又在单词里面,让单词的长度自增*/ 69 } 70 /*分别扫描x和y,输出频率直方图 */ 71 for(thisval=maxval;thisval>0;thisval--) 72 { 73 printf("%4d|",thisval); 74 75 for(thisidx=0;thisidx<=MAXWORDLEN;thisidx++) 76 { 77 if(lenArr[thisidx]>=thisval) 78 { 79 printf("* "); 80 81 } 82 else 83 { 84 printf(" "); 85 86 } 87 } 88 printf("\n"); 89 90 } 91 92 93 printf(" +"); 94 for(thisval=0;thisval<=MAXWORDLEN;thisval++) 95 { 96 printf("---"); 97 98 } 99 printf("\n "); 100 101 102 for(thisval=0;thisval<MAXWORDLEN;thisval++) 103 { 104 printf("%2d ",thisval+1); 105 106 } 107 printf(">%d\n",MAXWORDLEN); 108 109 } 110 return 0; 111 }
练习1-17:把所有长度大于80的字符输入行都打印出来。
1 #include <stdio.h> 2 3 #define MINLENGTH 8 4 5 //将输入的字符串 复制到buff中 6 int readbuff(char *buffer) { 7 size_t i=0; 8 int c; 9 while (i < MINLENGTH) { 10 c = getchar(); 11 if (c == EOF) return -1; 12 if (c == '\n') return 0; 13 buffer[i++] = c; 14 } 15 return 1; 16 } 17 18 //复制一行 19 20 int copyline(char *buffer) { 21 size_t i; 22 int c; 23 int status = 1; 24 for(i=0; i<MINLENGTH; i++) 25 putchar(buffer[i]); //先把前MINLENGTH输出 26 while(status == 1) { 27 c = getchar(); 28 if (c == EOF) 29 status = -1; 30 else if (c == '\n') 31 status = 0; 32 else 33 putchar(c); 34 } 35 putchar('\n'); 36 return status; 37 } 38 39 int main(void) { 40 char buffer[MINLENGTH]; 41 int status = 0; 42 while (status != -1) { 43 status = readbuff(buffer); 44 if (status == 1) //如果大于MINLENGTH,就copyyline 45 status = copyline(buffer); 46 } 47 return 0; 48 }
自从看到一个命令在我的手下,蹦的一下------------我就笑了
浙公网安备 33010602011771号