Soluções Iterativas com Laços
Como poderiamos imprimir 50 vezes um mesmo texto?
Ou imprimir os números de 1 a 1000 ?...
O Laço While
while (teste-de-continuação)
{
comandos
}
O Laço While
int n = 0;
while (n < 50)
{
System.out.println("Bom Jogo!");
n++;
}
System.out.println("Fim das mensagens");
O Laço While
int n = 50;
while (n > 0)
{
System.out.println("Bom Jogo!");
n--;
}
System.out.println("Fim das mensagens");
O Laço While
E se eu quisesse perguntar o número de vezes a ser impresso?
import java.util.Scanner;
public class Cap04Ap04
{
public static void main(String[] args)
{
Scanner entrada = new Scanner(System.in);
System.out.print("Entre numero de linhas a imprimir: ");
int n = entrada.nextInt();
while (n > 0)
{
System.out.println("Bom Jogo!");
n--;
}
System.out.println("Fim das mensagens");
}
}
Algo mais útil...
n! = n  (n-1)  (n-2)  … 1.
int f;
f = 1;
while (n>1)
{
f *= n;
// equivalente a f = f * n;
n--;
// equivalente a n = n-1
}
Ou
int f;
f = 1;
while (n>1)
f *= n--;
return f;
While
f
1
4
12
24
24
n
4
3
2
1
OBS:
11! = 39916800
12! = 479001600
13! = 6227020800
valores na entrada do laço
1a. iteração permitida (pois n=4 > 1): f = 1 x 4 e n se torna 3
2a. iteração permitida (pois n=3 > 1): f = 4 x 3 e n se torna 2
3a. iteração permitida (pois n=2 > 1): f = 12 x 2 e n se torna 1
laço termina (pois n=1) e o valor de f = 24 retorna
O que faz este programa?
int contador = 0;
While (true)
{
contador += 1
System.out.print(contador + “\n”);
}
Funções – Exercicio
A série de Taylor que calcula o seno de um número é
dada por:
Escreva um programa que calcula o seno de um número
Variantes do While
Exercício
Implementar a função fatorial com o For
Exercício
Implementar o jogo da Adivinhação
Exercicio
public class Cap04Ap06
{
public static void main(String[] args)
{
int segredo, chute, conta=0, a=1, b=6;
Scanner entrada = new Scanner(System.in);
segredo = a + (int)(Math.random()*b); // numero no intervalo [a,a+b)
do
{
System.out.print("Chute um numero: ");
chute = entrada.nextInt();
conta++;
if (chute==segredo)
{
System.out.println("ACERTOU! :-)");
conta = 0;
}
else
{
System.out.println("errou :-(");
}
} while (conta != 0);
}
}
Laço Infinito
Game Loop
Métodos e Soluções
Conceito de Função Matemática
função f(x,y)= x2 + y2 mapeia (1,2) a 5 e (2,3) a 13, ou seja:
f(1,2)= 5 e f(3,3)= 13.
uma função mapeia valores de seu domínio em valores de
seu contra-domínio
Máquinas Funcionais
x
Máquinas Procedimentais
Definição de Funções
modificadores tipoRetorno nome(argumentos)
{
comandos
}
a primeira linha é chamada de assinatura do método
(method signature) ou cabeçalho do método (method header)
e o conjunto de comandos é denominado de corpo do
método.
Definição de Funções
Métodos static
Definição de Funções
- os nomes das variáveis no main não precisam ser os mesmos
nomes usados pelo universo de um método (porque são valores que
são passados)
- o método é público (public), no sentido de que qualquer parte do
programa pode usá-lo,
Definição de Funções
public class Cap04Ap01
{
public static int max3(int a, int a2, int a3)
{
int max = a;
if (a2>max)
max= a2;
if (a3>max)
max= a3;
return max;
}
public static void main(String[] args)
{
int a=1;
int b=7;
int c=10;
int i = max3(a,b,c);
System.out.println("Máximo= "+i);
}
}
Void...
public class Cap04Ap02
{
public static void discriminante(int a,
{
double d= b*b-4*a*c;
if (d<0)
{
System.out.println("Não existem
}else
{
if (d==0)
{
System.out.println("Existem
}else
{
System.out.println("Existem
}
}
}
public static void main(String[] args)
{
int a=1;
int b=6;
int c=9;
discriminante(a,b,c);
}
}
int b, int c)
raízes reais");
duas raízes reais iguais");
duas raízes reais diferentes");
Sobrecarga de Métodos
public static int min(int a, int b)
{
if (a<b)
return a;
return b;
}
// metodo 1
public static double min(double a, double b)
{
if (a<b)
return a;
return b;
}
// metodo 2
public static int min(int a, int b, int c)
{
return min(min(a,b),c);
}
// metodo 3
public static void main(String[] args)
{
System.out.println(min(7,2));
System.out.println(min(5,3,1));
System.out.println(min(7.0,2.0));
}
Métodos podem ter o mesmo nome e lista de argumentos diferentes. Este
recurso é denominado de sobrecarga de método (method overloading).
Sobrecarga de Métodos
A sobrecarga de métodos é exclusivamente baseada na lista de argumentos.
Mudanças nos modificadores ou tipoRetorno não sobrecarregam métodos.
O compilador sempre procura pelo método mais específico, num processo
denominado de resolução de sobrecarga (overload resolution).
O que ocorreria se tivéssemos?:
min(3,7)
public static double min(int a, double b)
...
public static double min(double a, int b)
erro dizendo que a referência a min é ambígua
Exercício
Sem usar if, escreva o método boolean intervalo(int x, int a, int b) que
testa se a <= x <= b , onde x, a e b são números inteiros.
Sobrecarregue o método do exercício anterior para x, a e b sendo
números reais e teste para intervalo(3,1,5), intervalo(2.5,1,5) e
intervalo(2.5,1,5).
O número decimal 0.1 não é representado com precisão pelo sistema
binário dos computadores, de maneira que a==b é falso se double a =
1.2; e double b = 12*0.1;. Escreva o método boolean igual(double x,
double y) que confirma x ser igual a y somente se |x  y| < TOL, onde |
| significa o módulo e TOL é uma constante pública e estática definida
por você. Teste o método para as variáveis a e b definidas acima.
Recursão
Processo de Indução
1, se n  0

fat(n)  
n  fat(n  1), se n  0
Base da Indução: Condição que não implica recursão, deve ser uma parada
obrigatória
Passo da recursão: Deve se aproximar um pouco mais da solução. Pm é
verdade, então Pm+1 também é verdade, desde que saibamos construir a
solução para o incremento de 1 grau de complexidade a partir de Pm.
Recursão
Expansão e Contração
Recursão - Exemplo
public static long fat(int n)
{
if (n==0)
return 1;
else
return n*fat(n-1);
}
Recursão – algoritmo de Euclides
Recursão – analise de eficiencia
Exercicio: implementar a serie de Fibonacci
Esta seqüência foi descrita primeiramente por Leonardo de Pisa, também conhecido como
Fibonacci (Dc. 1200), para descrever o crescimento de uma população de coelhos. Os
números descrevem o número de casais em uma população de coelhos depois de n meses se
for suposto que:
-no primeiro mês nasce apenas um casal,
-casais amadurecem sexualmente (e reproduzem-se) apenas após o segundo mês de vida,
-não há problemas genéticos no cruzamento consangüíneo,
-todos os meses, cada casal fértil dá a luz a um novo casal, e
-os coelhos nunca morrem.
F(n) = 0, se n = 0
F(n) = 1, se n = 1
F(n) = F(n-1) + F(n-2), para n >= 2
Este método recursivo gera um processo
chamado de recursão de árvore, onde cada
chamada gera duas outras. Este processo é
muito pouco eficiente, pois o tempo de
execução cresce exponencialmente com n e as
chamadas recursivas são repetitas várias vezes.
Recursão – Torre de Hanoi
Dados Compostos com Vetores
Dependendo do problema que queremos resolver utilizando um (ou mais
de um) programa(s) de computador, podemos encontrar a situação em
que uma grande quantidade de dados precisa ser manipulada
simultaneamente em um objeto.
Vetores unidimensionais
Sintaxe:
tipo[] nomeVetor= new tipo[tamanho];
Exemplo:
int [] numeros = new int[2];
numeros[0] = 1;
numeros[1] = 2;
numeros[2] = 3; // Está errado, porque?
Vetores unidimensionais
class DespesasAnuais
{
double[] despEduc = new double[12];
double maxDesp()
{
int i = 1;
double max = despEduc[0];
while (i < 12)
{
if (despEduc[i] > max)
max = despEduc[i];
i++;
}
return max;
}
public static void main(String[] arg)
{
DespesasAnuais desp2008 = new DespesasAnuais();
desp2008.despEduc[0] = 20.01;
desp2008.despEduc[1] = 10.11;
desp2008.despEduc[2] = 22.01;
desp2008.despEduc[3] = 13.11;
desp2008.despEduc[4] = 25.01;
desp2008.despEduc[5] = 19.11;
double despMax = desp2008.maxDesp();
System.out.println(despMax);
}
}
Exercicio
Escreva um programa que leia os dados da inflação de cada
mês ao longo de um ano e calcule qual foi a inflação de todo
o ano.
Vetores Bidimensionais
Sintaxe:
tipo[][] nomeVetor= new tipo [tamanho1][tamanho2];
Exemplo:
double[][] matrizPedagio = new double[10][10];
matrizPedagio[0][0] = 2,50
matrizPedagio[0][1] = 7,50;
...
Exercicio
Crie uma matriz de duas dimensões, que contenha a
distancia entre as cidades A e B:
Distancia[A][B] = 100km
Desenvolva uma função que recebe um par de cidades e
retorna a distancia entre elas.
Exercícios
Construa um programa que receba duas matrizes quadradas
de tamanho N por N e calcule a soma dessas duas matrizes.
Construa um programa que receba duas matrizes quadradas
de tamanho N por N e calcule o produto dessas duas
matrizes (dica: você precisará de três índices de controle).
Flags...
Exemplo de Flags
Ler um vetor de números até encontrar o numero 0
Download

parte II - Instituto de Computação