考了三道題。
佩服李開複老師的省錢本事:考試直接發白紙,連印刷費也省了,試題直接用投影儀顯示在講台螢幕上。
三道題,看著不難,所以我就現在先在稿紙上把程式基本都寫出來,最後剩近二十分鐘,才匆忙開始抄寫到答題紙上。
失策:
1、最後二十分鐘抄寫程式,比較匆忙,導致抄寫過程完全是機械式的,來不及重新思考或檢查。有點浪費了二十分鐘去抄寫程式的遺憾。
改正:在稿紙上,基本寫出解題思路;之後,直接把答案寫到答卷上。避免三道題寫完了,再寫答卷的話,什麼思路都忘了、斷了。
回來後,發現第一題答得有漏洞,於是在機器上,重新實現了程式:
題意:把句子"I love you baby",倒置成"baby you love I"。
#include <iostream><br />using namespace std;<br />void Reverse(char *sentence)<br />{<br />int len = strlen(sentence);<br />string ts, word;<br />for (int i = len - 1; i >= 0; i--)<br />{<br />char c = sentence[i];<br />if (('A' <= c && c <= 'Z') || ('a' <= c && c <= 'z'))<br />{<br />word += c;<br />}<br />else<br />{<br />if (word.length() > 0)<br />{<br />for (int j = word.length() - 1; j >= 0; j--)<br />{<br />ts += word[j];<br />}<br />word = "";<br />}<br />ts += c;<br />}<br />}<br />if (word.length() > 0)<br />{<br />for (int j = word.length() - 1; j >= 0; j--)<br />{<br />ts += word[j];<br />}<br />}<br />strcpy(sentence, ts.c_str());<br />}<br />int main()<br />{<br />char cs[100] = "I love you baby";<br />Reverse(cs);<br />cout<<cs<<endl;<br />return 0;<br />}<br />
答卷上的漏洞:
1、word沒有反轉過來:
for (int j = word.length() - 1; j >= 0; j--)<br />{<br /> ts += word[j];<br />}
2、word沒有置空值:word = "";
3、對word的最後情況,沒有考慮:
if (word.length() > 0)
{
for (int j = word.length() - 1; j >= 0; j--)
{
ts += word[j];
}
}
知識延伸:
1、對判斷一個char是否是一個字母,我的判斷是:('A' <= c && c <= 'Z') || ('a' <= c && c <= 'z')。方法是比較低效的。
可使用<ctype>庫中的函數:isalpha函數。
2、標準庫函數isalpha的實現是:
int isalpha(int ch)<br />{<br /> return (unsigned int)((ch | 0x20) - 'a') < 26u;<br />}
在ASCII碼中A-Z的編碼為
二進位 十進位
A 01000001 65
B 01000010 66
.
.
Y 01011001 89
Z 01011010 90
所以A-Z的編碼高位的第2、3位始終為10,然後通過後面5位來表示26個字母。
在ASCII碼中a-z的編碼為
二進位 十進位
a 01100001 97
b 01100010 98
.
.
y 01111001 121
z 01111010 122
所以a-z的編碼高位的第2、3位始終為11,然後通過後面5位來表示26個字母。
ch | 0x20 表示將A-Z轉換為a-z
3、關於位操作符:
(1)、~取反~0011 = 1100
(2)、&位與0011 & 0110 = 0010
(3)、|位或0011 | 0110 = 0111
(4)、^異或0011 ^ 0110 = 0101