ZeroJudge A217: caps lock的災難

電腦的每個鍵盤都具有他們各自的重要功能,

要是哪個鍵突然出錯了都會帶來巨大的困擾。

今天假設有個人叫小明,他的電腦的 caps lock 鍵壞掉了,

所以他打出來的英文字全都是小寫,

這時小明為了證明他每個星期學寫程式是很有用的,

他決定寫個程式,可以自動把句子轉成正確的大小寫格式。

請你同樣寫個程式完成這件事。

p.s. 這只是考試題目在嘴砲,事實上你可以用 shift 鍵取代 caps lock 的大寫功能,

或是這種時候根本就應該儘快把電腦拿去修。 

範例測資

範例輸入範例輸出
每行為一筆單獨之資料,僅有小寫字母和空格和「,」、「.」、「?」、「!」 
每行不超過 1000 個字元 
每筆輸出一行, 
把每個句子第一個英文字母變大寫,
單獨的 i 也要變成大寫。
yo! i am so fat. macbook air so cool!
me, too. battle!
who am i?
Yo! I am so fat. Macbook air so cool!
Me, too. Battle!
Who am I?

解題思路

設定一個布林值 cap,如果 cap == true 代表目前的字母要大寫,並且將 cap 設定為 false。如果遇到「,」、「.」、「?」、「!」,則將 cap 設定為 true。

如果遇到「i」這個字元,判斷前後是否為空格或表點符號。需要注意要先判斷目前字元位置以免造成記憶體區段錯誤。

範例程式碼-ZeroJudge A217: caps lock的災難

#include <iostream>
#include <cctype>
using namespace std;

int main() {
    cin.sync_with_stdio(0);
    cin.tie(0);
    string str;
    while (getline(cin, str))
    {
        bool cap = true;
        string ans = "";
        for (int i = 0; i<str.length(); i++)
        {
            if (isalpha(str[i]))
            {
                if (cap)
                {
                    ans += toupper(str[i]);
                    cap = false;
                }
                else if (str[i] == 'i')
                {
                    if (i == 0 && str[i+1] == ' ') ans += toupper(str[i]);
                    else if (i == int(str.length())-1 && str[i-1] == ' ') ans += toupper(str[i]);
                    else
                    {
                        if ((str[i+1] == ' ' || str[i+1] == '.' || str[i+1] == '?' || str[i+1] == '!' || str[i+1] == ',') && (str[i-1] == ' ' || str[i-1] == '.' || str[i-1] == '?' || str[i-1] == '!' || str[i-1] == ',')) ans += toupper(str[i]);
                        else ans += str[i];
                    }
                }
                else ans += str[i];
            }
            else ans += str[i];
            if (str[i] == '.' || str[i] == '!' || str[i] == '?') cap = true;
        }
        cout << ans << "\n";
    }
}

//ZeroJudge A217
//Dr. SeanXD

發佈留言