题目
- 从键盘上输入字符。
(1)分别统计其中字母、数字、其他字符的个数。
(2)将统计的字母、数字、其他字符的个数以如下柱状图的形式打印(其中**表示其他字符):
思路
- 本题的难点在于哪种类型多,就要打印在前面,因为统计字母、数字、其他字符的个数后,需要进行排序。排序后,下面的alp、num、oth字符串的位置要相应地发生变动。可以用交叉组合暴力法进行求解,这里采用指针数组。
代码
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a[3]={0};
char *p[3]={"alp","num","oth"};
char c;
int i,j;
int tmp;
char *ptmp;
while(scanf("%c",&c)!=EOF)
{
if(c>='A' && c<='Z' || c>='a' && c<='z')
{
a[0]++;
}else if(c>='0' && c<='9')
{
a[1]++;
}else{
if(c=='\n')//不统计\n
{
break;
}
a[2]++;
}
}
for(i=3;i>1;i--)//冒泡法同步交换
{
for(j=0;j<i-1;j++)
{
if(a[j]<a[j+1])
{
//交换整型数组
tmp=a[j];
a[j]=a[j+1];
a[j+1]=tmp;
//交换字符指针数组中的指针
ptmp=p[j];
p[j]=p[j+1];
p[j+1]=ptmp;
}
}
}
printf("a[0]=%d,a[1]=%d,a[2]=%d\n",a[0],a[1],a[2]);
printf("p[0]=%s,p[1]=%s,p[2]=%s\n",p[0],p[1],p[2]);
for(i=0;i<=a[0];i++)//开始打印(2)
{
if(0==i)
{
printf("%3d",a[0]);
}else{
printf("****** ");
}
if(a[0]-a[1]==i)
{
printf("%3d",a[1]);
}else if(a[0]-a[1]<i){
printf("****** ");
}
if(a[0]-a[2]==i)
{
printf("%3d",a[2]);
}else if(a[0]-a[2]<i){
printf("****** ");
}
printf("\n");
}
printf("%5s %5s %5s\n",p[0],p[1],p[2]);
system("pause");
}
执行结果

京公网安备 11010502036488号