2013-06-30 41 views
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); 
} 

现在我已经在计划编写的代码,它是如下:

(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写公式我必须引用在volumecareac,然后运行它。

+1

您可能会看到乘法的交换性质(http://bit.ly/14ky8Zh) – GoZoner

回答

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)) 
0

只是一些nitpicks。

(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的副作用,而不是程序的实际输出。当您希望能够将read以与将数据结构保存到文件时相同的形式返回到函数中时,使用writedisplay通常用于显示供人阅读的内容。

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

+0

'(eq'total-volume'TotalVolume)==>#f' – Sylwester