题目信息
小张的英语不太好,今天他又要面临英语作文的困扰了。终于他在ddl的前一秒完成了他的作文,但是由于太过匆忙,很多单词的大小写出现了问题。请你在一秒之内帮他改完英语作文吧!
输入
给出若干行字符串表示小张的作文,以EOF结束。保证文章总长度不超过1000000个字符。整篇文章只有大小写英文字母,空格,'.',',','?','!'
。并且保证每个标点符号都紧跟前面的单词,单词之间恰好一个空格。
输出
输出修改后的作文,要求每一句第一个单词的首字母大写,其他单词所有字母小写。'.','?','!'
表示每一句的结束。
测试样例
How aRe you?
I am fine. and you?
i am fine, Too.
See yOu.
Goodbye.
How are you?
I am fine. And you?
I am fine, too.
See you.
Goodbye.
解答
#include <iostream>
#include <cstring>
#include <math.h>
using namespace std;
int ZhuanHua(int x)
{
if (x >= 'a' && x <= 'z')
{
return x - 'a' + 'A';
}
else
{
return x - 'A' + 'a';
}
}
int main()
{
//freopen("/Users/zhj/Downloads/test.txt", "r", stdin);
char tmp[1000010];
while (gets(tmp) != NULL)
{
if (tmp[0] >= 'a' && tmp[0] <= 'z')
{
tmp[0] = ZhuanHua(tmp[0]);
}
if (tmp[1] >= 'A' && tmp[1] <= 'Z')
{
tmp[1] = ZhuanHua(tmp[1]);
}
int i = 2;
while (tmp[i] != '\0')
{
if (tmp[i - 1] == ' ')
{//前方一个出现空格的话,存在断句现象
if (tmp[i - 2] == '.' || tmp[i - 2] == '!' || tmp[i - 2] == '?')
{//如果前面出现了句号问好叹号则需要大写
if (tmp[i] >= 'a' && tmp[i] <= 'z')
{//只要前面不是句号,统一转换为小写
tmp[i] = ZhuanHua(tmp[i]);
}
}
else if (tmp[i - 2] == ',')
{//出现逗号需要小写
if (tmp[i] >= 'A' && tmp[i] <= 'Z')
{//只要前面不是句号,统一转换为小写
tmp[i] = ZhuanHua(tmp[i]);
}
}
else
{//仅仅是单词之间的空格
if (tmp[i] >= 'A' && tmp[i] <= 'Z')
{//只要前面不是句号,统一转换为小写
tmp[i] = ZhuanHua(tmp[i]);
}
}
}
else if ((tmp[i - 1] >= 'a' && tmp[i - 1] <= 'z') || (tmp[i - 1] >= 'A' && tmp[i - 1] <= 'Z'))
{//如果前方出现了字母
if (tmp[i] >= 'A' && tmp[i] <= 'Z')
{
tmp[i] = ZhuanHua(tmp[i]);
}
}
i++;
}
puts(tmp);
}
return 0;
}