[問題] while和switch的結合出了問題

看板C_and_CPP作者 (無良記者)時間11年前 (2013/01/29 11:18), 編輯推噓0(0011)
留言11則, 3人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) VC++ 2010 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) iostream 問題(Question): 我是一名自學C++沒多久的新手 最近進度看到了函式多載(function overloading)和樣板(template) 後面有一題練習題,題目如下: 目前輸入不正確的字元到計算器裡,則它會印出錯誤訊息,但不會印出錯誤發生在哪一行 。請撰寫一個回報錯誤的程式,能印出輸入字串,並使用^記號指出錯誤 例如:12 + 4,2*3 ^ P.S.計算器是參考書裡給的範例程式,這裡不重要 題目沒有要求說還要讓這個程式要附加計算功能,因此我就想偷吃步 只要讓程式的功能能判斷輸入的算式裡一些基本規則有無錯誤,並印出來就好了 下面是我對這個程式訂出來的檢查規則及理想的程式進行方式: 0.創一個陣列 equation[],將輸入的算式存進去 1.先吃掉空白後再做錯誤判斷 2.創另一個陣列 error[]來標記錯誤位置 3.輸入的算式,允許的符號為:"+ - * / . ( )",其中"+ - * /"為運算子。有其他符號 則為錯誤,並將位置存到 error[]中並存入"^" 4.小數規則:當遇到"."時,在遇到下一個運算子(+ - * /)之前,數字都視為小數,遇 到其他符號則為錯誤,並將位置存到 error[]中並存入"^" 5.當"/"和其他運算子之間數字只有"0"時,視為錯誤,並將位置存到 error[]中並存入"^" 6.印出 equation[] 7.印出 error[] 對於這些條件判斷,原本我很開心的想用if判斷式去很白話的全部打出來 但在看到亂碼之後就知道得用switch迴圈去做了._. 我用了四個函式+main來做這個程式 void eatspace(equation) 是吃掉算式間的空白 void checkSymbol(equation, error) 是檢查並標出非法的符號 void checkDecimal(equation, error) 是檢查非法的小數 void checkDivision(equation, error) 是檢查非法的除數 eatspace 運作的很順利,但 checkSymbol和 checkDecimal都只能跑出前半部分而已 checkDivision 更是連跑都跑不了...... 這個程式裡,大多都是用 while迴圈裡疊 switch判斷式來檢查,因此我想問題可能在這邊 但我debug了半個晚上加一個早上,能改的都改了就是找不到問題所在...... (大概可以體會到為什麼寫程式的人最討厭debug了._.) 希望板友們能幫我看一下我的程式,找出問題到底在哪裡 感激不盡 m(_ _)m 餵入的資料(Input): 測試 checkSymbol:,,,,,4,,,,, 測試 checkDecimal:+.4.5 測試 checkDivision:2/0 預期的正確結果(Expected Output): 測試 checkSymbol:,,,,,4,,,,, ^^^^^ ^^^^^ 測試 checkDecimal:+.4.5 ^ ^ 測試 checkDivision:2/0 ^ 錯誤結果(Wrong Output): 測試 checkSymbol:,,,,,4,,,,, ^^^^^ 測試 checkDecimal:+.4.5 ^ 測試 checkDivision:程式卡住,什麼都跑不出來 程式碼(Code):(請善用置底文網頁, 記得排版) http://codepad.org/tfdwIH5U 補充說明(Supplement): 被註解的code是一開始直接用白話寫出來的code --

10/26 12:33,
那WoW的安薩到LoL也不是
10/26 12:33

10/26 12:34,
東巴
10/26 12:34

10/26 12:35,
而是石內普
10/26 12:35

10/26 12:37,
葛萊芬多扣
10/26 12:37

10/26 12:39,
-10
10/26 12:39

10/26 12:43,
扣-10是怎樣,傲嬌嗎?
10/26 12:43
-- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.39.234.241

01/29 11:39, , 1F
error 每個元素初始值為 '\0',會被當成是字串結尾。
01/29 11:39, 1F
但什麼都不加的話,這樣就會出現亂碼......0.0

01/29 14:17, , 2F
cout 字串的時候會從字串開頭印,一旦遇到'\0',則後面的
01/29 14:17, 2F

01/29 14:18, , 3F
就都不會被印出來。
01/29 14:18, 3F

01/29 14:20, , 4F
如果 error[] 是 {'^', '\0', '^', '\0'} 會印出 "^"
01/29 14:20, 4F

01/29 14:21, , 5F
如果 error 是 {'^', ' ', '^', '\0'} 才會印出 "^ ^"
01/29 14:21, 5F
瞭解了 那請問我error[]該給他什麼初始值比較好0.0? 如果都不給的話就會出現亂碼,但不管給什麼初始值都只會印出前面而已...... ※ 編輯: o07608 來自: 114.39.234.241 (01/29 14:26) 剛剛不爽,初始值直接給"hello world!" 結果輸出值變成,,,,,4,,,,, 了......OAO ^^^^^ ^^^^^! 難道我要給他「79個空白」這種初始值嗎......囧a

01/29 14:34, , 6F
你可以用 memset(error, ' ', 79); 來填入 79 個空白。
01/29 14:34, 6F
所以真的要用這個初始值喔,囧 ※ 編輯: o07608 來自: 114.39.234.241 (01/29 14:36) 總算解決前兩個函式了,剩下第三個......

01/29 15:56, , 7F
你變數名取好一點應該會比較容易 debug, 我看到 i j k m
01/29 15:56, 7F

01/29 15:56, , 8F
就開始頭痛了, 幸好你還有注解...
01/29 15:56, 8F

01/29 16:24, , 9F
checkDivision 裡你設 j = i 可是後來又 i = j, 找到第一
01/29 16:24, 9F

01/29 16:25, , 10F
個除號之後就會一直卡在那個位置動不了, 所以會無窮迴圈
01/29 16:25, 10F
我想說那些變數只是拿來指陣列位置就隨便設...... 剛才在最後面加了一個i++。總算是解決無窮迴圈問題了 然後錯誤符號印不出來OAQ

02/02 01:22, , 11F
02/02 01:22, 11F
原來提問也有這種方法...... ※ 編輯: o07608 來自: 114.27.4.77 (02/02 22:18)
文章代碼(AID): #1H1pzefC (C_and_CPP)