Estruturas Repetitivas Para T=1 até Triangulos Para Carat=1 até Linha Trian:=Trian+ '*' FimPara Trian:=Trian+"\t" FimPara Trian:=Trian+"\n" FimPara Escrever(Trian)
 PROGRAMA TRIANGULOSRETANGULOS public class R15 {public static void main(String[] args) {final char C='*'; int A=6; int Triangulos=5; String Trian=""; for (int Linha=1; Linha<=A; Linha++) {for (int T=1; T <= Triangulos; T++) {for (int Carat=1; Carat <= Linha; Carat++) Trian += C; Trian += "\t";} Trian+="\n";} System.out.println(Trian);}}
 EXECUÇÃO * ** *** **** *****
* ** *** **** *****
* ** *** **** *****
* ** *** **** *****
* ** *** **** *****
? EXERCÍCIO 16: ÁRVORE Elabore um programa que imprima a seguinte árvore:
* * * * * * * * * *
* * * * *
* * * * * *
* * * * *
* * * * * * * * * * © FCA – Editora de Informática
109
Exercícios de Java: Algoritmia e Programação Estruturada  TOP-DOWN 1. 2. 3. 4.
Ler o número de linhas da árvore Determinar a coluna do ecrã onde será impresso o topo da árvore Inicializar o primeiro ímpar Para cada linha da árvore 4.1. Imprimir espaços até ao início da linha 4.2. Imprimir um número ímpar de asteriscos 4.3. Preparar a impressão da linha seguinte 4.3.1. Gerar o próximo ímpar 4.3.2. Determinar o início da próxima linha
 CONSTANTES E VARIÁVEIS Constante C Espaco Variável A Carat Esp Impar Inicio L
Tipo char char
Tipo int int int int int int
 ALGORITMO ARVORE C:= '*' Espaco:=' ' Ler(A) Impar:=1 Inicio:=((A-1)*2+1)/2 Para l=1 até A Para Esp=1 até Inicio Escrever(Espaco) FimPara Para Carat=1 até Impar Escrever(C) FimPara Impar:=Impar+2 Inicio:=Inicio-1 FimPara 110
© FCA – Editora de Informática
Significado Caráter da árvore Espaço
Valor *
Significado Altura da árvore Contador de asteriscos Contador de espaços Número de asteriscos de cada linha Coluna para início de cada linha da árvore Contador de linhas
Estruturas Repetitivas  PROGRAMA ARVORE import java.util.Scanner; public class R16 {public static void main(String[] args) {final char C='*'; final char Espaco=' '; int A, Impar, Inicio; Scanner LerS=new Scanner(System.in); System.out.print("Número de linhas da árvore "); A=LerS.nextInt(); Impar=1; Inicio=(int) ((A *2-1)); for(int L=1; L<=A; L++) {for (int Esp=1; Esp<=Inicio; Esp++) System.out.print (Espaco); for (int Carat=1; Carat <= Impar; Carat++) System.out.print(C); System.out.println(); Impar+=2; Inicio--;}}}
 EXECUÇÃO Número de linhas da árvore 10 * *** ***** ******* ********* *********** ************* *************** ***************** *******************
? EXERCÍCIO 17: MULTIPLICAÇÃO RUSSA Antigamente, os camponeses russos usavam um algoritmo da multiplicação que implicava, apenas, o conhecimento da tabuada do 2. Assim, para multiplicarem X por Y, dividiam (divisão inteira) X sucessivamente por 2 até obterem o quociente 1 e multiplicavam Y por 2; adicionavam os valores de Y sempre que X era ímpar. © FCA – Editora de Informática
111
Exercícios de Java: Algoritmia e Programação Estruturada ? EXERCÍCIO 35: PALÍNDROMO Elabore um programa que verifique se determinada palavra é um palíndromo. Um palíndromo é uma palavra ou frase que se lê da mesma maneira, quer da esquerda para a direita, quer da direita para a esquerda. Por exemplo: osso, ovo e socos. Â TOP-DOWN 1. Ler a palavra 2. Determinar o comprimento da palavra 3. Enquanto a palavra puder ser um palíndromo 3.1. Extrair o caráter mais à esquerda 3.2. Extrair o caráter mais à direita 3.3. Comparar os dois carateres 3.3.1. Se os dois carateres forem diferentes, a palavra não é um palíndromo 3.3.2. Se os dois carateres forem iguais, passar à extração do próximo par de carateres 4. Imprimir se a palavra é ou não um palíndromo
 VARIÁVEIS Variável
