题意:给你一首诗歌,输出所得的分数由于输入时不是按一行一句来的,而是无规则的,分辨一行是否结束是以逗号来分的,所以为了方便,我们可以先把整首合并起来,然后在进行分割。
syllables的计算:
每个单词(长度大于1),长度大于等于6的,得3分,但是如果长度为6,而单词中有包含“ng“或者”ny“,得2分。
长度4-5的,得2分。
长度小于4的,得1分。但是如果长度为3,而单词中有以元音开头,得2分。
B的计算:如果第1和第3行 或者 第2和第4行 的最后一个单词的最后两个字母相同,B加20,最多为40.
C的计算:如果第1和第3行 或者 第2和第4行 的syllables相同,C加10,最多为20
D的计算:超过4行,超出1行为10分。
E的计算:E=A+B+C-D
#include<bits/stdc++.h>
using namespace std;
char lasttwo[4][3];
int A,B,C,D,E;
int line;
char eachword[50];
int linepoint[4];
int getpoint(char a[],int len)
{
if(len==6&&(strstr(a,"ng")||strstr(a,"ny"))) return 2;
if(len==3&&(a[0]=='a'||a[0]=='e'||a[0]=='i'||a[0]=='o'||a[0]=='u'||a[0]=='A'||a[0]=='E'||a[0]=='I'||a[0]=='O'||a[0]=='U')) return 2;
if(len>=6) return 3;
if(len==4||len==5) return 2;
if(len==3||len==2) return 1;
}
int main()
{
char str[300];
char str2[400];
int t,cases=0;
scanf("%d",&t);
getchar();
while(t--)
{
memset(str,0,sizeof(str));
memset(linepoint,0,sizeof(linepoint));
A=B=C=D=0;
line=0;
while(1)
{
gets(str2);
int len=strlen(str2);
str2[len]=' ';
str2[len+1]='\0';
strcat(str,str2);
if(str2[len-1]=='.') break;
}
//puts(str);
int len=strlen(str)-1;
//printf("%d\n",len);
int sum=0;
for(int i=0;i<len;)
{
sum=0;
if(str[i]==' ')
{
i++;
continue;
}
while(1)
{
if(str[i]==' '||str[i]==','||str[i]=='.')
{
eachword[sum]='\0';
if(sum!=0&&line<4)
linepoint[line]+=getpoint(eachword,sum);
if(str[i]==','||str[i]=='.')
{
if(line<4)
{
lasttwo[line][0]=eachword[sum-1];
lasttwo[line][1]=eachword[sum-2];
lasttwo[line][2]='\0';
}
i++;
break;
}
sum=0;
}
else eachword[sum++]=str[i];
i++;
}
if(linepoint[line]>=8&&linepoint[line]<=12) A+=10;
//printf("%d\n",linepoint[line]);
line++;
//printf("%d",i);
//system("pause");
}
/*for(int i=0;i<4;i++)
printf("%d\n",linepoint[i]);*/
for(int i=0;i<2;i++)
{
if(linepoint[i]==linepoint[i+2]&&linepoint[i]!=0)
C+=10;
if(!strcmp(lasttwo[i],lasttwo[i+2])&&lasttwo[i][0]!='\0')
B+=20;
}
if(line>4)
D+=(line-4)*10;
E=A+B+C-D;
printf("Case #%d: %d %d %d %d %d\n",++cases,A,B,C,D,E);
}
return 0;
}