Laboratório de Desenvolvimento de Algoritmos
Este texto apresenta uma abordagem de pontos específicos apresentados à disciplina de Laboratório de Desenvolvimento de Algoritmos do curso de Ciência da Computação da Universidade Cruzeiro do Sul. Se você chegou aqui de outra forma, sinta-se a vontade para descobrir ou rever alguns conceitos.
Aula 01 — Java
Java é muito conhecido e ainda utilizado por trazer o conceito multi-plataforma, ou seja, um programa escrito em Java pode ser lido em qualquer sistema operacional, desde que este tenha o Ambiente de Execução do Java (JRE).
O JRE fornece os requisitos para executar um programa java e, para isso, utiliza uma Máquina Virtual do Java (JVM) para executar o bytecode (.class) A JVM é capaz de interpretar e executar os programas compilados em qualquer um desses SOs.
Porém, para criar um programa em Java (.java) é necessário o Kit de Desenvolvimento Java (JDK). O JDK é um kit que fornece ferramentas para o desenvolvimento de programas Java. O kit destinado a criação de aplicativos para desktop (e relacionados) é o Java SE (Standard Edition), para dispositivos móveis o Java ME (Micro Edition), e para aplicativos baseados na Web e desenvolvedor corporativo o Java EE (Enterprise Edition).
Para que o computador execute um programa escrito em uma linguagem de alto nível (Java), é necessário um meio de tradução desta para linguagem de máquina.
Uma ferramenta do JDK (javac) é capaz de compilar (traduzir) um programa (.java) em um bytecode (programa equivalente, .class) escrito em linguagem de máquina. O bytecode agora pode ser interpretado pela JVM. O objetivo da JVM é permitir que qualquer sistema operacional possa executar uma aplicação Java
Ambiente de desenvolvimento
Estrutura básica de um programa em Java
Vá além:
- https://docs.oracle.com/en/java/javase/16/docs/api/java.desktop/javax/swing/JOptionPane.html
- https://docs.oracle.com/javase/tutorial/uiswing/components/dialog.html
Aula 02 — Uso de variáveis e Tipos de dados
Variáveis — declaração, atribuição
Identificador único: letras minúsculas, maiúsculas, _ , $
Como convenção, é interessante iniciar todos os nomes de variáveis em Java com uma letra maiúscula.
O motivo é que o valor usado pelo compilador não é realmente 92.71, mas o valor de ponto flutuante mais próximo de 92.71.
Tipos de Dados
Representa o tipo de informação que será manipulada
Tipos Primitivos
Visto que existem tantas maneiras de representar um número, os desenvolvedores do Java tiveram que escolher e atribuir os tipos mais comuns.
- Para literais inteiros (int, long, byte, short), o padrão é int .
- Para literais de ponto flutuante (float, double), o padrão é double . O uso de double permite uma aritmética mais segura sobre os valores armazenados.
Para os formatos padrão, o sufixo que denota o tipo exato é opcional.
Números fracionários são números de ponto flutuante (Floating Point), cujo padrão é double. Portanto, não é possível armazenar um número fracionário em uma variável do tipo float.
Números inteiros são números de ponto fixo (Integer), cujo padrão é int. Portanto, dependendo do número não é possível armazenar um número inteiro em uma variável do tipo short ou byte. Por outro lado, todos os números inteiros cabem em uma variável do tipo long.
É necessário converter os números
Vá além:
- https://www.w3schools.com/java/java_data_types.asp
- https://www.youtube.com/watch?v=PDgT0T0Yodo
- https://codegym.cc/groups/posts/29-widening-and-narrowing-of-primitive-types
- https://docs.oracle.com/javase/specs/jls/se9/html/jls-5.html#jls-5.1
Palavras reservadas
Soma ou Concatenação
Vá além:
Comentários
Exercícios
- Crie três variáveis dos tipos int com diferentes nomes e valores.
Crie uma variável chamada soma do tipo int.
Atribua a soma das três variáveis à variável soma.
Imprima o resultado no Console de Depuração da seguinte forma:
"A soma dos valores é ____" - Repita o exercício 1 com valores do tipo double.
- Repita o exercício 1 com valores do tipo float.
Utilize comentários sobre as linhas do algoritmo criado.
Aula 03 — Caixas de diálogo, conversões e organização
Os métodosshowMessageDialog
e showInputDialog
pertencem a classe JOptionPane
e estão em um mesmo pacote externo que precisa ser importado: javax.swing
.
O método println
da classe System
está no pacote java.lang
o qual já é importado por padrão, não é necessário importar.
Problema com números e quantidade.
Conversão de número em quantidade?
Organização no código e Sequências de escape
Exemplo: Cálculo do IMC
- IMC = peso / altura²
Assim como a classe System
, a classe Math
já está no pacote java.lang
, portanto não precisa ser importada.
- Um método é um bloco de código que só roda quando é chamado.
- É possível passar dados (parâmetros) para um método.
- São usados para realizar ações
- Também são conhecidos como funções.
Por que usar métodos? Para reutilizar o código: defina o código uma vez e use-o várias vezes. Ex.: veja como o método (função/funcionalidade) showInputDialog
é reutilizado.
Vá além:
Exercícios
1. Uma loja está oferecendo um desconto de 15% em todos os itens vendidos. O funcionário do caixa da loja não sabe trabalhar com porcentagem e utiliza um programa para isso. Ele insere o valor da compra no programa DesconTop e, como saída o algoritmo imprime as informações do valor da compra, o valor do desconto e o valor a ser pago pelo cliente.
- Crie um programa de nome DesconTop;
- Utilize uma janela para solicitar o valor da compra;
- Calcule 15% deste valor, i.e.
desc = 0.15*valorCompra
; - Imprima o valor da compra, o desconto e o valor a ser pago em uma nova janela.
2. A loja concorrente também está oferecendo um desconto, mas é dependente do humor do gerente😈. Ao invés do desconto ser fixo, o valor é inserido pelo funcionário no caixa.
- Crie um programa de nome DesconTalvez;
- Utilize uma janela para solicitar o valor da compra;
- Utilize uma nova janela para solicitar o valor do desconto;
- Imprima o valor da compra, o desconto aplicado e o valor a ser pago em uma nova janela.
3. Uma carteira digital quer entrar no mercado e está oferencendo 8% de cashback para clientes que pagarem um lanche específico pelo seu aplicativo. O lanche que fornece o cashback custa R$37,50.
- Crie um programa de nome LancheComDesconto;
- Utilize uma janela para solicitar o nome do usuário;
- Logo em seguida, utilize outra janela para imprimir o valor do lanche, o valor pago (igual ao valor do lanche) e o valor do cashback devolvido à carteira do usuário.
4. Um certo professor fica pistola 🔫 quando um aluno entra muito atrasado na sala de aula, e deseja conhecer qual é o tempo exato de atraso de qualquer aluno. Sabendo que a aula começa 19h10:
- Crie um programa chamado AlunoAtrasadao;
- Utilize uma janela para solicitar a hora em que o aluno chegou.
- Utilize outra janela para solicitar os minutos em que o aluno chegou.
- Apresente em uma janela o tempo total de atraso do aluno em minutos.
- Apresente em outra janela a mensagem: "O aluno está atraso em X hora(s) e Y minuto(s)". Substitua X e Y pela quantidade de horas e minutos de atraso 😈.
Aula 04— Operadores Aritméticos, Relacionais, Lógicos
Operadores Aritméticos
Operadores Relacionais
Operadores Lógicos
Exercícios
1. Crie um programa que solicita dois valores ao usuário e retorna em uma mesma caixa de diálogo todas as operações aritméticas +- * / , por exemplo:
2 + 3 = 5
2 - 3 = 5
2 * 3 = 5
2 + 3 = 5
2. Crie um algoritmo para verificar se um número digitado pelo usuário é par ou ímpar. A caixa de diálogo deverá apresentar as duas informações em sequência. Por exemplo, caso você digite 4 em um caixa de diálogo, a mensagem de saída deverá ser:
Este número é par? true
Este número é ímpar? false
3. Crie um algoritmo que solicita dois valores ao usuário e retorna em uma mesma caixa de diálogo todas as operações relacionais e de igualdade, por exemplo:
4 < 3 ? false
4 > 3 ? true
4 ≤ 3 ? false
4 ≥ 3 ? true
4 == 3 ? false
4 != 3 ? true
Operador Ternário 🙏🙌
O operador ternário funciona como uma avaliação condicional e altera o valor de uma variável baseada nesta condição. Caso a condição seja verdadeira, a expressão1 é armazenada na variável. Caso contrário, a expressão2 será armazenada.
var = (condicao) ? valorCasoPositiva : valorCasoNegativa;
onde ()
armazena a condição, após ?
o valor caso a condição for verdadeira e após :
o valor do caso a condição for falsa.
Exercícios
4. Crie um algoritmo que solicita dois valores ao usuário e retorna qual deles é o maior.
5. Refaça o exercício anterior, porém verifique se um número é par ou ímpar. Apresente as seguintes repostas: "O número digitado é par" ou “O número digitado é ímpar”.
6. Refaça o exemplo do guarda-chuva, porém ao invés das variáveis fixas utilize a caixa de diálogo JOptionPane.showConfirmDialog
para perguntar ao usuário Sim/Não.
7. Crie um algoritmo que solicita três valores ao usuário e retorna qual deles é o maior (sistema aninhado — nesting).
8. Um usuário tem dificuldade em saber dizer "bom dia/boa tarde/noa noite" e decidiu comprar um aplicativo que reponde isso de forma automática. Na primeira versão do aplicativo o usuário necessita digitar a hora atual para obter a resposta. O valor de entrada deve ser fornecido entre 00 até 23.
— Entre 00 e 06 a resposta deverá ser "Bom dia";
— Entre 07 e 18 a resposta deverá ser “Bom tarde”;
— Entre 19 e 23 a resposta deverá ser “Bom noite”;
Ajuste os valores de acordo com o seu gosto.
Avançado (opcional): Na segunda versão do aplicativo não é necessário entrar com a hora, o programa captura o horário atual do dispositivo e fornece a resposta a partir da variável hora
, onde:
import java.util.Calendar;
//.........
Calendar infoCalendario = Calendar.getInstance();
int hora = infoCalendario.get(Calendar.HOUR_OF_DAY);
Aula 05 — Condições
Se a avaliação condicional for complexa e envolver mais instruções para cada caso, ao invés de uma atribuição de variável, é possível que estruturas de condições sejam mais eficazes.
O operador ternário sempre retorna um valor que deve ser armazenado em uma variável. Por outro lado, a estrutura condicional direciona o fluxo do algoritmo.
Solução: Condição. Caso o valorEntrada for ímpar, isto é, verifica for false, uma mensagem indicativa deverá ser apresentada indicando o erro.
Tá! Mas e se eu quiser adicionar conteúdo no fluxo em caso contrário?
Opções:
- if
- if-else
- if-else if cascateado (ladder)
- if-else aninhado (nested)
- switch-case
https://www.w3schools.com/java/java_conditions.asp
https://www.w3schools.com/java/java_switch.asp
Bora fazer testes com o cálculo do IMC!
O cálculo do IMC já foi realizado em um exemplo neste artigo, porém é possível classificar de forma subjetiva através de uma tabela:
Veja algumas estruturas para apresentar a classificação a partir do valor do IMC:
> teste com 90kg e 1.50m … que que aconteceu? Resolva!
Exemplos:
1. Implementar um programa em Java solicite 2 números, apresente o maior ou se eles são iguais.
2. Dadas três distâncias L1, L2 e L3, verificar se estas podem ser lados de um triângulo. Caso positivo, verificar se é um triângulo equilátero, isósceles ou escaleno. Caso negativo, apresente uma mensagem indicativa.
A opção switch-case é uma forma simples para definir desvios no código a partir de uma variável de tipo primitivo Integer, isto é, short, int, char, byte. Essa mecânica é utilizada quando se tem várias seleções com muitas alternativas.
Outra diferença entre o switch-case e o if-else if cascateado é de que o if-else avalia várias condições, enquanto o switch-case é utilizado para comparar valores. Além disso, condições são baseadas em restrições e os valores do switch são baseados, em sua grande maioria, em uma escolha do usuário.
https://www.w3schools.com/java/java_switch.asp
A declaração default é opcional. O comando break finaliza o case e sai da estrutura condicional do switch. Caso o comando break não seja inserido, todos os outros cases serão testados.
Exercícios
1. Elabore um programa em Java que leia o valor de um produto e a condição de pagamento conforme tabela abaixo. Exiba ao final do programa, o valor real do produto e o valor a ser pago (conforme tabela), caso seja escolhido o parcelamento, mostre o valor de cada parcela.
Obs.: Caso houver mais do que duas casas decimais nos valores das parcelas, ajuste os valores para que a primeira parcela fique maior do que a segunda. Por exemplo: Valor do produto R$75,25 parcelado em 2x deve apresentar as parcelas de R$37,63 e R$ 37,62 .
2. Uma loja de brinquedos teve aumentos sucessivos de contas de energia em pouco tempo e, para se sustentar, teve que repassar o aumento ao cliente. Foi realizada uma pesquisa juntamente aos compradores e descoberto que brinquedos caros seriam comprados mesmo com um aumento de 15%, por outro lado brinquedos baratos não seriam facilmente vendidos com este mesmo ajuste.
O gerente da loja decidiu seguir uma tabela para realizar o ajuste de valor:
Com base no novo preço é possível reavaliar a classificação do custo de um brinquedo de acordo com a tabela:
Elabore um programa em que leia o preço de um produto, calcule e mostre sua classificação após a nova taxação criada.
3. Crie um algoritmo que solicite ao usuário informações sobre indivíduos conversando e uso de máscara e retorne uma informação sobre a probabilidade de contágio.
Um dia um aluno percebeu que sua tia Rosana, testada como positivo para COVID19, estava conversando com sua vizinha Carminha . Ao se deparar com a situação concluiu que sua tia era muito irresponsável por não permanecer em quarentena em casa durante o período de incubação do vírus. Porém o aluno não sabia qual era a probabilidade de a Carminha se infectar.
Para verificar uma probabilidade subjetiva, o aluno criou um programa para avaliar rapidamente situações como essa, seguindo as informações do poster abaixo:
Desenvolva um programa onde uma janela questiona se a pessoa contaminada está de máscara e, em outra janela, se a pessoa (possivelmente) não contaminada está de máscara. Apresente a resposta em uma nova janela indicando o nível de probabilidade de a pessoa não contaminada se contaminar, sendo a escala "Muito Baixa/Alta/Média/Baixa".
Verifique seu programa realizando um teste de mesa, ou seja, verificando todas as possibilidades.
Dica: utilize o método showConfirmDialog.
4. Crie um algoritmo que solicite ao usuário o valor total de uma compra e a quantidade de parcelas a financiar. O sistema deve imprimir o valor de cada parcela de acordo com os juros da tabela abaixo:
Aula 06— Repetições
As repetições, conhecidas como loops, podem executar um mesmo bloco de código diversas vezes até que uma condição especificada seja alcançada. As repetições são úteis porque economizam tempo, reduzem erros e tornam o código mais legível.
Existem diferentes formas de se reproduzir repetições em Java:
- while
- do-while
- for
- for-each* (será visto depois)
While
Sortear um valor até alcançar um número específico:
Prevenindo loop infinito
Do-While
Outra forma de sortear um valor sem ajuste inicial:
Criando um contador para verificar quantos números foram sorteados
Criando um acumulador para verificar a soma da quantidade de números
For
Break e Continue
Exercícios
1. Um usuário esqueceu a senha de um serviço web e solicitou a recuperação de senha. Ao verificar a mensagem de recuperação, apagou acidentalmente a senha temporária.
O problema é que o sistema de recuperação de senhas não envia uma nova senha antes de 30 minutos após a última solicitação e o usuário ficou 🔫.
Ao se deparar com este problema, e conhecendo a segurança fraca do serviço, o qual utiliza 3 dígitos numéricos para autenticação, o usuário decidiu desenvolver um sistema brute force para testar todas as combinações possíveis para entrar no ambiente virtual.
1.1. Crie um código de 3 dígitos (ex. 563) e armazene em uma variável. Na sequência rode um contador de 000 até 999. Quando o contador for igual ao código, apresente uma janela indicando "Usuário autenticado!".
1.2. Ao invés do código estático, gere um código aleatório de 3 dígitos Math.round(1000*Math.random())
para autenticação.
2. Por falta de segurança, o usuário decidiu contratar um novo serviço. A diferença é de que no novo sistema após três tentativas erradas o programa finaliza, não permitindo nova tentativa.
2.1. Crie um código de 4 dígitos e, na sequência, apresente uma janela para o usuário digitar a senha. Caso o usuário acerte a senha apresente uma janela indicando “Usuário autenticado!”. Caso o usuário não acerte permita com que ele realize mais duas tentativas. Caso as tentativas acabem finalize o programa.
2.2. Gere um código aleatório entre 00 e 20 e, na sequência, apresente uma janela para o usuário digitar a senha. Permita que o usuário realize 5 tentativas. Caso não acerte nenhuma das tentativas, apresente uma tela com os dizeres "Nem pra chutar serve! Beijinhos Tchau tchau". Caso acerte apresente uma tela parabenizando o usuário.
3. Elabore um algoritmo que determine o máximo de uma sequência de 100 números aleatórios.
4. Dado o pseudocódigo abaixo, transcreva para a linguagem Java e descreva o que o algoritmo faz. Quais informações e valores serão escritos no final caso sejam fornecidos os valores: 416 ; 52825 ; 939 ; 9182, 30 ?
Aula 07 — Classes (objetos)
Classe "Celular"
Construindo objetos do tipo "Celular"
Um objeto pode ser compreendido como uma instância de uma classe.
Métodos de objetos
Scanner
Na maioria das plataformas, o console é o ambiente de linha de comando a partir do qual o programa Java foi inicialmente lançado, por esse motivo este ambiente é o destino padrão para saída do sistema System.out (ou System.err) e também origem padrão de entrada do sistema System.in.
Portanto, para obter a entrada de dados é necessário utilizar a propriedade in da Classe System, isto é, "System.in". Para capturar a informação do System.in é necessário utilizar a Classe Scanner que é uma classe que deve ser instanciada através da palavra "new".
ATENÇÃO: System.in aceita dados do Terminal como entrada, portanto a classe Scanner não permite o uso do Console de Depuração do VSCode!!
A Classe Scanner interpreta o retorno (Enter) dado pelo usuário e transfere a captura dos dados (System.in) para um objeto do tipo Scanner. Um objeto do tipo Scanner tem métodos capazes de extrair o conteúdo para diversos tipos.
https://www.w3schools.com/java/java_user_input.asp
String
Geralmente String é uma sequência de caracteres, mas em Java String é um objeto que representa uma sequência de caracteres. A classe java.lang.String é usada para criar um objeto string. Por esse motivo os métodos de String são aplicados sobre o próprio objeto.
É possível criar uma String utilizando o formato literal ou construindo um objeto String com a palavra-chave "new".
A diferença é de que String literal não cria novas instâncias para strings reutilizadas, o que traz melhor eficiência de memória.
- https://www.w3schools.com/java/java_strings.asp
- https://www.w3schools.com/java/java_ref_string.asp
- https://www.devmedia.com.br/string-em-java-entendendo-e-utilizando-essa-classe/25503
Array
Array é uma coleção de elementos com um único nome mas que podem ser acessados de acordo com sua posição. Cada elemento está em uma única posição e esta posição armazena um valor do tipo único do array.
Assim como Strings, Arrays são objetos que podem ser criados com literal ou com a palavra reservada "new"
https://www.w3schools.com/java/java_arrays.asp
Date
A classe Date é uma das classes mais antigas do Java e a maioria dos seus métodos estão obsoletos, mesmo assim ainda é possível usá-la para representar uma data.
Mesmo com atualizações o Java permanece sem uma classe Date embutida no pacote java.lang. Uma forma moderna de se manipular objetos com formato de data se dá a partir do pacote java.time .
Math*
Math também é uma classe java, porém não pode ser instanciada, isto é, não é possível criar objetos do tipo Math. Mesmo assim a classe Math fornece propriedades e métodos que podem ser utilizados sobre outros tipos de dados.
Exemplo
Seja uma lista de nome jogos, com 3 itens (https://www.maioresemelhores.com/jogos-online-mais-jogados-no-mundo/) e uma lista valores, com os valores de cada jogo…
… crie um algoritmo que imprima no console o código e o nome dos jogos. O usuário poderá escolher um jogo para compra através do seu código (0,1,2) e, após a escolha, deverá ser impressos o nome e o valor do jogo, junto de uma solicitação de CUPOM de desconto.
Exercícios
1. Um usuário recebeu um cupom de desconto de um aplicativo e decidiu compartilhar com os amigos. O cupom “SETEMBROCHOVE” dá direito a 20% de desconto em uma compra de um jogo online.
1.1 Foram liberados mais dois cupons no sistema de jogos online "NAOCHOVENAO" (R$ 10) e "CHOVEPAKAS" (50% limitado a R$40) . Crie uma lista (array) com os três cupons e verifique se o cupom digitado pelo usuário pertence a essa lista. Caso pertença, aplique o desconto no processo de compra.
- Utilize o método .toUpperCase() para converter qualquer entrada em maiúsculo (https://www.w3schools.com/java/tryjava.asp?filename=demo_strings_touppercase)
- Utilize o método .equals() para comparar strings (https://www.w3schools.com/java/tryjava.asp?filename=demo_ref_string_equals)
1.2. Adicione o horário da compra na impressão .
Aula 08 — Classes (métodos e atributos)
Métodos
Retorno de métodos:
Argumentos de entrada de métodos (parâmetros):
- Até agora estávamos criando nossa própria Classe e importávamos outras classes!
- Na nossa classe um único método é presente: "void main"
Assim como a Classe Scanner e JOptionPane foram importadas para a nossa classe App e dependendo da motivação, a nossa classe (App) pode ser importada por outros programas (outras classes). Basta configurar corretamente os modificadores de acesso da classe e dos métodos que se deseja compartilhar.
Sintaxe de Classe
Modificador de acesso especifica que a classe…
- public: … pode ser usada por outras classes de outros pacotes;
- (sem modificador): … não é visível por outras classes fora do pacote. Só poderá ser usada por outras classes que estão no mesmo pacote.
Sintaxe de Método
Modificador de acesso especifica que o método …
- public: … pode ser chamado de dentro de outras classes;
- private: … só pode ser chamado de dentro da própria classe;
- protected: … só pode ser chamado de dentro da própria classe ou por subclasses que o herdam.
Modificador de método especifica que …
- static: … o método pode ser chamado sem ser instanciado;
- final: … o método não pode ser redefinido ou alterado por nenhuma subclasse derivada;
- abstract: … o método é abstrato e não tem implementação (corpo).
Exercícios
1. Crie um projeto com a classe principal contendo as seguintes características:
- No método principal (main) defina 2 valores inteiros (num1, num2) e dois números reais (num3, num4).
- Crie um método (somaInt) que receba dois número inteiros e retorne a soma.
- Crie um método (somaFloat) que receba dois número reais e retorne a soma.
- Crie um método (impressao) que recebe o valor da soma e imprima em uma janela o valor da soma dos valores reais e em modo texto o valor da soma dos valores inteiros
2. Crie um projeto com a classe principal Avaliacao contendo as seguintes características:
- No método principal (main) defina um vetor notas com 4 valores reais.
- Através do console solicite as notas de: "Exercícios", "Av. Parcial" e "Av. Regimental". Atribua as notas a 3 posições de um vetor notas.
- Crie um método notaparcial com o argumento de entrada notas, que some e retorne as notas dos Exercícios (notas[0]) e Av. parcial (notas[1]).
- Some o retorno do método notaparcial com a nota da Av. Regimental (notas[2]) e imprima a nota final.
- Caso a nota final for maior ou igual a 6, imprima uma mensagem APROVADO, caso contrário solicite a nota da Av. Final. Caso a nova nota final for maior ou igual a 6 imprima a mensagem de APROVADO, caso contrário REPROVADO.