2013-06-30 1 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 я должен ссылаться areac в volumec, а затем запустить его.

+1

Вы можете изучить Коммутативное свойство умножения (http://bit.ly/14ky8Zh) – GoZoner

ответ

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)) 
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, а не фактическим выходом из программы. Также write используется, когда вы хотите, чтобы он возвращался обратно к функции в том же виде, что и при сохранении структуры данных в файл, display, как правило, используется для отображения для чтения человеком.

Используйте специальную форму let, чтобы определить локальные переменные в теле функции.

+0

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

Смежные вопросы