题目

  1. 从键盘上输入字符。
    (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");
}

执行结果
图片说明