UFABC - MCTA016-13 - Paradigmas de Programação
Segundo Quadrimestre de 2019

Índice

Permalink

Turmas: DA2MCTA016-13SA e NA2MCTA016-13SA
Professores: Emilio Francesquini
E-mail: e.francesquini@ufabc.edu.br


Avisos

  • [2019-09-06 sex] Todos aqueles interessados em fazer a Rec. devem me mandar um e-mail manifestando o interesse até dia 20/09.
  • [2019-09-05 qui] Notas finais online! Caso tenham alguma observação ou reclamação avisem-me o quanto antes!!

↑ novidades

  • [2019-09-01 dom] Notas da P2 online.
  • [2019-09-01 dom] Atenção às salas da SUB dia 04/09. A prova da manhã será aplicada pela Profa. Carla Lintzmayer.
    • 08h00 → A-113-0
    • 19h00 → A-108-0
  • [2019-08-27 ter] Atenção às salas da P2 dia 28/08. A prova será aplicada pela Profa. Carla Lintzmayer.
    • 08h00 → S-205-0
    • 19h00 → A-108-0
  • [2019-08-25 dom] A tabela de entregas em atraso para o projeto foi atualizada.

    Dia Nota máxima
    25/08 10
    26/08 9
    27/08 8
    28/08 5
    29/08 em diante 0
  • [2019-08-22 qui] Finalmente! Notas da P1 online.
  • [2019-08-20 ter] Horário da P2 corrigido na programação de aulas.
  • [2019-08-15 qui] Excepcionalmente o atendimento hoje será feito online. Você poderá me encontrar no Google Hangouts no seguinte endereço: prof.emilio.ufabc@gmail.com
  • [2019-08-09 sex] A monitoria do dia 12/08 excepcionalmente será às 9h.
  • [2019-08-08 qui] Atividade Bônus online. Prazo 11/08/2019 23h00.
  • [2019-07-27 sáb] Listas de exercícios 5 e 6 disponíveis.
  • [2019-07-26 sex] Atenção: Com a definição pela prograd da data da reposição da aula perdida no dia 14/06, o calendário para o final do curso foi ligeiramente alterado. Avise-me por e-mail o quanto antes caso essas novas datas causem problemas.
  • [2019-07-26 sex] No oferecimento passado desta disciplina, o Caio Cesar Dionello e o Ricardo Rodrigues de Mendonça montaram um tutorial sobre o uso de GTK com Haskell. O tutorial está disponibilizado aqui (PDF, Código Exemplo).
  • [2019-07-24 qua] Código completo do Arkanoid em Haskell usando Gloss disponível aqui.
  • [2019-07-14 dom] Torneio de Haskell @ URI Online Judge
  • [2019-07-04 qui] Link de divulgação de notas no ar.
  • [2019-06-24 seg] Horários de atendimento de monitoria divulgados!
  • [2019-06-20 qui] TODOS que forem aprovados no curso de Teoria das Categorias para Programadores do professor Fabrício Olivetti terão 1 ponto adicional na média final!
  • [2019-06-17 seg] Links para submissão da proposta do projeto disponíveis.
  • [2019-06-13 qui] Amanhã dia 14/06 não teremos aula devido à greve.
  • [2019-06-10 seg] Curso gratuito: Teoria das Categorias para Programadores, pelo professor Fabrício Olivetti
  • [2019-06-03 seg] Página online

Informações Gerais

Turma Diurno (DA2MCTA016-13SA)

  • Quartas das 10:00 às 12:00, Sala 409-2
  • Sextas das 08:00 às 10:00, Sala S-008-0

Turma Noturno (NA2MCTA016-13SA)

  • Quartas das 21:00 às 23:00, Sala 407-2
  • Sextas das 19:00 às 21:00, Sala S-006-0

Atendimento

