Baixe o app para aproveitar ainda mais
Prévia do material em texto
VETORES E MATRIZES UNIDADE 4 PROFESSOR: SÉRVULO JUNIOR FALCULDADE PITÁGORAS ALGORITMOS E PROGRAMAÇÃO 4 VETORES E MATRIZES 4.1 Vetores 4.2 Matrizes ROTEIROROTEIRO PROFESSOR: SÉRVULO JUNIOR 2/41 É uma técnica de programação que permitirá trabalhar com o agrupamento de várias informações dentro de uma mesma variável, sendo essa variável do mesmo tipo e por essa razão podemos chamar de estrutura de dados homogêneos. A utilização deste tipo de estrutura de dados recebe diversos nomes, como: variáveis indexadas, variáveis compostas, variáveis subscritas, arranjos, vetores, matrizes, tabelas em memória ou arrays (do inglês). As matrizes (tabelas em memória) são tipos de dados que podem ser “construídos” à medida que se fazem necessários, pois não é sempre que os tipos básicos (real, inteiro, caractere e lógico) e/ou variáveis simples são suficientes para representar a estrutura de dados utilizada em um programa. ROTEIRO4 VETORES E MATRIZES PROFESSOR: SÉRVULO JUNIOR 3/41 Vetores ou Matrizes de uma Dimensão Vetor pode também ser denominado por matrizes unidimensionais e caracteriza-se por ser definida uma única variável dimensionada com um determinado tamanho. Os nomes dados as matrizes seguem as mesmas regras de nomes utilizados para indicar as variáveis simples. A manipulação de uma matriz tipo vetor é utilizada uma única instrução de looping (enquanto, para ou repita). Para ter uma ideia de como utilizar matrizes em uma determinada situação, considere o seguinte problema: “Calcular e apresentar a média geral de uma turma de 8 alunos. A tabela seguinte mostra esse cenário. ROTEIRO4.1 Vetores PROFESSOR: SÉRVULO JUNIOR 4/41 ROTEIRO4.1 Vetores PROFESSOR: SÉRVULO JUNIOR ALUNO NOTA1 NOTA2 NOTA3 NOTA4 MEDIA 1 4.0 6.0 5.0 3.0 4.5 2 9.0 8.0 9.0 6.0 8.0 3 3.0 5.0 4.0 2.0 3.5 4 6.0 7.0 5.0 8.0 6.5 5 4.0 6.0 6.0 8.0 6.0 6 7.0 7.0 7.0 7.0 7.0 7 8.0 7.0 6.0 5.0 6.5 8 6.0 7.0 2.0 9.0 6.0 TABELA 1: REPRESENTAÇÃO DE UM VETOR EM UMA TABELA. 5/41 Para utilizar matrizes, será definida a instrução conjunto que indicará em postuguês estruturado a utilização de uma matriz, tendo como sintaxe: VARIÁVEL : conjunto [<dimensão>] de <tipo de dado> Onde: <dimensão> será a indicação dos valores inicial e final do tamanho do vetor; <tipo de dado> se o vetor em questão irá utilizar valores reais, inteiros, lógicos ou caracteres. Na linguagem C: tipo VARIÁVEL [<dimensão>]; ROTEIRO4.1 Vetores PROFESSOR: SÉRVULO JUNIOR 6/41 Na linguagem C tipo VARIÁVEL [<dimensão>]; Onde: <dimensão> será a indicação dos valores inicial e final do tamanho do vetor; <tipo de dado> se o vetor em questão irá utilizar valores reais, inteiros, lógicos ou caracteres. A seguir um Portugol onde efetua a leitura das notas de 8 alunos, cálculo da média e a sua apresentação do vetor. ROTEIRO4.1 Vetores PROFESSOR: SÉRVULO JUNIOR 7/41 programa MEDIA_TURMA var MD [0..7] : real; SOMA, MEDIA : real; I : inteiro; inicio SOMA = 0; para I de 0 até 7 passo 1 faça leia (MD[I]); SOMA = SOMA + MD[I]; fim para; MEDIA = SOMA / 8; escreva (“Media = “, MEDIA); fim. ROTEIRO4.1 Vetores PROFESSOR: SÉRVULO JUNIOR 8/41 Em C o portugol fica: //programa MEDIA_TURMA #include <stdio.h> #include <stdlib.h> float MD [8]; float SOMA, MEDIA; int I; main (){ SOMA = 0; for(I = 0; I <= 7; I++){ printf("Digite a %i. nota: ",I+1); scanf("%f", &MD[I]); SOMA = SOMA + MD[I]; } MEDIA = SOMA / 8; printf("Media = %.2f\n\n",MEDIA); system("pause"); return 0; } ROTEIRO4.1 Vetores PROFESSOR: SÉRVULO JUNIOR 9/41 Em uma matriz não podemos confundir o índice com o elemento. O índice é o endereço de alocação de uma unidade da matriz, enquanto elemento é o conteúdo armazenado em um determinado endereço. ROTEIRO4.1 Vetores PROFESSOR: SÉRVULO JUNIOR Índice Elemento 1 4.5 2 8.0 3 3.5 4 6.5 5 6.0 6 7.0 7 6.5 8 6.0 TABELA 2: Índice e elemento de uma matriz, Coluna Média 10/41 A seguir um programa que ler e escreve 8 notas de alunos. programa MEDIA_TURMA var MD [0..8] : real; SOMA, MEDIA : real; I : inteiro; inicio SOMA = 0; para i de 0 até 7 passo 1 faça leia (MD[I]); SOMA = SOMA + MD[I]; fim para; MEDIA = SOMA / 8; para I de 0 até 2 passo 1 faça escreva (MD[I]); fim para; escreva (“Media = “, MEDIA); fim. ROTEIRO4.1 Vetores PROFESSOR: SÉRVULO JUNIOR 11/41 //programa MEDIA_TURMA #include <stdio.h> #include <stdlib.h> float MD [7]; float SOMA, MEDIA; int I; main (){ SOMA = 0; for(I = 0; I <= 7; I++){ printf("Digite a %i. nota: ",I+1); scanf("%f", &MD[I]); SOMA = SOMA + MD[I]; } MEDIA = SOMA / 8; for(I = 0; I <= 7; I++){ printf("%i. nota: %.2f\n",I+1, MD[I]); } printf("Media = %.2f\n\n",MEDIA); system("pause"); return 0; } ROTEIRO4.1 Vetores PROFESSOR: SÉRVULO JUNIOR 12/41 O exemplo a seguir efetua a leitura de dez elementos de uma matriz A, o objetivo é construir uma matriz B de mesmo tipo, observando a seguinte lei de formação: se o valor do índice for par, o valor deverá ser multiplicado por 5, se for ímpar devera ser somado com 5. Ao final mostrar o conteúdo da matriz B. Como resolver: 1. Iniciar o contador de índice, variável I como 0 em um contador até 9; 2. Ler os 10 valores, um a um; 3. Verificar se o índice é par se sim multiplicar por 5, se não somar 5. Criar a matriz B; 4. Apresentar os conteúdos das duas matrizes. ROTEIRO4.1 Vetores PROFESSOR: SÉRVULO JUNIOR 13/41 Programa INDICE_PAR_OU_IMPAR; var A, B : conjunto [1..10]: inteiro; I, R: inteiro; Inicio para I de 0 até 9 passo 1 faça leia A[I]; fim para; para I de 0 até 9 passo 1 faça R = I – 2 * (I div 2); se (R = 0) então B[I] = A[I] * 5; senão B[I] = A[I] + 5; fim se; fim para; para I de 0 até 9 passo 1 faça escreva B[I]; fim para; fim. ROTEIRO4.1 Vetores PROFESSOR: SÉRVULO JUNIOR 14/41 //Programa INDICE_PAR_OU_IMPAR; #include <stdio.h> #include <stdlib.h> int A[9], B[9], I, R; main(){ for(I = 0; I <= 9; I++){ printf("Digite o %i. numero: ",I+1); scanf("%i", &A[I]); } for(I = 0; I <= 9; I++){ R = I%2; if(R == 0){ B[I] = A[I] * 5; } else { B[I] = A[I] + 5; } } printf("\n\nO VETOR B E\n\n"); for(I = 0; I <= 9; I++){ printf("%i. numero: %i %i\n",I+1, A[I],B[I]); } system("pause"); return 0; } ROTEIRO4.1 Vetores PROFESSOR: SÉRVULO JUNIOR 15/41 ROTEIRO4.1 Vetores PROFESSOR: SÉRVULO JUNIOR Desenvolver um programa que efetue a leitura de cinco elementos de uma matriz A do tipo vetor. No final apresente o total da soma de todos os elementos que sejam ímpares. Como resolver: 1. Iniciar o contador de índice, variável I como 0 em um contador até 4; 2. Ler os 5 valores, um a um; 3. Verificar se o elemento é impar; se sim efetuar a soma dos elementos; 4. Apresentar o total somado de todos os elementos ímpares da matriz. 16/41 Programa ELEMENTO_IMPAR; var A [0..4]: inteiro; R, I, SOMA: inteiro; Inicio SOMA = 0; para I de 0 até 4 passo 1 faça leia A[I]; fim para; para I de 0 até 4 passo 1 faça R = (A[I] div 2); se (R = 1) então SOMA = SOMA + A[I]; fim se; fim para; escreva SOMA; fim. ROTEIRO4.1 Vetores PROFESSOR: SÉRVULO JUNIOR 17/41 //Programa ELEMENTO_IMPAR; #include <stdio.h> #include <stdlib.h> int A[5], I, R, SOMA; main(){ SOMA = 0; for(I = 0; I <= 4; I++){ printf("Digite o %i. numero: ",I+1); scanf("%i", &A[I]); } for(I = 0; I <= 4; I++){ R = A[I]%2; if(R == 1){ SOMA = SOMA + A[I]; } }printf("\n\nA SOMA DOS VALOR E %i \n\n", SOMA); system("pause"); return 0; } ROTEIRO4.1 Vetores PROFESSOR: SÉRVULO JUNIOR 18/41 ROTEIRO4.2 Matrizes PROFESSOR: SÉRVULO JUNIOR Classificação dos elementos de uma matriz Colocar em ordem crescente 5 valores numéricos armazenados numa matriz A e apresentá-los. Como resolver: 1. Iniciar o contador de índice, variável I como 0 em um contador até 4; 2. Ler os 5 valores, um a um; 3. Verificar se o elemento seguinte é maior que o elemento atual; 4. Apresentar o vetor em ordem crescente. 19/41 ROTEIRO4.2 Matrizes PROFESSOR: SÉRVULO JUNIOR Programa ORDENA_VETOR var N [0..4]: inteiro; I, J, X: inteiro; inicio para I de 0 até 4 passo 1 faça leia (N[I]); fim para; para I de 0 até 3 passo 1 faça para J de I + 1 até 4 passo 1 faça se (N[I] > N[J]) então X = N[I]; N[I] = N[J]; N[J] = X; fim se; fim para; fim para; para I de 0 até 4 passo 1 faça escreva (N[I]); fim para; fim. 20/41 ROTEIRO4.2 Matrizes PROFESSOR: SÉRVULO JUNIOR //Programa ORDENA_VETOR; #include <stdio.h> #include <stdlib.h> int N[5], I, J, X; main(){ for(I = 0; I <= 4; I++){ printf("Digite o %i. numero: ",I+1); scanf("%i", &N[I]); } for(I = 0; I <= 3; I++){ for(J = I+1; J <= 4; J++){ if(N[I] > N[J]){ X = N[I]; N[I] = N[J]; N[J] = X; } } } printf("\n\nO VETOR ORDENADO \n\n"); for(I = 0; I <= 4; I++){ printf("%i\n",N[I]); } system("pause"); return 0; } 21/41 ROTEIRO4.2 Matrizes PROFESSOR: SÉRVULO JUNIOR MÉTODO DE PESQUISA EM UMA MATRIZ Pesquisa sequencial Consiste em efetuar a busca da informação a partir do primeiro elemento sequencialmente até o último. Este método é lento, porém eficiente nos casos em que a matriz encontra-se com seus elementos desordenados. Pesquisa binária Este método de pesquisa é em média mais rápida, porém exige que a matriz esteja previamente classificada, pois este método divide a lista em duas partes e procura saber se a informação a ser pesquisada está acima ou abaixo da linha de divisão. Se estiver acima, por exemplo, toda a metade abaixo é desprezada. Em seguida, se a informação não foi encontrada, é novamente dividida em duas, e pergunta se aquela informação está acima ou abaixo, e assim vai sendo executada até encontrar ou não a informação pesquisada. Pelo fato de ir dividindo sempre em duas partes o volume de dados é que o método recebe a denominação de pesquisa binária. 22/41 ROTEIRO4.2 Matrizes PROFESSOR: SÉRVULO JUNIOR A seguir um exemplo utilizando Pesquisa sequencial onde o programa dar entrada de 10 nomes e a apresentação desses nomes que venham a ser solicitados durante a fase de pesquisa. Consiste em efetuar a busca da informação a partir do primeiro elemento sequencialmente até o último. Este método é lento, porém eficiente nos casos em que a matriz encontra-se com seus elementos desordenados. Como resolver: 1. Iniciar o contador de índice, variável I como 0 em um contador até 9; 2. Criar um looping que efetue a pesquisa enquanto o usuário assim desejar. Durante a fase de pesquisa, deverá ser solicitada a informação a ser pesquisada. Essa informação deverá ser comparada com o primeiro elemento; sendo igual mostra, caso contrário avança para o próximo. Se não achar em toda a lista, informar que não existe o elemento pesquisado; se existir deverá mostrá-lo; 3. Encerrar a pesquisa quando desejado. 23/41 ROTEIRO4.2 Matrizes PROFESSOR: SÉRVULO JUNIOR Programa PESQUISA_SEQUENCIAL var NOME [0..9]: caractere; I: inteiro; PESQ, RESP : caractere; ACHA: lógico; inicio para I de 0 até 9 passo 1 faça leia (NOME [I]); fim para; RESP = “SIM”; enquanto (RESP = “SIM”) faça escreva “Entre com o nome a ser pesquisado: “; leia PESQ; I = 0; ACHA = falso; 24/41 ROTEIRO4.2 Matrizes PROFESSOR: SÉRVULO JUNIOR enquanto (I <= 9) e (ACHA = falso) faça se (PESQ = NOME[I]) então ACHA = verdadeiro; se não I = I + 1; fim se; fim enquanto; se (ACHA = verdadeiro) então escreva (PESQ, “ foi localizado na posição ”, I); se não escreva (PESQ, “ não foi localizado”); fim se; escreva (“Deseja continuar? “); leia (RESP); fim enquanto; fim. 25/41 ROTEIRO4.2 Matrizes PROFESSOR: SÉRVULO JUNIOR //Programa PESQUISA_SEQUENCIAL; #include <stdio.h> #include <stdlib.h> #include <string.h> char NOME[4][100]; int I; char PESQ[100], RESP, ACHA; main(){ for(I = 0; I <= 3; I++){ printf("Digite o %i. nome: ",I+1); gets (NOME[I]); } RESP = 'S'; while(RESP == 'S' || RESP == 's'){ printf("Entre com o nome a ser pesquisado: "); fflush (stdin); gets(PESQ); 26/41 ROTEIRO4.2 Matrizes PROFESSOR: SÉRVULO JUNIOR I = 0; ACHA = 'F'; while((I <= 3) && (ACHA == 'F')){ if(strcmp(PESQ, NOME[I]) == 0){ ACHA = 'V'; } else { I++; } } if(ACHA == 'V'){ printf("%s foi localizado na posicao %i\n\n", PESQ, I); } else { printf("%s nao foi localizado\n\n", PESQ); } printf("Deseja continuar (S/N)?"); scanf("%s", &RESP); } system("pause"); return 0; } 27/41 ROTEIRO4.2 Matrizes PROFESSOR: SÉRVULO JUNIOR Agora um exemplo utilizando Pesquisa binária, para esse exemplo iremos utilizar o problema anterior onde o algoritmo lê 10 nomes e a apresentação somente de nomes que venham a ser solicitadas pelo usuário durante a execução do programa. Como resolver: 1. Iniciar o contador de índice, variável I como 0 em um contador até 9; 2. Criar um looping que efetue a pesquisa enquanto o usuário assim desejar. Durante a fase de pesquisa, deverá ser solicitada a informação a ser pesquisada. Essa informação deverá ser comparada utilizando-se o método de pesquisa binária. Sendo igual mostra, caso contrário avança para o próximo. Se não achar em toda a lista, informar que não existe o elemento pesquisado; se existir deverá mostrá-lo; 3. Encerrar a pesquisa quando desejado. 28/41 ROTEIRO4.2 Matrizes PROFESSOR: SÉRVULO JUNIOR Programa PESQUISA_BINÁRIA var NOME [0..9]: caractere; I, X, J: inteiro; PESQ, RESP : caractere; ACHA: lógico; inicio para I de 0 até 9 passo 1 faça leia (NOME [I]); fim para; //ordenação para I de 0 até 8 passo 1 faça para J de I + 1 até 9 passo 1 faça se (NOME[I] > NOME[J]) então X = NOME[I]; NOME[I] = NOME[J] ; NOME[J] = X; fim se; fim para; fim para; 29/41 ROTEIRO4.2 Matrizes PROFESSOR: SÉRVULO JUNIOR //treco de pesquisa enquanto (RESP = “SIM”) faça escreva “Entre com o nome a ser pesquisado: “; leia PESQ; COMECO = 0; FINAL = 9; ACHA = falso; enquanto (COMECO <= FINAL) e (ACHA = falso) faça MEIO = (COMECO + FINAL) / 2; se (PESQ = NOME[MEIO]) então ACHA = verdadeiro; se não se (PESQ < NOME[MEIO]) então FINAL = MEIO -1; se não COMECO = MEIO + 1; fim se; fim se; fim enquanto; 30/41 ROTEIRO4.2 Matrizes PROFESSOR: SÉRVULO JUNIOR se (ACHA = verdadeiro) então escreva (PESQ, “ foi localizado na posição ”, MEIO); se não escreva (PESQ, “ não foi localizado”); fim se; escreva (“Deseja continuar? “); leia (RESP); fim enquanto; fim. 31/41 ROTEIRO4.2 Matrizes PROFESSOR: SÉRVULO JUNIOR O exemplo na linguagem C. //Programa PESQUISA_BINARIA; #include <stdio.h> #include <stdlib.h> #include <string.h> char NOME[10][100]; int I, J, COMECO, MEIO, FINAL; char PESQ[100], RESP, ACHA; char X[100]; main(){ for(I = 0; I <= 9; I++){ printf("Digite o %i. nome: ",I+1); gets (NOME[I]); } //ordenação for(I = 0; I <= 8; I++){ for(J = I+1; J <= 9; J++){ if(strcmp(NOME[I], NOME[J]) > 0){strcpy(X, NOME[I]); strcpy(NOME[I], NOME[J]); strcpy(NOME[J], X); } } } 32/41 ROTEIRO4.2 Matrizes PROFESSOR: SÉRVULO JUNIOR //treco de pesquisa RESP = 'S'; while(RESP == 'S' || RESP == 's'){ printf("Entre com o nome a ser pesquisado: "); fflush (stdin); gets(PESQ); COMECO = 0; FINAL = 9; ACHA = 'F'; while((COMECO <= FINAL) && (ACHA == 'F')){ MEIO = (COMECO + FINAL) / 2; if(strcmp(PESQ, NOME[MEIO]) == 0){ ACHA = 'V'; } else { if(strcmp(PESQ, NOME[MEIO]) < 0){ FINAL = MEIO -1; } else { COMECO = MEIO + 1; } } } 33/41 ROTEIRO4.2 Matrizes PROFESSOR: SÉRVULO JUNIOR if(ACHA == 'V'){ printf("%s foi localizado na posicao %i\n\n", PESQ, MEIO); } else { printf("%s nao foi localizado\n\n", PESQ); } printf("Deseja continuar (S/N)?"); scanf("%s", &RESP); } system("pause"); return 0; } 34/41 ROTEIRO4.2 Matrizes PROFESSOR: SÉRVULO JUNIOR Matrizes com mais de uma dimensão Também conhecida como matrizes bidimensionais ou arranjos (arrays) as matrizes com mais de uma dimensão tem variáveis no sentido horizontal e vertical. Uma matriz de duas dimensões deverá ser controlada com dois looping de três dimensões deverá ser controlado por três loopings e assim por diante. Em matrizes de mais de uma dimensão os seus elementos são também manipulados de forma individualizada, sendo a referência feita sempre por meio de dois índices: o primeiro para indicar a linha e o segundo para indicar a coluna. 35/41 ROTEIRO4.2 Matrizes PROFESSOR: SÉRVULO JUNIOR Operações básicas com matrizes de duas dimensão Uma matriz de duas dimensões está sempre fazendo menção a linhas e colunas e é representada por seu nome e seu tamanho (dimensão) entre colchetes. Desta forma é uma matriz de duas dimenções. TABELA [0..8, 0..5] Onde: TABELA -> nome o nome da matriz; 0..8 -> quantidade de linhas; 0..5 -> quantidade de colunas; No exemplo acima quer dizer que podemos armazenar até 45 elementos. 36/41 ROTEIRO4.2 Matrizes PROFESSOR: SÉRVULO JUNIOR Como exemplo temos: leia um valor numérico X e uma matriz A 4x2, elabore um algoritmo que calcule e exiba uma outra matriz B que deverá conter cada elemento da matriz A dividido pelo valor numérico X. Para resolver este problema, vamos criar uma tabela com 10 linha [0..9] para guardar pessoas e 5 colunas [0..4] para guardar dados pessoais. [0] [1] [1] [2] [3] [4] 37/41 ROTEIRO4.2 Matrizes PROFESSOR: SÉRVULO JUNIOR //algoritmo "Calcula Matriz B" var A, B: vetor[1..4,1..2]: inteiro X real I, J: inteiro inicio leia(X) para I de 1 ate 4 faca para J de 1 ate 2 faca leia(A[I, J]); B[I, J] = A[I, J]/X; fim para; fim para; para I de 0 ate 3 faca para J de 0 ate 1 faca escreva( B[I, J]); fim para; fim para; Fim. 38/41 ROTEIRO4.2 Matrizes PROFESSOR: SÉRVULO JUNIOR NOSSO EXEMPLO DESENVOLVIDO NA LINGUAGEM C //algoritmo "Calcula Matriz B" #include <stdio.h> #include <stdlib.h> #include <string.h> int A[4][2]; int B[4][2]; int X, I, J; 39/41 ROTEIRO4.2 Matrizes PROFESSOR: SÉRVULO JUNIOR main(){ printf("Digite o valor de X: "); scanf("%i",&X); printf("ELEMENTOS DA MATRIZ A \n\n"); for(I = 0; I <= 3; I++){ for(J = 0; J < 2; J++){ printf("digite o elemento da linha %i coluna %i: ",I, J); scanf("%i",&A[I][J]); B[I][J] = A[I][J]/X; } } printf("\n\nELEMENTOS DA MATRIZ B (elemento da matriz A dividido pelo valor numérico X) \n\n"); for(I = 0; I <= 3; I++){ for(J = 0; J < 2; J++){ printf("elementos da matriz B [%i, %i]........: %i \n",I, J, B[I][J]); } } system("pause"); return 0; } 40/41 ARAÚJO, Everton C. Algoritmos: fundamento e prática. Capítulo 6 – Estrutura de Dados Homogêneas I; Capítulo 7 – Aplicações Práticas do Uso de Matrizes do Tipo Vetor; e Capítulo 8 – Estrutura de Dados Homogêneas II. VICTORINA, VIVIANE, MIZRANE. Treinamento em Linguagem C: curso completo. Capítulo 7 – Matrizes e Strings; Capítulo 1 – Introdução e Capítulo – Funções. ROTEIROBibliografia PROFESSOR: SÉRVULO JUNIOR 41/41
Compartilhar