Laboratório de Desenvolvimento de Algoritmos

Giulio Guiyti
21 min readAug 13, 2021

--

https://livingnomads.com/2017/04/java-travel-blog/

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).

https://dicasdejava.com.br/qual-a-diferenca-entre-jdk-jre-e-jvm/

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.

https://www.codingninjas.com/blog/2020/10/26/how-is-java-platform-independent/

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:

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

https://www.softwaretestingmaterial.com/data-types-in-java/

Tipos Primitivos

https://getkt.com/blog/reintroduction-to-java-data-types/

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:

Palavras reservadas

http://alcidesduartejr.blogspot.com/2015/04/java-5-palavras-chave-ou-reservadas.html

Soma ou Concatenação

Vá além:

Comentários

Exercícios

  1. 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 é ____"
  2. Repita o exercício 1 com valores do tipo double.
  3. 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 JOptionPanee estão em um mesmo pacote externo que precisa ser importado: javax.swing.

O método println da classe Systemestá 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?

https://www.scientecheasy.com/2020/05/variables-in-java.html/

Organização no código e Sequências de escape

https://www.dca.fee.unicamp.br/cursos/PooJava/sintaxe/seqesc.html

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.

Definição de "método"

  • 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

https://techvidvan.com/tutorials/java-operators/

Operadores Lógicos

https://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html
https://medium.com/@JKDMarks/logic-truthiness-logical-operators-and-readability-8b1c13ce75e9

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.

https://www.javatpoint.com/ternary-operator-in-java
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.

https://physioquantum.com/o-transgeracional-01/

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

https://www.geeksforgeeks.org/decision-making-c-c-else-nested-else/

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:

https://portalcbncampinas.com.br/2020/04/coronavirus-e-a-obesidade/

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:

https://hospitaligesp.com.br/uso-de-mascara-para-prevencao-ao-coronavirus/

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

https://blog.psicologiaviva.com.br/padroes-e-repeticoes/

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.

https://snakebear.science/_images/if_vs_while.svg

Existem diferentes formas de se reproduzir repetições em Java:

  • while
  • do-while
  • for
  • for-each* (será visto depois)

https://www.w3schools.com/java/java_while_loop.asp

https://www.w3schools.com/java/java_for_loop.asp

https://www.tutorialspoint.com/scala/scala_loop_types.htm

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.

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.

Exemplo Finalizado

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.

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.

--

--