POJ-3371-Flesch Reading Ease一道模拟题

本题大意:

输入一段文章,然后根据文章求出  单词总数,元音节数,句子数!然后根据题目所给的一个公式,把三个值带入,然后将所得值保留两位小数,再输出即可!

1.单词总数:gets()和scanf()的区别在于:gets()的结束符是仅仅是回车,即换行符;而scanf()的结束符是空格和换行符!

所以输入的时候就应该使用scanf(),这样输入一次,单词总数就直接加1次就可以了!!!


2.句子数:有第一点输入方法的保障,求句子数也是很简单的,就把输入的字符串传参到自定义函数里,然后取a[len-1],进行判断,看是否是结束符号里面的其中之一!是的话句子数就加1次!

yuan[12]= {'A','E','I','O','U','Y','a','e','i','o','u','y'};


3.元音节数:


  1. Each vowel (one of a, e, i, o, u and y) in a word is considered one syllable subject to that
    1. -es, -ed and -e (except -le) endings are ignored,
    2. words of three letters or shorter count as single syllables,
    3. consecutive vowels count as one syllable.

1.单词后缀为-es,-ed,或者最后一个字母为e(除去le这种不算)的,都不算为元音节数!!!

2.单词长度若小于等于3的话就直接被计为1个元音节,不用再继续进行判断了!!!

3.连续多个元音节被视为1个!!!



然后关于计算元音节数,我是先定义一个数组,当然,数组长度要开大点,保证能大于每一个单词的长度,然后初始化为0!搜索单词,只要是元音节,就将对应的数组元素值变为1,最后再根据数组来计算元音节数!


好了,思路大致就是这样了!代码如下:

#include<stdio.h>
#include<string.h>
char yuan[12]= {'A','E','I','O','U','Y','a','e','i','o','u','y'};
char biao[5]= {'.','?',':',';','!'};
int yuanyin(char a[],int len)
{
    //单词里面可能还有标点符号,如果有那么果断去掉,再进行判断!
    if(a[len-1]<'a'||a[len-1]>'z')
        len--;
    int yi[20];
    memset(yi,0,sizeof(yi));
    int sum=0;//定义一个数组,里面的值要么为1,要么为0,这个是用来求元音个数的!
    if(len<=3)
        return 1;//单词数少于3,那么就直接返回 1 !
    for(int i=0; i<len; i++)
    {
        if(i==len-2)
            if((a[len-2]=='e'&&a[len-1]=='s')||(a[len-2]=='e'&&a[len-1]=='d'))
            {
                yi[i]=0;
                continue;
            }//表明最后两个字母已经没必要再继续进行判断了!直接退出!
        if(i==len-1&&a[i]=='e')
        {
            //表明最后一个字母为e!
            if(a[i-1]=='l')
                yi[i]=1;
            else
                yi[i]=0;
            continue;
        }
        for(int j=0; j<12; j++)
            if(a[i]==yuan[j])//表示找到了元音字母!
                yi[i]=1;
    }
    for(int i=0; i<20; i++)
    {
        if(yi[i]==1&&yi[i+1]==0)
            sum++;
    }
    return sum;//此为元音个数!
}
int sentences(char a[],int len)
{
    int sum=0;
    for(int i=0; i<5; i++)
    {
        if(a[len-1]==biao[i])
            return 1;//找到了符号就直接返回 1 !
    }
    return 0;//如果没有句子判断符号,就表明句子至今还未出现,则返回 0 !
}
int main()
{
    char str[520];
    int sen=0,swo=0,syll=0;
    //定义句子,单词,元音节数并且初始化!
    while(scanf("%s",str)!=EOF)
    {
        swo++;//单词数加 1 !
        int len=strlen(str);
        sen+=sentences(str,len);
        syll+=yuanyin(str,len);
    }
    //printf("%d , %d , %d\n",swo,sen,syll);
    double num1=(swo*1.0/sen)*1.015;
    double num2=(syll*1.0/swo)*84.6;
    double num=206.835-num1-num2;
    printf("%.2lf\n",num);
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值