码迷,mamicode.com
首页 > 编程语言 > 详细

C语言统计字符数

时间:2017-08-30 22:28:35      阅读:290      评论:0      收藏:0      [点我收藏+]

标签:over   length   print   包含   default   网上   勿喷   c++11   4行   

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

  先贴代码:

#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

C语言统计字符数

标签:over   length   print   包含   default   网上   勿喷   c++11   4行   

原文地址:http://www.cnblogs.com/Lyewen/p/7455471.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!