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

By Adele 
at 2018-06-17T17:55
at 2018-06-17T17:55
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
 
 
 
結論,只要拆開分析計算就很快解決了...
 
以上如果說明有誤,煩請各位先進留言補充,謝謝。
 
--
    : 輸入一個數字
: 解一個答案
: 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
結論,只要拆開分析計算就很快解決了...
以上如果說明有誤,煩請各位先進留言補充,謝謝。
--
Tags:
        考試
        
All Comments

By Oscar 
at 2018-06-21T15:18
at 2018-06-21T15:18

By Ula 
at 2018-06-23T15:48
at 2018-06-23T15:48

By Frederic 
at 2018-06-26T01:06
at 2018-06-26T01:06

By Charlie 
at 2018-06-30T19:36
at 2018-06-30T19:36

By Jessica 
at 2018-07-03T07:43
at 2018-07-03T07:43

By Sandy 
at 2018-07-07T19:32
at 2018-07-07T19:32
Related Posts
三法修法

By Ida 
at 2018-06-17T11:05
at 2018-06-17T11:05
梁傑普化2017-2018正課講義

By Eden 
at 2018-06-17T01:12
at 2018-06-17T01:12
6/24高點會計師 稅法題庫班 即將開課!!

By Kama 
at 2018-06-17T00:56
at 2018-06-17T00:56
交換-曾正生物學歷屆解析換英文歷屆試題解析

By Agatha 
at 2018-06-16T17:57
at 2018-06-16T17:57
高醫生物生化推文討論區

By Harry 
at 2018-06-16T17:46
at 2018-06-16T17:46