• C语言笔记(六)


    C语言学习第六天

    1.6 数组

    编写一个统计各个数字、空白符(包括空格符、制表符及换行符)以及所有其他字符出现的次数。这个程序的实用意义并不大,但我们可以通过该程序讨论C语言多方面的问题。
    所有的输入字符可以分成12类,因此可以用一个数组存放各个数字出现的次数,这样比用10个独立的变量更方便。

    #include

    /* 统计各个数字、空白符及其他字符出现的次数 */
    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);
    }

    该程序中的声明语句

    int ndigit[10];

    将变量ndigit声明为由10个整型数构成的数组。在C语言中,数组下标总是从0开始,因此该数组的10个元素分别为ndigit[0]、ndigit[1]、 ...、ndigit[9],这可以通过初始化和打印数组的两个for循环语句反映出来。
    数组下标可以时任何整型表达式,包括整型变量(如i)以及整型常量。
    由定义可知,char类型的字符时小整型,因此cahr类型的变量和常量在算术表达式中等价于int类型的变量和常量。这样做既自然又方便,例如,c-'0'是一个整型表达式,如果存储在c中的字符时'0'~'9',其值将为0~9,因此可以充当数组ndigit的合法下标。

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

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

    在这种方式中,各条件从前往后依次求值,直到满足某个条件,然后执行对应的语句部分。这部分语句执行完成后,整个语句体执行结束。如果所有条件都不满足,则执行位于最后一个else之后的语句(如果有的话)。在第一个if与最后一个else只见可以有0个或多个下列形式的语句序列:
        else if (条件)
            语句

    练习1-13 编写一个程序,打印输入中单词长度的直方图。水平方向的直方图必较容易绘制,垂直方向的直方图则要困难些。
    练习1-14 编写一个程序,打印输入中各个字符出现频度的直方图。

    ----------------------------------------------------------------------------------------------------
    #include

    /* 练习1-13 编写一个程序,打印输入中单词长度的直方图。水平方向的直方图必较容易绘制,垂直方向的直方图则要困难些。 */
    main() {
        int c, curlword, i, j; // 表示当前输入字符和当前单词长度
        int lword[50];
        int lwordMax; // 表示单词出现的最大次数

        i = j = curlword = lwordMax = 0;
        for(i = 0; i < 50; i++) {
            lword[i] = 0;
        }

        while ((c = getchar()) != EOF) {
            if (c == ' ' || c == '\t' || c == '\n') {
                if (curlword != 0) {
                    ++lword[curlword];
                }
                curlword = 0;
            } else {
                curlword++;
            }
        }

        for(i = 0; i < 50; i++) {
            if (lword[i] > lwordMax)
                lwordMax = lword[i]; // 找出最大值,最大值表示垂直直方图要输出的行数
        };

        printf("----单词长度水平直方图----\n");
        for (i = 0; i < 50; i++) {
            if (lword[i]) {
                printf("长度%2d|\t", i);
                for (j = 0; j < lword[i]; j++) {
                    printf(" *");
                }
                printf("\n");
            }
        }
        printf("------| ");
        for(i = 0; i < lwordMax; i++) {
            printf("---", i);
        }
        printf("\n");

        printf("次数  | ");
        for(i = 1; i <= lwordMax; i++) {
            printf("%2d", i);
        }
        printf("\n");
        printf("-----------------\n");

        printf("----单词长度垂直直方图----\n");
        for (i = lwordMax; i > 0; i--) { // i表示图中这一行单词出现次数
            printf("次数%2d| ", i);
            for (j = 0; j < 50; j++) {
                if(lword[j]) // 有统计的此才输出
                    if(lword[j] < i)
                        printf("   ");
                    else
                        printf(" * "); // 当前单词长度大于等于当前高度
            }
            printf("\n");
        }

        printf("------| ");
        for(i = 0; i < 50; i++) {
            if(lword[i])
                printf("---", i);
        }
        printf("\n");

        printf("长度  | ");
        for(i = 0; i < 50; i++) {
            if(lword[i])
                printf("%2d ", i);
        }
        printf("\n-----------------\n");
    }

    ------------------------------------------------------------------------------------------------------
    #include

    /* 练习1-14 编写一个程序,打印输入中各个字符出现频度的直方图。*/
    main() {
        int c, i, j, lcharMax;
        int charTime[128];  // 假设只计算a~z,A~Z,0~9字符频度,其他的就太多了

        i = j = lcharMax = 0;
        for (i = 0; i < 128; i++)
            charTime[i] = 0;

        while ((c = getchar()) != EOF)
            ++charTime[c];

        for(i = 0; i < 128; i++) {
            if (charTime[i] > lcharMax)
                lcharMax = charTime[i]; // 找出最大值,最大值表示垂直直方图要输出的行数
        };

        printf("----字符频度水平直方图----\n");
        for (i = 0; i < 128; i++) {
            if (charTime[i] && (i>= '0' && i <= '9' || i >= 'a' && i <= 'z' || i >= 'A' && i <= 'Z')) {
                printf("字符%c|\t", i);
                for (j = 0; j < charTime[i]; j++) {
                    printf(" *");
                }
                printf("\n");
            }
        }
        printf("-----|--");
        for(i = 0; i < lcharMax; i++) {
            printf("---", i);
        }
        printf("\n");

        printf("次数 |  ");
        for(i = 1; i <= lcharMax; i++) {
            printf("%2d", i);
        }
        printf("\n");
        printf("-----------------\n");

        printf("----字符频度垂直直方图----\n");
        for (i = lcharMax; i > 0; i--) { // i表示图中这一行单词出现次数
            printf("次数%2d| ", i);
            for (j = 0; j < 128; j++) {
                if(charTime[j] && (j>= '0' && j <= '9' || j >= 'a' && j <= 'z' || j >= 'A' && j <= 'Z')) // 有统计的此才输出
                    if(charTime[j] < i)
                        printf("   ");
                    else
                        printf(" * "); // 当前单词长度大于等于当前高度
            }
            printf("\n");
        }

        printf("------|--");
        for(i = 0; i < 128; i++) {
            if(charTime[i] && (i>= '0' && i <= '9' || i >= 'a' && i <= 'z' || i >= 'A' && i <= 'Z'))
                printf("---", i);
        }
        printf("\n");

        printf("字符  | ");
        for(i = 0; i < 128; i++) {
            if(charTime[i] && (i>= '0' && i <= '9' || i >= 'a' && i <= 'z' || i >= 'A' && i <= 'Z'))
                printf(" %c ", i);
        }
        printf("\n-----------------\n");

    }

  • 相关阅读:
    代码随想录算法训练营第五十七天 |392.判断子序列、115.不同的子序列
    从零开始Blazor Server(13)--消息通知
    计算机网络——互联网控制报文协议(ICMP)
    软件测试面试题及答案 这个在线题库的多种刷题模式能帮你快速通关
    torch实现Gated PixelCNN
    高校教务系统登录页面JS分析——华南理工大学
    Vim简介
    Cannot use object of type __PHP_Incomplete_Class as array
    OpenSSL CVE-2022-0778漏洞问题复现与非法证书构造
    熊市中市场状况低迷,COSOSWAP逐步实现协议价值的捕获
  • 原文地址:https://blog.csdn.net/u014360189/article/details/127948887