Tipo
C Dirta Esq Numcarat Palavra
int char char int String
Significado Contador de carateres Caráter à direita Caráter à esquerda Comprimento da palavra Palavra a verificar se é um palíndromo
 ALGORITMO PALINDROMO Ler(Palavra) Numcarat:=Palavra.comprimento Palindromo:=verdade Para C=0 até Numcarat/2-1 e Palindromo=verdade Esq:=palavra.subString(C,1) Dirta:=Palavra.subString(Numcarat-1-C,1) Se Esq<>Dirta Então Palindromo:=falso FimSe FimPara Escrever(Palavra, Palindromo) 148
© FCA – Editora de Informática
Estruturas Repetitivas  PROGRAMA PALINDROMO import java.util.Scanner; public class R35 {public static void main(String[] args)throws Exception {char Esq, Dirta; String Palavra; boolean Palindromo=true; Scanner LerS=new Scanner(System.in); System.out.print("Digite uma palavra "); Palavra=LerS.next().toLowerCase(); int Numcarat=Palavra.length(); for (int C=0; (C<Numcarat / 2 && Palindromo == true); C++) {Esq=Palavra.charAt(C); Dirta =Palavra.charAt(Numcarat-1-C); if (Esq != Dirta) Palindromo=false;} System.out.println (Palavra+String.valueOf(Palindromo ==true ? " é palíndromo": " não é palíndromo"));}}
 EXECUÇÃO Digite uma palavra radar radar é palíndromo
© FCA – Editora de Informática
149
Exercícios de Java: Algoritmia e Programação Estruturada ? EXERCÍCIO 12: PESQUISA BINÁRIA Elabore um programa que procure um valor num vetor de números reais que se encontra ordenado por ordem crescente. Utilize a pesquisa binária. Por exemplo, procure o número 160 no seguinte vetor: A=
100
110
120
140
160
200
220
Procura do número 160: 100
110
120
140
160
200
220
Procura do número 130:
 TOP-DOWN 1. Formar um vetor de N números inteiros 2. Ler o número a procurar 3. Procurar o número enquanto não o encontrarmos e for possível encontrá-lo 3.1. Determinar o índice que ocupa a posição do meio do vetor 3.2. Comparar o elemento do meio com o número a procurar 3.2.1. Se o valor a procurar for maior do que o elemento do meio, dirigir a procura para o subconjunto da direita 3.2.2. Se o valor a procurar for menor do que o elemento do meio, dirigir a procura para o subconjunto da esquerda 3.2.3. Se o valor a procurar for igual ao elemento do meio, encontramos o número 4. Imprimir o índice do elemento que for igual ao valor procurado e, em caso de não o termos encontrado, imprimir uma mensagem apropriada
172
© FCA – Editora de Informática
Vetores e Matrizes  VARIÁVEIS Variável
Tipo
Significado
A Exito I Inf M
double[] lógica int int int
N Sup X
int int double
Vetor de números reais Resultado da pesquisa Índice de cada elemento do vetor Limite inferior de cada subconjunto Índice do elemento do meio de cada subconjunto Número de elementos do vetor Limite superior de cada subconjunto Valor a procurar
 ALGORITMO PESQUISABINARIA A:={100,110,120,140,160,200,220} N:=A.comprimento Ler(X) Inf:=0 Sup:=N-1 Exito:=falso Enquanto Exito=falso E Inf<=Sup M:=Int((Sup+Inf)/2) Se X>A(M) Então Inf:=M+1 Senão Se X<A[M] Então Sup:=M-1 Senão Exito:=verdade Fimse Fimse FimEnq Se Exito=verdade Então Escrever(X, " é o elemento índice",M," do vetor") Senão Escrever(X, " não existe no vetor!!") Fimse
 PROGRAMA PESQUISABINARIA import java.util.Scanner; public class VM12 {public static void main(String[] args)throws Exception {int N=7, Inf=0, Sup=N-1, M=0; double[]A={100,110,120,140,160,200,220}; © FCA – Editora de Informática
173
Exercícios de Java: Algoritmia e Programação Estruturada double X; boolean Exito=false; Scanner LerS= new Scanner(System.in); System.out.print("Digite o valor a procurar "); X = LerS.nextDouble(); while (Exito==false && Inf<=Sup) {M=(Sup+Inf)/2; if (X>A[M]) Inf=M+1; else if (X<A[M]) Sup=M-1; else Exito=true;} if (Exito==true) System.out.print(String.format("%3.1f é o elemento índice %d do vetor\n",X, M)); else System.out.print(String.format("%3.1f não existe no vetor!!\n",X));}}
 EXECUÇÃO Digite o valor a procurar 160 160,0 é o elemento índice 4 do vetor
