练习1-13 编写一个程序,打印输入中单词长度的直方图。水平方向的直方图比较容易绘制,垂直方向的直方图则要困难些。
代码如下:
#include <stdio.h> // 包含标准库的信息。 #define MAXWORD 10 // 输入单词的最大数。 #define IN 1 // 在单词内。 #define OUT 0 // 在单词外。 int main() // 定义名为main的函数,它不接受参数值。 { printf("======打印输入单词长度的直方图======\n"); printf("======只统计前10个单词的长度======\n"); int ws_len[MAXWORD]; int c, count, i, state; // 单词,单词长度,单词个数,是否输入了多个\t或空格。 c = count = i = state = 0; while ((c = getchar()) != EOF) { if (c == ‘\t‘ || c == ‘\n‘ || c == ‘ ‘) // 如果输入完了一个单词。 { // 把单词长度放入长度数组。 if (state == IN) { state = OUT; // 将长度放入长度数组。 ws_len[i] = count; // 清空单词长度。 count = 0; // 数组下表+1; ++i; } } else { // 如果输入的不是\t,\n和空格,记录单词长度。 ++count; state = IN; } } int j; printf("单词长度水平直方图如下:\n"); for (i = 0;i < 10;i++) { printf("%2d |", i+1); for (j = 0;j < ws_len[i];j++) { printf("*"); } printf("\n"); } printf("\n单词长度垂直直方图如下:\n"); int maxvalue = 0; // 获得最长的单词长度。 for (i = 0;i < 10;i++) { if (ws_len[i] > maxvalue) { maxvalue = ws_len[i]; } } // 从最上排向下打印。 for (i = maxvalue; i > 0; --i) { for (j = 0; j < 10; j++) if (ws_len[j] >= i) { printf(" * "); } else printf(" "); printf("\n"); } for (i = 0; i < 10; i++) printf(" %d ", i); getchar(); // 防止控制台一闪而过,需要接受任意字符后在关闭控制台。 return 0; // 向执行环境返回一个整形,0代表执行成功。 }
个人理解:
使用之前的计数器功能记录单词的长度,然后在运用循环功能对数组中记录的单词长度进行排版打印。
时间: 2024-11-03 21:26:52