一段統計字元數的代碼及分析。 先貼代碼: 以下是實驗過程,將memset語句註釋掉 結果是上圖的一大串數字,來看看是為什麼: 可以看到,在未初始化時,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