Re: [問題] 遞迴問題part2...

看板C_and_CPP作者 (韓)時間13年前 (2012/10/05 16:51), 編輯推噓12(1205)
留言17則, 13人參與, 最新討論串2/2 (看更多)
同學你好,大概針對程式碼的幾個問題做回應: ※ 引述《a26573633 (a26573633)》之銘言: : 程式目的:要用遞迴寫出一程式,可以計算像是 : +1+*45*23這種算式,其代表1+(4*5+2*3) : 在經過各位熱心板友還有版主的指導後, : 我寫出以下程式碼 : ------------------------------------------- : #include<stdio.h> : int F(char str[]); /* 函數宣告*/ : int x = 0; : int main(void) : { : char str [100]; : int ans; : scanf("s%", str); ^^^^^^^^^^^^^^^^^^^ 印象中上課我們講的是%s,不是s%,這害我改你的code改到最後還是無法scan字串0.0 : ans = F(str); : printf("%d",ans); : return 0; : } : int F( char str[]) /* 函數定義*/ : { : if(str[x] == 1) return 1; : if(str[x] == 2) return 2; : if(str[x] == 3) return 3; : if(str[x] == 4) return 4; : if(str[x] == 5) return 5; : if(str[x] == 6) return 6; : if(str[x] == 7) return 7; : if(str[x] == 8) return 8; : if(str[x] == 9) return 9; ^^^^^^^^^^^^^^^^^^^^^^^^^^^ 以上9行佩服同學的毅力,不過有點小問題,如果 str[x] == 6 成立的話 return 6 那這樣直接 return str[x] 就好啦? 應該是 if ( str[x] == '6' ) return 6 ; ,代表str[x] 是6這個字元。因為很不巧 6這個字元的編碼(ASCII Code)不是6,所以需要做個轉換。 這個轉換其實很簡單,因為 '0'是48,'1'是49...'9'是57,所以其實 return str[x]-'0' ;即可 : else{ if (str[x] == "+") return F(str[x+1])+F(str[x+2]); ^^^^^^^ 你把else寫在這裡的意思是說,只有str[x] 不是'9'的時候才會進來。 str[x]如果是0~8,都不會進入這行else。 還有就是要比較"字符"是否相等,那要用'+' 或是 '-' 用"雙印號"包起來的是字串,要用strcmp去比較。 這部份可參考上學期網頁 http://wayne.cs.nthu.edu.tw/~geniusturtle/QF100300s12/index.htm : if (str[x] == "*") return F(str[x+1])*F(str[x+2]); ^^^^^^^^^^^^^^^^^^^^^^^ 這段我懂你的意思,我們想要往下算後面兩個運算元,但是你函數宣告成 int F(char str[]); ,意思是說str是一個字元陣列,但是你傳入的F(str[x+1]) 卻是一個字元!! 我們上課的時候有提到過, char x[5] ;這樣是宣告一個字元的陣列,這時候x是字串,但是x[4]是字串裡的一個字 算是字元。所以這樣會跑出warning 27 |warning: passing argument 1 of 'F' makes pointer from integer without a cast : } : } : ------------------------------------------------------------ : 進去codeblock跑,有跑出程式,但我試著運算,答案是錯的..... : 不知道是哪裡出了問題,我自認矩陣當引數的概念很薄弱,指標 : 方面也還在努力中(但這題好像不會使用到),不知道是否在這些 : 方面出了問題 : 非常感謝大家!!! 另外有個比較根本的問題: 參考我們上課時候的投影片最後一頁 http://ggg.twgg.org/QF200100f12/slides/20120927.pptx 如果input是 + 1 2 的話,剛好 str[0]是+,str[1]是1,str[2]是2 但是如果稍微複雜一點的話, + * 2 3 5, 那讀到+之後,第一個該被轉成數字的前序的開頭是 * ,str[1]沒錯, 但是該前序的長度包含了3個字元, * 2 3,所以第二個前序的開頭是str[4],5這個數字 所以說寫成F(str[x+1])+F(str[x+2]) x+1 跟 x+2是不對的哦! 建議這個x可以放在global,因為從投影片上最後一個動畫可以看出來,這個x是隨著 程式執行的時間遞增,並不會因為遞迴回到上層就減少。所以建議寫法是把x放在global 然後遞迴裡面每消耗掉一個char,就把x++即可。 By 講師 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.34.233.197

10/05 16:51, , 1F
頭推
10/05 16:51, 1F

10/05 17:07, , 2F
這是老師吧orz 真是太謝謝你了 不敢相信
10/05 17:07, 2F
※ 編輯: han0408 來自: 114.34.233.197 (10/05 17:13)

10/05 17:23, , 3F
原PO等著GG吧XDDD
10/05 17:23, 3F

10/05 17:26, , 4F
我人這麼好XD 其實提出來討論我覺得都沒什麼關係阿
10/05 17:26, 4F

10/05 17:27, , 5F
課程上會不希望同學直接伸code,不過如果把想法或程式拿出
10/05 17:27, 5F

10/05 17:28, , 6F
來討論,其實沒什麼不好的~
10/05 17:28, 6F

10/05 17:34, , 7F
有心推 XDDD
10/05 17:34, 7F

10/05 18:31, , 8F
推! 上學期的project 竟是最近鄰居分群..
10/05 18:31, 8F

10/05 18:53, , 9F
上學期不是我開的 那時我只是個TA XD
10/05 18:53, 9F

10/05 22:29, , 10F
老師只能推了 是我自己基礎沒打好 我會努力的XDDD
10/05 22:29, 10F

10/05 22:40, , 11F
推一下XD
10/05 22:40, 11F

10/06 01:31, , 12F
推老師 XD
10/06 01:31, 12F

10/06 01:44, , 13F
推_老師
10/06 01:44, 13F

10/06 16:23, , 14F
推老師XD
10/06 16:23, 14F

10/06 18:00, , 15F
By 講師 XDDDDDDDD
10/06 18:00, 15F

10/07 10:30, , 16F
老師推XD
10/07 10:30, 16F

10/07 16:47, , 17F
XDDDDD
10/07 16:47, 17F
文章代碼(AID): #1GRfzqnH (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1GRfzqnH (C_and_CPP)