(FundComp)
Considere este exemplo de um texto contendo uma tabela:
Mostramos uma lista de cinco afirmações para quatro pessoas e perguntamos o quanto cada uma dessas pessoas concordava, numa escala de 0 a 5, com cada uma de cinco afirmações apresentadas. Obtivemos as seguintes respostas: Nome/resposta A1 A2 A3 A4 A5 Alice 0 1 2 3 4 Beto 1 1 3 1 2 Camila 4 2 2 1 1 Daniel 5 5 0 0 2
Repare que a tabela é formada por algumas linhas do texto; a primeira linha é a que diz "Nome/resposta A1 A2 A3 A4 A5". Cada linha da tabela e' formada por várias "palavras"; na primeira linha, "Nome/resposta", "A1", "A2", "A3", "A4", "A5", na segunda linha "Alice", "0", "1", "2", "3", "4", etc.
O objetivo deste trabalho é fazer uma série de funções que nos permitam trabalhar com esse tipo de tabela em textos. A primeira destas funções, "string->tabela", pega um string correspondente a uma tabela destas e transforma-o num objeto que é bem mais fácil de manipular em Lisp: uma lista de listas.
(setq tabela (string->tabela " . Q1 Q2 Q3 Q4 A5 Alice 0 1 2 3 4 Beto 1 1 3 1 2 Camila 4 2 2 1 1 Daniel 5 5 0 0 2 ")) |-> (("." "Q1" "Q2" "Q3" "Q4" "Q5") ("Alice" 0 1 2 3 4) ("Beto" 1 1 3 1 2) ("Camila" 4 2 2 1 1) ("Daniel" 5 5 0 0 2))
O primeiro objetivo deste trabalho é fazer uma função - a função "calcula" - que simule uma calculadora RPN. A função "calcula" recebe uma lista de operações a serem feitas com uma pilha de números - essa pilha é uma lista de números que fica guardada na variável "pilha" - e vai executando essas operações uma a uma, modificando a pilha a cada passo e mostrando o valor novo da pilha. Por exemplo, a lista (2 3 * 4 5 * +) corresponde às operações:
2 - põe o número 2 no topo da pilha 3 - põe o número 3 no topo da pilha * - tira os dois números que estão no topo da pilha, 2 e 3, multiplica-os e põe o resultado na pilha 4 - põe o número 4 no topo da pilha 5 - põe o número 5 no topo da pilha * - multiplica os dois números que estão no topo da pilha, 4 e 5, e põe o resultado, 20, no lugar + - soma os dois caras do topo da pilha, 6 e 20, e põe o resultado, 26, no lugar
Um exemplo de como a função "calcula" deve se comportar:
(setq pilha ()) (calcula '(2 3 * 4 5 * +)) |-> (2) (3 2) (6) (4 6) (5 4 6) (20 6) (26) (car pilha) |-> 26
Depois que a função "calcula" estiver pronta tentem fazer uma função "calcula-arit" que trata a pilha como uma pilha de "contas" em notação aritmética usual; essas "contas" vão ser coisas como
2 (2 * 3) (2 * ((3 * 4) * (5 * 6)))
Uma definição mais precisa do que é uma "conta" é a seguinte:
- qualquer número é uma "conta"; - se c1 e c2 são "contas" então (c1 * c2), (c1 + c2), (c1 - c2), etc, são "contas"; - as "contas" são só os objetos que são formados a partir de sucessivas aplicações das regras acima.
Um exemplo de como a função "calcula-arit" deve se comportar:
(setq pilha ()) (calcula-arit '(2 3 * 4 5 * +)) |-> (2) (3 2) ((2 * 3)) (4 (2 * 3)) (5 4 (2 * 3)) ((4 * 5) (2 * 3)) (((2 * 3) + (4 * 5))) (car pilha) |-> ((2 * 3) + (4 * 5)) (setq pilha ()) (calcula-lisp '(2 3 * 4 5 * +)) |-> (2) (3 2) ((* 2 3)) (4 (* 2 3)) (5 4 (* 2 3)) ((* 4 5) (* 2 3)) ((+ (* 2 3) (* 4 5))) (car pilha) |-> (+ (* 2 3) (* 4 5))
(* (+ 1 2) (+ 3 4)) (_ * (+ 1 2) (+ 3 4)) (* _ (+ 1 2) (+ 3 4)) (* _ (_ + 1 2) (+ 3 4)) (* _ (+ _ 1 2) (+ 3 4)) (* _ (+ 1 _ 2) (+ 3 4)) (* _ (+ 1 2 _) (+ 3 4)) (* 3 _ (+ 3 4)) (* 3 _ (_ + 3 4)) (* 3 _ (+ _ 3 4)) (* 3 _ (+ 3 _ 4)) (* 3 _ (+ 3 4 _)) (* 3 7 _) 21
O grupo que
Trabalha com vetores, pontos, retas dadas por equações, e se possível também círculos. Pontos podem ter nomes e a gente pode especificar segmentos para serem traçados.
(defponto 'O '(0 0)) |-> (0 0 ponto O) (defponto 'A '(2 0)) |-> (2 0 ponto A) (defponto 'B '(0 1)) |-> (0 1 ponto B) (defponto 'C '(3 -2)) |-> (3 -2 ponto C) (defvetor 'v (-- B A)) |-> (-2 1 vetor v) (++ C v) |-> (1 -1 ponto) (++ A B) |-> ERRO (defreta 'r (reta O A)) |-> ((0 1) 0 reta) (defreta 's (reta B C)) |-> ((1 1) 1 reta) (cruzamento 'r 's) |-> (1 0 ponto)
Desenhar funções e figuras de geometria descritiva: pontos, nomes nos pontos, segmentos, eixos, tracinhos e números nos eixos; ajuste de escala, o que fazer quando a função não cabe na tela. Desenhar algumas figuras de geometria descritiva: por exemplo, a do Teorema de Pitágoras. Fazer o programa desenhar alguns exemplos de gráficos: exp, seno e cosseno e algumas aproximações deles por série de Taylor.
Funções que a gente conhece:
, >, >
, =, ffloor, sqrt
Comandos
Modos
Hiperlinks