? EXERCÍCIO 13: ORDENAÇÃO ALFABÉTICA Elabore um programa que ordene por ordem alfabética um vetor de nomes, aplicando o algoritmo de ordenação por seleção. Por exemplo, ordenação da seguinte lista de K nomes por ordem alfabética: João
Teresa
Pedro
Passagem 1
Paulo
Beatriz
Lista de nomes Beatriz
2 3 4 5
174
Maria
© FCA – Editora de Informática
Teresa
Pedro
Maria
Paulo
João
João
Pedro
Maria
Paulo
Teresa
Maria
Pedro
Paulo
Teresa
Paulo
Pedro
Teresa
Pedro
Teresa
Exercícios de Java: Algoritmia e Programação Estruturada ? EXERCÍCIO 24: TORRES DE HANÓI Elabore um procedimento recorrente que resolva o jogo das torres de Hanói. O jogo consiste em mudar uma torre com vários discos, dispostos por ordem descrescente de diâmetro, para uma outra torre, usando uma torre intermédia. A mudança de um disco de uma torre para a outra tem de ser feita sempre por ordem decrescente de diâmetro, isto é, um disco só pode ser mudado para uma torre vazia ou para cima de um outro disco com diâmetro maior (ver figura seguinte).
 TOP-DOWN HANOI 1. Se só houver um disco, muda-se da torre onde está para a torre de destino 2. Nos outros casos 2.1. Chamar o procedimento Hanoi, com menos um disco de altura e mudar o disco da origem para a torre intermédia 2.2. Escrever o registo da mudança efetuada 2.3. Chamar o procedimento Hanoi, com menos um disco de altura e mudar o disco da torre intermédia para a torre de destino 342
© FCA – Editora de Informática
Recorrência  PARÂMETROS Parâmetro Altura De Para Usando
Tipo int char char char
Significado Número de discos da torre inicial Designação da torre de origem Designação da torre de destino Designação da torre intermédia
 SUBALGORITMO HANOI(ALTURA, DE, PARA, USANDO) Se Altura=1 Então Escrever ("Mudar o disco", De, Para) Senão Hanoi(Altura-1, De, Usando, Para) Escrever ("Mudar o disco", De, Para); Hanoi(Altura-1, Usando, Para, De) FimSe
 SUBPROGRAMA HANOI public static void Hanoi(int Altura, char De, char Para, char Usando) {if (Altura==1) System.out.printf("Mudar o disco de %c para %c\n", De, Para); else {Hanoi(Altura-1, De, Usando, Para); System.out.printf("Mudar o disco de %c para %c\n", De, Para); Hanoi(Altura-1, Usando, Para, De);}
 INVOCAÇÃO DO SUBPROGRAMA public class RC24 {public static void Hanoi(int Altura, char De, char Para, char Usando) {if (Altura==1) System.out.printf("Mudar o disco de %c para %c\n", De, Para); else {Hanoi(Altura-1, De, Usando, Para); System.out.printf("Mudar o disco de %c para %c\n", De, Para); Hanoi(Altura-1, Usando, Para, De);}} public static void main(String[] args) {int Altura = 4; Hanoi(Altura, 'A', 'C', 'B');}} © FCA – Editora de Informática
343
Exercícios de Java: Algoritmia e Programação Estruturada  EXECUÇÃO Mudar Mudar Mudar Mudar Mudar Mudar Mudar Mudar Mudar Mudar Mudar Mudar Mudar Mudar Mudar
o o o o o o o o o o o o o o o
disco disco disco disco disco disco disco disco disco disco disco disco disco disco disco
de de de de de de de de de de de de de de de
A A B A C C A A B B C B A A B
para para para para para para para para para para para para para para para
B C C B A B B C C A A C B C C
? EXERCÍCIO 25: ORDENAÇÃO RÁPIDA Elabore um procedimento recorrente que ordene um vetor por ordem crescente. Aplique o método de ordenação rápida (quick sort). Por exemplo, a ordenação por ordem crescente de: Vetor={10, 90, 67, 45, 78, 32, 17, 89, 100, 108, 21} Consiste nas seguintes transformações, em que se sublinha o elemento inicial de cada chamada da função recorrente: 10 10 10 10 10 10 10 10 10 10 10 10
90 21 21 21 17 17 17 17 17 17 17 17
67 67 17 17 21 21 21 21 21 21 21 21
45 45 45 32 32 32 32 32 32 32 32 32
78 78 78 78 78 78 78 78 45 45 45 45
32 32 32 45 45 45 45 45 78 67 67 67
17 17 67 67 67 67 67 67 67 78 78 78
89 89 89 89 89 89 89 89 89 89 89 89
100 108 21 100 108 90 100 108 90 100 108 90 100 108 90 100 108 90 100 108 90 100 108 90 100 108 90 100 108 90 100 90 108 90 100 108
Vetor ordenado={10, 17, 21, 32, 45, 67, 78, 89, 90, 100, 108} 344
© FCA – Editora de Informática