Introdução à Computação, Programação e POO

Enviado por Anônimo e classificado em Computação

Escrito em em português com um tamanho de 14,27 KB

Tema 1: Introdução ao Computador

Computador: um conjunto de conhecimentos científicos, técnicas e tecnologias que permitem o tratamento automático de dados.

Sistema de Computador: um sistema que processa informação, inter-relacionando entidades. Componentes: hardware (processador), software (programas) e peopleware (usuários / operadores).

Item 2: Programação e Linguagens

Software: um conjunto de instruções que dizem ao computador o que deve fazer de forma precisa.

Os programas não são inteligentes.

Eles não têm iniciativa.

Eles não têm imaginação nem inventividade.

Modelo: simplificação da realidade que permite abstrair detalhes supérfluos e concentrar-se no que é verdadeiramente importante.

Linguagens de Programação

Consoante o nível de abstração:

  • linguagem de máquina
  • linguagem Assembly
  • linguagem de alto nível: C, C++ ...
  • 4ª geração: SQL ...
  • linguagens baseadas em componentes: Nesc ...
  • linguagens de modelagem

De acordo com o estilo de programação:

  • declarativa (Prolog, LISP ...)
  • imperativa (C, Java, C++ ...)

De acordo com o processo de tradução:

  • compiladas
  • interpretadas

Componentes de uma linguagem

A linguagem de programação tem dois componentes básicos:

  • Sintaxe: o que e como se pode escrever (vocabulário e regras de escrita).
  • Semântica: o significado do que se escreve.

Erros em programas

Boa prática: definir de forma sistemática, ordenada e seguindo convenções reduz significativamente os erros semânticos. Fazer um design de programação antes de codificar é uma regra muito importante.

Tipos de erros:

  • Erros de compilação: detectados em tempo de compilação; geralmente erros de sintaxe, verificados pelo compilador.
  • Erros de execução: detectados em tempo de execução.
  • Erros lógicos / não-programador: erros de concepção ou lógica do programa (bugs atribuíveis ao programador).

Mecanismo de exceções em Java — para tratar erros em tempo de execução.

Algoritmos

Algoritmos: estudo dos processos ideais para resolver um problema. Um algoritmo é uma receita para resolver um problema.

Eficiência: a eficiência descreve o desempenho de um algoritmo ao executar uma tarefa de forma ótima. A eficiência de um algoritmo é medida por suas ordens de complexidade (tempo e espaço).

Engenharia de Software: princípios e técnicas de desenvolvimento de software com base em engenharia.

Análise: captação e análise de requisitos.

Requisitos:

  • funcionais
  • não funcionais: custo, tempo de desenvolvimento, modificabilidade e extensibilidade, tempo de execução, tempo de implementação global ...

Design: várias propostas são feitas para que o cliente decida qual deseja.

Implementação: parte menos criativa: codifica-se um projeto.

Ensaios / V&V (Verificação e Validação)

Manutenção de software (≈ 80% do ciclo):

  • extensão e melhorias (≈ 10%)
  • resolução de problemas e correção de erros (≈ 60%)
  • realização de testes periódicos (≈ 30%)

Item 3: Introdução à Programação

(Conteúdo introdutório sobre programação — ver itens seguintes para mais detalhes.)

Item 4: Programação Estruturada

Princípios de programação estruturada:

  1. Um programa é uma sequência de instruções.
  2. Princípio do empilhamento: qualquer ação pode ser substituída por duas ou mais ações em sequência.
  3. Princípio das estruturas básicas: qualquer ação pode ser substituída por uma das três estruturas de controlo válidas:
  • sequência
  • seleção (condicional)
  • iteração (repetição)

Todas as estruturas de controlo devem ter um único ponto de entrada e um único ponto de saída. Estas regras podem ser aplicadas repetidamente conforme necessário.

Item 5: Processos e Abstração de Dados

Programação estruturada (ver item 4).

Programação modular — princípio "dividir para conquistar".

