题目描述
写一个程序从输入文件中去读取四行大写字母(全都是大写的,每行不超过100个字符),然后用柱状图输出每个字符在输入文件中出现的次数。严格地按照输出样例来安排你的输出格式。
输入格式
四行字符,由大写字母组成,每行不超过100个字符
输出格式
由若干行组成,前几行由空格和星号组成,最后一行则是由空格和字母组成的。在任何一行末尾不要打印不需要的多余空格。不要打印任何空行。
输入输出样例
输入 #1
THE QUICK BROWN FOX JUMPED OVER THE LAZY DOG.
THIS IS AN EXAMPLE TO TEST FOR YOUR
HISTOGRAM PROGRAM.
HELLO!
输出 #1

代码
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
char line[444];
int i;
int alpha[27];
memset(alpha, 0, sizeof(alpha));
fgets(line, 444, stdin);
i = 0;
while (line[i] != '\0')
{
alpha[line[i] - 'A']++;
i++;
}
fgets(line, 444, stdin);
i = 0;
while (line[i] != '\0')
{
alpha[line[i] - 'A']++;
i++;
}
fgets(line, 444, stdin);
i = 0;
while (line[i] != '\0')
{
alpha[line[i] - 'A']++;
i++;
}
fgets(line, 444, stdin);
i = 0;
while (line[i] != '\0')
{
alpha[line[i] - 'A']++;
i++;
}
int max = alpha[0];
for (int i = 0; i < 26; i++)
{
if (max < alpha[i])
max = alpha[i];
}
char draw[400][52];
memset(draw, ' ', sizeof(draw));
for (int i = 0; i < 52; i+=2)
{
for (int j = max - 1, k = 0; k != alpha[i / 2]; k++,j--)
{
draw[j][i] = '*';
}
}
for (int i = 0; i < max; i++)
{
for (int j = 0; j < 52; j++)
{
printf("%c", draw[i][j]);
}
printf("\n");
}
for (int i = 0; i < 26; i ++)
{
if (i == 0)
printf("%c", 'A' + i);
else
printf(" %c", 'A' + i);
}
printf("\n");
}
总结
-
fgets()函数,也是只能输入一行。不能多行输入
-
memset()函数可以对多维数组进行初始化,与一维数组使用方法相同
-
对于下面这行代码,我总算改变了以往的固定思维。利用了 k 来进行计数,打印了多少个*,而 j 则来表明下标。
for (int j = max - 1, k = 0; k != alpha[i / 2]; k++,j--)
{
draw[j][i] = '*';
}
- 代码写的还是很是水。水到极致。
463

被折叠的 条评论
为什么被折叠?



