電腦的每個鍵盤都具有他們各自的重要功能,
要是哪個鍵突然出錯了都會帶來巨大的困擾。
今天假設有個人叫小明,他的電腦的 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