Benefícios da programação modular

  • Encapsulamento de algoritmos: os módulos podem ser generalizados como operadores que recebem alguns parâmetros de entrada (0 ou mais) e produzem resultados de saída (0 ou mais).
  • Vantagem: se for necessário corrigir, melhorar ou modificar um módulo, só é preciso alterar a sua implementação.
  • Código modular facilita modificar e depurar o programa.
  • Abstração processual: um módulo pode ser reutilizado quantas vezes forem necessárias sem repetir o código — módulos como caixas-pretas.
  • Vantagem: código menor, sem duplicação e, portanto, mais legível.

Em Java, módulos são chamados de métodos.

Tipos de classes em Java

  • classe
  • biblioteca
  • métodos estáticos de biblioteca: métodos que não necessitam de um objeto para ser executados; são chamados usando o nome da classe.
  • classes de objetos modelados

Uma classe descreve a estrutura (atributos) e o comportamento (métodos não estáticos).

Parâmetros de métodos

Na definição, os parâmetros são chamados de parâmetros formais (tipo + identificador). Quando invocamos um método, os valores passados são os parâmetros atuais (valores literais ou variáveis).

Passagem de argumentos em Java:

  • passagem por valor: é passada uma cópia do valor;
  • passagem por referência: passa-se o endereço de memória (ponteiro) — observar que, em Java, tudo é passado por valor (o valor de referências é copiado).

Os métodos sempre recebem zero ou mais parâmetros de entrada. Os parâmetros formais em Java recebem uma cópia dos parâmetros atuais; alterar um parâmetro formal dentro do método não altera a variável atual passada, salvo se a cópia for uma referência para um objeto cujo conteúdo for modificado.

Sobrecarga de métodos

Em Java você pode definir vários métodos com o mesmo nome dentro da mesma classe, desde que tenham assinaturas diferentes. Quando isso acontece, dizemos que o método está sobrecarregado. A versão invocada depende da lista de parâmetros reais (número, tipo e ordem).

Duas versões de um método são válidas se e somente se têm assinaturas diferentes. O tipo de retorno não faz parte da assinatura.

Assinatura de um método: assinatura = nome + lista de parâmetros.

Abstração

Abstração de controlo (loops), abstração processual (métodos) e abstração de dados (tipos abstratos de dados, classes).

Resumo do tipo de dados abstrato (TDA / ADT): modelo ou estrutura abstrata que define a estrutura (atributos) e comportamento (métodos) dos objetos que pertencem a essa classe.

Envolucros (wrappers) são usados quando precisamos de um objeto em vez de um tipo de dados primitivo (por exemplo, para estruturas encadeadas onde um elemento referencia o próximo).

Métodos não estáticos: executam a pedido de uma instância.

Métodos estáticos: pertencem à classe e podem ser chamados sem um objeto.

Item 6: Recursividade (vs. Iteração)

Recursão é quando algo chama a si próprio; tem relação com o princípio de indução.

Recursão pode consumir muita memória, pois mantém variáveis de método em pilha durante a execução, e também pode levar mais tempo. A recursão é cara, mas muitas vezes mais natural e preferida para certas soluções. Por exemplo, não é viável calcular recursivamente o fatorial de um milhão em Java por limitações de memória, embora a recursão seja útil para escrever e entender certos programas.

Recursão versus Iteração

  1. Ambas executam repetição:
    • a) solução iterativa repete o corpo do laço;
    • b) solução recursiva repete chamadas ao método recursivo.
  2. Ambas têm uma condição de término:
    • a) solução iterativa: termina quando a condição de continuação do laço deixa de ser satisfeita;
    • b) solução recursiva: termina quando se alcança o caso base (indução), desencadeando uma sequência de retorno.
  3. Ambas devem convergir para a solução (princípio da convergência):
    • a) solução iterativa: deve garantir que a condição de término será alcançada;
    • b) solução recursiva: deve garantir que o caso base será alcançado.

Princípio importante: qualquer solução recursiva tem uma solução iterativa equivalente, embora o inverso nem sempre seja tão direto.

Backtracking

Backtracking: técnica de busca que envolve tentativa e retrocesso (backtracking) na resolução de problemas por sucessão de decisões experimentais.

