Flesch Reading Ease 是一個經典的英文文本可讀性評分公式。給定一篇規範文本,需統計三項指標並代入公式:
. ? : ; ! 分隔, 分隔公式:206.835 - 1.015 × (單詞數/句子數) - 84.6 × (音節數/單詞數),結果保留兩位小數。
a e i o u y(不分大小寫)且前一字符非元音 → 音節數 +1(連續元音只計一次)-es、-ed、-e 結尾時,該後綴的 e 不計入音節;但 -le 結尾例外,需計入。scanf("%s") 自動按空白分隔),檢查末尾標點符號以判斷句子結束並統計單詞。qian 标记前一字符是否為元音,實現「連續元音只計一次」。bool is_yuan(char c) {
return strchr("aeiouyAEIOUY", c) != NULL;
}
int main() {
char s[1010];
int sentences = 0, words = 0, syllables = 0;
while (~scanf("%s", s)) {
bool qian = false;
int len = strlen(s);
// 1. 基礎音節統計
if (len <= 3) syllables++;
else {
if (is_yuan(s[0])) { syllables++; qain = true; }
for (int i = 1; i < len; i++) {
if (is_yuan(s[i]) && !qian) { syllables++; qian = true; }
else if (!is_yuan(s[i])) qian = false;
}
}
// 2. 後綴修正
bool hasPunct = strchr(".,;!?:", s[len-1]) != NULL;
int last = hasPunct ? len-2 : len-1;
// 檢查 -e, -es, -ed (排除 -le)
if (last >= 1 && s[last] == 'e' && s[last-1] != 'l' && !is_yuan(s[last-1])) syllables--;
else if (last >= 2 && s[last] == 's' && s[last-1] == 'e' && !is_yuan(s[last-2])) syllables--;
else if (last >= 2 && s[last] == 'd' && s[last-1] == 'e' && !is_yuan(s[last-2])) syllables--;
// 3. 句子與單詞計數
if (hasPunct) sentences++;
words++;
}
printf("%.2f\n", 206.835 - 1.015*words/sentences - 84.6*syllables/words);
return 0;
}
-le 例外:如 apple 結尾 le 的 e 要計音節,不能扣除。while(~scanf(...)) 是標準寫法。