题目
- 从键盘上输入字符。
(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"); }
执行结果