Horário Seg Ter Qua Qui Sex
08:00 - 09:00         Aula Teoria
09:00 - 10:00         Aula Teoria
10:00 - 11:00     Aula Prática   Atendimento (Emilio)
11:00 - 12:00 Atendimento (Pedro)   Aula Prática   Atendimento (Emilio)
-----          
17:00 - 18:00       Atendimento (Emilio)  
18:00 - 19:00   Atendimento (Pedro)   Atendimento (Emilio)  
19:00 - 20:00       Atendimento (Emilio) Aula Teoria
20:00 - 21:00         Aula Teoria
21:00 - 22:00     Aula Prática    
22:00 - 23:00     Aula Prática    
  • Monitoria
    • Monitor: Pedro Faustini - pedro.faustini@ufabc.edu.br
    • Local: Sala de Atendimento aos alunos (ao lado da sala 501-2)
    • Horários
      • Segunda-feira das 11h às 12h
      • Terça-feira das 18h às 19h
  • Presencial
    • Horários de atendimento
      • Nos horários listados abaixo não é preciso confirmar ou marcar, apenas apareça! :-)
      • Quinta-feira, das 17:00 às 20:00, Sala 531-2.
      • Sexta-feira, das 10:00 às 12:00, Sala 531-2.
    • Agendado por e-mail
      • Verifique minha agenda e sugira pelo menos dois possíveis horários!
    • Em sala de aula - Após as aulas
  • Online

Sobre a Disciplina

MCTA016-13 - Paradigmas de Programação

  • TPI: 2-2-4
  • Recomendação: Processamento da Informação, Programação Orientada a Objetos

Objetivos

Esta disciplina traz à atenção do aluno as diversas diferenças fundamentais entregrandes famílias de linguagens de programação, tanto em teoria como de forma prática. Estavisão tem efeitos importantes, nem sempre perceptíveis: ao apreciar diversas técnicas deprogramação e mecanismos peculiares de linguagens de programação diferentes, o estudanteexpande seu leque de técnicas e rompe sua rigidez de concepção a respeito do que vem a serprogramar. Além disso, há situações onde um paradigma se aplicará com mais sucesso do queoutro. Pode-se sem dúvida afirmar que a programação em diferentes paradigmas auxilia namelhoria da qualidade da programação de forma geral.

Conteúdo Programático

Visão comparativa entre os paradigmas de programação. Paradigmafuncional. Paradigma concorrente.

Fonte: Projeto Pedagógico do BCC 2017


Datas Importantes

  • Prova 1 - 19/07/2019
  • Prova 2 - 23/08/201928/08/2019
  • Projeto - 25/08/2019
  • Prova Substitutiva - 28/08/201904/09/2019
  • Prova de Recuperação - A definir (Q3 2019)

Listas de Exercícios

Atividades Semanais

  • Atenção 1: Repositórios criados fora do Github Classroom não serão considerados para correção.
  • Atenção 2: Assegure-se de ter utilizado o link correspondente à sua própria turma!
  • Atenção 3: Faça o primeiro acesso ao Github Classroom o quanto antes para verificar se o seu usuário foi criado corretamente.
Atividade Prazo Peso Diurno Noturno
Atividade 01 23/06 23h00 10 https://classroom.github.com/a/AklZWu76 https://classroom.github.com/a/bHrWS1VH
Atividade 02 30/06 23h00 10 https://classroom.github.com/a/EXX08IA8 https://classroom.github.com/a/abFWhOfz
Atividade 03 07/07 23h00 10 https://classroom.github.com/a/7iD9JBYt https://classroom.github.com/a/HR74u5tr
Atividade 04 14/07 23h00 15 https://classroom.github.com/a/fkHe64el https://classroom.github.com/a/8nlSFzZ8
Atividade 05 21/07 23h00 15 https://classroom.github.com/a/6LEuGsun https://classroom.github.com/a/U_MTSJxw
Atividade 06 28/07 23h00 15 https://classroom.github.com/a/K3ao9DFE https://classroom.github.com/a/RqN92oJH
Atividade 07 04/08 23h00 15 https://classroom.github.com/a/my22Yst5 https://classroom.github.com/a/ZyxccTlA
Atividade 08 11/08 23h00 15 https://classroom.github.com/a/a79wBymP https://classroom.github.com/a/X6H752vj
Atividade Bônus 11/08 23h00 15 https://classroom.github.com/a/CMfnncMI https://classroom.github.com/a/D6Vqhx5x
Atividade 09 18/08 23h00 15 https://classroom.github.com/a/vGSOXQPV https://classroom.github.com/a/JFQFr5Hs
Atividade 10 25/08 23h00 10 https://classroom.github.com/a/CdJhwxBV https://classroom.github.com/a/yAEqHQGS

