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