The C Programming Language (2nd)--笔记--1.6

1.6 数组   

    编程统计数字、空白符号(空格符、制表符及换行符)以及所有其他字符出现的次数。程序实用意义不大,但可通过该程序讨论C语言多方面的问题。

        所有输入(字符)可分成12类,用一个数组存放各个数字出现的次数比使用10个独立的变量更方便。程序版本一:

#include <stdio.h>

/* count digits, white space, others */
main ()
{
    int c, i, nwhite, nother;
    int ndigit[10];

    nwhite = nother = 0;
    for (i = 0; i < 10; ++i)
        ndigit[i] = 0;

    while ((c = getchar ()) != EOF)
        if (c >= '0' && c <= '9')
            ++ndigit[c-'0'];
        else if (c == ' ' || c == '\n' || c == '\t')
            ++nwhite ;
        else 
            ++nother;

    printf ("digits = ");
    for (i = 0; i < 10; ++i)
       printf (" %d", ndigit[i]);
    printf (", white space = %d, other = %d\n",
        nwhite, nother );
}

把这段程序本身作为输入时,输出结果为:

        digits =  9 3 0 0 0 0 0 0 0 1,white space = 123, other = 345

        程序中的声明语句

int ndigit[10];

将变量声明为由10个整型数构成的数组。在C中,数组下标总从0开始,因此该数组的10个元素分别为ndigit[0]、ndigit[1]、…、ndigit[9],这可通过初始化和打印数组中的两个for循环语句反映。

        数组下标可以是任何整型表达式,包括整型变量(如i)及整型常量。

        该程序的执行取决于数字的字符表示属性。如测试语句

if(c >= '0' && c <= '9')

用于判断中的字符是否为数字。如果它是,该数字对应的数值是

c -'0'

只有当'0'、'1'、…、'9'具有连续递增的值时,这种做法才可行。幸运的是,所有的字符集都是这样的。

        由定义知,char 类型的字符是小整型,因此char类型的变量和常量在算术表达式中等价于int类型的常量和变量。这样做自然且方便,例如,c - '0'是个整型表达式,若存储在 c 中的字符是'0'~'9',其值将为0~9,因此可充当数组 ndigit 的合法下标。

        判断一个字符是数字、空白符还是其他字符可由下列语句序列完成:

if (c >= '0' && c <= '9')
    ++ndigit[c-'0'];
else if (c == ' ' || c == '\n' || c == '\t')
    ++nwhite ;
else 
    ++nother;

        程序中常使用下列方式表示而多路判定:

if(条件1)
语句1
else if (条件2)
语句2
…
…
else
语句n

在这种方式中,各条件从前往后依次求值,直到满足某个条件,然后执行对应的语句部分。这部分语句执行完成后,整个语句体执行结束(其中的任何语句都可以是锁在花括号中的若干条语句)。若所有条件都不满足,则执行位于最后一个else之后的语句(若有)。类似于前面的单词计数程序,若没有最后一个else及对应语句,该语句体将不执行任何动作。在第一个if与最后一个else之间可有0或多个下列形式的语句序列:

else if(条件)
语句

        就程序设计风格而言,建议读者采用上面所示的缩进格式以体现该结构的层次关系,否则,若每个if都比前一个else向里缩进一些距离,那么较长的判定序列就可能超出页面的右边界。

        第3章将讨论的 switch 语句提供了编写多路分支程序的另一方式。它特别适合于判定某个整型或字符表达式是否与一个常量集合中的某个元素相匹配的情况。将在第3.4节给出用switch语句编写的该程序的另一版本。

        练习1-13         编程,打印输入中单词长度的直方图。水平方向的直方图比较容易绘制,垂直方向的直方图要困难些。

        练习1-14         编程,打印输入中各个字符出现频度的直方图。 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值