c程序设计语言第二版学习记录

第一章 导言

1.6 数组

核心代码:统计输入文本流中各个数字、空白符(包括空格、制表符、换行符)以及所有其他字符出现的次数。
#include <stdio.h>
int main() {
    int c;
    int nwhite = 0, nother = 0;
    int ndigit[10];
    for (int 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("digit:");
    for (int i = 0; i < 10; i++) {
        printf(" %d", ndigit[i]);
    }
    printf(" %d %d\n", nwhite, nother);
    return 0;
}

运行结果

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

备注:此处规定单词长度的最大值为10

由于自己规定了单词的最大长度,所以具体的步骤如下:

  1. 使用数组count来记录不同长度的单词个数
  2. 使用nw来记录每一个单词的长度:
    1. 识别到空白符:代表单词输入结束了,如果单词长度不为0,则统计到count中
    2. 识别到其他字符:还在输入单词,nw继续自增
  3. 打印水平直方图
    1. 由于count中,下标i记录的是单词长度,值记录的是该单词长度对应的单词数量
    2. 直接遍历count数组,打印i,为单词长度
    3. 根据count[i]的值为长度,打印*
  4. 打印垂直直方图
    1. 先遍历打印count中所有单词长度,并且记录最大的单词数量
    2. 根据最大的单词数量,遍历count数组:
      1. 如果count[i]为0,则直接打印空格;
      2. 如果count[i]不为0,则打印*,且count[i]自减
#include "stdio.h"
#define MAX_LEN 10
int main() {
    int count[MAX_LEN];
    int c, nw = 0;
    for (int i = 0; i < MAX_LEN; i++)
        count[i] = 0;
    while ((c = getchar()) != EOF) {
        if (c == ' ' || c == '\n' || c == '\t') {
            if (nw) {
                count[nw]++;
            }
            nw = 0;
        } else {
            nw++;
        }
    }
    // 打印水平直方图
    printf("wordlen\tcount\n");
    for (int i = 0; i < MAX_LEN; i++) {
        if (count[i] == 0)
            continue;
        printf("%d\t", i);
        for (int j = 0; j < count[i]; j++)
            printf("*");
        printf("\n");
    }
    // 打印垂直直方图
    int max = 0;
    for (int i = 0; i < MAX_LEN; i++) {
        printf("%d\t", i);
        max = max > count[i] ? max : count[i];
    }
    printf("\n");
    for (int i = 0; i < max; i++) {
        for (int j = 0; j < MAX_LEN; j++) {
            if (count[j] == 0)
                printf(" ");
            else {
                printf("*");
                count[j]--;
            }
            printf("\t");
        }
        printf("\n");
    }
    return 0;
}

运行结果(垂直直方图不知道如何只打印存在的长度,所以全部打出来了,熟悉的uu可以在评论区补充)

 

练习1-14 编写一个程序,打印输入中各个字符出现频度的直方图 
#include "stdio.h"
#define MAX_COUNT   127
int main() {
    int count[MAX_COUNT];
    int c;
    for (int i = 0; i < MAX_COUNT; i++) 
        count[i] = 0;
    while ((c = getchar()) != EOF)
        count[c]++;
    // 打印直方图
    printf("chara\tcount\n");
    for (int i = 0; i < MAX_COUNT; i++) {
        if (count[i] == 0)
            continue;
        printf("%c\t", i);
        for (int j = 0; j < count[i]; j++)
            printf("*");
        printf("\n");
    }
    return 0;
}

运行结果(有一个问题,那种不可见的字符,比如制表符、空格等需要转义吗?)

 

1.7 函数

核心代码:使用函数的形式实现计算较小正整数次幂
#include <stdio.h>
/* 测试power函数 */
int power(int m, int n);
int main() {
    int i;
    for (i = 0; i < 10; i++)
        printf("%d %d %d\n", i, power(2, i), power(-3, i));
    return 0;
}
/* power函数:求底数的n次幂,其中n>=0 */
int power(int base, int n) {
    int i, p;
    p = 1;
    for (i = 1; i <= n; i++)
        p = p * base;
    return p;
}

运行结果

 练习1-15 重新编写1.2节中的温度转换程序,使用函数实现温度转换计算

此处将温度转换计算和打印抽离到单独的change函数中,并且最大温度、最小温度以及温度跨度作为change函数的入参。在main函数中指定这些参数并且调用change函数进行温度转换

#include <stdio.h>
int change(float upper, float lower, int step);
int main() {
    change(300, 0, 20);
    return 0;
}
int change(float uppper, float lower, int step) {
    float fahr;
    for (fahr = uppper; fahr >= lower; fahr = fahr - step)
        printf("%3.0f\t%6.1f\n", fahr, 5 * (fahr - 32) / 9);
    return 0;
}

运行结果

 

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值