轉載請註明出處:優YoU http://user.qzone.qq.com/289065406/blog/1308452631
大致題意:
給出一篇規範的文章,求其 句子數、單詞數 和 音節數
把這3個值代入題目給出的公式,輸出其結果,保留2位小數。
PS:“規範”即文章沒有錯誤的標點符號,字母在適當的位置有大小寫。
解題思路:
我做了整整5天的BT題,,就是被標點符號害的!!!
別聽信網上讒言,我個人總結出這題的標點符號只有6個!!!
註:下面的分隔字元不包括 括弧(),所有分隔字元均為 英式標點符號
標記單詞分隔字元: 逗號(,) 和 空格( )
句子分隔字元:句號(.) 問號(?) 冒號(:) 分號(;) 驚嘆號(!)
不存在上述標點符號以外的符號!!!所有符號只佔一個字元的位置!!
什麼 省略符號、引號、連字號、問號+歎號、斜杠 等等符號統統不存在!!
知道這個,後面的就好做了
每出現一個單詞分隔字元,單詞數+1
每出現一個句子分隔字元,句子數+1
注意:
由於用while(cin>>msg)輸入文章,因此是按 Null 字元 把文章分開若干片段,直到出現EOF時才結束輸入,因此msg中的單詞分隔字元不會出現空格,只要當msg最後一個字元為字母時,就說明此時的單詞分隔字元為空白格。
音節數是最難處理的,其規律如下:
(1) 當單詞總長度<=3時,音節數無條件+1
(2) 當單詞總長度>3時,單詞中每出現一個母音字母(a、e、i、o、u、y),音節數+1,但是連續的母音字母只按1個音節計算,且當單詞尾碼為-es、-ed和-e時,尾碼的母音字母e不列為音節數計算。但是尾碼-le例外,要計算音節數。
注意:
(1)母音字母要判斷12個,6個小寫,6個大寫。
(2)輸入的文章每個字元只能掃描一次,若重複掃描會逾時。
//Memory Time //244K 0MS #include<iostream>#include<iomanip>using namespace std;int word=0; //單詞數int sentance=0; //句子數int syllable=0; //音標數bool isalpha(char ch) //檢查字元ch是否為字母{if(ch>='A' && ch <='Z')return true;if(ch>='a' && ch <='z')return true;return false;}bool isvowel(char ch) //檢查字元ch是否為母音字母{if(ch=='a' || ch=='e' || ch=='i' || ch=='o' || ch=='u' || ch=='y')return true;if(ch=='A' || ch=='E' || ch=='I' || ch=='O' || ch=='U' || ch=='Y')return true;return false;}bool isword(char ch) //檢查字元ch是否為單詞分隔字元{if(ch==',')return true;return false;}bool issentance(char ch) //檢查字元ch是否為句子分隔字元{if(ch=='.' || ch=='?' || ch==':' || ch==';' || ch=='!')return true;return false;}int main(void){char msg[1000];while(cin>>msg) //以空格為標記,截取文章片段{int wordlen=0;bool flag_frevowel=false; //噹噹前字元為母音時,檢查前一字元是否為母音的標記int syl=0; //假設當前單詞長度>3時,記錄音節數的變化量。若單詞實際長度<=3,則syllable-sylint i;for(i=0;msg[i];i++){if(isalpha(msg[i])) //當前字元為 字母{wordlen++; //當前所處理的單詞的已知長度 (已知長度<=實際長度)if(wordlen<=3) //當 已知長度<=3 時{if(!isalpha(msg[i+1])) //檢查單詞實際長度是否<=3{syllable++; //當實際長度<=3時,syllable無條件+1syllable-=syl; //實際音節數調整,單詞實際長度<=3,則syllable減去 "假設單詞長度>3時" 音節數的變化量sylsyl=0;continue;}}if(isvowel(msg[i])) //當前字母為 母音字母{if(msg[i]=='e'){if(!isalpha(msg[i+1]) && msg[i-1]=='l') //-le{syllable++;syl++; //由於不知道單詞的實際長度,因此總音節數syllable與音節數變化量syl同時遞增continue;}else if(!isalpha(msg[i+1])) // -econtinue;else if((msg[i+1]=='d' || msg[i+1]=='s') && !isalpha(msg[i+2])) // -ed -escontinue;}/*處理連續或單個母音*/if(!flag_frevowel) //當前字母為母音,但前一字元不是母音{flag_frevowel=true;syllable++;syl++;continue;}else //當前字母為母音,但前一字母也是母音,即出現連續母音,syllable不計數continue;}flag_frevowel=false; //當前字母不是母音}else if(isword(msg[i])) //當前字元為 單詞分隔字元{flag_frevowel=false;wordlen=0; //當前單詞操作已結束,長度清零,計算下一單詞syl=0;word++;}else if(issentance(msg[i])) //當前字元為 句子分隔字元{flag_frevowel=false;wordlen=0; //當前單詞操作已結束,長度清零,計算下一單詞word++;syl=0;sentance++;}}if(isalpha(msg[i-1])) //當前文章片段最後一個字元為 字母word++;}cout<<fixed<<setprecision(2)<<206.835-1.015*(double)word/(double)sentance-84.6*(double)syllable/(double)word<<endl;return 0;}