1

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

4

2 回答 2

2

然后只需调用areacvolumec

(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))
于 2013-06-30T20:29:09.580 回答
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通常用于显示以供人类阅读。

使用 let 特殊形式 let 在函数体中定义局部变量。

于 2013-07-01T13:59:58.223 回答