Algoritmos Algoritmos Leandro Tonietto Unisinos [email protected] http://www.inf.unisinos.br/~ltonietto/inf/pg1/algoritmosI_Java.pdf Mar-2008 Possuem sintaxe flexível e são mais úteis para descrição em alto nível da solução de problemas. É necessário fazer o “mapeamento” para alguma linguagem de programação. Programas são formados por: Linguagem de programação Possui sintaxe própria e rígida Conceitos Conjunto de palavras reservadas Bibliotecas padrão de funções Ambiente de desenvolvimento Bibliotecas de software Permite declaração de variáveis Permite definições de blocos de comandos Permite organização de funções e módulos Utilizada para a implementação de algoritmos Conceitos Sintaxe do comando para incluir bibliotecas no programa: Para incluir uma do diretório padrão de bibliotecas: import import import import <nome_pacote.[*|nome_classe]; java.io.File; java.util.*; meuprojeto.AlgumaClasse; Variáveis Expressões Comandos Bloco principal de operações Blocos auxiliares de operações Opcionalmente, mas importante, comentários de código. Bibliotecas são funções ou partes de programas que executam uma função padrão ou independente da aplicação aonde são usadas. Exemplo: programa que imprime dados no console do programa. A função de impressão, colocar caracteres na tela, é a mesma para todas as aplicações deste tipo. Não há motivos que justifiquem que tenham que escrever esta função em todos os programas; podemos fazer uma reutilização. Precisamos apenas importar ou incluir o arquivo da função nas nossas aplicações. Os programas não totalmente escritos do zero! Conceitos Bloco comandos: Agrupa um conjunto de instruções afins. Instruções que deve ser executadas em conjunto, são escritas dentro de um bloco de comando. Determinados comandos podem exigir que escreva as suas instruções internas dentro de um bloco de comandos. Declarara-se (codifica-se, programa-se) um bloco de comandos com chaves: { – início do bloco } – fim do bloco Normalmente possuem um identificador (nome) ou um comando associado. 1 Conceitos Bloco comandos: Conceitos Sintaxe para blocos de instruções: <tipo> <nome> ([<parâmetros>]) { <comandos...> } Bloco comandos principal: Sintaxe para blocos instruções para comandos: <comando> (<expressão>) { <comandos,...> public static void main(String args[]){ <comandos,...> } } Veremos mais sobre blocos auxiliares e comandos mais adiante. Por enquanto, isto é o suficiente... Conceitos Comentários: Comentários: Documentar o programa. Para explicar algum trecho importante do algoritmo. Para colocar meta-informações. Exemplos: /** Esta classe realiza um operação * matemática... * @autor Fulano de tal * @version 01/04/2008 */ Dois tipos: Conceitos Servem para: É por onde começa a execução do algoritmo ou programa. É obrigatório. O compilador precisa saber por onde começar... Em Java, deve-se declarar um bloco chamado main: // - comentário de linha /* <informações> */ - comentário de bloco /** <comentários e tags> */ - comentário Javadoc /* Trecho de código abaixo... */ // a linha abaixo calcula a média dos valores Conceitos Conceitos Dados: São informações sobre determinados objetos, campos ou atributos. Tipos de dados: Numéricos: Inteiros: int, long, short e byte Ponto-flutuante: double, float (diferencia do double pela letra f após o número). Texto: char: um único caracter. Deve ser informado entre aspas simples (‘ ’). Cadeia de caracteres (strings): deve ser informado entre aspas duplas (“ ”). Classe String. Em Java, classe String é um tipo especial de classe, que pode ser usado também como tipo de dado. Booleano boolean: representa um estado binário. 1 ou 0, ligado ou desligado. Deve-se informar true ou false. Variáveis: São posições de memória que guardam valores e podem ser referenciadas ao longo do programa. Representam os dados do programa. Conteúdo não constante, permitem alterações. São utilizadas com algum tipo de dado associado. Para se usar um dado (uma variável) deve-se declará-las antes de ser usada. Por exemplo: se é necessário solicitar que o usuário digite o seu CPF para fazer alguma busca, então é necessário antes declarar uma variável que comporte esta informação. 2 Conceitos Conceitos Variáveis: Sintaxe para declaração em C/C++: <tipo> <nome> [ = <inicialização>]; int idade = 32; long cpf; float angulo = 45.0f; double total = 0.0; double media = total / numPessoas; char opcao = ‘A’; String nome = “Fulano de Tal”; String endereco = “Rua XYZ, 123”; boolean achouRegistro = false; Conceitos As declarações abaixo são válidas? int nome; E quais delas são boolean angulo = 45.0f; válidas de acordo com a double media = 1; lógica de programação? char idade = ‘8’; String cpf = “123.981.329-36”; Testar no ambiente de desenvolvimento... Erros de sintaxe o compilador avisa Erros de lógica só testando o programa mesmo!! Necessita maior cuidado na declaração. Decidir isto na etapa de pensar na solução = algoritmo. Conceitos – Exemplo 1 Comentários Escopo da variável: Variáveis: Um bloco de comandos define o escopo das variáveis declaradas dentro dele. Portanto, a “vida útil” ou a validade de uma variável está dependente do bloco em que foi declarada. Isto será revisto na aula sobre memória e ponteiros. /* Este baita programa executa duas tarefas: 1) Aloca dados para descrever uma pessoa. 2) Imprime os dados do vivente. Inclusão de bibliotecas */ import java.util.Datel // inclusão bibliotecas auxiliares, veremos mais tarde... public static void main(String args[]){ // declaração; dados do vivente ; int idade = 32; ; char sexo = ‘M’; Bloco principal do programa String nome = “Fulano de Tal”; ; // impressão dos dados ; System.out.println(“Dados ;do vivente:”); System.out.println(“Nome: ” + nome); ; System.out.println(“ – Idade: ” + idade); System.out.println(“ – sexo: ” + sexo); Todos os comandos ou } instruções do programa são terminados por “;” Conceitos Variáveis: //declaração: int a, b; char c; float d; int e; Inteiro (int): 2 bytes Caractere (char): 1 byte Ponto flutuante (float): 4 bytes Slide do Prof. Sandro Rigo Conceitos Memória: Endereço| Conteúdo -----------------------------100 | a 101 | a 102 | b 103 | b 104 | c 105 | d 106 | d 107 | d 108 | d 109 | d 110 | e 111 | e 112 | 113 | 114 | Variáveis: //declaração: int a, b; char c; float d; int e; Inteiro (int): 2 bytes Caractere (char): 1 byte Ponto flutuante (float): 4 bytes Slide do Prof. Sandro Rigo Memória: Endereço| Conteúdo -----------------------------100 | 00 } 101 | 00 102 | 00 } 103 | 01 104 105 106 107 108 109 110 111 112 113 114 | | | | | | | | | | | 33 (“!”) } d d d d d 00 02 } Exemplo de uso: a = 0; b = 1; c = “!”; e = 2; Caractere Código ASCII 3 Conceitos Comandos: Sempre terminam com ponto-e-vírgula (“;”) Podem ser agrupados numa mesma linha Bloco de comandos: Expressões: int i=1; float f = 2.0f; Entretanto, não é uma boa prática de programação. Comandos são escritos dentro de um bloco de comandos, que está dentro de “{” e “}”. Comandos podem ser de uma linha: Conceitos a = b + 1; Tipos de expressões: Booleanas: Faz uso dos operadores matemáticos e dos modificadores de preferência - parênteses. +, -, *, /, % e () a = (b + c – 1)/2 modulo = a % 2; Precedência: () * / % + - Descreva em linguagem alto nível o algoritmo para conversão de polegadas para centímetros. Sabendo que a fórmula para conversão é: if(a < (b-c)*2 ) ... Conceitos int a = 1; Exemplo 02 int a = 1; int a = (b – c) * 2; Em comandos de bloco: Aritméticas: Atribuição: Atribuição: if (achou) { System.out.println(“encontrou o dado”); indice = i; } else { System.out.println( “não encontrou o dado”); } Tipos de expressões: São comandos definidos dentro de um comando maior: Conceitos São instruções matemáticas. Resultam em alguns valor. São usadas tanto na atribuição quanto na validação da execução de comandos de bloco. Sempre retornam verdadeiro ou falso. Usadas na avaliação dos comandos de bloco ou em atribuições. Operadores de comparação: <, >, <=, >=, == e != achou = total > 0; if(sexo == ‘F’){...}; Muito cuidado = é diferente == Operadores lógico: São usados para combinar expressões booleanas. Quando é necessário usar mais de uma condição para achar um valor booelano. &&, || e ! (respectivamente, AND, OR e NOT) achou = (total > 0) && (c == 2); if( (sexo == ‘F’) || (idade >= 60) ){ ... } Exemplo 02 Pensamento sistêmico para solucionar o problema. 1 polegada = 2.54 centímetros Para efetuar o cálculo de conversão é necessário saber qual é o número que deve ser convertido, então as primeiras instruções são: Solicitar ao usuário que informe um número Ler número a ser convertido Sabendo o número, é necessário executar a fórmula de conversão e armazenar o resultado Centímetros = polegadas * 2.54 Agora basta apenas imprimir o resultado na tela. Imprimir centímetros 4 Exemplo 02 Algoritmo de conversão: 1. 2. 3. 4. Solicitar ao usuário que informe um número Ler número a ser convertido Centímetros = polegadas * 2.54 Imprimir centímetros Exemplo 02 // algoritmo para conversão de polegadas para centímetros public static void main(String args[]){ // declare variáveis com nomes significativos double polegadas; System.out.println(“Informe as polegadas: ”); // este comando lê do teclado polegadas = Teclado.leFloat(); // expressão que resolve o algoritmo // repare que o separador decimal dos ponto-flutuantes é o // ponto “.” e não a vírgula “,” double centimetros = polegadas * 2.54; System.out.println(“ = “ + centímetros + “ cm”); Fácil? Então escreva este código em Java } Exercícios 2: Faça programa para resolver os problemas: Calcular o fatorial de um número qualquer. Converter um valor representando uma temperatura em Fahrenheit para Celsius. Fórmula: ((fahrenheit - 32) * 5 / 9). Calcular o índice de massa corporal de uma pessoa (cm2 / kg). Ler os dados de uma pessoa e imprimi-los na tela Classe de funções matemáticas Java possui uma classe que implementa diversas funções matemáticas: Math Para se usar as funções da Math não é necessário instanciar objeto. Exemplos: Classe de funções matemáticas Exemplos: Math.round(numero): arredondamento. Math.abs(numero): valor absoluto. Math.min(a, b): o menor entre dois números. Math.sqrt(numero): raiz quadrada. Math.Pi(): número Pi Math.random(): gera um número aleatório entre 0 e 1 Math.pow(a,b): calcula a elevado na potência b Sintaxe para definição de classes public class NomeDaClasse { private Tipo atributo; int mes = Math.min(a, 12); double raiz = Math.sqrt(144); public NomeDaClasse(){ // construtor } public void setAtributo(Tipo parametro){ atributo = parametro; } public Tipo getAtributo(){ return atributo; } } 5