现在在这个问题中你必须使用C代码作为参考来创建方案代码。
#include <stdio.h>
const double PI = 3.14159265;
double areac(double d) {
double a;
a = PI*(d/2)*(d/2);
return a;
}
double volumec(double d, double h) {
double a, v;
a = areac(d); // call areac() here
v = a*h;
return v;
}
double TotalVolume() {
double v1, v2, v3, v4, v5;
v1 = volumec(1, 1);
v2 = volumec(2, 2);
v3 = volumec(3, 3);
v4 = volumec(4, 4);
v5 = volumec(5, 5);
return v1+v2+v3+v4+v5;
}
void main() {
double v;
v = TotalVolume();
printf("%f\n",v);
}
现在我已经在Scheme中编写了代码,它如下:
(define PI 3.14159265)
(define areac
(lambda(d)
(* PI (expt (/ d 2) 2))))
(write"Areac: ")
(areac 5)
(newLine)
(define volumec
(lambda (d h)
(* (* (expt (/ d 2) 2) h) PI)))
(write"Volumec: ")
(volumec 5 5)
(newLine)
(define TotalVolume
(lambda()
(+ (volumec 1 1) (volumec 2 2) (volumec 3 3) (volumec 4 4) (volumec 5 5))))
(define main
(lambda ()
(* (TotalVolume) 1)))
(write"Total Volume: ")
(main)
(newLine)
现在不是在volumec
中编写公式,而是在areac
中引用volumec
,然后运行它。
答案 0 :(得分:2)
然后从areac
致电volumec
:
(define volumec
(lambda (d h)
(* h (areac d))))
说明:首先,请注意,由于乘法的可交换属性,您当前的volumec
实现等效于此:
(* h (* PI (expt (/ d 2) 2)))
现在只需更换已在areac
中计算的代码:
(* PI (expt (/ d 2) 2))
通过调用areac
,注意到必须作为参数传递的唯一缺失值为d
:
(areac d)
之后,如C中的原始公式所示,剩下的唯一事情就是乘以h
,我们都设置好了:
(* h (areac d))
答案 1 :(得分:0)
只是一些挑剔。
(define TotalVolume
(lambda()
(let ((do-it (lambda (x) (volumec x x))))
(reduce + 0
(map do-it (list 1 2 3 4 5)))))
当你发现自己一遍又一遍地输入同样的东西时,你就是一个人类编译器,一种避免它的方法就是使用更高阶的函数。
(define main
(lambda ()
(let ((v (TotalVolume)))
(display v))))
请注意返回到REPL的内容与实际显示为输出的内容之间的区别。除非您使用的功能如显示,写入,显示,格式化或打印...屏幕上显示的内容是REPL的副作用,而不是程序的实际输出。如果您希望write
能够以与将数据结构保存到文件时相同的形式将read
恢复为函数,则使用display
,{{1}}通常用于显示被人类阅读
使用let special form let在函数体中定义局部变量。