Algoritmos Algoritmos Leandro Tonietto Unisinos ltonietto@unisinos.br 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: Variáveis Expressões Comandos Bloco principal de operações Blocos auxiliares de operações Opcionalmente, mas importante, comentários de código. Linguagem de programação Possui sintaxe própria e rígida Conjunto de palavras reservadas Bibliotecas padrão de funções Ambiente de desenvolvimento 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 Bibliotecas de software 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! Sintaxe do comando para incluir bibliotecas no programa: Para incluir uma do diretório padrão de bibliotecas: import <nome_pacote.[* nome_classe]; import java.io.file; import java.util.*; import meuprojeto.algumaclasse; 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
Bloco comandos: Sintaxe para blocos de instruções: <tipo> <nome> ([<parâmetros>]) { <comandos...> Sintaxe para blocos instruções para comandos: <comando> (<expressão>) { <comandos,...> Veremos mais sobre blocos auxiliares e comandos mais adiante. Por enquanto, isto é o suficiente... Bloco comandos principal: É 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: <comandos,...> Comentários: Servem para: Documentar o programa. Para explicar algum trecho importante do algoritmo. Para colocar meta-informações. Dois tipos: // - comentário de linha /* <informações> */ - comentário de bloco /** <comentários e tags> */ - comentário Javadoc Comentários: Exemplos: /** Esta classe realiza um operação * matemática... * @autor Fulano de tal * @version 01/04/2008 */ /* Trecho de código abaixo... */ // a linha abaixo calcula a média dos valores 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. 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
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; As declarações abaixo são válidas? int nome; boolean angulo = 45.0f; E quais delas são 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. Escopo da variável: 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. Exemplo 1 Comentários /* 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... // declaração ; dados do vivente int idade = 32; ; char sexo = M ; ; String nome = Fulano de Tal ; Bloco principal do programa ; // 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 ; //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 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 //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 33 (! ) 105 d 106 d 107 d 108 d 109 d 110 00 111 02 112 113 114 Exemplo de uso: a = 0; b = 1; c =! ; e = 2; Caractere Código ASCII 3
Comandos: Sempre terminam com ponto-e-vírgula ( ; ) Podem ser agrupados numa mesma linha 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: a = b + 1; Bloco de comandos: São comandos definidos dentro de um comando maior: if (achou) { System.out.println( encontrou o dado ); indice = i; else { System.out.println( não encontrou o dado ); Expressões: 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. Atribuição: int a = 1; int a = (b c) * 2; Em comandos de bloco: if(a < (b-c)*2 )... Tipos de expressões: Atribuição: int a = 1; Aritméticas: 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: () * / % + - Tipos de expressões: Booleanas: 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) ){... Descreva em linguagem alto nível o algoritmo para conversão de polegadas para centímetros. Sabendo que a fórmula para conversão é: 1 polegada = 2.54 centímetros Pensamento sistêmico para solucionar o problema. 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
Algoritmo de conversão: 1. Solicitar ao usuário que informe um número 2. Ler número a ser convertido 3. Centímetros = polegadas * 2.54 4. Imprimir centímetros Fácil? Então escreva este código em Java // algoritmo para conversão de polegadas para centímetros // 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 ); 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 (cm 2 / 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: 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 Classe de funções matemáticas Exemplos: int mes = Math.min(a, 12); double raiz = Math.sqrt(144); Sintaxe para definição de classes public class NomeDaClasse { private Tipo atributo; public NomeDaClasse(){ // construtor public void setatributo(tipo parametro){ atributo = parametro; public Tipo getatributo(){ return atributo; 5