Advertisement
Guest User

Racket Lab4 - Leonardo Reis e Bruno Corrêa de Almeida|01-06

a guest
Jun 1st, 2019
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Racket 16.32 KB | None | 0 0
  1. ;;EXERÍCIOS DA AULA(exercícios extraclasse começam na linha 287) | Dupla: Leonardo Reis da Silva e Bruno Corrêa de Almeida.
  2.  
  3. (define-struct disciplina(nm_disciplina nota))
  4. ;; Um elemento do tipo disciplna é:
  5. ;; (make-disciplina nd n) onde:
  6. ;; nd: Nome da disciplina do tipo String
  7. ;; n: Nota recebida na disciplina do tipo Número
  8.  
  9. ;; Uma Lista-de-Disciplinas é:
  10.  
  11. ;; OU empty
  12. ;; OU (cons d ldd), onde:
  13. ;; - d: disciplina
  14. ;; - ldd: Lista-de-Disciplinas
  15.  
  16. (define-struct aluno(matricula nome curso historico))
  17. ;; Um elemento do tipo aluno é:
  18. ;; (make-aluno m n c h) onde:
  19. ;; m: Número de matrícula do tipo Número
  20. ;; n: Nome do aluno do tipo String
  21. ;; c: Curso do aluno do tipo String
  22. ;; h: Histórico do aluno do tipo Lista-de-Disciplinas
  23.  
  24.  
  25. ;; Definição de alunos para testes
  26. (define Carlos
  27.   (make-aluno 107 "Carlos" "Ciencia da Computaçao" (list (make-disciplina "Calculo" 8.5)(make-disciplina "MatDiscreta" 8)(make-disciplina "AlgProg" 9))))
  28. (define Rubens
  29.   (make-aluno 72 "Rubens" "Engenharia da Computaçao" (list (make-disciplina "Calculo" 7)(make-disciplina "MatDiscreta" 5)(make-disciplina "Fisica" 6))))
  30. (define Manuela
  31.   (make-aluno 540 "Manuela" "Biologia" (list (make-disciplina "Calculo" 7)(make-disciplina "Quimica" 8)(make-disciplina "Fisica" 9))))
  32. (define Joao
  33.   (make-aluno 400 "Joao" "Ciencia da Computaçao" (list (make-disciplina "Calculo" 5)(make-disciplina "MatDiscreta" 9)(make-disciplina "AlgProg" 10))))
  34. (define James
  35.   (make-aluno 52 "James" "Biologia" empty))
  36.  
  37.  
  38. (define-struct no_aluno(id aluno esq dir))
  39. ;; Um elemento do tipo no_aluno é:
  40. ;; OU empty
  41. ;; OU
  42. ;; (make-no_aluno id aluno esq dir) onde:
  43. ;; id: Número de matrícula do aluno do tipo Número
  44. ;; aluno: elemento do tipo Aluno
  45. ;; esq: elemento do tipo no_aluno com id menor do que este aluno
  46. ;; dir: elemento do tipo no_aluno com id maior do que este aluno
  47.  
  48.  
  49. ;; Uma ABP é:
  50. ;; OU empty
  51. ;; OU no_aluno
  52.  
  53.  
  54. ;; Definição da ABP para testes
  55.  
  56. (define arvoreAlunos
  57.   (make-no_aluno 107 Carlos
  58.                  (make-no_aluno 72 Rubens
  59.                                 (make-no_aluno 52 James empty empty)
  60.                                 empty)
  61.                  (make-no_aluno 400 Joao
  62.                                 empty
  63.                                 (make-no_aluno 540 Manuela empty empty)
  64.                                 )
  65.                  )
  66.   )
  67.  
  68.  
  69. (define-struct NomeCurso(nome curso))
  70. ;; Um elemento NomeCurso é:
  71. ;; (make-NomeCurso n c) onde:
  72.  
  73. ;; n: Nome do aluno encontrado do tipo String
  74. ;; c: Curso do aluno encontrado do tipo String
  75.  
  76. ;; Tipo misto: RetornoBuscaAluno é:
  77. ;; OU NomeCurso
  78. ;; OU String
  79.  
  80.  
  81. ;; buscaAluno: ABP Número -> RetornoBuscaAluno
  82.  
  83. ;; Objetivo: A partir de uma árvore de alunos e um número de matrícula, encontrar o nome e curso do aluno correspondente, retornando uma estrutura com tais atributos ou uma String
  84. ;; no caso do aluno não existir na árvore
  85.  
  86. ;; Exemplos: (buscaAluno arvoreAlunos 107) -> (make-NomeCurso "Carlos" "Ciencia da Computaçao")
  87. ;;           (buscaAluno arvoreAlunos 52) -> (make-NomeCurso "James" "Biologia")
  88. ;;           (buscaAluno arvoreAlunos 400) -> (make-NomeCurso "Joao" "Ciencia da Computaçao")
  89. ;;           (buscaAluno empty 52) -> "Aluno não encontrado"
  90. ;;           (buscaAluno arvoreAlunos 189) -> "Aluno não encontrado"
  91.  
  92. (define (buscaAluno abp matricula)
  93.   (cond
  94.     [(empty? abp) "Aluno não encontrado"]
  95.     [(> matricula (no_aluno-id abp)) (buscaAluno (no_aluno-dir abp) matricula)]
  96.     [(< matricula (no_aluno-id abp)) (buscaAluno (no_aluno-esq abp) matricula)]
  97.     [else (make-NomeCurso (aluno-nome (no_aluno-aluno abp)) (aluno-curso(no_aluno-aluno abp)))]
  98.     )
  99.   )
  100.  
  101. ;;testes:
  102. (check-expect (buscaAluno arvoreAlunos 107) (make-NomeCurso "Carlos" "Ciencia da Computaçao"))
  103. (check-expect (buscaAluno arvoreAlunos 52) (make-NomeCurso "James" "Biologia"))
  104. (check-expect (buscaAluno arvoreAlunos 400) (make-NomeCurso "Joao" "Ciencia da Computaçao"))
  105. (check-expect (buscaAluno empty 52) "Aluno não encontrado")
  106. (check-expect (buscaAluno arvoreAlunos 189) "Aluno não encontrado")
  107.  
  108. ;; alunosDeCurso: ABP String -> Lista-de-Alunos
  109.  
  110. ;; Uma Lista-de-Alunos é:
  111. ;; OU empty
  112. ;; OU (cons (make-aluno matricula nome curso historico) lda) onde lda é uma Lista-de-Alunos
  113.  
  114. ;; Objetivo: A partir de uma árvore de alunos e um curso, retorna uma lista de elementos aluno que pertencem ao curso
  115.  
  116. ;; Exemplos: (alunosDeCurso arvoreAlunos "Ciencia da Computaçao") -> (list Carlos Joao)
  117. ;;           (alunosDeCurso arvoreAlunos "Biologia") -> (list James Manuela)
  118. ;;           (alunosDeCurso empty "Biologia") -> empty
  119. ;;           (alunosDeCurso arvoreAlunos "Engenharia Quimica") -> empty
  120.  
  121. (define (alunosDeCurso abp curso)
  122.   (cond
  123.     [(empty? abp) empty]
  124.     [(string=?(aluno-curso (no_aluno-aluno abp)) curso) (cons (no_aluno-aluno abp) (append(alunosDeCurso (no_aluno-esq abp) curso)(alunosDeCurso (no_aluno-dir abp) curso)))]
  125.     [else (append(alunosDeCurso (no_aluno-esq abp) curso)(alunosDeCurso (no_aluno-dir abp) curso))]
  126.     )
  127.   )
  128.  
  129. ;;testes:
  130. (check-expect (alunosDeCurso arvoreAlunos "Ciencia da Computaçao")(list Carlos Joao))
  131. (check-expect (alunosDeCurso arvoreAlunos "Biologia") (list James Manuela))
  132. (check-expect (alunosDeCurso empty "Biologia") empty)
  133. (check-expect (alunosDeCurso arvoreAlunos "Engenharia Quimica") empty)
  134.  
  135.  
  136. ;; contaElementos: Lista -> Número
  137.  
  138. ;; Objetivo: conta elementos de uma lista qualquer
  139.  
  140. ;; Exemplo: (contaElementos (list 1 2 3)) -> 3
  141. ;;          (contaElementos empty) -> 0
  142.  
  143. (define (contaElementos lista)
  144.   (cond
  145.     [(empty? lista) 0]
  146.     [else (+ 1 (contaElementos (rest lista)))]
  147.     )
  148.   )
  149.  
  150. ;;testes:
  151. (check-expect (contaElementos (list 1 2 3)) 3)
  152. (check-expect (contaElementos empty) 0)
  153.  
  154. ;; Tipo misto RetornoNumD é:
  155. ;; OU String
  156. ;; OU Número
  157.  
  158.  
  159. ;; contaDisciplinas: ABP Número -> RetornoNumD
  160.  
  161. ;; Objetivo: A partir de uma árvore de alunos e um número de matrícula, retorna o número de disciplinas cursadas pelo aluno ou uma String no caso de não encontrá-lo
  162.  
  163. ;; Exemplos: (contaDisciplinas arvoreAlunos 72) -> 3
  164. ;;           (contaDisciplinas arvoreAlunos 52) -> 0
  165. ;;           (contaDisciplinas empty 52) -> "Aluno não encontrado"
  166. ;;           (contaDisciplinas arvoreAlunos 89) -> "Aluno não encontrado"
  167.  
  168. (define (contaDisciplinas abp matricula)
  169.   (cond
  170.     [(empty? abp) "Aluno não encontrado"]
  171.     [(> (aluno-matricula(no_aluno-aluno abp)) matricula) (contaDisciplinas (no_aluno-esq abp) matricula)]
  172.     [(< (aluno-matricula(no_aluno-aluno abp)) matricula) (contaDisciplinas (no_aluno-dir abp) matricula)]
  173.     [else (contaElementos (aluno-historico(no_aluno-aluno abp)))]
  174.     )
  175.   )
  176.  
  177. ;;testes:
  178. (check-expect (contaDisciplinas arvoreAlunos 72) 3)
  179. (check-expect (contaDisciplinas arvoreAlunos 52) 0)
  180. (check-expect (contaDisciplinas empty 42) "Aluno não encontrado")
  181. (check-expect (contaDisciplinas arvoreAlunos 89) "Aluno não encontrado")
  182.  
  183.  
  184.  
  185. ;; Uma Lista-de-Funcionarios é:
  186. ;; OU empty
  187. ;; OU (cons f ldf), onde:
  188. ;; - f: funcionario
  189. ;; - ldf: Lista-de-Funcionarios
  190.  
  191. (define-struct funcionario(nome cargo salario subordinados))
  192. ;; Um elemento funcionario é:
  193.  
  194. ;; (make-funcionario n c s sub) onde:
  195.  
  196. ;; n: Nome do funcionario do tipo String
  197. ;; c: Cargo do funcionario do tipo String
  198. ;; s: Salário do funcionario do tipo Número
  199. ;; sub: Lista de subordinados do tipo Lista-de-Funcionarios
  200.  
  201. ;; Definição de funcionarios para teste
  202.  
  203.  
  204. (define Silvao
  205.   (make-funcionario "Silvao" "Monitor" 12000 empty))
  206. (define Hermanoteu
  207.   (make-funcionario "Hermanoteu" "Monitor" 12000 empty))
  208. (define Ribas
  209.   (make-funcionario "Ribas" "Monitor" 10000 empty))
  210. (define Jacques
  211.   (make-funcionario "Jacques" "Substituto" 15000 empty))
  212. (define Lucio
  213.   (make-funcionario "Lucio" "Professor" 20000 (list Hermanoteu Silvao)))
  214. (define Zumbi
  215.   (make-funcionario "Zumbi" "Entidade" 40000 empty))
  216. (define Marcelo
  217.   (make-funcionario "Marcelo" "Professor" 20000 (list Ribas Jacques)))
  218. (define Bruno
  219.   (make-funcionario "Bruno" "Reitor" 50000 (list Marcelo Lucio Zumbi)))
  220.  
  221.  
  222.  
  223.  
  224.  
  225.  
  226. ;; Uma ArvoreDeFuncionarios é:
  227. ;; OU empty
  228. ;; OU (make-funcionario n c s sub), onde:
  229. ;; - n: String, nome do funcionário
  230. ;; - c: String, cargo do funcionário
  231. ;; - s: Número, salário do funcionário
  232. ;; - sub: Lista-de-Funcionarios, lista de subordinados do funcionário
  233.  
  234. ;; Definição da árvore de funcionários para testes
  235.  
  236. (define arvoreFuncionarios
  237.   Bruno)
  238.  
  239.  
  240. ;; numFuncionariosAcima: ArvoreDeFuncionarios Número -> Número
  241.  
  242. ;; Objetivo: A partir de uma árvore de funcionários e um valor, retorna quantos funcionários, incluido a raíz da árvore e seus subordinados, possusem um salário acima desse valor
  243.  
  244. ;; Exemplos: (numFuncionariosAcima arvoreFuncionarios 15000) -> 4
  245. ;;           (numFuncionariosAcima arvoreFuncionarios 20000) -> 2
  246. ;;           (numFuncionariosAcima arvoreFuncionarios 100000) -> 0
  247. ;;           (numFuncionariosAcima empty 500) -> 0
  248.  
  249.  
  250.  
  251. (define (numFuncionariosAcima arvoreFuncionarios valor)
  252.   (cond
  253.     [(empty? arvoreFuncionarios) 0]
  254.     [(> (funcionario-salario arvoreFuncionarios) valor) (+(verificaLista (funcionario-subordinados arvoreFuncionarios) valor) 1)]
  255.     [else (verificaLista (funcionario-subordinados arvoreFuncionarios) valor)]
  256.     )
  257.   )
  258.          
  259. ;;testes:
  260. (check-expect (numFuncionariosAcima arvoreFuncionarios 15000) 4)
  261. (check-expect (numFuncionariosAcima arvoreFuncionarios 20000) 2)
  262. (check-expect (numFuncionariosAcima arvoreFuncionarios 100000) 0)
  263. (check-expect (numFuncionariosAcima empty 500) 0)
  264.  
  265. ;;verificaLista: Lista-de-Funcionarios Número -> Número
  266. ;;Objetivo: Auxiliar de numFuncionariosAcima. Dada uma Lista-de-Funcarios(de subordinados, nesse caso) e o valor,
  267. ;;conta quantos funcionários recebem um valor maior que o passado usando recursão mútua com numFuncionariosAcima.
  268. ;;Exemplos:
  269. ;;(verificaLista (funcionario-subordinados arvoreFuncionarios) 100) -> 7
  270. ;;(verificaLista (funcionario-subordinados arvoreFuncionarios) 20000) -> 1
  271. ;;(verificaLista empty 100) -> 0
  272. ;;(verificaLista (funcionario-subordinados arvoreFuncionarios) 9999999) -> 0
  273. (define (verificaLista listaSub valor)
  274.   (cond
  275.     [(empty? listaSub) 0]
  276.     [else (+(numFuncionariosAcima (first listaSub) valor)(verificaLista(rest listaSub) valor))]
  277.     )
  278.   )
  279.  
  280. ;;testes:
  281. (check-expect (verificaLista (funcionario-subordinados arvoreFuncionarios) 100) 7)
  282. (check-expect (verificaLista (funcionario-subordinados arvoreFuncionarios) 20000) 1)
  283. (check-expect (verificaLista empty 100) 0)
  284. (check-expect (verificaLista (funcionario-subordinados arvoreFuncionarios) 9999999) 0)
  285.  
  286.  
  287. ;;EXERCÍCIOS EXTRACLASSE:
  288.  
  289. ;;EXTRACLASSE 1:
  290.  
  291. ;;nomeAlunoMenorMatricula: ABP -> String
  292. ;;Objetivo: dada uma ABP de alunos, retorna o nome(String) do aluno com menor número de matrícula. Caso a ABP seja vazia, retorna mensagem avisando.
  293. ;;Exemplos:
  294. ;;(nomeAlunoMenorMatricula arvoreAlunos) -> "James"
  295. ;;(nomeAlunoMenorMatricula empty) -> "ABP vazia"
  296. (define (nomeAlunoMenorMatricula ABP_alunos)
  297.   (cond
  298.     [(empty? ABP_alunos) "ABP vazia"]
  299.     [else
  300.      (cond
  301.        [(not(empty? (no_aluno-esq ABP_alunos))) (nomeAlunoMenorMatricula (no_aluno-esq ABP_alunos))]
  302.        [else (aluno-nome (no_aluno-aluno ABP_alunos))])]
  303.     ))
  304.  
  305. ;;testes:
  306. (check-expect (nomeAlunoMenorMatricula arvoreAlunos) "James")
  307. (check-expect (nomeAlunoMenorMatricula empty) "ABP vazia")
  308.  
  309.  
  310.  
  311.  
  312.  
  313. ;;EXTRACLASSE 2:
  314.  
  315. ;;somaNotas: Lista-de-disciplinas -> Número
  316. ;;Objetivo: Auxiliar para mediaAritmeticaAluno: Dada um histórico(Lista-de-disciplinas), retorna a soma de todas as notas.
  317. ;;Exemplos:
  318. ;;(somaNotas (aluno-historico Rubens)) -> 18
  319. ;;(somaNotas empty) -> 0
  320. (define (somaNotas histórico)
  321.   (cond
  322.     [(empty? histórico) 0]
  323.     [else (+ (disciplina-nota(first histórico)) (somaNotas (rest histórico)))]))
  324.  
  325. (check-expect (somaNotas (aluno-historico Rubens)) 18)
  326. (check-expect (somaNotas empty) 0)
  327.  
  328. ;;Um elemento retornoMediaAritmeticaAluno é:
  329. ;; - String
  330. ;;    ou
  331. ;; - Número
  332.  
  333. ;;mediaAritmeticaAluno: ABP Número -> retornoMediaAritmeticaAluno
  334. ;;Objetivo: Dada uma ABP de alunos e um número de matrícula, retorna a média aritmética
  335. ;;das notas do aluno informado. Caso não encontre o aluno, retorna uma mensagem de aviso.
  336. ;;Caso encontre o aluno, mas o mesmo não possua registro em seu histórico, retorna mensagem de aviso.
  337. ;;Exemplos:
  338. ;;(mediaAritmeticaAluno arvoreAlunos 72) --> 6
  339. ;;(mediaAritmeticaAluno arvoreAlunos 107) --> 8.5
  340. ;;(mediaAritmeticaAluno empty 72) --> "Aluno não encontrado"
  341. ;;(mediaAritmeticaAluno arvoreAlunos 999) --> "Aluno não encontrado"
  342. ;;(mediaAritmeticaAluno arvoreAlunos 52) --> "Aluno possui histórico vazio"
  343.  
  344. (define (mediaAritmeticaAluno ABP_aluno matrícula)
  345.   (cond
  346.     [(empty? ABP_aluno) "Aluno não encontrado"]
  347.     [(= (no_aluno-id ABP_aluno) matrícula)
  348.      (cond
  349.        [(empty? (aluno-historico (no_aluno-aluno ABP_aluno))) "Aluno possui histórico vazio"]
  350.        [else (/ (somaNotas (aluno-historico (no_aluno-aluno ABP_aluno))) (contaElementos (aluno-historico (no_aluno-aluno ABP_aluno))))])]
  351.     [(> matrícula (no_aluno-id ABP_aluno)) (mediaAritmeticaAluno (no_aluno-dir ABP_aluno) matrícula)]
  352.     [else (mediaAritmeticaAluno (no_aluno-esq ABP_aluno) matrícula)]))
  353.  
  354. ;;testes:
  355. (check-expect (mediaAritmeticaAluno arvoreAlunos 72) 6)
  356. (check-expect (mediaAritmeticaAluno arvoreAlunos 107) 8.5)
  357. (check-expect (mediaAritmeticaAluno empty 72) "Aluno não encontrado")
  358. (check-expect (mediaAritmeticaAluno arvoreAlunos 999) "Aluno não encontrado")
  359. (check-expect (mediaAritmeticaAluno arvoreAlunos 52) "Aluno possui histórico vazio")
  360.  
  361.  
  362.  
  363. ;;Um elemento Lista-de-string é:
  364. ;;ou empty
  365. ;;ou (cons String lds), onde:
  366. ;; String: String, uma String qualquer
  367. ;; lds: Lista-de-string
  368.  
  369.  
  370. ;;EXTRACLASSE 3:
  371.  
  372. ;;funcionariosComCargo: ArvoreDeFuncionarios String -> Lista-de-string
  373. ;;Objetivo: Dada uma árvore de funcionários(do tipo ArvoreDeFuncionarios)e um cargo(do tipo String),
  374. ;;retorna uma lista(do tipo Lista-de-string) contendo os nomes(String) de todos os funcionários
  375. ;;daquela árvore que sejam do cargo informado.
  376. ;;Exemplos:
  377. ;;(funcionariosComCargo arvoreFuncionarios "Reitor") -> (list "Bruno")
  378. ;;(funcionariosComCargo arvoreFuncionarios "Professor") -> (list "Marcelo" "Lucio")
  379. ;;(funcionariosComCargo arvoreFuncionarios "Padeiro") -> empty
  380. ;;(funcionariosComCargo empty "Professor") -> empty
  381. (define (funcionariosComCargo arvore_funcionarios cargo)
  382.   (cond
  383.     [(empty? arvore_funcionarios) empty]
  384.     [(string=? cargo (funcionario-cargo arvore_funcionarios)) (cons (funcionario-nome arvore_funcionarios)
  385.                                                                     (auxiliarCargos (funcionario-subordinados arvore_funcionarios) cargo))]
  386.     [else (auxiliarCargos (funcionario-subordinados arvore_funcionarios) cargo)]
  387.     )
  388.    
  389.   )
  390.  
  391. ;;testes:
  392. (check-expect (funcionariosComCargo arvoreFuncionarios "Reitor") (list "Bruno"))
  393. (check-expect (funcionariosComCargo arvoreFuncionarios "Professor") (list "Marcelo" "Lucio"))
  394. (check-expect (funcionariosComCargo arvoreFuncionarios "Padeiro") empty)
  395. (check-expect (funcionariosComCargo empty "Professor") empty)
  396.  
  397.  
  398. ;;auxiliarCargos: Lista-de-Funcionarios cargo -> Lista-de-string
  399. ;;Objetivo: Auxiliar de funcionariosComCargo. Dado uma lista de subordinados(do tipo Lista-de-Funcionarios), retorna
  400. ;;uma lista de nomes dos funcionários subordinados que possuem o cargo informado, utilizando recursão mútua e concatenação de listas.
  401. ;;Exemplos:
  402. ;;(auxiliarCargos (funcionario-subordinados arvoreFuncionarios) "Professor") -> (list "Marcelo" "Lucio")
  403. ;;(auxiliarCargos (funcionario-subordinados arvoreFuncionarios) "Entidade")  -> (list "Zumbi")
  404. ;;(auxiliarCargos (funcionario-subordinados arvoreFuncionarios) "Padeiro")   -> empty
  405. ;;(auxiliarCargos empty "Professor") -> empty
  406. (define (auxiliarCargos lista_subordinados cargo)
  407.   (cond
  408.     [(empty? lista_subordinados) empty]
  409.     [else (append (funcionariosComCargo (first lista_subordinados) cargo) (auxiliarCargos (rest lista_subordinados) cargo))]
  410.   ))
  411.  
  412. ;;testes:
  413. (check-expect (auxiliarCargos (funcionario-subordinados arvoreFuncionarios) "Professor") (list "Marcelo" "Lucio"))
  414. (check-expect (auxiliarCargos (funcionario-subordinados arvoreFuncionarios) "Entidade") (list "Zumbi"))
  415. (check-expect (auxiliarCargos (funcionario-subordinados arvoreFuncionarios) "Padeiro") empty)
  416. (check-expect (auxiliarCargos empty "Professor") empty)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement