W3Cschool
恭喜您成為首批注冊用戶
獲得88經驗值獎勵
如果一個函數的返回結果只取決于參數值,并且沒有像修改參數、輸出一些值等副作用,那么就可認為此函數是純函數。
下面這個after函數就是一例。此函數比較兩個Time變量并返回一個布爾值并指出第一個操作數是否比第二個晚:
bool after (Time& time1, Time& time2) {
if (time1.hour > time2.hour) return true;
if (time1.hour < time2.hour) return false;
if (time1.minute > time2.minute) return true;
if (time1.minute < time2.minute) return false;
if (time1.second > time2.second) return true;
return false;
}
當兩個時間相等時,函數返回什么?函數是否有適當的返回值?如果是你為此函數編寫文檔,你會專門提及這種情況嗎?
另外一例是addTime函數,負責計算兩個時間值之和。比如現在是9:14:30,你的面包機工作時間是3小時35分鐘,你可以使用addTime函數來計算什么時候面包做好。
下面是此函數的一個草稿,不一定完全正確:
Time addTime (Time& t1, Time& t2) {
Time sum;
sum.hour = t1.hour + t2.hour;
sum.minute = t1.minute + t2.minute;
sum.second = t1.second + t2.second;
return sum;
}
下面舉一個使用該函數的例子。若currentTime為當前時間,breadTime為面包機做面包用的總時間,你就可以用addTime計算面包做好的時間了。
Time currentTime = { 9, 14, 30.0 };
Time breadTime = { 3, 35, 0.0 };
Time doneTime = addTime (currentTime, breadTime);
printTime (doneTime);
這段程序的輸出為12:49:30,答案正確。另外,還有些例子的結果是不正確的。你能想出一個嗎?
這個函數的問題在于它沒有處理秒數或分鐘數加起來超過60的情況。這種情況我們必須將多出的秒數“進位”到分鐘,或者多出的分鐘進位到小時。
下面是再次修改函數后的正確版本:
Time addTime (Time& t1, Time& t2) {
Time sum;
sum.hour = t1.hour + t2.hour;
sum.minute = t1.minute + t2.minute;
sum.second = t1.second + t2.second;
if (sum.second >= 60.0) {
sum.second -= 60.0;
sum.minute += 1;
}
if (sum.minute >= 60) {
sum.minute -= 60;
sum.hour += 1;
}
return sum;
}
代碼正確了,但也變長了。稍后,我將給出另一個解決方案,能大大簡短代碼。
這段代碼給出了我們之前沒見過的兩個操作符:+=和-=,用于簡潔的表示變量的增減。比方說,語句
sum.second -= 60.0;
和語句
sum.second = sum.second - 60;
是等價的。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯系方式:
更多建議: