一段統計字符數的代碼及分析。
先貼代碼:
#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