Projeto de Programação

  • Proposta de projeto
    • Prazo até dia 23/06.
    • Grupos de até 4 pessoas (não pode ser trocado mais tarde!)
    • Uma única página (PDF, fonte 12pt) contendo, nomes e RAs dos integrantes, problema e proposta de implementação. Enviado pelo link abaixo.
  • Projeto
    • Prazo até dia 25/08.
    • Mesmo grupo entregue na proposta!
    • Entrega pelo link do GitHub Classroom abaixo.
  Prazo Diurno Noturno
Proposta 23/06 https://classroom.github.com/g/8pLlAv2G https://classroom.github.com/g/NtRpptGd
Projeto 25/08 Use o mesmo link acima (mesmo repositório para proposta e código). Use o mesmo link acima (mesmo repositório para proposta e código).

Aulas

Sem. Data Assunto Referências Material
05/06 - Aula 1 (P) Introdução ao Haskell: ghc, ghci, cabal, stack, Emacs/Atom/Sublime/VSCode/VIM/… [GH] 1,2; [SGS] 1; [ML] 2 Apresentação do Curso; Introdução
  07/06 - Aula 2 (T) Paradigmas de Programação [GH] 1,2; [SGS] 1; [ML] 2 Paradigmas de Programação
12/06 - Aula 3 (P) Tipos e classes padrões [GH] 3; [SGS] 2; [ML] 3 Tipos e classes padrões
  14/06 - Aula 4 (T) Não houve aula devido às manifestações    
19/06 - Aula 4 (P)->(T) Cálculo λ [GH] 4; [SGS] 4; Syntax and Semantics of Programming Languages (Lambda Calculus, Cap. 5) Cálculo λ; Y-Combinator
  21/06 - Aula 5 - Corpus Christi Não haverá aula.    
26/06 - Aula 5 (P) Funções, casamento de padrões, guardas, lambdas [GH] 4; [SGS] 2; [ML] 4 Funções
  28/06 - Aula 6 (T) Listas [GH] 5; [SGS] 2; [ML] 2 Listas
03/07 - Aula 7 (P) QuickCheck, Cifra de César [GH] 5 QuickCheck; Cifra de César
  05/07 - Aula 8 (T) Recursão [GH] 6; [SGS] 2; [ML] 5 Recursão
10/07 - Aula 9 (P) Exercícios de recursão! [GH] 6; [SGS] 2; [ML] 5 Exercícios
  12/07 - Aula 10 (T) Funções de alta ordem [GH] 7; [SGS] 4; [ML] 6 Funções de alta ordem
17/07 - Aula 11 (P) Sistemas de Voto [GH] 7 Votos
  19/07 - Aula 12 (T) Prova 1    
24/07 - Aula 13 (P) Tipos de dados algébricos e classes [GH] 8; [SGS] 3; [ML] 8 ADTs; Exercício - Tautologias
  26/07 - Aula 14 (T) Functors, Applicatives e Monads [GH] 12; [SGS] 14; [ML] 11,12 Monads
31/07 - Aula 15 (P) Lazyness - Computando π da maneira menos confiável do mundo [GH] 15; Artigo de Jerzy Karczmarczuk1 PDF; Código Fonte
  02/08 - Aula 16 (T) Monoid, Foldable, Traversable [GH] 14; [SGS] 13,14,15; [ML] 11 State, Monoid, Foldable, Traversable
10ª 07/08 - Aula 17 (P) Monads - Estudo de Caso: State Transformer [GH] 12; [SGS] 15,15; [ML] 13 Jogo da Zebra; State Transformer (Código Fonte)
  09/08 - Aula 18 (T) Estratégias de paralelismo [SM] 1,2,3 Paralelismo em Haskell; Exemplo: Fractal
11ª 14/08 - Aula 19 (P) K-Means paralelo [SM] 3 K-Means Paralelo (Arquivo de Entrada - Wine Quality Data)
  16/08 - Aula 20 (T) Haskell concorrente [SM] 7 MVars
12ª 21/08 - Aula 21 (P) Prolog   Slides; aula.pl; aula.plt
  23/08 - Aula 22 (T) Aprendizado de Máquina em Haskell   Aprendizado de máquina funcional; Código
13ª 28/08 - Aula 23 (T) Reposição da aula de Sex. 21/06. 08h/19h Prova 2    
  04/09 - Aula 24 (T) Reposição da aula de Sex. 14/06. 08h/19h Prova Substitutiva    

Critério de avaliação

warning.png Honestidade Acadêmica

