Programa detalhado
Sumário
-
Noção de computador como máquina programável.
-
Programação como arte de resolver problemas.
-
Conceito de algoritmo.
-
Resolução do problema do cálculo do máximo
divisor comum de dois inteiros positivos: escrita de um algoritmo em pseudocódigo
(informal), e demonstração da sua correcção.
-
Conceitos de linguagens naturais, de programação e máquina.
Diferenças.
-
Conceito de compilador como tradutor duma linguagem de programação
para linguagem máquina.
-
Implementação do algoritmo desenvolvido em C++.
-
Programa como concretização dum algoritmo.
-
Fases da resolução de um problema usando um computador.
Aula prática 1 (Introdução ao
Linux). Capítulo 1 das Folhas Teóricas.
-
Conceito de memória.
-
Variáveis como forma estruturada de usar a memória.
-
Tipos básicos:
bool
, int
(e variantes), float
(e variantes) e char
.
-
Noções sobre a representação física
dos tipos.
-
Noções de representação de inteiros em complemento
para dois.
-
Noções de representação de valores em vírgula
flutuante: mantissa e expoente.
-
Noções sobre códigos de caracteres.
-
Interpretação de valores do tipo
char
como inteiros.
-
Valores literais.
-
Computadores como máquinas finitas: limitações dos
tipos e sua importância.
-
Expressões e operações: operações aritméticas,
relacionais e de igualdade.
-
Precedência e associatividade.
-
Importância da operação de atribuição:
alteração do estado da memória.
Aula prática 2. Capítulo
2 das Folhas Teóricas.
-
Conceitos de modularização, abstracção e encapsulamento.
-
Vantagens.
-
Características desejáveis dos módulos.
-
Interface e implementação: "caixas pretas".
-
Rotinas (funções e procedimentos) como unidades atómicas de
modularização.
-
Abordagem descendente para a resolução de problemas.
-
Sintaxe da definição de rotinas:
cabeçalho vs. corpo.
-
Cabeçalho como interface e corpo como implementação.
-
Contratos: pré-condições e condições objectivo.
-
Instruções de asserção e programação por contrato.
-
Parâmetros como variáveis especiais de entrada inicializadas
com o valor dos argumentos.
-
Parâmetros: variáveis.
-
Argumentos: expressões.
-
Instrução
return
.
-
Conceitos de retorno e devolução.
-
Caso dos procedimentos: não há devolução (tipo
de devolução
void
).
-
Sintaxe da invocação ou chamada.
Aula prática 3. Capítulo
3 das Folhas Teóricas.
-
Passagem de argumentos por valor e referência.
-
Referências como nomes alternativos (sinónimos ou pseudónimos)
de variáveis.
-
Blocos de instruções. Blocos embutidos.
-
Variáveis locais e globais: âmbito, permanência e ocultação.
Regra da definição única.
-
Perigos das variáveis globais. Uso de constantes globais.
-
Parâmetros como variáveis locais.
-
Declaração vs. definição de rotinas.
-
Noções sobre nomes de variáveis, funções
e procedimentos.
-
Comprimento típico de rotinas.
Aula prática 4. Capítulo
3 das Folhas Teóricas.
-
Sobrecarga de nomes de rotinas. Noção
de assinatura. Utilizações.
-
Rotinas recursivas.
-
Problemas.
-
Garantia de fim.
-
Aplicações.
-
Mecanismo de invocação de rotinas.
-
A pilha, as variáveis locais, os parâmetros e o valor devolvido.
-
Porque funcionam as rotinas recursivas.
Aula prática 5. Capítulo
3 das Folhas Teóricas.
-
As instruções de selecção
if
else
e
as instruções condicionais if
.
-
Sintaxe.
-
Transformação entre os dois tipos de instrução.
-
Exemplos.
-
Asserções.
-
Conceitos.
-
Dedução de asserções: directa e inversa.
-
O caso da instrução de atribuição.
-
As guardas de instruções de selecção.
-
Metodologia de desenvolvimento de instruções de selecção.
Importância de partir dos objectivos.
-
Simplificação de instruções de selecção.
A instrução
return
nas instruções
controladas pelo if
e consequente possibilidade de eliminar o
else
.
-
A instrução
?
:
.
-
Importância do cálculo curto-circuitado dos operadores lógicos.
Aula prática 6. Capítulo
4 das Folhas Teóricas.
-
Instruções de selecção encadeadas.
-
Instrução
while
: sintaxe e semântica.
-
Exemplo de ciclo simples.
-
Inicialização, guarda e passo (acção e progresso).
-
Condição invariante.
-
Importância da fraqueza da guarda.
-
Demonstração da correcção de ciclos.
Sua importância.
Aula prática 7. Capítulo
4 das Folhas Teóricas.
-
Importância da especificação do problema: as soluções
são por vezes mais simples do que a formulação inicial
do problema deixa antever.
-
Noção de invariante de um ciclo.
-
Condição invariante, inicialização e guarda
de um ciclo.
-
Metodologia de Dijkstra para desenvolvimento de ciclos:
-
Obtenção da CI: enfraquecimento da CO por introdução
de variável. Menção ao enfraquecimento por factorização
da CO.
-
Obtenção da guarda.
-
Inicialização.
-
Progresso.
-
Acção.
-
Importância da metodologia.
-
Base formal para desenvolvimento.
-
Controlo dos erros.
-
Redução de surpresas.
-
Melhor raciocínio.
-
Maior eficiência.
-
Prática da construção de ciclos: usar ou não
usar metodologia?
Aula prática 8. Capítulo
4 das Folhas Teóricas.
-
Noção de matriz como agregado indexável de variáveis
do mesmo tipo.
-
Sintaxe da definição e da inicialização.
-
Particularidades no C++.
-
Dimensão constante.
-
Proibidas atribuições, comparações e devoluções.
-
Passagens sempre por "referência".
-
Indexações fora dos limites não verificadas.
-
Sintomatologia da indexação fora dos limites: alterações
em variáveis não envolvidas nos cálculos.
Aula prática 9. Capítulo
5 das Folhas Teóricas.
-
Necessidade de TAD: acrescentando tipos ao C++.
-
Sintaxe da definição de classes C++.
-
Sintaxe da definição de variáveis de uma classe C++: as
instâncias e a instanciação.
-
Variáveis e constantes membro: atributos.
-
Acesso a variáveis membro de uma classe C++: operador de selecção
de membro.
-
Rotinas membro: operações e métodos. Declaração
vs. definição. A construção
TAD::
.
-
Acesso a membros de uma classe C++: a variável implícita.
-
Construtores: sintaxe e utilização.
-
Parâmetros com valores por omissão de novo.
-
Categorias e políticas de acesso: membros públicos vs. membros
privados.
-
Princípio do encapsulamento: aplicação aos TAD.
-
Noção de condição invariante de classe
(CIC): regras e vantagens.
-
Exemplos com o TAD
Racional
, para concretização
do conceito de número racional.
Aula prática 10. Capítulo
6 e Capítulo 7 das Folhas Teóricas.
-
Importância das restrições às variáveis
membro: a cada racional deve corresponder uma representação
única.
-
Introdução à sobrecarga de operadores para classes:
operadores
+
binário e ++
prefixo.
-
Devolução de referências.
-
Acesso à instância implícita através da construção
*this
.
Aula prática 11. Capítulo
7 das Folhas Teóricas.
-
Definição dos operadores para o TAD
Racional
.
-
Regra: uma rotina só deve ser membro
se precisar de o ser.
-
Conversões implícitas: construtores invocáveis com
um único argumento. Evitando as conversões implícitas
com
explicit
.
-
Passagem de argumentos por referência constante: evitando cópias,
aumento de eficiência.
Aula prática 12. Capítulo
7 das Folhas Teóricas.
-
Definindo constantes de uma classe: necessidade de declarar métodos como constantes (que não
alteram a instância implícita). Sintaxe. Devolução
por valor constante.
-
Evitando o mecanismo de invocação de rotinas no código máquina produzido pelo compilador:
rotinas
inline
.
Sintaxe. Regras de utilização.
-
Explicação do efeito de
inline
sobre o código
máquina produzido. Exemplo com programa em C++ e respectiva tradução
para MAC-1 (ver Arquitectura de Computadores).
Aula prática 13. Capítulo
7 das Folhas Teóricas.
-
Desenho de classes: programação baseada em objectos.
Fases:
-
Declaração das operações suportadas, suas consequências,
e forma de utilização: interface da classe.
-
Definição dos atributos (representação)
e das operações ou métodos (mecanismo): implementação.
-
Exemplo com pilhas.
-
Definição de sinónimos de tipos com
typedef
.
-
Definição do sinónimo
Item
e vantagens na facilidade
de adaptar a classe.
-
A classe modelo
stack
.
-
Noções elementares de eXtreme Programming: desenho de
testes antes das classes e desenvolvimento incremental.
Aula prática 14. Capítulo
8 das Folhas Teóricas. Ainda por
disponibilizar.
Alguns tópicos deste programa poderão ser transferidos para o programa
de Programação
Orientada para Objectos, caso não haja tempo para os abordar
nesta disciplina.