1 条题解

  • 0
    @ 2025-5-26 20:54:38

    题意分析

    我们需要编写一个拼写检查程序,检测输入文本中的以下两种错误:

    1. 句子的首字母是小写:每个句子的第一个字母必须是大写。句子以句号(.)、问号(?)或感叹号(!)结束。
    2. 单词中非首字母的位置出现了大写字母:单词中除了第一个字母外,其他字母必须是小写。单词是由字母组成的序列,不包含其他符号或行尾。

    解题思路

    1. 遍历文本:逐个字符检查文本,识别句子和单词的边界。
    2. 检测句子首字母
      • 句子的开始有两种情况:文本的开始或前一个句子结束符(.!?)后的第一个字母。
      • 检查这些位置的字母是否是小写,如果是则错误计数加一。
    3. 检测单词内部大写字母
      • 对于每个单词,从第二个字母开始检查是否有大写字母,如果有则错误计数加一。
    4. 处理边界情况
      • 确保标点符号后的空格或直接跟另一个字符时正确处理。
      • 忽略非字母字符(如标点符号、空格)对单词和句子的影响。

    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