Planificação

NOTA: irei muito brevemente atualizar esta parte do site e atualizá-la regularmente para ser mais fácil para todos perceber quais são as matérias que estão a ser lecionadas.

Calendário

Esta planificação serve para dar uma ideia resumida das aulas planeadas e/ou dadas:

Sumários

Aula Teórica #01: 11/02/2020
Apresentação da unidade curricular: docentes, frequência, avaliação, objectivos, programa, funcionamento das aulas, bibliografia; história da linguagem Java.
Slides: 0 - Apresentação e Programa (todos) ; 1 - Introdução ao Java (1 a 5)

Aula Teórica #02: 18/02/2020
Caracterísicas principais do Java; portabilidade; JDK; modelo de programação e um primeiro programa em Java; comentários; tipos de dados primitivos e seus limites máximos; conversões implicitas e "castings"; âmbitos das variáveis; principais operadores.
Slides: 1 - Introdução ao Java (6 a 15)

Aula Teórica #03: 21/02/2020
Divisão inteira e resto; regras de precedência; operadores de incremento/decremento e modifica-e-atribui; instruções condicionais: if-else e switch; instruções de ciclo: while, do-while, for, break e continue.
Slides: 1 - Introdução ao Java (20 a 28)

Aula Teórica #04: 28/02/2020
Classes e terminologia associada: referências, objectos, atributos e métodos; operadores "new" e "ponto"; um primeiro exemplo de classe: coordenada 2D; métodos construtores; overload de métodos; comparação de objectos; variáveis e métodos estáticos; API do Java; packages java.lang e java.util; strings.
Slides: 1 - Introdução ao Java (29 a 41)

Aula Teórica #05: 03/03/2020
Strings (continuação); arrays e matrizes; input/output em Java; entrada, saída e erro padrão; classe Scanner, construtores e outros métodos associados; escrita formatada; regras de etiqueta e convenções.
Slides: 1 - Introdução ao Java (42 a 61)

Aula Teórica #06: 06/03/2020
Regras metodológicas para resolução de problemas; conceitos de programação estruturada; exemplo de boas práticas com a implementação da resolução de um problema relacionado com um jogo do galo generalizado.
Slides: 2 - Programação Estruturada (todos)

Aula Teórica #07: 10/03/2020
Princípios de programação orientada a objectos: abstração, encapsulamento e modularidade; tipos abstractos de dados (TADs); TAD Vector: atributos, construtores e outros métodos associados para operações comuns; palavra chave "this"; qualificados de âmbito: "private", "protected" e "public"; o método toString() e noção de "override" de métodos.
Slides: 3 - Tipos Abstractos de Dados (1 a 14)

Aula Teórica #08: 13/03/2020
Modo de funcionamento das aulas não presenciais; TAD conjunto, conceito de interface; implementação de um conjunto como lista num array; geração de erros customizados; vantangens e desvantagens da implementação mostrada.
Slides: 3 - Tipos Abstractos de Dados (15 a 32)

Aula Teórica #09: 17/03/2020
TAD Conjunto como um array de booleanos; implementações de conjuntos da API do Java (TreeSet e HashSet); genéricos; wrappers; auto boxing/unboxing; mecanismo de herança; override.
Slides: 3 - Tipos Abstractos de Dados (33 a 57)

Aula Teórica #10: 20/03/2020
Estruturas de dados sequenciais; vantagens e desvantagens de arrays; conceito de listas ligadas; implementação de listas ligadas: classes para um nó e para uma lista, adicionar, remover e aceder a elementos, imprimir conteúdo.
Slides: 4 - Listas Ligadas, Pilhas e Filas (1 a 17)

Aula Teórica #11: 24/03/2020
Motivação para listas circulares; escalonamento "round-robin"; implementação de listas circulares; motivação para listas duplamente ligadas; implementação de listas duplamente ligadas; conceito de "sentinelas".
Slides: 4 - Listas Ligadas, Pilhas e Filas (18 a 38)

Aula Teórica #12: 27/03/2020
TAD Pilha ("stack"): operações fundamentais (push e pop) e implementação com listas ligadas; TAD Fila ("queue"): operações fundamentais (enqueue e dequeue) e implementação com listas ligadas; TAD deque ("double ended queue"); TADs sequenciais na API do Java; interface Iterable e uso da instrução de ciclo simplificada do tipo foreach.
Slides: 4 - Listas Ligadas, Pilhas e Filas (39 a 55)

Aula Teórica #13: 31/03/2020
Implementação com "live coding" (e explicações) de 6 problemas de listas ligadas simples. Nomeadamente, são resolvidos os problems ED188 (get), ED189 (remove), ED190 (copy), ED191 (duplicate), ED192 (count) e ED193 (removeAll).

Aula Teórica #14: 03/04/2020
Explicação e implementação com "live coding" do problema de desafio "[ONI_PG] Padrões Geométricos".

Aula Teórica #15: 14/04/2020
Conceitos de algoritmo, instância, correcção e eficiência temporal ou espacial; o problema do caixeiro-viajante (TSP): algumas possíveis heurísticas não optimais e uma solução correta gerando testando todas as hipóteses; estimativas de tempo necessário num computador atual; o modelo de Random Access Machine (RAM) para contagem de operações simples num programa.
Slides: 5 - Complexidade Algorítmica (1 a 22)

Aula Teórica #16: 17/04/2020
Tipos de análise: pior caso e caso médio; Fundamentos de análise assintótica: conceito de taxa de crescimento e notação O, Ω Θ; funções mais comuns: nomes e exemplos de algoritmos; previsão do tempo de execução de um algoritmo; alguns exemplos e regras práticas.
Slides: 5 - Complexidade Algorítmica (23 a 40)


Aula Prática #01: 17/02 a 21/02
Um primeiro programa em Java; ciclos, instruções condicionais, procedimentos e funções; arrays e crivo de Eratóstenes; strings.

Aula Prática #02: 24/02 a 28/02
Classe Scanner e leitura de input; uso de arrays; plataforma Mooshak para avaliação automática de código; classes String e Character; resolução de problemas.

Aula Prática #03: 02/03 a 06/03
Uso de classes em Java: métodos, atributos, construtores; referências e conceito de null; atributos e métodos estáticos; classes para representar objectos geométricos simples: pontos e retângulos; classe para representar uma matriz.

Aula Prática #04: 09/03 a 13/03
Noções de programação estruturada; resolução de problemas: implementação de um verificador para um jogo do galo genérico, implementação do jogo da vida, implementação de um verificador de sopa de letras.

Aula Prática #05: 16/03 a 20/03
Tipos Abstractos de Dados, interfaces e suas implementações; implementação de conjuntos de números inteiros usando um array como lista e um array de booleanos como "dicionário" e métodos associados; implementação de números arbitratriamente grandes.

Aula Prática #06: 23/03 a 27/03
Exploração da implementação de listas ligadas dada nas aulas teóricas; resolução de problemas com implementação de vários métodos sobre listas ligadas.

Aula Prática #07: 30/03 a 03/04
Exploração das implementações de listas circulares, listas duplamente ligadas, pilhas, filas e deques dadas nas aulas; resolução de problemas usando os conceitos de listas, pilhas, filas e deques.

Aula Prática #08: 13/04 a 17/04
Consolidação de conhecimentos sobre listas, pilhas e filas. Resolução de problemas usando os conceitos dados.