Ir para o conteúdo

Brincar com ifs e conds

; Exercicio 7 - Brincar com ifs e conds
;
; Exercício resolvido por: Rui Maia (deathseeker25@portugal-a-programar.org) 
;
; 7.1. O procedimento circulo, sem parametros, principia por pedir o raio de um circulo e termina visualizando
; no ecrã a área o círculo e o respectivo perímetro. Este procedimento verifica se o utilizador fornece um
; valor numérico adequado.

(define pi 3.141592653589793)

(define area-circulo
  (lambda (raio)
    (* pi (* raio raio))))

(define perimetro-circulo
  (lambda (raio)
    (* pi raio)))

(define circulo
  (lambda ()
    (display "raio (indicar um valor numérico positivo): ")
    (let ((raio (read)))
      (if (and (number? raio) (>= raio 0))
             ( (display "Area do circulo e: ")
             (display (area-circulo raio))
             (newline)
             (display "Perimetro do circulo e: ")
             (display (perimetro-circulo raio))
             (newline))
             (display "Erro: deve indicar um valor numérico positivo.")))))

;> (circulo)
;raio (indicar um valor numérico positivo): dez
;Erro: deve indicar um valor numérico positivo.
;> (circulo)
;raio (indicar um valor numérico positivo): -10
;Erro: deve indicar um valor numérico positivo.
;> (circulo)
;raio (indicar um valor numérico positivo): 10
;Area do circulo e: 314.1592653589793
;Perimetro do circulo e: 31.41592653589793


; 7.2. O procedimento area-triangulo devolve a area do triangulo, em que os comprimentos dos 3 lados
; são fornecidos através do teclado.
;
;>(area-triangulo)
;lado1: 10
;lado2: 20
;lado3: 25
;
;(area-triangulo)
;lado1: 10
;lado2: 20
;lado3: 35
;
; Este procedimento verifica se os argumentos fornecidos são compatíveis com os comprimentos dos lados 
; de um triângulo, ou seja, nenhum deles pode ser igual ou superior à soma dos outros dois. Em caso de
; incompatibilidade o resultado deverá ser 0.
; Escreva em Scheme o procedimento area-triangulo conforme a especificacao apresentada.

(define calc-area
  (lambda (sp lado1 lado2 lado3)
    (sqrt (* sp (* (- sp lado1) (- sp lado2) (- sp lado3))))))


(define area-triangulo
  (lambda ()
    (display "lado1: ")
    (let ((lado1 (read)))
      (display "lado2: ")
          (let((lado2 (read)))
      (display "lado3: ")
          (let((lado3 (read)))
          (let((sp (/ (+ lado1 lado2 lado3) 2)))
         (if (or (< (+ lado1 lado2) lado3) (< (+ lado1 lado3) lado2) (< (+ lado2 lado3) lado1))
          0
          ((display "Area do triangulo: ")
           (display (calc-area sp lado1 lado2 lado3))))))))))

;> (area-triangulo)
;lado1: 10
;lado2: 15
;lado3: 10
;Area do triangulo: 49.607837082461074
;> (area-triangulo)
;lado1: 10
;lado2: 11
;lado3: 22
;0