1 条题解
-
0
题意分析
我们需要编写一个拼写检查程序,检测输入文本中的以下两种错误:
- 句子的首字母是小写:每个句子的第一个字母必须是大写。句子以句号(
.
)、问号(?
)或感叹号(!
)结束。 - 单词中非首字母的位置出现了大写字母:单词中除了第一个字母外,其他字母必须是小写。单词是由字母组成的序列,不包含其他符号或行尾。
解题思路
- 遍历文本:逐个字符检查文本,识别句子和单词的边界。
- 检测句子首字母:
- 句子的开始有两种情况:文本的开始或前一个句子结束符(
.!?
)后的第一个字母。 - 检查这些位置的字母是否是小写,如果是则错误计数加一。
- 句子的开始有两种情况:文本的开始或前一个句子结束符(
- 检测单词内部大写字母:
- 对于每个单词,从第二个字母开始检查是否有大写字母,如果有则错误计数加一。
- 处理边界情况:
- 确保标点符号后的空格或直接跟另一个字符时正确处理。
- 忽略非字母字符(如标点符号、空格)对单词和句子的影响。
C++代码实现
#include <iostream> #include <cctype> #include <string> using namespace std; int main() { string text; getline(cin, text); int errors = 0; bool newSentence = true; // 标记是否是新句子的开始 for (size_t i = 0; i < text.size(); ++i) { if (newSentence && isalpha(text[i])) { // 检查句子首字母是否小写 if (islower(text[i])) { errors++; } newSentence = false; // 检查单词的后续字母是否大写 i++; // 跳过首字母 while (i < text.size() && isalpha(text[i])) { if (isupper(text[i])) { errors++; } i++; } if (i < text.size()) { // 回退一步,因为外层循环会i++ i--; } } else if (text[i] == '.' || text[i] == '!' || text[i] == '?') { newSentence = true; } else if (isalpha(text[i])) { // 当前不是新句子,但遇到字母,可能是单词中间 // 检查单词的后续字母是否大写 i++; // 跳过首字母 while (i < text.size() && isalpha(text[i])) { if (isupper(text[i])) { errors++; } i++; } if (i < text.size()) { i--; } } } cout << errors << endl; return 0; }
- 句子的首字母是小写:每个句子的第一个字母必须是大写。句子以句号(
- 1
信息
- ID
- 1342
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 9
- 标签
- 递交数
- 16
- 已通过
- 2
- 上传者