Re: [課業] 資料處理 程設題型種類

作者: redspeed (RED)   2018-06-17 17:55:18
※ 引述《lensfill (undo)》之銘言:
: 輸入一個數字
: 解一個答案
: https://photos.app.goo.gl/rhQLYra1P2QJR6h8A
: 要怎樣思維關鍵在哪?
第一題的程式碼如下:
#include <stdio.h>
int bar(int value){
static int tmp=0;
tmp++;
value++;
return value + tmp;}
int main(void) {
int x=5;
printf("%d\n",bar(x));
printf("%d\n",bar(bar(x)));
}
說明:
bar 副程式的 tmp 為 static 型態,
也就是說 tmp 這一個變數要等程式結束後才會歸還記憶體。
printf("%d\n",bar(x)); ←印出7,說明如下
int bar(int value){ ←這裡的value帶入5
static int tmp=0;
tmp++; ←此時這裡的tmp是1 (後++)
value++; ←value是6
return value + tmp;←傳回7}
printf("%d\n",bar(bar(x)));←印出12,說明如下
先解內部的bar(x)
int bar(int value){ ←這裡的value帶入5
static int tmp=0; ←這裡的tmp是1
tmp++; ←此時這裡的tmp是2 (後++)
value++; ←value是6
return value + tmp;← 6+2 = 8 ,傳回8}
再算外部的bar(bar(x)),內部的bar(x)是8,
因此bar(bar(x))等同bar(8),
int bar(int value){ ←這裡的value帶入8
static int tmp=0; ←這裡的tmp是2
tmp++; ←此時這裡的tmp是3 (後++)
value++; ←value是9
return value + tmp;← 9+3=12, 傳回12}
第二題的程式碼如下:
(鍵盤輸入100)
#include <stdio.h>
int foo(int v)
{return (v/10+v%10);}
int main(void) {
int v1,v2;
scanf("%d",&v1);
v2=foo(foo(foo(v1)));
printf("%d\n",v2);
}
這一題的思維跟上一題一樣,
v2=foo(foo(foo(v1)));
printf("%d\n",v2);←印出 1 ,理由如下
先拆解,先解最內層的foo(v1),
最內層解完後再代入第二層的foo(),
第二層解完後再代入最外層的foo(),
最內層的foo(v1)
int foo(int v)←v代入100
{return (v/10+v%10);} ← 10+0 = 10,傳回 10
第二層的foo(10) ←將內部層的結果代入第二層
int foo(int v)←帶入10
{return (v/10+v%10);} ← 1+0 = 1,傳回 1
最外層的foo(1) ←將第二層的結果代入最外層
int foo(int v)←帶入1
{return (v/10+v%10);} ← 0+1 = 1,傳回 1
結論,只要拆開分析計算就很快解決了...
以上如果說明有誤,煩請各位先進留言補充,謝謝。
作者: alzm2006 (哭哭嘴)   2018-06-17 20:06:00
我想問一下 在第一題 後置遞增 為什麼不是先把後面運算跑完再遞增 而是先遞增完在算後面的運算式
作者: silentazure (北極熊)   2018-06-17 20:27:00
如果把分號通通換行也許比較明顯? 實際上的觀念是sequence point
作者: lensfill (undo)   2018-06-18 20:31:00
剛查一下 前面有人提過, 你寫得最清楚 感謝哈哈, 還是很沒感覺..謝謝~~我會了, 我人腦常當機

Links booklink

Contact Us: admin [ a t ] ucptt.com