C语言之输入的统计


此处主要以统计字符的个数,单词的个数,行数来练习一些递增的规则和while循环还有for循环

首先写一个统计字符数的小程序,示例如下:

[root@CWG hc]# cat zftj.c
#include <stdio.h>
main()
{
    long C_NUM = 0;                  //声明一个长整形来统计字符的个数,int的长度不够会出现计算溢出的情况
    
    while (getchar() != EOF)         //如果getchar获取的值不等于文本结束符的话 就执行循环体
        ++C_NUM;                            //”++“ 这个运算等同与 +1,++a == a+1,a++ == a+1,而a++ != ++a  在赋予变量的时候b = a++;是先将a的原始值赋予b之后变量a再执行运算,b = ++a;是先将a++运算完之后,再将a的值赋予b变量
    printf("%d\n", C_NUM);             //最后打印处C_NUM 所统计的数值
}

getchar每获取一个不等与EOF的值,C_NUM的值就+1,当输入文本结束符的时候此程序将打印处最后C_NUM 所统计的值

结果如下:

[root@CWG hc]# ./zftj
kkk                    //输入三个k
d                        //输入了一个d
6                        //3+1=4,为什么会打印处6呢?因为没此当我们输入完字符后会输入一个回车符“\n”,此处也统计成了一个字符,所有3+1+2 =6
[root@CWG hc]# ./zftj
cc
3                         //此处只统计了一个回车符号,所以是2+1=3

有于双精度浮点型的变量比long长整形的更长,范围更大,所有下个用双精度浮点型(double)来运算这个字符统计程序,同时并练习for循环:

[root@CWG hc]# cat fzftj.c
#include <stdio.h>
main()
{
    double C_NUM;              //声明一个double类型的变量
    for (C_NUM = 0; getchar() != EOF; ++C_NUM)  //首先初始化C_NUM的值为0,然后循环条件为getchar函数获得的值不等与EOF,如果执行一次函数体,则C_NUM加1
        ;                                                                                //循环体为空,所以不执行任何操作,只是继续循环条件的变更
    printf("%.0f\n", C_NUM);                                          //最后打印处C_NUM统计的参数
}

我们将它编译为fzftj,和以上zftj执行的结果一样


以上是字符的个数统计,每一个字符,统计的值++即可,下边我们来统计行数,每行的行末将是一个为“\n”的换行符,一次为据来写这个程序

[root@CWG hc]# cat tjhs.c
#include <stdio.h>
main()
{
    int LIN, i;
    LIN = 0;
    while ((i =  getchar()) != EOF)                 //如果i的值是getchar获取的值,如果getchar获取的值不等与文本结束符,就执行循环体
        if (i == '\n')                                               //如果循环条件成立,则判断i的值是否等于换行符“\n”如果是就是另起一行,所以LIN加1
            ++LIN;                                                 //LIN加1
    printf("%d\n", LIN);                                    //打印处LIN最后统计的值
}

运行结果是:

[root@CWG hc]# ./tjhs
rrr              //输入一行
hello         //在输入一行
2                //统计结果为一共两行


下边我们将看一个能统计行数,能统计字符个数,还能统计单词个数的程序

[root@CWG hc]# cat sumtj.c
#include <stdio.h>
#define IN 1                          //定义一个字符常量OUT
#define OUT 0                      //定义一个字符常量IN
main()
{
    int c, hang, ci, gs, zt;         
    
    zt = OUT;                       //将状态的初始值设置成OUT
    hang = ci = gs = 0;       //将行,单词,字符的个数初始值都设置成0
    while ((c = getchar()) != EOF) {
        gs++;                      //每次输入gs都+1统计字符个数
        if (c == '\n')             //每次输入换行符行数+1
            hang++;
        if (c == ' ' || c == '\n' || c == '\t')   //“||”是或者的意思,如果输入是空格,或者换行符,或者制表符的话设置zt的状态为OUT,如果下次输入不是EOF还能到这儿,而且到这儿输入的不是空格,或者制表符或者换行的话,就算有一个单词了,到这而zt的状态为OUT
            zt = OUT;
        else if (zt == OUT) {
            zt = IN;                           //状态归位
            ci++;                               //单词的个数+1
        }
    }
    printf("hang %d, danci %d, zifu %d\n", hang, ci, gs);
}

程序的描述大概是这样的,while循环中不管怎么样,只要有输入则gs+1,如果有换行,则行数+1,如果输入是空格,或者制表符或者换行的话就将zt的状态设置为OUT,当if成立了之后else if则不运行开始下一轮的循环,下一轮循环循环到最后一个if的时候,如果输入的是空格,或者制表符或者换行的话继续将zt的状态设置为OUT,如果不是的花判断上一个输入是不是空格,或者制表符或者换行,此处判断这一条件只需要判断zt的状态如果是out则上此的输入是空格,或者制表符或者换行则ci的值+1,如果IN的花就说明上次的输入不是空格,或者制表符或者换行符,所有这个字符和上个单词是同一个单词因此不用加ci的值。

执行结果如下:

[root@CWG hc]# ./sumtj
hh hh
dd
wocaole de
hang 3, danci 5, zifu 20

3行,5个单词,20个字符(算上换行)


以上组要讲了++n的概念,||运算的概念,if简单的判断的概念


####################################

迷途小运维学习C语言笔记

作者:john

转载请注明出处

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值