Scheme中球体的面积和体积

时间:2013-06-30 20:16:56

标签: scheme

现在在这个问题中你必须使用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,然后运行它。

2 个答案:

答案 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在函数体中定义局部变量。