Re: [問題] 遞迴問題part2...
同學你好,大概針對程式碼的幾個問題做回應:
※ 引述《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
10/05 17:07, 2F
※ 編輯: han0408 來自: 114.34.233.197 (10/05 17:13)
推
10/05 17:23, , 3F
10/05 17:23, 3F
→
10/05 17:26, , 4F
10/05 17:26, 4F
→
10/05 17:27, , 5F
10/05 17:27, 5F
→
10/05 17:28, , 6F
10/05 17:28, 6F
推
10/05 17:34, , 7F
10/05 17:34, 7F
推
10/05 18:31, , 8F
10/05 18:31, 8F
→
10/05 18:53, , 9F
10/05 18:53, 9F
推
10/05 22:29, , 10F
10/05 22:29, 10F
推
10/05 22:40, , 11F
10/05 22:40, 11F
推
10/06 01:31, , 12F
10/06 01:31, 12F
→
10/06 01:44, , 13F
10/06 01:44, 13F
推
10/06 16:23, , 14F
10/06 16:23, 14F
推
10/06 18:00, , 15F
10/06 18:00, 15F
推
10/07 10:30, , 16F
10/07 10:30, 16F
推
10/07 16:47, , 17F
10/07 16:47, 17F
討論串 (同標題文章)