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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM