360 likes | 437 Views
Profs.:. José Eustáquio Rangel de Queiroz Roberto Medeiros de Faria. Carga Horária:. 60 h. Introdução à Programação. Capítulo 6. Arrays. Introdução à Programação. Tópicos 6.1 Introdução 6.2 Arrays 6.3 Declaração de Arrays 6.4 Exemplos de Uso de Arrays
E N D
Profs.: José Eustáquio Rangel de Queiroz Roberto Medeiros de Faria Carga Horária: 60 h Introdução à Programação Capítulo 6 Arrays
Introdução à Programação Tópicos 6.1 Introdução 6.2 Arrays 6.3 Declaração de Arrays 6.4 Exemplos de Uso de Arrays 6.5 Passagem de Arrays para Funções 6.6 Ordenação Arrays 6.7 Estudo de Caso: Cálculo da Média, Mediana e Moda Usando Arrays 6.8 Busca em Arrays 6.9 Arrays com Vários Subscritos
6.1 Introdução • Arrays • Estruturas de itens de dados relacionados • Entidade estática Tamanho constante ao longo de todo o programa • Estruturas de dados dinâmicas Capítulo 12 • Grupo de locações consecutivas de memória • Mesmo nome e tipo
6.2 Arrays • Referência a elementos de um array • Nome do array • Número da posição do elemento no array • Formato nome_array[número_posição] • Primeiro elemento Posição 0 do array • Array cde n elementos • c[ 0], c[ 1] ... c[ n – 1 ]
6.2 Arrays -45 vet[0] • Exemplo • Nome do array vet • Número de elementos 12 6 vet[1] 0 vet[2] 72 vet[3] 1543 vet[4] Nome do array Todos os elementos do array têm o mesmo nome,vet -89 vet[5] 0 vet[6] 62 vet[7] -3 vet[8] Posição do elemento Número que indica a posição do elemento no array acompanha o nome, entre colchetes 1 vet[9] 6453 vet[10] 78 vet[11]
6.2 Arrays • Elementos de array são semelhantes à variáveis normais c[0] = 3; printf("%d", c[0]); • Realização de operações em subscritos. Se x igual a 3 c[5 - 2] == c[3] == c[x]
6.3 Declaração de Arrays • Declaração de arrays • Nome • Tipo • Número de elementos tipo_array nome_array[número_elementos]; • Exemplos int c[10]; float meu_array[3284]; • Declaração de múltiplos arrays do mesmo tipo • Formato similar para variáveis regulares • Exemplo int b[ 100 ], x[ 27 ];
6.4 Exemplos de Uso de Arrays • Inicializadores int n[ 5 ] = { 1, 2, 3, 4, 5 }; • Número de inicializadores insuficiente Atribuição de 0 aos elementos mais à direita int n[5] = {0} • Todos os elementos iguais a 0 • Número de inicializadores excessivo Produção de um erro de sintaxe • Arrays em C não têm verificação de limites
6.4 Exemplos de Uso de Arrays • Omissão do tamanho Determinação a partir dos inicializadores int n[ ] = { 1, 2, 3, 4, 5 }; • 5 inicializadores Array com 5 elementos
6.4 Exemplos de Uso de Arrays 01/*Programa de impressão de histograma */ 02#include<stdio.h> 03#defineTAM 10 04 05intmain() 06{ 07intn[TAM] = { 19, 3, 15, 7, 11, 9, 13, 5, 17, 1 }; 08inti, j; 09 10printf( "%s%13s%17s\n", "Elemento", "Valor", "Histograma" ); Elemento Valor Histograma 0 19 ******************* 1 3 *** 2 15 *************** 3 7 ******* 4 11 *********** 5 9 ********* 6 13 ************* 7 5 ***** 8 17 ***************** 9 1 * 11for( i = 0; i <= TAM - 1; i++ ) { 12 printf( "%7d%13d ", i, n[ i ]) ; 13for( j = 1; j <= n[ i ]; j++ )/* imprime uma barra */ 14printf( "%c", '*' ); 15printf( "\n" ); 16} 17return0; 18}
6.4 Exemplos de Uso de Arrays • Arrays de caracteres • Cadeia de caracteres primeiroArray estático • Possibilidade de inicialização de arrays de caracteres a partir do uso de literais do tipo cadeia de caracteres (string) char string1[ ] = “primeiro”; • Terminação de cadeias de caracteres NULL(\0) • string1 é realmente composta por 9 elementos char string1[]={'p','r','i','m','e','i','r','o','\0' }; • Possibilidade de acesso a caracteres individuais string1[ 3 ] Caractere ‘m’
6.4 Exemplos de Uso de Arrays • Nome do array Endereço do array • Uso de & desnecessário scanf( "%s", string2 ); • Leitura de caracteres até a identificação de um espaço em branco • Possibilidade de escrita além do array Atenção e cuidado
6.4 Exemplos de Uso de Arrays 01 /* Tratamento de arrays de caracteres como cadeias de caracteres */ 02#include<stdio.h> 03 04intmain() 05{ 06charstring1[ 20 ], string2[] = "string literal"; 07inti; 08 09printf(" Entre com um string: "); 10scanf( "%s", string1 ); 11printf( "string1 é: %s\nstring2: é %s\n" 12"string1 com espacos entre caracteres é:\n", string1, string2 ); 13for( i = 0; string1[ i ] != '\0'; i++ ) 14printf( "%c ", string1[ i ] ); 15printf( "\n" ); Entre com um string: Alo todos string1 é: Alo string2 é: string literal string1 com espacos entre caracteres é: A l o 16 return0; 17}
6.5 Passagem de Arrays para Funções • Passagem de arrays para funções • Passagem de argumentos do tipo array Especificação do nome do array (sem colchetes) int array[24]; funcao(array, 24); • Tamanho do array usualmente passado para a função • Arrays são passados por referência • Nome do array Endereço do primeiro elemento • Conhecimento do espaço de armazenamento do array pela função • Modificação das locações originais de memória
6.5 Passagem de Arrays para Funções • Passagem de elementos do array • Passagem por valor • Passagem do nome do array com subscrito para a função (e.g. array[3]) • Protótipo da Função void modificaArray(int b[ ],int tamanho); • Nomes de parâmetros Opcionais no protótipo • int b[ ] Possibilidade de escrita como int [ ] • int tamanhoint
6.4 Exemplos de Uso de Arrays 01 /* Passagem de arrays e elementos isolados de arrays para funções */ 02#include<stdio.h> 03 #defineTAM 5 04 05voidmodificaArray(int[],int); 06voidmodificaElemento(int); Arrays inteiros passados por referência podem ser modificados 07intmain() 08 { 09inta[TAM] = {0, 1, 2, 3, 4}, i; 10 11printf( "Efeitos da passagem de arrays inteiro em chamadas por referência: " 12“\nOs valores do array original são:\n " 13 for(i = 0; i <= TAM - 1; i++) 14printf( "%3d", a[ i ] ); Elementos de array passados por valor não podem ser modificados 15printf( "\n" ); 16 modificaArray(a, TAM);/* passagem por referência */ 17printf( “Os valores do array modificado são:\n" ); 18for(i = 0; i <= TAM - 1; i++) 19printf( "%3d", a[ i ] ); 20 printf( "\ Efeitos da passagem de elementos em chamadas por valor:" 21 "\nO valor de a[3] é %d\n", a[3] ); 22modificaElemento(a[ 3 ]); 23printf( “O valor de a[3] é %d\n", a[3] ); 24return0; 25 }
6.4 Exemplos de Uso de Arrays 26void modificaArray(int b[], int tam) 27{ 28 int j; 29 30 for (j = 0; j <= tam - 1; j++) 31 b[ j ] *= 2; 32 } 33 34 void modificaElemento(int e) 35 { 36 printf("Valor em modificaElemento é %d\n", e *= 2); 37 } Efeitos da passagem de arrays inteiros em chamadas por referência: Os valores do array original são: 0 1 2 3 4 Os valores do array modificado são: 0 2 4 6 8 Efeitos da passagem de elementos em chamadas por valor: O valor de a[3] é 6 Valor em modificaElemento é 12 O valor de a[3] é 6
6.6 Ordenação de Arrays • Ordenação de dados • Aplicação computacional importante • Nos mais diferentes contextos de trabalho, a ordenação de dados é uma atividade imprescindível
Exercício • Série de Fibonacci e número de ouro Phi • Para a sequência de Fibonacci, os quocientes F(n)/F(n-1) tendem para o ‘número de ouro’ . = 1.618 0339 887... • Calcule a série de Fibonacci até que o módulo da diferença entre duas aproximações de phi seja menor que 0.000001, ou seja .|F(n)/F(n-1) – F(n-1)/F(n-2)| < 0.000001. (Defina e use uma função mod(n) que retorna o módulo de n) • Guarde toda a série em um array e, ao final, mostre: • A série • O último phi = F(n)/F(n-1) • Os números 1/phi e 1 - phi
6.6 Ordenação de Arrays • Ordenação Borbulhante (Bubble sort/ Sinking sort) • Várias etapas ao longo do array • Comparação de pares sucessivos de elementos • Ordenação crescente (ou valores idênticos) Posição dos elementos no array inalterada • Ordenação decrescente Troca de posição dos elementos no array • Repetição do processo de comparação
6.6 Ordenação de Arrays • Exemplo • Seqüência original Etapa 1 3 4 2 6 7 3 4 2 6 7 • Etapa 2 Etapa 3 3 4 2 6 7 3 2 4 6 7 • Etapa 4 Etapa 5 3 2 4 6 7 3 2 4 6 7 • Etapa 6 2 3 4 6 7 • Elementos de menor valor “borbulham” para a superfície (topo do array)
6.7 Estudo de Caso: Cálculo da Média, Mediana e Moda Usando Arrays • Média Média aritmética • Mediana Valor central de uma seqüência ordenada • Exemplo 2 3 4 6 7 • Mediana = 4 • Moda Valor mais freqüente em uma seqüência • Exemplo 1 1 1 2 3 3 4 5 6 5 • Moda = 1
6.4 Exemplos de Uso de Arrays 01/* Programa para o cálculo da média, mediana, e moda dos dados */ 02#include<stdio.h> 03#defineTAM 99 04 05voidmedia(const int[]); 06voidmediana(int[]); 07voidmoda(int [],const int[]) ; 08voidbolha(int[]); 09voidimprimeArray(const int[]); 10intmain() 11{ 12intfreq[10] = {0}; 13intentrada[TAM] = 14{6, 7, 8, 9, 8, 7, 8, 9, 8, 9, 157, 8, 9, 5, 9, 8, 7, 8, 7, 8, 166, 7, 8, 9, 3, 9, 8, 7, 8, 7, 177, 8, 9, 8, 9, 8, 9, 7, 8, 9, 186, 7, 8, 7, 8, 7, 9, 8, 9, 2, 197, 8, 9, 8, 9, 8, 9, 7, 5, 3, 205, 6, 7, 2, 5, 3, 9, 4, 6, 4, 217, 8, 9, 6, 8, 7, 8, 9, 7, 8, 227, 4, 4, 2, 5, 3, 8, 7, 5, 6, 234, 5, 6, 1, 6, 5, 7, 8, 7 }; 24media(entrada); 25mediana(entrada); 26moda(freq, entrada); 27return0; 28}
6.4 Exemplos de Uso de Arrays 29voidmedia(constintvalores[]) 30{ 31intj, total = 0; 32 33printf( "%s\n%s\n%s\n", "********", " Média", "********" ); 34for(j = 0; j <= TAM - 1; j++) 35total += valores[j]; 36printf("A média é igual à razão do somatório de todos os itens de dados\n" 37"pelo número de itens de dados ( %d ). O valor médio neste exemplo \n" 38"eh : %d / %d = %.4f\n\n", TAM, total, TAM, (double)total/TAM); 39} 40voidmediana(intvalores[]) 41{ 42printf("\n%s\n%s\n%s\n%s","*********","Mediana",“*********","Array desordenado:"); 43imprimeArray(valores); 44bolha(valores); 45printf("\n\nArray ordenado:"); 46imprimeArray(valores); 47printf( "\n\nA mediana é o elemento %d do array ordenado de %d elemento(s).\n" 48"Neste exemplo, a mediana é %d\n\n", TAM/2, TAM,valores[TAM/2] ); 49} 50 voidmoda(intfreq[],const intvalores[]) 51 { 52 inttaxa, j, h, maior = 0, valorModa = 0; 53 54 printf("\n%s\n%s\n%s\n","********"," Moda","********"); 55 for(taxa = 1; taxa <= 9; taxa++) 56 freq[ taxa ] = 0;
6.4 Exemplos de Uso de Arrays 57for( j = 0; j <= TAM - 1; j++ ) ++freq[valores[j]]; 58printf("%s%11s%19s\n\n%54s\n%54s\n\n",“Entrada","Frequencia","Histograma", 59"1 1 2 2", "5 0 5 0 5" ); 60for( taxa = 1; taxa <= 9; taxa++ ) { Observe que a subscrição de frequencia[ ] é o valor de um elemento de entrada[ ] (valores[ ]) 61printf( "%8d%11d ", taxa, freq[taxa] ); 62if(freq[taxa] > maior) { 63maior = freq[taxa]; 64valorModa = taxa; 65} Imprime * em função do valor de frequencia[] 66for(h = 1; h <= freq[taxa]; h++) printf("*"); 67printf("\n"); 68} 69printf(“A moda é o valor mais freqüente de uma seqüência.\n" 70“Neste exemplo, a moda é %d, tendo ocorrido %d vezes.\n,valorModa,maior); 71} 72voidbolha(inta[]) 73{ 74intpasso, j, auxi; 75 76for(passo = 1; passo <= TAM - 1; passo++) 77for(j = 0; j <= TAM - 2; j++) 78if(a[j] > a[j+1]){ Ordenação Borbulhante: se há elementos fora de ordem, troca-os. 79auxi = a[j]; 80a[j] = a[j+1]; 81a[j+1] = auxi; 82} 83}
6.4 Exemplos de Uso de Arrays 84voidimprimeArray(constinta[]) 85{ 86intj; ******** Media ******** A média é igual à razão do somatório de todos os itens de dados pelo número de itens de dados ( %d ). O valor médio neste exemplo eh: 681 / 99 = 6.8788 ********* Mediana ********* Array desordenado: 7 8 9 8 7 8 9 8 9 7 8 9 5 9 8 7 8 7 8 6 7 8 9 3 9 8 7 8 7 7 8 9 8 9 8 9 7 8 9 6 7 8 7 8 7 9 8 9 2 7 8 9 8 9 8 9 7 5 3 5 6 7 2 5 3 9 4 6 4 7 8 9 6 8 7 8 9 7 8 7 4 4 2 5 3 8 7 5 6 4 5 6 1 6 5 7 8 7 Array ordenado: 1 2 2 2 3 3 3 3 4 4 4 4 4 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 A mediana é o elemento 49 do array ordenado de 99 elemento(s). Neste exemplo, a mediana é 7 87 88for(j = 0; j <= TAMANHO - 1; j++) { 89 if(j % 20 == 0) 90printf( "\n" ); 91 printf( "%2d", a[ j ] ); 92} 93}
6.4 Exemplos de Uso de Arrays ******** Moda ******** Resposta Frequencia Histograma 1 1 2 2 5 0 5 0 5 1 1 * 2 3 *** 3 4 **** 4 5 ***** 5 8 ******** 6 9 ********* 7 23 *********************** 8 27 *************************** 9 19 ******************* A moda é o valor mais freqüente de uma seqüência. Neste exemplo, a moda é 8, tendo ocorrido 27 vezes.
6.8 Busca em Arrays: Busca Linear e Busca Binária • Pesquisa de valores-chaves em arrays • Busca linear • Simplicidade • Comparação de cada elemento do array com o valor-chave • Utilidade em arrays pequenos e desordenados
6.8 Busca em Arrays: Busca Linear e Busca Binária • Busca binária • Adequação a arrays ordenados • Comparação do elemento intermediário com a chave • Se iguais Elemento encontrado • Se chave < meio Busca na primeira metade do array • If chave > meio Busca na segunda metade do array • Repetição do processo 5
6.8 Busca em Arrays: Busca Linear e Busca Binária • Busca binária • Grande rapidez do processo • No máximo n passos, onde 2n > N (número de elementos do array) • Exemplo: Array de 30 elementos • Número máximo de passos 5 (25 > 30)
a[ 2 ][ 0 ] a[ 1 ][ 0 ] a[ 0 ][ 0 ] a[ 1 ][ 1 ] a[ 2 ][ 1 ] a[ 0 ][ 2 ] a[ 0 ][ 1 ] a[ 2 ][ 2 ] a[ 0 ][ 3 ] a[ 1 ][ 3 ] a[ 2 ][ 3 ] a[ 1 ][ 2 ] 6.9 Arrays com Vários Subscritos • Arrays com múltiplos subscritos • Tabelas com linhas e colunas (arraym x n) • Matrizes Especificação da linha e, em seguida, da coluna Coluna 0 Coluna 1 Coluna 2 Coluna 3 Linha 0 Linha 1 Linha 2 Nome do array Subscrito da coluna Subscrito da linha
1 2 3 4 1 0 3 4 6.9 Arrays com Vários Subscritos • Inicialização • int b[ 2 ][ 2 ] = { { 1, 2 }, { 3, 4 } }; • Agrupamento de inicializadores Linhas entre chaves • Se não forem suficientes Elementos não especificados ajustados para zero int b[ 2 ][ 2 ] = { { 1 }, { 3, 4 } }; • Referência de elementos • Especificação da linha e, em seguida, da coluna printf( "%d", b[ 0 ][ 1 ] );
6.4 Exemplos de Uso de Arrays 01/* Exemplo de um array com dois subscritos */ 02#include<stdio.h> 03#defineALUNOS 3 04#defineEXAMES 4 05intminimo(constint[][ EXAMES ],int,int); 06intmaximo(const int[][ EXAMES ],int,int); 07doublemedia(constint[], int); Cada linha é um aluno em particular, cada coluna são as notas em um exame. 08voidimprimeArray(constint[][ EXAMES ],int,int); 09intmain() 10{ 11intaluno; 12const intnotas[ALUNOS][EXAMES] = { { 77, 68, 86, 73 }, 13{ 96, 87, 89, 78 }, 14{ 70, 90, 86, 81 } }; 15printf(“O array é:\n"); 16imprimeArray(notas, ALUNOS, EXAMES ); 17printf("\n\nNota menor: %d\nNota maior: %d\n", 18minimo(notas, ALUNOS, EXAMES), 19maximo(notas, ALUNOS, EXAMES)); 20for(aluno = 0; aluno <= ALUNOS - 1; aluno++) 21printf(“Nota média do aluno %d %.2f\n", aluno, media(notas[aluno ], EXAMES)); 22return0; 23}
6.4 Exemplos de Uso de Arrays 24/* Determinação da menor nota */ 25intminimo(const intnotas[][EXAMES],intpupilos,inttestes) 26{ 27inti, j, menorNota = 100; 28for(i = 0; i <= pupilos - 1; i++) 29for(j = 0; j <= testes - 1; j++) 30if(notas[i][j] < menorNota) 31menorNota = notas[i][j]; 32returnmenorNota; 33} 34/* Determinação da nota máxima */ 35intmaximo(constintnotas[][EXAMES],intpupilos,inttestes) 36{ 37inti, j, maiorNota = 0; 38for(i = 0; i <= pupilos - 1; i++) 39for(j = 0; j <= testes - 1; j++) 40if(notas[i][j] > maiorNota) 41maiorNota = notas[i][j]; 42returnmaiorNota; 43} 44/* Determinação da nota média para um exame particular */ 45double media(constintnotas[],inttestes) 46{ 47inti, total = 0; 48for(i = 0; i <= testes - 1; i++) 49total += notas[ i ]; 50return(double) total/testes; 51}
6.4 Exemplos de Uso de Arrays 52/* Impressão do array */ 53voidimprimeArray(constintnotas[][ EXAMES ],intpupilos,inttestes) 54{ 55inti, j; 56printf( " [0] [1] [2] [3]" ); 57for( i = 0; i <= pupilos - 1; i++ ) { 58printf( "\nnotas[%d] ", i ); 59for(j = 0; j <= testes - 1; j++) 60printf( "%-5d", notas[ i ][ j ] ); 61} 62} O array é: [0] [1] [2] [3] notas[0] 77 68 86 73 notas[1] 96 87 89 78 notas[2] 70 90 86 81 Menor Nota: 68 Maior Nota: 96 A nota média para o aluno 0 é 76.00 A nota média para o aluno 1 é 87.50 A nota média para o aluno 2 é 81.75
José Eustáquio Rangel de Queiroz Roberto Medeiros de Faria Ulrich Schiel UNIVERSIDADE FEDERAL DE CAMPINA GRANDE CENTRO DE CIÊNCIAS E TECNOLOGIA DEPARTAMENTO DE SISTEMAS E COMPUTAÇÃO