第一章 导言
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
由于自己规定了单词的最大长度,所以具体的步骤如下:
- 使用数组count来记录不同长度的单词个数
- 使用nw来记录每一个单词的长度:
- 识别到空白符:代表单词输入结束了,如果单词长度不为0,则统计到count中
- 识别到其他字符:还在输入单词,nw继续自增
- 打印水平直方图
- 由于count中,下标i记录的是单词长度,值记录的是该单词长度对应的单词数量
- 直接遍历count数组,打印i,为单词长度
- 根据count[i]的值为长度,打印*
- 打印垂直直方图
- 先遍历打印count中所有单词长度,并且记录最大的单词数量
- 根据最大的单词数量,遍历count数组:
- 如果count[i]为0,则直接打印空格;
- 如果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;
}
运行结果