資料處理 程設題型種類 - 考試

Table of Contents

※ 引述《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



結論,只要拆開分析計算就很快解決了...

以上如果說明有誤,煩請各位先進留言補充,謝謝。

--

All Comments

Oscar avatarOscar2018-06-21
我想問一下 在第一題 後置遞增 為什麼不是先把後面運
算跑完再遞增 而是先遞增完在算後面的運算式
Ula avatarUla2018-06-23
如果把分號通通換行也許比較明顯? 實際上的觀念是
sequence point
Frederic avatarFrederic2018-06-26
剛查一下 前面有人提過, 你寫得最清楚 感謝
Charlie avatarCharlie2018-06-30
哈哈, 還是很沒感覺..
Jessica avatarJessica2018-07-03
謝謝~~
Sandy avatarSandy2018-07-07
我會了, 我人腦常當機