C程序设计语言学习笔记(5)

此博客介绍了如何通过编程统计输入文件中单词长度,并将其绘制成直方图。同时,实现了一个功能,用于筛选并打印长度超过特定阈值的文本行。

每日一语:

按值调用

在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 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kcyuan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值