• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

joaoqalves

[Scheme] Médias

11 mensagens neste tópico

Boas pessoal, eu e o tirácio fizemos duas espécies de programas em Scheme para calcular as médias (neste caso, das Provas de Ingresso) e gostávamos de saber quais os erros e assim.

Quanto a mim, os meus erros:

- usei dois if's e devia ter usado um else.

- usei um contador (não sei se era possível não utilizar)

Aqui vai o source:

(define Soma 0)
(define Contador 0)
(define (Provas num)
  (if (> num 0)
   (begin
    (display " Nota da Prova de Ingresso ? ")
    (set! Soma(+ Soma (read)))
    (set! Contador(+ Contador 1))
    (Provas (- num 1))
  ))
  (if (= num 0)
    (begin
          (display " Média das PI :")
    (display (/ Soma Contador))
    (newline)
   )))

foi feito em R5RS

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

My code:

(define Soma 0)
(define tmp 0)
(define (prova num)
(display "Nota da prova de ingresso? ")
(let ((PI (read)))
(set! Soma (+ Soma PI))))

(define (Provas num)
  (prova num)
  (set! tmp (+ tmp 1))
  (init num))

(define (Media num)(
display (/ Soma num)))

(define (init num)
(cond [(< tmp num) (Provas num)]
       [else (Media num)]))

Lazy Scheme.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bom eu não testei os codes, presumo que funcionassem. Também não fiz alterações estruturais, apenas de identação/sintaxe.

(define Soma 0)
(define Contador 0)
(define (Provas num)
  (if (> num 0)
   (begin
      (display " Nota da Prova de Ingresso ? ")
     (set! Soma(+ Soma (read)))
      (set! Contador(+ Contador 1))
      (Provas (- num 1))))
  (if (= num 0)
      (begin
          (display " Média das PI :")
          (display (/ Soma Contador))
          (newline))))

joaoqalves:

Eu sei que custa a habituar a ter 50 parêntesis seguidos, mas tentem, porque acaba por ser uma marca da linguagem. :P

(define Soma 0)
(define tmp 0)
(define (prova num)
(display "Nota da prova de ingresso? ")
(let ((PI (read)))
(set! Soma (+ Soma PI))))

(define (Provas num)
  (prova num)
  (set! tmp (+ tmp 1))
  (init num))

(define (Media num)
  (display (/ Soma num)))

(define (init num)
(cond 
    ((< tmp num) (Provas num))
    (else (Media num))))

tiracio estavas a utilizar uma notação um pouco estranho no cond (até admito que funcionasse), mas vê a notação que eu utilizei. É mais limpa e agradável. ;)

Quanto ao resto, nunca gostei muito dos set! geralmente arranjava maneira de utilizar lets e coisas do género. Mas isso é com cada um.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Evitem usar modificadores, como o set!.

O código pode ser escrito sem isso.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Praticamente não analisei o código, mas se estão a codar Scheme para codarem Imperativo não vale a pena darem-se ao trabalho!

O challenge em Scheme é aprender a programar Funcional, esqueçam que sabem programação quando querem codar algo em scheme...

Googlem por Structure Interpretation of Computer Programs e leiam o livro... foi o que eu li no meu 12º e foi mais de um mês de aulas a não aprender nada de novo... ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Evitem usar modificadores, como o set!.

O código pode ser escrito sem isso.

E que aconselhas ... ?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

tiracio estavas a utilizar uma notação um pouco estranho no cond (até admito que funcionasse), mas vê a notação que eu utilizei. É mais limpa e agradável. :)

A notação que encontrei foi o que vi num link qq que o joaoqalves me deu.

Googlem por Structure Interpretation of Computer Programs e leiam o livro... foi o que eu li no meu 12º e foi mais de um mês de aulas a não aprender nada de novo... :)

http://mitpress.mit.edu/sicp/full-text/book/book.html right?

Codei aquilo ao calhas quase, tou a pensar olhar para isso com olhos de ver. :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Porreiro pá :) Obrigado pelo link

(define (power x n) (cond ((= n 0) 1) (else (* x (power x (- n 1))))))

Só não percebo muito bem como é que se identa nesta linguagem...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sempre usei editores que identam por mim, mas normalmente identam-se os blocos lógicos (ou seja, pelo número de parênteses abertos)

Vou ver se tenho tempo (e se me lembro) para vos mostrar como evitar modificadores.

Já agora, não usem displays, mas sim funções que retornem o valor pretendido.

Edit:

Provavelmente não é a melhor maneira para aprenderem, mas ficam aqui com uma sugestão:

(define media
  (lambda (lista)
    (/ (apply + lista) 
       (length lista))))

Podem chamar assim: (media '(1 2 3 4 5 6 7)) por exemplo

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Warrior, isso sim já se falamos a mesma língua :biggrin: Percebi tudo desse código :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

boas, neste momento tou num projecto de criar um jogo de damas havaianas em scheme e tou com algumas dificuldades se alguem me poder ajudar diga

Obrigado

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora