题目描述
写一个程序从输入文件中去读取四行大写字母(全都是大写的,每行不超过100个字符),然后用柱状图输出每个字符在输入文件中出现的次数。严格地按照输出样例来安排你的输出格式。
输入输出格式
输入格式:
四行字符,由大写字母组成,每行不超过100个字符
输出格式:
由若干行组成,前几行由空格和星号组成,最后一行则是由空格和字母组成的。在任何一行末尾不要打印不需要的多余空格。不要打印任何空行。
==================================================================
#include <cstdio>
#include <iostream>
#include <string.h>
using namespace std;
int main()
{
int sum[27]={0}; //默认26个字母最初只出现了0次;sum[0]不存东西,
//sum[1]表示第一个字母A出现了几次。(sum数组记录对应字母出现次数)
int flag[27]={0}; //flag数字表示1-26个字母这一行需不需要打印,需要打印则为1;标记数组
char a[100];
char b[100];
char c[100];
char d[100];
gets(a);
gets(b);
gets(c);
gets(d); //输入四个字符串
int lena,lenb,lenc,lend;
lena=strlen(a);
lenb=strlen(b);
lenc=strlen(c);
lend=strlen(d); //strlen()函数得到字符串的长度。
int i;
for(i=0;i<lena;i++)
{
if(65<=a[i]&&a[i]<=90)
{
sum[a[i]-64]++;
}
}
for(i=0;i<lenb;i++)
{
if(65<=b[i]&&b[i]<=90)
{
sum[b[i]-64]++;
}
}
for(i=0;i<lenc;i++)
{
if(65<=c[i]&&c[i]<=90)
{
sum[c[i]-64]++;
}
}
for(i=0;i<lend;i++)
{
if(65<=d[i]&&d[i]<=90)
{
sum[d[i]-64]++;
}
} //依次从四个字符串循环判断字符是否为大写字母
//符合要求,则对应sum数组中的字母出现次数要加1,从而起到计数作用
int maxsum=sum[1]; //默认第一个字母是出现最多次的;
//一行一行,由上往下打印,从左到右打印,不能打印多余空格
//最后一行就是A B C D E F G H I J K
for(i=2;i<=26;i++)
{
if(sum[i]>=maxsum)
{
maxsum=sum[i]; //比较,找出出现最多次的字母,即打印最多个*号的字母
}
}
int j=maxsum; //maxsum赋值给j,表示*号最多打印j行,最后一行打印ABCD````Z;
int k=maxsum; //k来记录这回打印的是表示出现第几次的*号
//k要减1,并且flag要变为0;
for(i=0;i<j;i++)
{
int time=1; //最远打印到第几个字母,默认打印到第一个字母就好;
for(int a=1;a<=26;a++)
{
if(sum[a]>=k) //k是表示当前这行打印的是表示出现了几次的
//举例:如果当前k=7,表示这行打印出的*号对应的字母,至少出现了7次;
//如果sum[a]>=k;说明该字母出现的次数至少有k次,这一行应该打印。
{
flag[a]=1; //应该打印*好,故flag数组记为1 这个字母上方需要打印*号。
if(2*a-1>=time)
{
time=2*a-1; //time 用来记录当前所在行,最远打印到第几个字母
}
}
} //以上工作为从上到下标记,以下操作为从左到右打印,从上到下。
for(int b=0;b<time;b++)
{
if(flag[b/2+1]==1) // 根据标记结果,从左到右打印
{
printf("*");
flag[b/2+1]=0;
}
else
{
printf(" ");
}
}
printf("\n");
k--;
}
printf("A B C D E F G H I J K L M N O P Q R S T U V W X Y Z");
return 0;
}
有其他方法欢迎互相学习讨论。
2019.7.12;