C语言统计字符数

  一段统计字符数的代码及分析。

  先贴代码:

#include<stdio.h>
#include<string.h>//提供memset函数原型。
int main()
{
    char S[80];
    int C[26],length;//一段声明,即字符数组S,整型数组C,和整型length。
    memset(C,0,sizeof(C));//将C清零,至于为什么不把字符数组清零,稍后有一段实验过程。
    for(int i=0;i<=3;i++)//循环4次,读入4行字符串。
    {
        gets(S);//获取字符串
        length=strlen(S);//获取字符串长度
        for(int j=0;j<length;j++)//循环length次,length=字符数
        {
            if(S[j]>='A'&&S[j]<='Z')//这一段代码很关键,判断语句,字符需要大写才能统计,即A~Z
                C[S[j]-'A']++;//S[j]-'A'是S[j]在字母表中的序号,记住如果S[j]是数字,要写成S[j]-'0'。
        }
    }
    for(int i=0;i<26;i++)
        printf("%d ",C[i]);//循环26次,输出统计完的数字。
    return 0;
}

 

以下是实验过程,将memset语句注释掉

 

结果是上图的一大串数字,来看看是为什么:

 

 可以看到,在未初始化时,C数组是一些不定数字,因为它需要统计字符数,所以要清零。

if(S[j]>='A'&&S[j]<='Z')
    C[S[j]-'A']++;

这一段代码是该程序的精华,有人也许会写的长长一段来统计每一个字母的字符数,这里只要两个数组便解决了,这利用了计算机存储能力。

笔者后来在网上搜寻资料,发现有一段更有趣的代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int ff[26];
int main()
{
    int i,j,n,maxn=0;char a[81];
    for(i=0;i<4;i++)
    {
        gets(a);
        n=strlen(a);
        for(j=0;j<n;j++)if(a[j]>='A'&&a[j]<='Z')ff[a[j]-'A']++;
    }
    for(i=0;i<26;i++)maxn=max(maxn,ff[i]);
    for(i=maxn;i>0;i--){
    for(j=0;j<26;j++)
    if(ff[j]>=i)printf("* ");else printf("  ");
    printf("\n");}
    for(i=0;i<26;i++)printf("%c ",i+'A');
}

 

输入样例
THE QUICK BROWN FOX JUMPED OVER THE LAZY DOG.
THIS IS AN EXAMPLE TO TEST FOR YOUR
HISTOGRAM PROGRAM.
HELLO!
输出样例
*
                            *
        *                   *
        *                   *     *   *
        *                   *     *   *
*       *     *             *     *   *
*       *     * *     * *   *     * * *
*       *   * * *     * *   * *   * * * *
*     * * * * * *     * * * * *   * * * *     * *
* * * * * * * * * * * * * * * * * * * * * * * * * *
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


这里有一个max函数,包含在c++标准库中头文件<algorithm>中,c++11标准:<algorithm>中min函数的原型:
default (1)     
  template
<class T> const T& min (const T& a, const T& b); custom (2)   template <class T, class Compare>   const T& min (const T& a, const T& b, Compare comp); initializer list (3)   template <class T> T min (initializer_list<T> il);   template <class T, class Compare>   T min (initializer_list<T> il, Compare comp);

通过他们来求最大值和最小值:

maxn=max(maxn,ff[i]);

分析了max函数,在接下来分析一下这代码中的精华:

if(ff[j]>=i)printf("* ");else printf("  ");

 模拟,是可以输出的就输出*,否则跳过。

然后程序结果为:

 

 PS:这些笔记是我闲来无事而写,目的不明确,也许是为了以后能够更好的理解或复习C语言,望大神勿喷!

                                                                      2017-08-30

转载于:https://www.cnblogs.com/Lyewen/p/7455471.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值