• 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
  • 相关阅读:
    URAL 1948 H
    int、long、long long取值范围
    Bonetrousle HackerRank 数学 + 思维题
    湖南省第十二届大学生计算机程序设计竞赛 problem A 2016
    Abbreviation ---- hackerrank
    POJ 3321 Apple Tree DFS序 + 树状数组
    HDU
    PICO CTF 2013 PHP 2: 85
    XSS进阶三
    XSS进阶二
  • 原文地址:https://www.cnblogs.com/lyy289065406/p/2122857.html
Copyright © 2020-2023  润新知