Entre outros, o código de ética da UFABC estabelece em seu artigo 25 que é eticamente inaceitável que os discentes:
I - fraudem avaliações;
II - fabriquem ou falsifiquem dados;
III - plagiem ou não creditem devidamente autoria;
IV - aceitem autoria de material academico sem participação na produção;
V - vendam ou cedam autoria de material acadêmico próprio a pessoas que não participaram da produção.

Muitos ainda têm dúvidas sobre a interpretação das regras definidas pelo Código de Ética da UFABC. Por esta razão, diversos professores elaboraram um documento (disponível aqui) com vários exemplos e esclarecendo a interpretação das regras acima. Abaixo uma versão resumida. Sempre consulte o documento completo ou converse com o seu professor em caso de dúvidas!

  • Regra 1 - Você não pode enviar para avaliação um trabalho que não seja de sua própria autoria ou que seja derivado/baseado em soluções elaboradas por outros.
  • Regra 2 - Você não pode compartilhar a sua solução com outros alunos nem pedir aos seus colegas que compartilhem as soluções deles com você.
  • Regra 3 - Nos trabalhos enviados para avaliação você deve indicar eventuais assistências que você tenha recebido.

    ATENÇÃO: todos os trabalhos enviados para avaliação poderão ser verificados por um sistema automatizado de detecção de plágio.

Qualquer violação às regras descritas acima implicará:

  • Descarte dos conceitos atribuídos a TODAS as tarefas avaliativas regulares de TODOS os envolvidos, causando assim suas reprovações automáticas com conceito F.
  • Possível denúncia à Comissão de Transgressões Disciplinares Discentes da Graduação, a qual decidirá sobre a punição adequada à violação que pode resultar em advertência, suspensão ou desligamento, de acordo com os artigos 78-82 do Regimento Geral da UFABC.
  • Possível denúncia apresentada à Comissão de Ética da UFABC, de acordo com o artigo 25 do Código de Ética da UFABC.

A avaliação da disciplina será composta por três notas principais: provas, atividades e projeto. Considere:

  • \(N_F\) é a nota final;
  • \(N_{\text{Atividades}}\) é a nota das atividades semanais;
  • \(N_{\text{Provas}}\) é a nota da prova;
  • \(N_{\text{Projeto}}\) é a nota do projeto.

A nota final (\(N_F\)) será determinada pela média harmônica ponderada de \(N_{\text{Atividades}}\), \(N_{\text{Provas}}\) e \(N_{\text{Projeto}}\) com pesos 4, 3 e 3 respectivamente:

\begin{equation*} N_F = \frac{10}{\frac{4}{\max\{0.1, N_{\text{Atividades}}\}} + \frac{3}{\max\{0.1, N_{\text{Provas}}\}} + \frac{3}{\max\{0.1, N_{\text{Projeto}}\}}} \end{equation*}

O conceito final (\(C_F\)) será obtido de acordo com a equação abaixo:

\begin{equation*} C_F = \begin{cases} \textbf{O} ,& \text{se ausência total exceder 25%}\\ \textbf{F} ,& \text{se } N_F \in [0,0;5,0) \\ \textbf{D} ,& \text{se } N_F \in [5,0;6,0) \\ \textbf{C} ,& \text{se } N_F \in [6,0;7,0) \\ \textbf{B} ,& \text{se } N_F \in [7,0;8,5) \\ \textbf{A} ,& \text{se } N_F \in [8,5;10,0] \\ \end{cases} \end{equation*}

O gráfico abaixo mostra a relação entre \(N_{\text{Atividades}}\), \(N_{\text{Provas}}\), \(N_{\text{Projeto}}\) e os conceitos:

conceitos.gif

Avaliação Atividades

  • Haverá uma atividade de laboratório por semana, totalizando 10 atividades ao longo do quadrimestre.
  • O enunciado de cada atividade será divulgado toda quarta antes da aula prática no repositório da disciplina no GitHub.
  • A solução dessas atividades deverá ser entregue apenas pelo Github, até o domingo da semana seguinte à liberação do enunciado (11 dias de prazo).
  • A nota de cada laboratório poderá chegar a 10 caso o programa execute corretamente em todos os casos de teste e será 0 caso contrário.
    • Exemplos de problemas que causam redução da nota: código mal escrito, nomes de variáveis/funções pouco claros, desorganização do código.
  • Cada atividade terá um peso específico, divulgado em seu enunciado, que irá variar de acordo com sua complexidade.
  • Não serão aceitas soluções fora do prazo.
  • Não haverá laboratórios substitutivos.
  • Essas atividades devem ser feitas individualmente.

