3 Conceitos Bsicos de Programao 4 Desenvolvimento de
3. Conceitos Básicos de Programação 4. Desenvolvimento de Programas Orientados a Objetos (Arrays) Carla Merkle Westphall INE-CTC-UFSC E-Mail: carlamw@inf. ufsc. br URL: http: //moodle. inf. ufsc. br INE 5603 -D (20072) - Programação Orientada a Objetos I
ARRAYS • Introdução • Declarando e criando arrays • Exemplos de uso de arrays • Declaração For avançado • Passando arrays para métodos • Estudo de caso: Classe Livro. De. Notas usando um Array para armazenar notas • Arrays multidimensionais • Estudo de caso: Classe Livro. De. Notas usando uma Array bidimensional • Tutoriais na Sun: – http: //java. sun. com/docs/books/tutorial/java/TOC. html – http: //java. sun. com/javase/6/docs/ 2
Introdução • São estruturas de dados – Na forma de um grupo de posições contíguas de memória – Cada posição mantém um valor do mesmo tipo (vetores de tipos) • São estruturas estáticas – uma vez criados mantém seu tamanho inicial. – Para estruturas dinâmicas a Linguagem Java possui classes especiais (classes Vector e Array) 3 C [ 0 ] -128 C [ 1 ] 8 C [ 2 ] 0 C [ 3 ] 82 C [ 4 ] 64 C [ 5 ] -12 C [ 6 ] 65 C [ 7 ] 43 C [ 8 ] 76 C [ 9 ] 11
Introdução • Índice – Usado para acessar elementos do array • Número da posição entre “[“ “]” – Deve ser um inteiro positivo ou uma expressão inteira (que pode ser convertido para inteiro) • Long não pode ser usado (erro de compilação) – Primeiro elemento tem um índice zero a = 5; b = 6; c[ a + b ] += 2; // adiciona 2 a c[ 11 ] 4
Declarando e iniciando Arrays • Declarando e criando arrays int c[]; // declara a variável array c = new int[ 12 ]; // cria o array, atribui para a variável array //equivalente a int c[] = new int[ 12 ]; // cria um array de 12 elementos • Inicializando arrays – Dispensam o operador new • o espaço é reservado automaticamente pelo compilador int array[] = {10, 20, 30, 40, 50}; // array de 5 ints • Tamanho do array. length; 5
Declarando e iniciando Arrays • Erros comuns de programação – Na declaração da array não se pode especificar o número de elementos • int c[ 12 ]; // isto é um erro de sintaxe – Na declaração de múltiplas variáveis arrays pode levar a erros súbitos. Exemplos: • int[] a, b, c; – Correta se o programador quer definir a, b e c como arrays • Se quiser definir apenas a como array – int a[], b, c; 6
Passando arrays como argumentos • Passando arrays como argumentos double temperatura[] = new double[24]; modifica. Array(temperatura); • Declarando o método void modifica. Array( int b[] ) 7
Exemplos do uso de arrays (Exemplo 1) • Imprime valores iniciais dos elementos do array public class Init. Array { public static void main( String args[] ) { int array[]; // declara a array final int TAM_ARRAY = 10; // boa prática: constante array = new int[TAM_ARRAY]; // cria espaço para a array // imprime os valores dos elementos do array System. out. printf( "%s%8 sn", "Indice", "Valor" ); // cabeçalho do texto for ( int i = 0; i < array. length; i++ ) System. out. printf( "%5 d%8 dn", i, array[ i ] ); } } 8
Exemplos do uso de arrays (Exemplo 2) • Inicializando array public class Init. Array { public static void main( String args[] ) { int array[] = {2, 4, 8, 10, 12}; // declara e inicializa array // imprime os valors dos elementos do array System. out. printf( "%s%8 sn", "Indice", "Valor" ); // cabeçalho do texto for ( int i = 0; i < array. length; i++ ) System. out. printf( "%5 d%8 dn", i, array[ i ] ); } } 9
Exemplos do uso de arrays (Exemplo 3) • Calculando os valores do elementos public class Init. Array { public static void main( String args[] ) { int array[]; // declara a array final int TAM_ARRAY = 10; // boa prática: constante array = new int[TAM_ARRAY]; // cria espaço para array for ( int i = 0; i < array. length; i++ ) array[ i ] = 2 + 2 * i; // imprime os valors dos elementos do array System. out. printf( "%s%8 sn", "Indice", "Valor" ); // cabeçalho do texto for ( int i = 0; i < array. length; i++ ) System. out. printf( "%5 d%8 dn", i, array[ i ] ); } } 10
Exemplos do uso de arrays (Exemplo 4) • Calculando a soma dos elementos public class Init. Array { public static void main( String args[] ) { int array[] = {2, 4, 8, 10, 12}; // declara e inicializa array int total=0; for ( int i = 0; i < array. length; i++ ) total += array[ i ]; System. out. printf( « Total : %d", total ); } } 11
Exemplos do uso de arrays • Utilizando Gráfico de Barras para apresentar os elementos de um array – Muitos programas apresentam os dados para o usuário de maneira gráfica • Por exemplo, valores numéricos são com freqüência apresentados como barras em um gráfico de barras – Um método simples para apresentar valores numéricos graficamente é com um gráfico de barras que mostra cada valor numérico como um barra de asteriscos (*) – Exemplo • Apresentar graficamente a distribuição de notas 12
Exemplos do uso de arrays: Gráfico de Barras // Aplicativo para testar a impressão do gráfico de barras public class Teste. Grafico. Barras { public static void main(String args[]) { Grafico. Barras. Notas grafico. Barras = new Grafico. Barras. Notas (); // array passando os valores a serem impressos graficamente int array[] = { 0, 0, 0, 1, 2, 4, 2, 1 }; grafico. Barras. set. Dados(array); grafico. Barras. imprime(); } } 0009 1019 2029 3039 4049 5059 6069 7079 8089 9099 Array[i] => Número de ocorrências na faixa 13 100
Exemplos do uso de arrays: Gráfico de Barras (Exemplo 5) // Mantém e apresenta um gráfico de barras com 11 barras public class Grafico. Barras. Notas { private int array[]; public void set. Dados(int array[] ) { this. array = array; } public void imprime() { System. out. println("Distribuicao: " ); 14 } } // para cada elemento do array, imprime uma linha no gráfico for ( int i = 0; i < 11; i++ ) { // os titulos das linhas ( "00 -09: ", . . . , "90 -99: ", "100: " ) if ( i == 10 ) System. out. printf( "%5 d: ", 100 ); else System. out. printf( "%02 d-%02 d: ", i * 10 + 9 ); // imprime barra de asteriscos for ( int estrela = 0; estrela < array[ i ]; estrela++ ) System. out. print( "*" ); System. out. println(); // imprime linha nova }
Exemplos do uso de arrays: Lança Dados • Utilizando os elementos de um array como contadores – Elementos de um array podem guardar valores que representam freqüências de ocorrência de determinados eventos. • Exemplo – Programa que realiza 6000 lançamentos de um dado e que ao final mostra os resultados 6000 experimentos – Simulando o lançamento do dado usando java. util. Random • Classe Random gera um stream de números semi-aleatórios – Método next. Int(int n) retorna um número inteiro pseudo-aleatório, uniformemente distribuídos entre 0 (inclusive) e o valor especificado (exclusivo) Não usado 15 1 2 3 4 5 Array[i] => Número de ocorrências da face i 6
Exemplos do uso de arrays: Lança Dados (Exemplo 6) // Lanca o dado 6000 vezes e analisa frequencia import java. util. Random; public class Lancamento. De. Dados { public static void main( String args[] ) { Random numeros. Aleatorio = new Random(); // gerador de números aleatórios int frequencia[] = new int[ 7 ]; // array de contadores de freqüência // lança dado 6000 vezes; usa valor do dado como indice de frequencia for ( int lancamento = 1; lancamento <= 6000; lancamento++ ) ++frequencia[ 1 + numeros. Aleatorio. next. Int( 6 ) ]; System. out. printf( "%s%15 sn", "Face", "Frequencia" ); // imprime cada valor do elemento do array for ( int face = 1; face < frequencia. length; face++ ) System. out. printf( "%4 d%10 dn", face, frequencia[ face ] ); } } 16
Exemplos do uso de arrays: Resultados da Pesquisa • Utilizando arrays para analisar resultados de pesquisas – Elementos do array podem manter resultados de uma série de experimentos • podem ser analisados para se conhecer mais sobre a pesquisa que representam. – Exemplo: • 40 estudantes da universidade avaliaram a comida do Restaurante Universitário, em uma escala de 1 a 10 (péssimo a excelente). • Programa armazena as 40 respostas em um array de inteiros e resume o resultado da pesquisa Resp. 1 Resp. 2 Resp. 3 Resp. 4 Resp. 5 Resp. 6 Resp. 7 . . . Resp. 40 resposta[i] => Resposta da pesquisa pelo aluno i+1 1 17 2 3 4 5 6 7 frequencia[i] => Número de ocorrências da nota i . . . 10
Exemplos do uso de arrays: Resultados da Pesquisa (Exemplo 7) public class Avalia. Restaurante { public static void main( String args[] ) { // array contendo as respostas int resposta[] = { 1, 2, 6, 4, 8, 5, 9, 7, 8, 10, 1, 6, 3, 8, 6, 10, 3, 8, 2, 7, 6, 5, 7, 6, 8, 6, 7, 5, 6, 6, 5, 6, 7, 5, 6, 4, 8, 6, 8, 10 }; int frequencia[] = new int[ 11 ]; // array de contadores de frequencia // para cada resposta, selecione elemento das respostas e use o valor como // índice de freqüência para determinar o elemento a incrementar for ( int i = 0; i < resposta. length; i++ ) ++frequencia[ resposta[ i ] ]; System. out. printf( "%s%15 sn", "Nota", "Frequencia" ); // imprime os valores dos elementos do array for ( int i = 1; i < frequencia. length; i++ ) System. out. printf( "%4 d%10 dn", i, frequencia[ i ] ); } 18 }
Prevenção de erros • Uma exceção – Indica a ocorrência de um erro na execução do programa • Programador pode tratar esta exceção – Quando o programa tenta acessar um elemento fora das fronteiras do array: • Ocorre uma exceção Array. Index. Out. Of. Bounds. Exception 19
For avançado (J 2 SE 5. 0) • Interessante para se trabalhar com arrays – Permite uma iteração através dos elementos de um array ou coleção sem usar um contador – Mas não oferece acesso ao índice do array, nem permite alterar os elementos do array • Sintaxe: for ( parametro : nome. Array ) bloco_instruções • Exemplo: 20 int array[] = { 87, 68, 94, 100, 83, 78, 85, 91, 76, 87 }; int total = 0; for ( int i = 0; i < array. length; i++ ) total += array[ i ]; // É equivalente a for ( int numero : array ) total += numero;
Passando array para métodos (Ex. 7. 1) • Dois modos de passar argumentos para métodos – Passagem por valor • O valor do argumento é passado na chamada do método • Em Java, todo tipo primitivo é passado por valor // Passagem por valor public class passa. Valor{ public static void main( String args[] ) { int a=1; System. out. printf(“Valor de a: %dn”, a); incrementa(a); System. out. printlf(“Valor de a após metodo: %d”, a); } public static void incrementa(int x) { x++; Valor de a: 1 } Valor de a após metodo: 1 } 21
Passando array para métodos • Dois modos de passar argumentos para métodos – Passado por referência • Chamador dá ao método chamado um acesso direto ao dado do chamador • Método chamado pode manipular estes dados • Melhora o desempenho em relação a passagem por valor • Em Java, todo objeto é passado por referência – Em Java, arrays são objetos – Portanto, arrays são passados para métodos por referência int c[] = {1, 2, 3, 4}; muda. Array(c); Array c na memória = 22 1 public void muda. Array(int x[]) { x[2]=0; } 2 3 0 4
Passando array para métodos • Passagem por referência melhora desempenho – Se fosse passado por valor, uma cópia de cada elemento deveria ser passado – Para arrays grandes frequentemente passados • Passagem por cópia poderia desperdiçar tempo e memória 23
Passando array para métodos (Exemplo 8) // Passando arrays e elementos de arrays para métodos public class Pass. Array { // main cria a array e chama os métodos modifica. Array e modifica. Elemento public static void main( String args[] ) { int array[] = { 1, 2, 3, 4, 5 }; System. out. println( "Efeito da passagem por referencia em array de inteiro: n" + "Os valores da array original sao: " ); // imprime elementos da array original for ( int valor : array ) System. out. printf( " %d", valor ); 24
Passando array para métodos modifica. Array( array ); // passagem por referencia // imprime elementos da array modificada System. out. println( "nn. Os valores da array modificada sao: " ); for ( int valor : array ) System. out. printf( " %d", valor ); System. out. printf("nn. Efeito da passagem do valor do elemento da array: n" + "array[3] antes de modifica. Elemento: %dn", array[ 3 ] ); modifica. Elemento( array[ 3 ] ); // tenta modificar array[ 3 ] System. out. printf("array[3] apos modifica. Elemento : %dn", array[ 3 ] ); } 25
Passando array para métodos // multiplica cada elemento da array por 2 public static void modifica. Array( int array 2[] ) { for ( int i = 0; i < array 2. length; i++ ) array 2[ i ] *= 2; } // multiplica argumento por 2 public static void modifica. Elemento( int elemento ) { elemento *= 2; System. out. printf("Valor do elemento em modifica. Elemento: %dn", elemento ); } } 26
Passando array para métodos • Pode ocasionar efeitos colaterais indesejados public class Teste. Grafico. Barras { public static void main(String args[]) { Grafico. Barras. Notas Grafico. Barras = new Grafico. Barras. Notas (); int array[] = { 0, 0, 0, 1, 2, 4, 2, 1 }; Grafico. Barras. set. Dados(array); array[5] = 10; Grafico. Barras. imprime(); } } 27
Solução do problema 28 // Mantém e apresenta um gráfico de barras public class Grafico. Barras. Notas { Cópia da array int array[]; public void set. Dados(int array[] ) { this. array = new int[11]; for (int i=0; i <11; i++) this. array[i] = array[i]; } public void imprime() { System. out. println("Distribuicao: " ); // para cada elemento do array, imprime uma linha no gráfico for ( int counter = 0; counter < 11; counter++ ) { // os titulos das linhas ( "00 -09: ", . . . , "90 -99: ", "100: " ) if ( counter == 10 ) System. out. printf( "%5 d: ", 100 ); else System. out. printf( "%02 d-%02 d: ", counter * 10 + 9 ); // imprime barra de asteriscos for ( int stars = 0; stars < array[ counter ]; stars++ ) System. out. print( "*" ); System. out. println(); // imprime linha nova } } }
Estudo de Caso: Livro de Notas (Exemplo 9) public class Teste. Livro. De. Notas { public static void main( String args[] ) { // array de notas dos estudantes int array. Notas[] = { 87, 68, 94, 100, 83, 78, 85, 91, 76, 87 }; Livro. De. Notas meu. Livro = new Livro. De. Notas( "Desenvolvimento OO", array. Notas ); meu. Livro. apresenta. Mensagem(); meu. Livro. processa. Notas(); } } 29
Estudo de Caso: Livro de Notas // Livro de notas usando um array para armazenar as notas de um aluno. public class Livro. De. Notas { private String nome. Curso; private int notas[]; // array mantendo as notas dos estudantes // construtor com dois argumentos para inicializar nome do curso e notas public Livro. De. Notas( String nome, int array. Notas[] ) { nome. Curso = nome; notas = array. Notas; } // método para inicializar o nome do curso public void set. Nome. Curso(String nome ) { nome. Curso = nome; } // método para recuperar o nome do curso public String get. Nome. Curso() { return nome. Curso; } 30
Estudo de Caso: Livro de Notas // apresenta a mensagem de boas vindas public void apresenta. Mensagem() { System. out. printf("Bem vindo ao livro de notas do curson%s!nn", get. Nome. Curso() ); } 31
Estudo de Caso: Livro de Notas // realiza varias operações no dado public void processa. Notas() { // apresenta notas imprime. Notas(); // chama método obter. Media para calcular a média das notas System. out. printf("n. Media da classe: %. 2 fn", obter. Media() ); // chama métodos obter. Minima e obter. Maxima System. out. printf( "Nota mais baixa: %dn. Nota mais alta: %dnn", get. Minima(), get. Maxima() ); // chama imprime. Distribuicao para imprimir gráfico de barras das notas imprime. Distribuicao(); } 32
Estudo de Caso: Livro de Notas // imprime conteúdo do array notas public void imprime. Notas() { System. out. println( "As notas sao: n" ); // imprime as notas dos estudantes for ( int aluno = 0; aluno < notas. length; aluno++ ) System. out. printf( "Aluno %2 d: %3 dn", aluno+ 1, notas[aluno]); } 33
Estudo de Caso: Livro de Notas // realiza varias operações no dado public void processa. Notas() { // apresenta notas imprime. Notas(); // chama método obter. Media para calcular a média das notas System. out. printf("n. Media da classe: %. 2 fn", obter. Media() ); // chama métodos obter. Minima e obter. Maxima System. out. printf( "Nota mais baixa: %dn. Nota mais alta: %dnn", get. Minima(), get. Maxima() ); // chama imprime. Distribuicao para imprimir gráfico de barras das notas imprime. Distribuicao(); } 34
Estudo de Caso: Livro de Notas // determina nota média da classe public double obter. Media() { int total = 0; // initializa total // soma notas for ( int nota : notas) total += nota; // retorna a media das notas return (double) total / notas. length; } 35
Estudo de Caso: Livro de Notas // encontra a nota minima public int get. Minima() { int nota. Minima = notas[ 0 ]; // assume notas[ 0 ] como a menor // loop sobre o array notas for ( int nota: notas) { // Se nota é mais baixa que nota mais baixa, // atribua esta a nota. Minima if ( nota < nota. Minima ) nota. Minima = nota; // nova nota mínima } return nota. Minima; // returna nota mais baixa } 36
Estudo de Caso: Livro de Notas // encontra nota maxima public int get. Maxima() { int nota. Maior = notas[0 ]; // assume nota[ 0 ] como a maior // loop sobre o array notas for ( int nota: notas ) { // Se nota é mais alta que nota mais alta, atribua esta a nota. Maior if ( nota > nota. Maior ) nota. Maior = nota; // nova nota maior } return nota. Maior; // retorna nota mais alta } 37
Estudo de Caso: Livro de Notas } 38 // Imprime barra de distribuição das notas public void imprime. Distribuicao() { System. out. println("Distribuicao das notas: " ); // armazena freqüência de notas em cada faixa de 10 notas int frequencia[] = new int[11 ]; // para cada nota, incrementa a freqüência apropriada for ( int nota : notas ) ++frequencia[ nota /10 ]; // para cada freqüência de nota, imprima a barra for ( int contador = 0; contador < frequencia. length; contador++ ) { // imprime titulo ( "00 -09: ", . . . , "90 -99: ", "100: " ) if (contador == 10 ) System. out. printf("%5 d: ", 100 ); else System. out. printf("%02 d-%02 d: ", contador * 10+ 9 ); // imprime barra de asterisco for ( int estrelas = 0; estrelas < frequencia[contador]; estrelas++ ) System. out. print("*" ); System. out. println(); // parte uma nova linha } }
Exemplos do uso de arrays • Classificação de arrays – Classificar dados significa ordenar os dados em alguma ordem particular, tais como crescente ou decrescente; – Problema muito comum no desenvolvimento de sistemas computacionais; – Existem vários algoritmos de classificação (bolha, bolha bidirecional, Quick. Sort, . . . ) • Exemplos: CEP, Listas de assinantes de telefone, Ranking em esportes. 39
Classificação de arrays: ordem crescente (Exemplo 10) // Classifica os valores de um array em ordem crescente utilizando o algoritmo da bolha public class Classifica. Array { public static void main( String args[] ) { int array[] = { 2, 6, 4, 8, 10, 12, 89, 68, 45, 37 }; System. out. println("Itens do array na ordem original"); // acrescenta valores originais do array ao String saida for ( int numero: array ) System. out. printf(" %d", numero); bubble. Sort( array ); // ordena o array System. out. println("nn. Itens do array em ordem ascendente"); // acrescenta valores ordenados do array ao String saida for ( int numero: array ) System. out. printf(" %d", numero); System. out. println(); } 40
Classificação de arrays: ordem crescente // ordena os elementos de um array considerando o algoritmo da Bolha static void bubble. Sort(int array 2[]) { // laço para controlar o número de passagens for ( int passagem = 1; passagem < array 2. length; passagem++ ) { // laço para controlar o número de comparações for ( int elemento = 0; elemento < array 2. length - 1; elemento++ ) { // compara elementos adjacentes e os troca de lugar se // o primeiro elemento for maior que o segundo elemento if ( array 2[ elemento ] > array 2[ elemento + 1 ] ) troca( array 2, elemento + 1 ); } // fim do laço para controlar comparações } // fim do laço para controlar passagens } // fim do método buble. Sort i 41 P 1 2 6 4 8 10 12 89 68 45 37 P 1 2 4 6 8 10 12 68 89 45 37
Classificação de arrays: ordem crescente // ordena os elementos de um array considerando o algoritmo da Bolha static void bubble. Sort(int array 2[]) { // laço para controlar o número de passagens for ( int passagem = 1; passagem < array 2. length; passagem++ ) { // laço para controlar o número de comparações for ( int elemento = 0; elemento < array 2. length - 1; elemento++ ) { // compara elementos adjacentes e os troca de lugar se // o primeiro elemento for maior que o segundo elemento if ( array 2[ elemento ] > array 2[ elemento + 1 ] ) troca( array 2, elemento + 1 ); } // fim do laço para controlar comparações } // fim do laço para controlar passagens } // fim do método buble. Sort i 42 i i i P 1 2 4 6 8 10 12 89 P 1 2 4 6 8 10 12 68 i 68 45 37 89 45 37
Classificação de arrays: ordem crescente // ordena os elementos de um array considerando o algoritmo da Bolha static void bubble. Sort(int array 2[]) { // laço para controlar o número de passagens for ( int passagem = 1; passagem < array 2. length; passagem++ ) { // laço para controlar o número de comparações for ( int elemento = 0; elemento < array 2. length - 1; elemento++ ) { // compara elementos adjacentes e os troca de lugar se // o primeiro elemento for maior que o segundo elemento if ( array 2[ elemento ] > array 2[ elemento + 1 ] ) troca( array 2, elemento + 1 ); } // fim do laço para controlar comparações } // fim do laço para controlar passagens } // fim do método buble. Sort i 43 P 1 2 4 6 8 10 12 68 89 45 37 P 1 2 4 6 8 10 12 68 45 89 37
Classificação de arrays: ordem crescente // ordena os elementos de um array considerando o algoritmo da Bolha static void bubble. Sort(int array 2[]) { // laço para controlar o número de passagens for ( int passagem = 1; passagem < array 2. length; passagem++ ) { // laço para controlar o número de comparações for ( int elemento = 0; elemento < array 2. length - 1; elemento++ ) { // compara elementos adjacentes e os troca de lugar se // o primeiro elemento for maior que o segundo elemento if ( array 2[ elemento ] > array 2[ elemento + 1 ] ) troca( array 2, elemento + 1 ); } // fim do laço para controlar comparações } // fim do laço para controlar passagens } // fim do método buble. Sort i 44 P 1 2 4 6 8 10 12 68 45 89 37 P 1 2 4 6 8 10 12 68 45 37 89
Classificação de arrays: ordem crescente // ordena os elementos de um array considerando o algoritmo da Bolha static void bubble. Sort(int array 2[]) { // laço para controlar o número de passagens for ( int passagem = 1; passagem < array 2. length; passagem++ ) { // laço para controlar o número de comparações for ( int elemento = 0; elemento < array 2. length - 1; elemento++ ) { // compara elementos adjacentes e os troca de lugar se // o primeiro elemento for maior que o segundo elemento if ( array 2[ elemento ] > array 2[ elemento + 1 ] ) troca( array 2, elemento + 1 ); } // fim do laço para controlar comparações } // fim do laço para controlar passagens } // fim do método buble. Sort 45 P 2 2 4 6 8 10 12 68 45 37 89 P 2 2 4 6 8 10 12 45 68 37 89
Classificação de arrays: ordem crescente // ordena os elementos de um array considerando o algoritmo da Bolha static void bubble. Sort(int array 2[]) { // laço para controlar o número de passagens for ( int passagem = 1; passagem < array 2. length; passagem++ ) { // laço para controlar o número de comparações for ( int elemento = 0; elemento < array 2. length - 1; elemento++ ) { // compara elementos adjacentes e os troca de lugar se // o primeiro elemento for maior que o segundo elemento if ( array 2[ elemento ] > array 2[ elemento + 1 ] ) troca( array 2, elemento + 1 ); } // fim do laço para controlar comparações } // fim do laço para controlar passagens } // fim do método buble. Sort 46 P 2 2 4 6 8 10 12 45 68 37 89 P 2 2 4 6 8 10 12 45 37 68 89
Classificação de arrays: ordem crescente // troca dois elmentos de um array static void troca( int array 3[], int prim, int sec ) { int elemento; // área de armazenamento temporário para troca elemento = array 3[ prim ]; array 3[ prim ] = array 3[ sec ]; array 3[ sec ] = elemento; } } // fim da classe Classifica. Array 47
Outros métodos de ordenação • Método da Seleção • Método da Inserção • Entenda como funciona os métodos da Seleção e Inserção!! • Quais as diferenças entre os seguintes métodos de ordenação? – Da bolha (bubble sort) – Da seleção – Da inserção 48
Arrays multidimensionais Índice da coluna Índice da linha Nome do array 49
Arrays Multidimensionais • Arrays de array unidimensional – Declarando array de duas dimensões b[2][2] int b[][] = { { 1, 2 }, { 3, 4 } }; – 1 e 2 inicializa b[0][0] e b[0][1] – 3 e 4 inicializa b[1][0] e b[1][1] int b[][] = { { 1, 2 }, { 3, 4, 5 } }; – Tamanho das linhas não precisam ser os mesmos – linha 0 contém elementos 1 e 2 – linha 1 contém elementos 3, 4 e 5 50
Arrays Multidimensionais • Criando array bidimensional com expressões de criação de array – Pode ser criada dinamicamente • Array 3 -por-4 int b[][]; b = new int[ 3 ][ 4 ]; • Linhas podem ter diferentes números de colunas int b[][]; b = new int[ 2 ][ ]; // cria 2 linhas b[ 0 ] = new int[ 5 ]; // cria 5 colunas para linha 0 b[ 1 ] = new int[ 3 ]; // cria 3 colunas para linha 1 51
Exemplo: Array bidimensional (Exemplo 13) // Inicializando array bidimensional public class Init. Array { // cria e imprime arrays bidimensionais public static void main( String args[] ) { int array 1[][] = { { 1, 2, 3 }, { 4, 5, 6 } }; int array 2[][] = { { 1, 2 }, { 3 }, { 4, 5, 6 } }; System. out. println( "Valores na array 1 por linha: " ); imprime. Array( array 1 ); // apresenta array 1 por linha System. out. println( "n. Valores na array 1 por linha: " ); imprime. Array( array 2 ); // apresenta array 2 por linha } 52 } // imprime linhas e colunas da arary de duas dimensoes public static void imprime. Array( int array[][] ) { // loop através das linhas do array for ( int linha = 0; linha < array. length; linha++ ) { // loop nas colunas da linha corrente for ( int coluna = 0; coluna < array[ linha ]. length; coluna++ ) System. out. printf( "%d ", array[ linha ][ coluna ] ); System. out. println(); // imprime linha nova } }
Estudo de Caso: Livro. De. Notas (Exemplo 14) • Classe Livro. De. Notas – Array unidimensional • Armazena notas dos estudandes em um exame simples – Array bidimensional • Armazena notas dos estudantes em diversos exames 53 Aluno P 1 P 2 P 3 1 50 75 80 2 60 54 89 3 31 42 90 4 20 100 56 5 50 65 26
Estudo de Caso: Livro. De. Notas // Cria objeto Livro. De. Notas usando um array //de notas public class Teste. Livro. De. Notas { public static void main( String args[] ) { // array de notas do estudantes int array. Notas[][] = { {50, 75, 80}, {60, 54, 89}, {31, 42, 90}, {20, 100, 56}, {50, 65, 26} }; Livro. De. Notas meu. Livro = new Livro. De. Notas("Desenvolvimento OO", array. Notas ); meu. Livro. apresenta. Mensagem(); meu. Livro. processa. Notas(); } 54 }
Estudo de Caso: Livro. De. Notas // Livro de notas usando um array para armazenar as notas. public class Livro. De. Notas { private String nome. Curso; private int notas[][]; // array bidimensional das notas dos estudantes // construtor com dois argumentos para inicializar nome do curso e notas public Livro. De. Notas( String nome, int array. Notas[][] ) { nome. Curso = nome; notas = array. Notas; } // metodo para inicializar o nome do curso public void set. Nome. Curso(String nome ) { nome. Curso = nome; } // método para recuperar o nome do curso public String get. Nome. Curso() { return nome. Curso; } 55
Estudo de Caso: Livro. De. Notas // apresenta a mensagem de boas vindas public void apresenta. Mensagem() { System. out. printf( "Bem vindo ao livro de notas do curson%s!nn", get. Nome. Curso() ); } // realiza varias operações no dado public void processa. Notas() { // apresenta notas imprime. Notas(); // chama métodos obter. Minima e obter. Maxima System. out. printf( "Nota mais baixa: %dn. Nota mais alta: %dnn", obter. Minima(), obter. Maxima() ); } 56 // chama imprime. Distribuição para imprimir o gráfico de distribuição de notas imprime. Distribuicao();
Estudo de Caso: Livro. De. Notas // imprime conteúdo do array notas public void imprime. Notas() { System. out. println( "As notas sao: n" ); System. out. print( " " ); // alinha cabeçalho das colunas // cria o cabeçalho da coluna para cada uma das provas for ( int prova = 0; prova < notas[ 0 ]. length; prova++ ) System. out. printf( "Prova %d ", prova + 1 ); System. out. println( "Media" ); // cabeçalho da coluna média // cria linhas/colunas do texto representando o array notas for ( int aluno = 0; aluno < notas. length; aluno++ ) { System. out. printf( "Aluno %2 d", aluno + 1 ); for ( int prova : notas[ aluno ] ) // imprime nota do aluno System. out. printf( "%8 d", prova ); 57 } } } // chama método get. Media para calcular a média do aluno na prova // passa linha do array notas como argumento do get. Media double media = obter. Media( notas[ aluno ] ); System. out. printf( "%9. 2 fn", media );
Estudo de Caso: Livro. De. Notas // determina nota média para o teste public double obter. Media(int cjt. De. Notas[]) { int total = 0; // initializa total } 58 // soma notas para um estudante for ( int nota : cjt. De. Notas) total += nota; // retorna a media das notas return (double) total / cjt. De. Notas. length;
Estudo de Caso: Livro. De. Notas // encontra a nota minima public int obter. Minima() { int nota. Minima = notas[0][0]; // assume nota[0][0] como a menor } 59 // loop sobre as linhas do array notas for ( int notas. Aluno[] : notas ) { // loop através das colunas da linha corrente for (int nota : notas. Aluno) { // Se nota é mais baixa que nota mais baixa, // atribua esta a nota. Minima if ( nota < nota. Minima ) nota. Minima = nota; // nova nota mínima } } return nota. Minima; // retorna nota mais baixa
Estudo de Caso: Livro. De. Notas // encontra nota maxima public int obter. Maxima() { int nota. Maior = notas[0][0]; // assume nota[0][0] como a maior } 60 // loop sobre as linhas do array notas for ( int notas. Aluno[] : notas ) { // loop através das colunas da linha corrente for (int nota : notas. Aluno) { // Se nota é mais alta que nota mais alta, // atribua esta a nota. Maior if ( nota > nota. Maior ) nota. Maior = nota; // nova nota maior } } return nota. Maior; // retorra nota mais alta
Estudo de Caso: Livro. De. Notas 61 // Imprime barra de distribuição das notas public void imprime. Distribuicao() { System. out. println( "Distribuicao das notas: " ); // armazena freqüência de notas em cada faixa de 10 notas int frequencia[] = new int[11]; // para cada nota, incrementa a frequencia apropriada for ( int notas. Estudante[] : notas ) { for ( int nota : notas. Estudante ) ++frequencia[ nota /10 ]; } // para cada frequencia de nota, imprima a barra for ( int contador = 0; contador < frequencia. length; contador++ ) { // imprime titulo ( "00 -09: ", . . . , "90 -99: ", "100: " ) if ( contador == 10 ) System. out. printf( "%5 d: ", 100 ); else System. out. printf( "%02 d-%02 d: ", contador * 10+9); // imprime barra de asterisco for ( int estrelas = 0; estrelas < frequencia[contador]; estrelas++ ) System. out. print( "*" ); System. out. println(); // parte uma nova linha } }
- Slides: 61