Teoria do 2º Semestre

1. Encapsulamento em tempo de desenvolvimento

Construímos uma classe que agrupa dados e métodos correspondentes ao conceito modelado.

2. Encapsulamento em tempo de execução

Quando a classe existe e criamos objetos, eles são tratados como caixas-pretas. Objetos encapsulam dados e métodos; deve-se interagir com eles apenas por meio da sua interface pública. O estado de um objeto deve ser modificado apenas através dos seus próprios métodos.

3. Interface: definição e propriedades

Uma interface é uma coleção de constantes e métodos abstratos. Interfaces não são utilizadas sozinhas; devem ser implementadas por classes que fornecem implementações dos métodos declarados. Uma classe pode implementar várias interfaces, permitindo algum nível de herança múltipla.

4. Abstração

Encapsulamento é uma forma de abstração. Em baixo nível de abstração manipulamos dados e métodos individualmente; em alto nível consideramos a classe como uma unidade e usamos apenas seus serviços.

5. Relações entre classes

  • generalização (herança)
  • associação
  • uso (dependency / utilização)

6. Generalização (herança)

Relação entre um elemento geral (superclasse) e um caso específico (subclasse). A subclasse herda atributos (dados) e procedimentos (métodos) do pai e pode adicionar os seus próprios.

7. Associação

Indica que uma classe é composta por outras classes usando objetos de uma classe como atributos de outra. A multiplicidade indica quantos objetos estão ligados em uma associação.

8. Uso (dependência)

Relação de utilização: quando uma mudança no estado de um objeto (independente) afeta o estado de outro (dependente), mas não vice-versa.

9. Construtores

Construtores são um ou mais métodos (podem ser sobrecarregados) usados para criar objetos de uma classe. Têm o mesmo nome da classe e não têm tipo de retorno, mas podem aceitar parâmetros para inicializar as variáveis do objeto.

10. Referências

Na atribuição por referência, se duas variáveis referenciam o mesmo objeto, alterar o conteúdo através de uma referência altera o objeto acessado pela outra, pois ambas referenciam a mesma instância.

11. Modificadores

Visibilidade:

  • public: acessível de qualquer lugar;
  • protected: acessível por classes no mesmo pacote ou por subclasses;
  • private: acessível apenas na mesma classe;
  • final: usado para declarar constantes (não permite alteração);
  • static: faz a variável ou método pertencer à classe, sendo comum a todos os objetos.

Métodos estáticos podem ser chamados sem um objeto daquela classe.

12. Três características-chave da POO

encapsulamento, herança e polimorfismo.

13. Polimorfismo

Capacidade de uma referência referir-se a objetos de várias classes relacionadas por herança. Na prática, uma referência pode apontar para qualquer objeto da sua classe ou de uma subclasse.

14. Abstração e classes abstratas

Classes abstratas podem declarar métodos sem implementar sua lógica, obrigando classes filhas a implementá-los. Se o método não fosse abstrato, a classe filha poderia herdar a implementação do pai.

15. Exceções

  • Exceções verificadas (checked): é obrigatório capturá-las com try/catch ou declará-las na cláusula throws; caso contrário, geram erro de compilação.
  • Exceções não verificadas (unchecked): não precisam ser declaradas; são erros que podem ser evitados ao programar corretamente (ex.: divisão por zero, acesso fora dos limites de um array, etc.).

16. Frameworks

Um framework é uma aplicação semi-completa que pode ser especializada e reutilizada por meio de mecanismos de extensão ou configuração para produzir aplicações específicas, frequentemente incluindo infraestrutura de implementação.

O ponto-chave de um framework é definir pontos que podem ser alterados ou especializados pelo programador (hot spots) e código estável. Frameworks são projetados usando design patterns.

17. Árvores binárias

Estruturas formadas por nós onde existe um nó primeiro (raiz), que tem dois nós descendentes; a partir daí cada nó pode ter, por sua vez, dois nós descendentes. Cada nó tem um valor "V", um filho esquerdo e um filho direito.

Entradas relacionadas: