看板 C_and_CPP 關於我們 聯絡資訊
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) VC++ 2010 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) iostream, cstring 問題(Question): 我是一名自學C++沒多久的新手 最近進度看到了函式多載(function overloading)和樣板(template) 後面有一題練習題,題目如下: 請撰寫一組equal()的多載函式,能接受兩個相同型態的引數,若兩者相同則傳回1,否則 傳回0。提供的版本有:char、int、double、char*等型態的引數。使用strcmp()函式來測 試字串是否相同,若不清楚strcmp()的用法,可使用線上輔助說明,並且利用#include指 令將使用<cstring>標頭檔載入到程式裡。再撰寫一個測試程式來驗證呼叫的版本是否為正 確的版本。 現在我最大的問題就是......我看不懂題目要問什麼 =_= 一開始想說是多載四個有用到strcmp()的函式,參數型態分別用題目規定那四個 然後在main裡面讓使用者輸入兩個字串,在呼叫函式時就會自動呼叫到char*型態的函式 但因為strcmp()不接受除了char*以外的型態,而打破了這個如意算盤 再來,我就不知道題目到底要我做什麼事情了...... 無論想到什麼可能的題目意思,都會受到strcmp()的限制 難道是要用static_cast來強行做出我最初的想法嗎...... 希望板友們能替我解惑,感謝 程式碼(Code):(請善用置底文網頁, 記得排版) http://codepad.org/lFq6BeeH 這是我根據第一個想法寫出來的程式碼,但錯誤一籮筐 還是貼上來給有需要的板友做參考...... 補充說明(Supplement): 開始體會到,有時候題意比觀念還難懂...... 另外請問大家,在構思一個程式時,要先把main想出來再想各個所需函式的架構 還是先把程式需要的函式都寫出來,再想辦法組合起來? 感謝~ --
meaning12:7-11 10/12 21:02
tingyun60426:7-4=-11 10/12 21:03
tingyun60426:哦 shit 打錯 是 1110/12 21:03
s26307722:7-4=3?10/12 21:03
s511320:7-4=3 謝謝10/12 21:04
tingyun60426:囧 請忽略我的推文10/12 21:04
-- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.27.22.229
azureblaze:他應該只有傳入char*的時候才要用strcmp() 01/26 21:09
azureblaze:其他型態用== 01/26 21:09
阿,突然發現我搞錯多載的意思了,當初以為多載的條件是連函式內容都要一樣 還想說那這樣跟template有什麼不同...... ※ 編輯: o07608 來自: 114.27.22.229 (01/26 21:11) 現在發現還是搞不懂題目的意思...... 如果每個型態都要判斷的話,那double型態的要如何輸入......(爆炸中)
PkmX:1. 先問對方他要輸入哪一種型態 2. 讀進來自行判斷 01/26 21:49
第二點我也有想過,這是我目前比較想用的方法,因為對使用者比較方便 但問題是不知道要如何讓程式判斷輸入的資料的形態......
flydragon198:多載不是這樣用的,而是你自定四個同名函式,有不同 01/26 21:59
flydragon198:類型的引數,然後他自動會找匹配的多載去執行 01/26 22:00
flydragon198:這個題目應該只是要告訴你,同樣名字的函式,會因為 01/26 22:07
flydragon198:引數型態的不同,而呼叫不同的函式 01/26 22:08
flydragon198:a(int) 和 a(double)是兩個不同函式,根據你的參數 01/26 22:09
flydragon198:型態不同,它會自動匹配去執行a(int)或a(double) 01/26 22:09
到這裡都是我當初理解到的範圍,但題目一進入實作面就無法理解了 ˊˋ
flydragon198:你多設定兩個變數double1和double2去帶入就好了..... 01/26 22:14
現在正在想說要如何自行判斷輸入的資料的形態0.0 輸入值的形態一開始要設void嗎?
flydragon198:int equal(double x, double y) 01/26 22:16
flydragon198:{ return double1+double2; } // 不用用到strcmp 01/26 22:16
flydragon198:這個題目應該沒要你判斷輸入的資料是字串還是數字~~~ 01/26 22:18
是沒有,但我覺得如果能寫出來的話對使用者會比較方便 ~"~
loveme00835:double 的版本題目沒給清楚 01/26 22:24
flydragon198:有函式可以判斷輸入的是不是數字 01/26 22:25
flydragon198:http://tinyurl.com/avp6xcn 01/26 22:25
azureblaze:這邊的「使用者」是使用code的人,不是使用程式的人 01/26 22:30
azureblaze:他的目的是讓寫程式的人不用去equalStr(),equalInt(), 01/26 22:31
azureblaze:equalDouble(),equalMyClass()... 01/26 22:31
azureblaze:判斷輸入是什麼是另外一層的問題 01/26 22:31
我還是先別好高騖遠,把判斷輸入留到之後再弄好了......ˊˋ
loveme00835:http://ppt.cc/AFcb 浮點數的相等判斷可以參考這篇, 01/26 22:42
loveme00835:因為還有 NaN 等數值的關係, 要做到完善不是 == 就可 01/26 22:43
loveme00835:以解決的, 如果不care那些, 這個算是基本題 01/26 22:43
loveme00835:另外提到一點書本上不會講到的: char* 作為參數型態時 01/26 22:48
loveme00835:表示 '接受一個字元變數的位址', 如果變成char const* 01/26 22:49
loveme00835:則變成 '接受c-type string的起始位址', 這個有可能是 01/26 22:50
loveme00835:string literal引數, 語意不一樣所以要注意, 所以這題 01/26 22:51
loveme00835:要改成 char const* 而不是 char* 01/26 22:52
我剛剛自己測試參數型態為char* 型態的函式時,是會成功的 不過我有在main裡先設兩個char陣列,再用char* 指向它們 如果是這樣的話,那不用char const*(不是const char* 喔0.0?)也可以嗎?
loveme00835:再來回答你最後一個問題, 寫程式'前'先分析功能, 再來 01/26 22:54
loveme00835:將不同的功能儘量分解成數個小部分, 這是即將變成函式 01/26 22:56
loveme00835:的, 再來決定功能的執行順序跟相依性, 這決定了函式誰 01/26 22:58
loveme00835:先呼叫誰後呼叫, 還有誰呼叫誰, 寫程式'時'就要看你怎 01/26 22:58
loveme00835:樣組合它了, 先組所有零件放好, 還是等要用零件再去組 01/26 23:00
了解了!
loveme00835:型態的解讀從右而左, char const *= pointer to a 01/26 23:01
loveme00835:const char, const 用來修飾'左邊'的元件, 但是有一特 01/26 23:01
loveme00835:例就是當左邊沒東西了就修飾右邊, 記通則以後遇到複雜 01/26 23:02
loveme00835:的型態才不會混淆, char * 指向 string literal 存取 01/26 23:03
loveme00835:時通常會炸掉 01/26 23:04
原來const有這種規定......幸好今天有學到了0.0
loveme00835:上面是指 write 01/26 23:06
自己筆記一下:string literal的意思是雙引號("")中間包的東西 ※ 編輯: o07608 來自: 114.27.22.229 (01/26 23:15) 大概開始理解我當初為什麼會一直不知道要怎麼做了 題目有提到「檢查字串」,然後我就一直在想要如何也檢查「整數串」「小數串」等等 而且還自我設限說不能一個數一個數打進去存入陣列 要像字串那樣可以直接啪啦啦打一整串再按enter進去檢查 囧a
loveme00835:它應該要寫: 在 "char const * 版本中使用 strcmp..." 01/26 23:34
loveme00835:或者 "測試字串是否相同'可以'用strcmp()", btw 我堅 01/26 23:36
loveme00835:持不看非 原文書/中譯書, 怕的就是語意混淆 01/26 23:37
是這樣子沒錯...... 不過我問我大學的導師,他的建議是沒接觸過程式的新手可以先買中文書來研讀練習 免得買原文書,結果看不下去提早放棄這樣 ._.
loveme00835:anyway, 後來有完成這題嗎? 01/26 23:43
http://codepad.org/vVNNoY8H 這是只完成題目需求的程式碼 應該是沒問題了,可是我用VC++2010編會過,丟到codepad上他卻跳警告......0.0
loveme00835:那就是我推文中說的 0.0 01/27 00:00
main裡面忘記加const了~ 感謝!! ※ 編輯: o07608 來自: 114.27.22.229 (01/27 00:02)