注:既然是从大到小,那么下面的柱子名称也得跟着变才行
思路
总之就是各种判断,我感觉写的好啰嗦(105行,主要是判断那一块儿占得多,我是按行输出的,每一行都有9种输出的可能,所以用了好多else if),不知道有没有大佬有简单点的写法.
#include <stdio.h>
#include <stdlib.h>
void sort(int *p,char **pc) //排数据的时候同时排名称
{
int i,j,tmp;
char *tmp2;
for(i=0; i<3; i++)
{
for(j=0; j<3-i; j++)
{
if(p[j]<p[j+1])
{
tmp=p[j];
tmp2=pc[j];
p[j]=p[j+1];
pc[j]=pc[j+1];
p[j+1]=tmp;
pc[j+1]=tmp2;
}
}
}
}
int main()
{
int i,alp,num,oth;
char a[100];//存放字符串
char *pa;
int c[3];//c存放三个统计数据
int *pc;
char cc[3][4]={"alp","num","oth"};
char **pcc;
pcc=(char**)malloc(sizeof(char*)*3);
pc=(int*)malloc(sizeof(int*)*3);//申请统计数据指针数组
while(gets(a))
{
pa=a;
for(i=0,alp=0,num=0,oth=0; i<100; i++)//统计个数
{
if(pa[i]=='\0') break;
if('A'<=pa[i] && pa[i]<='Z' || 'a'<=pa[i] && pa[i]<='z')
{
alp++;
}else if('0'<=pa[i] && pa[i]<='9'){
num++;
}else{
oth++;
}
}
printf("alp=%d num=%d oth=%d\n",alp,num,oth);
c[0]=alp; c[1]=num; c[2]=oth;
for(i=0; i<3;i++)//初始化统计数据指针数组
{
pc[i]=c[i];
}
for(i=0; i<3;i++)//初始化数据名称指针数组
{
pcc[i]=cc[i];
}
sort(pc,pcc);
for(i=0; i<=pc[0]; i++)
{
if(i==0)
{
if(pc[0]==pc[1] && pc[1]==pc[2])
{
printf(" %d %d %d\n",pc[0],pc[0],pc[0]);
}else if(pc[0]==pc[1] && pc[1]!=pc[2]){
printf(" %d %d\n",pc[0],pc[0]);
}else{
printf(" %d\n",pc[0]);
}
}else if(pc[1]<pc[0]-i){
printf("*****\n");
}else if(pc[1]==pc[0]-i && pc[0]-i>pc[2]){
printf("***** %d\n",pc[1]);
}else if(pc[1]==pc[0]-i && pc[0]-i==pc[2]){
printf("***** %d %d\n",pc[1],pc[2]);
}else if(pc[2]<pc[0]-i){
printf("***** *****\n");
}else if(pc[2]==pc[0]-i){
printf("***** ***** %d\n",pc[2]);
}
else{
printf("***** ***** *****\n");
}
}
for(i=0; i<3;i++)//打印数组
{
printf(" %s ",pcc[i]);
}
printf("\n-----------------------\n");
}
system("pause");
}