Avaliação Provas

A nota da teoria \(N_{\text{Provas}}\) será será formada por duas provas \(P_1\) e \(P_2\). Todas as provas serão efetuadas em sala de aula, sem qualquer tipo de consulta.

Haverá também uma prova subsitutiva \(P_S\) que será aberta a todos os interessados, ainda que eles tenham feito tanto a \(P_1\) quanto a \(P_2\).

important.png Atenção

A nota da \(P_S\) será utilizada obrigatoriamente em substituição à menor nota entre \(P_1\) e \(P_2\) ainda que isto diminua a nota final do aluno!

Assim, a nota de provas (\(N_{\text{Provas}}\)) será calculada conforme a seguinte fórmula:

\begin{equation*} N_{\text{Provas}} = \begin{cases} \frac{2 \cdot P_S + 3 \cdot P_2}{5} ,& \text{caso tenha feito a } P_S \text{ e } P_1 < P_2 \\ \frac{2 \cdot P_1 + 3 \cdot P_S}{5} ,& \text{caso tenha feito a } P_S \text{ e } P_2 \leq P_1 \\ \frac {2 \cdot P_1 + 3 \cdot P_2}{5} ,& \text{caso contrário} \end{cases} \end{equation*}

Avaliação Projeto

O enunciado do projeto será anunciado em breve. Ele poderá ser feito em grupos de até 4 pessoas. A sua nota será dada pela qualidade do código (organização, documentação, …), complexidade do projeto, documentação, etc.

Recuperação

Conforme Resolução ConsEPE nº 182 fica assegurado a todos os alunos com \(C_F\) igual a D ou F o direito a fazer uso de mecanismos de recuperação.

A recuperação será feita através de uma prova \(P_R\), sem consulta, e a sua nota será utilizada para compor a o conceito pós-recuperação \(C_R\) conforme as equações abaixo:

\[N_R = \frac{P_R + N_F}{2}\]

Caso 1 \(C_F = D\):

\begin{equation*} C_R = \begin{cases} \textbf{C} ,& \text{se } N_R \geq 6,0 \\ \textbf{D} ,& \text{caso contrário} \end{cases} \end{equation*}

Caso 2 \(C_F = F\):

\begin{equation*} C_R = \begin{cases} \textbf{D} ,& \text{se } N_R \geq 5,0 \\ \textbf{F} ,& \text{caso contrário} \end{cases} \end{equation*}

Notas

Recursos Online

Grupos, listas, páginas, …

Disciplinas em Haskell

  • MCTA016-13: Paradigmas de Programação (em Haskell), UFABC. 2018.
  • CR062-2018: Programação Funcional em Haskell, UFABC. 2018.
  • G51PGP: Programming Paradigms, University of Nottingham. 2019.
  • CS653: Functional Programming, Indian Institute of Technology Kanpur. 2018.
  • CIS 194: Introduction to Haskell, University of Pennsylvania. 2016, 2015, 2014, 2013.
  • … mais exemplos aqui

Ambientes

Para os primeiros exercícios semanais, os ambientes online podem ser suficientes. Mais adiante no curso você provavelmente vai querer um ambiente local na sua máquina

Documentação


Bibliografia

Os principal texto utilizado neste curso será o GH Segunda Edição.

div.png

gh.jpg [GH]

  • Programming in Haskell. 2nd Edition.
    • Por Graham Hutton.

A primeira edição, que tem boa parte do conteúdo da segunda edição, está disponível na biblioteca:

gh1.jpg 1st Edition (antiga)

div.png

sgs.jpg [SGS]

div.png

ml.jpg [ML]

div.png

sm.jpg [SM]

div.png


Última atualização: 2019-09-06 00:46
Emacs 26.3 (Org-mode 9.2.5)

Nota al pie de página:

1

Segundo o próprio autor, o título do paper é "The Most Unreliable Technique in the World to Compute PI" mas, se você estiver atrás de um título com uma pegada mais científica, poderia ser "Infinite precision real fractions, and lazy carry propagation"

Autor: Emilio Francesquini

Created: 2019-09-06 sex 00:46