Prévia do material em texto
CONECTA
16.09.2023
E2A DIGITAL
PROGRAMAÇÃO DE SOLUÇÕES COMPUTACIONAIS
E2A DIGITAL
Professor Alexandre
“Montanha”
• Mestre em Educação e Gestão Social
• Especialista em Educação
• Especialista em Gamification
• Analista de Sistemas
• Historiador
• Gamer
http://lattes.cnpq.br/7137425845019062
https://www.linkedin.com/in/alexandre-oliveira-montanha/
alexmontanha@hotmail.com
http://lattes.cnpq.br/7137425845019062
https://www.linkedin.com/in/alexandre-oliveira-montanha/
mailto:alexmontanha@hotmail.com
E2A DIGITAL
TA L K
3 0 s e t | s á b a d o | 9 - 1 1 h 5 0
P R O G R A M A Ç Ã O D E S O L U Ç Õ E S
C O M P U TA C I O N A I S
E2A DIGITAL
Orientações sobre o momento dos encontros síncronos
Material Didático - Unidades 04, 05 E 06
Momento Pedagógico
Objetivo de trabalhar o conteúdo
pedagógico da UCD
Dúvidas gerais, para além do
conteúdo, devem ser tratadas nos
canais oficiais:
Tutor: Fórum com o tutor, disponível
na UCD, no Ulife;
CAE: (11) 3298-7730 (WhatsApp) ou
https://aluno.ead.br
O encontro é gravado e a gravação
será disponibilizada posteriormente
pelo Tutor, no Ulife
https://aluno.ead.br/
Agenda
• Como analisar e resolver problemas computacionais
• Um caso
• POO
• Práticas
COMO ANALISAR
UM PROBLEMA
Algoritmos que testem as
premissas no horário
gerado
COMPUTAÇÃO
Esse algoritmo é eficiente?
ANÁLISE
PROCESSO
DIVIDIR Dividir o problema em
pedaços menores para
avaliar melhor
ITERAÇÕES Laços e comparações
necessárias para resolver o
problema
ESTRUTURAS Como esses dados são
armazenados e processados
TEXTUAL Descrever textualmente os
passos
Tema: Sistema de Gerenciamento de Estoque de Autopeças
Descrição do Projeto:
Desenvolva um sistema em Java para gerenciar o estoque de uma loja de
autopeças. O sistema deve ser desenvolvido dentro do paradigma orientado a
objetos e pode ser organizado em um repositório GIT.
Requisitos Funcionais:
Cadastro de Autopeças:
Deve ser possível cadastrar autopeças com os seguintes atributos: código,
nome, descrição, preço unitário e quantidade em estoque.
As autopeças devem ser armazenadas em uma coleção (por exemplo, um
ArrayList).
Consulta de Autopeças:
Deve ser possível listar todas as autopeças cadastradas.
Deve ser possível buscar uma autopeça por código.
Atualização de Estoque:
Deve ser possível adicionar ou remover unidades de uma autopeça do estoque.
O sistema deve atualizar automaticamente a quantidade em estoque após cada
operação.
Venda de Autopeças:
Deve ser possível registrar uma venda de autopeças.
O sistema deve reduzir a quantidade em estoque das autopeças vendidas.
Relatórios:
O sistema deve gerar relatórios com as seguintes informações:
Lista de todas as autopeças com seus detalhes.
Lista das autopeças com estoque baixo (por exemplo, menos de 10 unidades).
Valor total do estoque (soma do preço unitário * quantidade em estoque de todas as
autopeças).
Persistência de Dados:
As informações das autopeças devem ser salvas em um arquivo de texto chamado "estoque.txt".
Toda vez que o programa for aberto, ele deve carregar as informações do arquivo para
preencher o estoque.
Requisitos Técnicos:
Use classes e objetos para representar as autopeças.
Utilize exceções para lidar com erros, como estoque negativo ou arquivo ausente.
Implemente um menu de console para interagir com o usuário.
Utilize estruturas de controle, como loops e condicionais, para criar uma experiência de usuário
fluida.
Organize seu código em classes e métodos para manter a modularidade e a legibilidade.
Utilize o Java 8 ou superior para aproveitar as funcionalidades mais recentes da linguagem.
Entrega:
Você pode criar um repositório no GitHub ou em outra plataforma de controle de versão para armazenar seu código-fonte. Certifique-se de incluir um diagrama de classes, um arquivo
README.md com instruções de execução e exemplos de uso, e o arquivo "estoque.txt" contendo dados de exemplo.
Lembre-se de testar bem o seu sistema e lidar com possíveis exceções para garantir que ele seja robusto e confiável.
Este projeto permitirá aos alunos praticar conceitos de orientação a objetos, manipulação de arquivos, interface de console e lógica de programação em Java.
Paradigmas de Linguagens de Programação
Paradigma Orientado a Objetos
Paradigma Orientado a Objetos
A orientação a objetos é uma abordagem de desenvolvimento de software que
organiza os problemas e suas soluções como um conjunto de objetos distintos.
Os programas em POO (programação orientada a objetos) tendem a ser mais lentos
(por serem mais pesados), porém a melhor estruturação do código é um benefício que
compensa (salvo casos a parte).
Paradigma Orientado a Objetos
O paradigma orientado a objetos tem o intuito de proporcionar a modelagem dos
objetos do mundo real de uma maneira mais fidedigna. Ou seja, aproximar o mundo
real do virtual, através da implementação de “blocos de códigos” com suas próprias
regras e valores e as interações entre tais blocos (troca de mensagens).
Programação Imperativa x POO
Programação Imperativa • Programação Orientada a Objetos
Observe que na programação imperativa os processos compartilham os mesmos dados, ou
seja, todos os procedimentos podem ter acesso a qualquer dado de forma indiscriminada
(é óbvio, estamos generalizando).
Dados
Proc1
Dados
Proc2 Proc3
Proc
Dados
Proc
Dados
Proc
Dados
Importância e Motivação
Importância: um objeto encapsula tanto os dados quanto o processamento que é aplicado aos dados, o que leva ao
reuso de código. Aumento da produtividade, diminuição do custo de desenvolvimento e manutenção.
Motivação: reusabilidade, economia de tempo, robustez, eficiência, portabilidade
Conceitos Básicos
Objeto
•Qualquer coisa existente no mundo real, em formato concreto ou abstrato (que exista física ou conceitualmente)
•Ex: aluno, mesa, professor, cadeira, caneta, conta bancária, tela, botão em uma tela etc.
•Estrutura computacional que representa um objeto do mundo real
Classe
•Quando identificamos características e operações similares em objetos distintos, estamos realizando sua classificação, ou seja, identificando classes!
•É uma descrição de um conjunto de objetos que compartilham os mesmos atributos, operações, relacionamentos e semântica.
Ou Seja...
Uma classe descreve uma categoria genérica, já um objeto, ou instância de uma classe, refere-se à
estrutura de dados que representa um membro específico da categoria.
Fazendo uma analogia, a classe está para a planta
baixa assim como o objeto está para a casa.
Membros de uma Classe
Atributos
•São dados ou campos privados.
•Representam as características que os objetos da classe possuem.
•Cada instância tem seus próprios valores de atributos, mas compartilha o nome e os comportamentos dos atributos com as outras
instâncias da classe.
•Os valores dos atributos nos ajudam a distinguir os objetos entre si.
Métodos
•Funções/procedimentos ou operações, comumente públicos.
•Representam o comportamento que os objetos da classe possuem.
•Modificam o estado de um objeto ou prestam serviços a outros objetos.
Correspondência de Termos
POO Programação Imperativa
Objeto Variável dinâmica (ponteiro)
Classe Tipo
Mensagem Chamada de subprograma
Método Subprograma (função ou procedimento)
Herança -
Polimorfismo -
Exemplo de Classes
Em um contexto de automação bancária podemos identificar algumas classes:
•Cliente
•Agência
•Conta
•Conta Corrente
•Conta Poupança
A Classe “Conta Corrente”
A classe Conta Corrente pode conter os seguintes membros:
•Atributos
número
agência
saldo
•Métodos
depositar
sacar
consultar saldo
Uma Implementação para a Classe
“Conta Corrente”
public class ContaCorrente {
private int numero, agencia;
private double saldo;
public void inicializarContaCorrente(int n, int ag) {
numero = n;
agencia = ag;
saldo = 0;
}
public void sacar(double valor){
saldo = saldo - valor;
}
public void depositar(double valor){
saldo = saldo+ valor;
}
public double consultarSaldo(){
return (saldo);
}
}
Utilizando a Classe “Conta Corrente”
public class Banco {
public static void main(String args[]){
ContaCorrente minhaConta;
minhaConta = new ContaCorrente();
minhaConta.inicializarContaCorrente(123, 7);
minhaConta.depositar(50);
minhaConta.depositar(70);
System.out.println("Saldo:" + minhaConta.consultarSaldo());
}
}
Em Java, um objeto é criado utilizando-se a palavra reservada new:
ContaCorrente minhaConta;
minhaConta = new ContaCorrente();
A linha 1 cria uma área de memória que é uma referência para um objeto da classe ContaCorrente
A linha 2 cria um objeto da classe ContaCorrente e o atribui a minhaConta
Mensagens
Programas orientados a objetos são constituídos por objetos que trocam mensagens entre si
O envio de uma mensagem a um objeto corresponde a invocar um método de tal objeto:
minhaConta.inicializarContaCorrente(100, 1212);
minhaConta.depositar(1000);
Os métodos inicializarContaCorrente e depositar são invocados.
Em outras palavras, são enviadas mensagens ao objeto minhaConta para que este realize as operações
inicializarContaCorrente e depositar.
Programar em OO
O simples fato de programar em Java não significa que a aplicação seja orientada a objetos.
É muito importante entender a filosofia deste paradigma de programação para poder obter os seus benefícios.
import java.util.Scanner;
public class Retangulo {
public static void main(String Args[]) {
float altura, largura, area, perimetro;
Scanner input = new Scanner(System.in);
System.out.print("Informe a altura do retângulo: ");
altura = input.nextFloat();
System.out.print("Informe a largura do retângulo: ");
largura = input.nextFloat();
area = altura * largura;
perimetro = 2 * altura + 2 * largura;
System.out.println("A area é: " + area);
System.out.println("O perimetro é: " + perimetro);
}
}
O programa funciona, mas isso é um programa OO? Resposta: NÃO!!!!!!
public class Retangulo {
private float altura, largura;
public Retangulo(){
altura = 1; largura = 1;
}
public float getAltura(){
return (altura);
}
public void setAltura(float alt){
altura = alt;
}
public float getLargura(){
return (largura);
}
public void setLargura(float larg){
largura = larg;
}
public float calculaArea(){
return altura * largura;
}
public float calculaPerimetro(){
return 2 * altura + 2 * largura;
}
}
E agora?
Observe a classe com os
métodos get e set, construtor,
atributos, etc...
import java.util.Scanner;
public class Principal {
public static void main(String Args[ ]) {
Retangulo ret = new Retangulo();
Scanner input = new Scanner(System.in);
System.out.print("Informe a altura do retângulo: ");
ret.setAltura(input.nextFloat());
System.out.print("Informe a largura do retângulo: ");
ret.setLargura(input.nextFloat());
System.out.println("A area é: " + ret.calculaArea());
System.out.println("O perimetro é: " + ret.calculaPerimetro());
}
}
E agora?
Método Construtor
É usado para inicializar os valores dos atributos (valores default).
Deve ter o mesmo nome da classe que o contém e não possui retorno.
Pode ter parâmetros.
Toda subclasse deve chamar um dos construtores da superclasse direta ou indiretamente para inicializar os valores da classe
para o objeto da subclasse.
A subclasse pode chamar implicitamente o construtor da superclasse.
A subclasse pode chamar explicitamente o construtor da superclasse através do operador Super.
Observe que no trecho de código abaixo o método construtor é público (sempre deve ser), ele não possui retorno
(obrigatoriamente) e não possui parâmetro (isso é opcional):
public class Retangulo {
private float altura, largura;
public Retangulo(){
altura = 1; largura = 1;
}
...
Programar de Forma OO
Programação em OO não foi pensada para se escrever menos.
Embora o programa se pareça maior e mais complexo, ele representa um retângulo de uma forma mais limpa e
próxima do mundo real.
À medida que esse código se tornar mais complexo, quem for usar essa classe não vai precisar conhecer detalhes e
será muito melhor de manter (modificar).
Alguns Detalhes...
Um método é uma função definida na classe que é invocada pelo objeto;
O operador de membro “.” (ponto) acessa um método ou atributo do objeto;
Construtores são invocados sempre que o objeto é alocado com new;
O operador this se refere ao objeto atual. Por exemplo, se uma variável de parâmetro tiver o mesmo nome do atributo você
pode identifica-los da seguinte maneira:
public void setNome(String nome) {
this.nome = nome;
}
Alguns Detalhes...
Os modificadores de acesso permitem controlar a visibilidade de
atributos e métodos (além da própria classe):
•public: todos os métodos e atributos são visíveis dentro da classe em que
são definidos. Porém, ao torna-los públicos é possível fazê-los visíveis para
todas as classes externas a classe a que pertencem.
•private: é o tipo de acesso mais restritivo. Membros de classe que são
declarados com o acesso privado somente podem ser utilizados pela
classe em que foram definidos.
•protected: o membro de classe protegido é acessível a classes no mesmo
pacote, acessível e herdado por subclasses no mesmo pacote, e pode ser
herdado por subclasses declaradas em outros pacotes.
Exercícios
1)Na classe Retangulo, implemente o método exibe(), que deve retornar as informações do retângulo:
Altura: altura
Largura: largura
Área: área
Perímetro: perímetro.
Exercícios
2)Implemente o método exibe() na classe ContaCorrente que imprima na tela os dados da conta:
Agência: agencia
Conta: conta
Saldo: R$ saldo.
•Para testar a implementação dessa classe, solicite inicialmente ao usuário que informe o número e agência da conta.
•Em seguida, solicite um valor para depósito e logo após, um valor para saque.
•Por último, imprima os dados da conta utilizando o método exibe() implementado.
•Altere o método sacar(), de modo que não seja possível sacar um valor maior que o saldo da conta. Emita uma mensagem caso o valor do saque seja inválido.
Exercícios
3)Crie uma classe Funcionario que possua os seguintes atributos: nome, idade, cargo, salário e endereço. Crie os
métodos gets e sets para os atributos, bem como uma classe principal que teste a classe. Crie um método exibe() para
imprimir na tela todas as informações de um funcionário.
Como identificar classes ?
Meio de transporte terrestre. Classe:
“Veiculo de Transporte Terrestre”
Meio de transporte aéreo. Classe:
“Veiculo de Transporte Aéreo”
Meio de transporte marítimo.
Classe:
“Veiculo de Transporte Marítimo”
• Repare que ao identificarmos os elementos e classificá-los quanto às
suas características estamos criando classes. No exemplo acima
temos três classes: Veiculo Aéreo, Veiculo Terrestre, Veiculo
Marítimo (ou Fluvial).
Herança: Reutilização de
Código
Segundo Yourdon, é um mecanismo que permite um objeto incorporar toda
ou parte da definição de outro objeto como parte da sua própria definição.
É a propriedade que permite que as classes tenham uma hierarquia entre
elas, criando assim uma espécie de “linhagem”, permitindo que uma classe
qualquer herde de seus ancestrais todas as características (atributos e
métodos).
Quando a herança é oriunda de apenas uma única classe (de forma direta)
dizemos que a herança é simples. Porém quando a herança é oriunda de mais
de uma classe (também de forma direta) dizemos que a herança é múltipla.
Em Java não temos herança múltipla, porém a implementação de interfaces é
uma maneira de “burlar” tal regra.
Pessoa
Pessoa Física Pessoa Jurídica
Herança Simples
Hidroavião
Avião Barco
Herança Múltipla
• As classes abstratas se diferem das interfaces basicamente em dois quesitos: as interfaces não permitem a
declaração de atributos e também não permitem que os métodos nela contidos sejam implementados.
Como identificar a hierarquia?
Veiculo
Terrestre Marítimo Aéreo
Motocicleta Automóvel
• Partimos do pressupostoque de um modo geral todos eles são veículos. Ou seja,
possuem características em comum, possibilitando assim a criação de uma classe
base, ou superclasse, chamada “Veiculo” (generalização). Os demais veículos são
derivados deste e assim temos veículos terrestres, marítimos e aéreos.
• Podemos continuar com a nossa abstração se quisermos e assim tratarmos um
veículo terrestre com sendo um automóvel ou uma motocicleta (especialização).
Exemplo 2
Implementação de Herança: SuperClasse “Veiculo”
Observe que os atributos em comum de um
veículo foram agrupados nesta classe. Fica
aqui uma dica: a criação desta classe como
abstrata seria algo a se pensar!
A referência this é utilizada para obter o
objeto através do qual a chamada do
método é feita, ou seja, serve para evitar
ambiguidades. Imagine um parâmetro com
o mesmo nome de um atributo?!
Exemplo 2
Implementação de Herança (continuação): Classe (derivada) “VeiculoAereo”
Em java a palavra reservada “extends” serve para indicar
a herança. Veja que a classe VeiculoAereo “herda” de
Veiculo. Observe a chamada ao método construtor da
superclasse através do comando “super”. Com isso
estamos inicializando os atributos originados da
superclasse. Não utiliza-lo não ocasiona erro de
compilação, porém a qualidade do software pode ficar
comprometida.
Exemplo 2
Implementação de Herança (continuação): Utilizando as classes.
Repare na chamada ao método “setTipoCombustivel”. Tal
método foi implementado na superclasse “Veiculo”, porém
com a herança...
Exercícios
1)Pesquisa sobre os temas a seguir, descreva cada um de forma sucinta e dê um exemplo:
Classe Abstrata
Interface
Função Virtual
Polimorfismo
Obrigado!