zoukankan      html  css  js  c++  java
  • POJ3371Flesch Reading Ease

    转载请注明出处:優YoU http://user.qzone.qq.com/289065406/blog/1308452631

     

    大致题意:

    给出一篇规范的文章,求其 句子数、单词数 音节数

    把这3个值代入题目给出的公式,输出其结果,保留2位小数。

    PS:“规范”即文章没有错误的标点符号,字母在适当的位置有大小写。

     

    解题思路:

    我做了整整5天的BT,,就是被标点符号害的!!!

    别听信网上谗言,我个人总结出这题的标点符号只有6个!!!

     

    注:下面的分隔符不包括 括号(),所有分隔符均为 英式标点符号

     

    标记单词分隔符: 逗号(, 空格(

    句子分隔符:句号(. 问号(? 冒号(: 分号(; 感叹号(!

     

    不存在上述标点符号以外的符号!!!所有符号只占一个字符的位置!!

    什么 省略号、引号、连字符、问号+叹号、斜杠 等等符号统统不存在!!

     

    知道这个,后面的就好做了

     

    每出现一个单词分隔符,单词数+1

    每出现一个句子分隔符,句子数+1

     

    注意:

    由于用while(cin>>msg)输入文章,因此是按 空字符 把文章分开若干片段,直到出现EOF时才结束输入,因此msg中的单词分隔符不会出现空格,只要当msg最后一个字符为字母时,就说明此时的单词分隔符为空格。

     

    音节数是最难处理的,其规律如下:

    (1)       当单词总长度<=3时,音节数无条件+1

    (2)       当单词总长度>3时,单词中每出现一个元音字母(aeiouy),音节数+1,但是连续的元音字母只按1个音节计算,且当单词后缀为-es-ed-e时,后缀的元音字母e不列为音节数计算。但是后缀-le例外,要计算音节数。

     

    注意:

    (1)元音字母要判断12个,6个小写,6个大写。

    (2)输入的文章每个字符只能扫描一次,若重复扫描会超时。

     

     

     

      1 //Memory Time 
    2 //244K 0MS
    3
    4 #include<iostream>
    5 #include<iomanip>
    6 using namespace std;
    7
    8 int word=0; //单词数
    9 int sentance=0; //句子数
    10 int syllable=0; //音标数
    11
    12 bool isalpha(char ch) //检查字符ch是否为字母
    13 {
    14 if(ch>='A' && ch <='Z')
    15 return true;
    16 if(ch>='a' && ch <='z')
    17 return true;
    18 return false;
    19 }
    20
    21 bool isvowel(char ch) //检查字符ch是否为元音字母
    22 {
    23 if(ch=='a' || ch=='e' || ch=='i' || ch=='o' || ch=='u' || ch=='y')
    24 return true;
    25 if(ch=='A' || ch=='E' || ch=='I' || ch=='O' || ch=='U' || ch=='Y')
    26 return true;
    27 return false;
    28 }
    29
    30 bool isword(char ch) //检查字符ch是否为单词分隔符
    31 {
    32 if(ch==',')
    33 return true;
    34 return false;
    35 }
    36
    37 bool issentance(char ch) //检查字符ch是否为句子分隔符
    38 {
    39 if(ch=='.' || ch=='?' || ch==':' || ch==';' || ch=='!')
    40 return true;
    41 return false;
    42 }
    43
    44 int main(void)
    45 {
    46 char msg[1000];
    47
    48 while(cin>>msg) //以空格为标记,截取文章片段
    49 {
    50 int wordlen=0;
    51 bool flag_frevowel=false; //当当前字符为元音时,检查前一字符是否为元音的标记
    52 int syl=0; //假设当前单词长度>3时,记录音节数的变化量。若单词实际长度<=3,则syllable-syl
    53 int i;
    54
    55 for(i=0;msg[i];i++)
    56 {
    57 if(isalpha(msg[i])) //当前字符为 字母
    58 {
    59 wordlen++; //当前所处理的单词的已知长度 (已知长度<=实际长度)
    60
    61 if(wordlen<=3) //当 已知长度<=3 时
    62 {
    63 if(!isalpha(msg[i+1])) //检查单词实际长度是否<=3
    64 {
    65 syllable++; //当实际长度<=3时,syllable无条件+1
    66 syllable-=syl; //实际音节数调整,单词实际长度<=3,则syllable减去 "假设单词长度>3时" 音节数的变化量syl
    67 syl=0;
    68 continue;
    69 }
    70 }
    71
    72 if(isvowel(msg[i])) //当前字母为 元音字母
    73 {
    74 if(msg[i]=='e')
    75 {
    76 if(!isalpha(msg[i+1]) && msg[i-1]=='l') //-le
    77 {
    78 syllable++;
    79 syl++; //由于不知道单词的实际长度,因此总音节数syllable与音节数变化量syl同时递增
    80 continue;
    81 }
    82 else if(!isalpha(msg[i+1])) // -e
    83 continue;
    84 else if((msg[i+1]=='d' || msg[i+1]=='s') && !isalpha(msg[i+2])) // -ed -es
    85 continue;
    86 }
    87
    88 /*处理连续或单个元音*/
    89
    90 if(!flag_frevowel) //当前字母为元音,但前一字符不是元音
    91 {
    92 flag_frevowel=true;
    93 syllable++;
    94 syl++;
    95 continue;
    96 }
    97 else //当前字母为元音,但前一字母也是元音,即出现连续元音,syllable不计数
    98 continue;
    99 }
    100
    101 flag_frevowel=false; //当前字母不是元音
    102 }
    103 else if(isword(msg[i])) //当前字符为 单词分隔符
    104 {
    105 flag_frevowel=false;
    106 wordlen=0; //当前单词操作已结束,长度清零,计算下一单词
    107 syl=0;
    108 word++;
    109 }
    110 else if(issentance(msg[i])) //当前字符为 句子分隔符
    111 {
    112 flag_frevowel=false;
    113 wordlen=0; //当前单词操作已结束,长度清零,计算下一单词
    114 word++;
    115 syl=0;
    116 sentance++;
    117 }
    118
    119 }
    120
    121 if(isalpha(msg[i-1])) //当前文章片段最后一个字符为 字母
    122 word++;
    123 }
    124
    125 cout<<fixed<<setprecision(2)<<206.835-1.015*(double)word/(double)sentance-84.6*(double)syllable/(double)word<<endl;
    126 return 0;
    127 }

    [ EXP技术分享博客 ] 版权所有,转载请注明出处: http://exp-blog.com
  • 相关阅读:
    Oracle SQL语句收集
    SqlParameter In 查询
    SQL 性能优化
    Entity Framework
    【XLL API 函数】 xlfSetName
    【XLL API 函数】xlfUnregister (Form 2)
    【XLL API 函数】xlfUnregister (Form 1)
    【Excel 4.0 函数】REGISTER 的两种形式以及VBA等效语句
    【Excel 4.0 函数】REGISTER
    【Bochs 官方手册翻译】 第一章 Bochs介绍
  • 原文地址:https://www.cnblogs.com/lyy289065406/p/2122857.html
Copyright © 2011-2022 走看看