Baixe o app para aproveitar ainda mais
Prévia do material em texto
Linguagem da Programação I 7º Aula Vetores e Matrizes Objetivos de aprendizagem Ao término desta aula, vocês serão capazes de: • compreender o funcionamento de variáveis alocadas como vetor; • compreender o funcionamento de matrizes multidimensionais; • desenvolver códigos utilizando dados armazenados em vetores e matrizes. Olá pessoal! Até agora que já sabemos utilizar variáveis, podemos tentar melhorar um pouco a utilização delas, pois muitas vezes precisamos ficar declarando uma quantidade grande de variáveis com o mesmo objetivo em comum. Podemos resolver problemas como esse utilizando vetores e matrizes. Portanto, nesta aula, trataremos de como utilizar essas estruturas existentes na linguagem de programação. Boa aula! Bons estudos! 43 Seções de estudo 1 - Introdução 1 - Introdução 2 - - Como declarar um vetor em C agora que já sabe para que serve e como são importantes, vamos começar a usar os vetores/arrays em linguagem C/C++ 3 - Acesso aos elementos de um vetor ou matriz 4 - Matrizes Um vetor é uma estrutura de dados utilizada para representar certa quantidade de variáveis de valores homogêneos, ou seja: um conjunto de variáveis, todas do mesmo tipo. Nas aulas anteriores, os programas sempre liam uma variável que armazenava apenas um valor. Ou seja, a cada rodada do laço, a variável assumia um valor, e exibir as notas de todos os alunos, não seria possível, pois sempre substituíamos a nota de um aluno pela nota do aluno seguinte. Para que fosse possível armazenar as notas de todos os alunos, teríamos duas alternativas: a primeira, menos inteligente, seria declarar uma variável para armazenar a nota de cada aluno; e a segunda seria declarar um vetor de tamanho igual à quantidade de alunos. Sintaxe para declaração de vetores: tipo_do_vetor nome_do_vetor [tamanho]; Como funciona: A única diferença entre a declaração de vetores e a declaração de variáveis simples é que, ao declarar vetores, especificamos ao fim da declaração e entre colchetes [ ] o tamanho do vetor, ou seja, sua capacidade de armazenamento. Por exemplo: Se precisarmos armazenar a nota de 10 alunos, podemos declarar um vetor de 10 posições do tipo float. A declaração do nosso vetor ficaria assim: float notas [10]; Um vetor é como uma coleção de caixinhas numeradas. Cada caixinha é capaz de armazenar um valor e tem o seu “endereço”. O “endereço” de cada caixinha é conhecido como índice e serve para identificar qual posição do vetor queremos acessar. Abaixo temos a representação gráfica no nosso vetor de notas de dez posições, declarado acima: Índice 0 1 2 3 4 5 6 7 8 9 Valor 8,5 7,6 9,3 10 6,3 4,7 8,8 9,1 3,4 10 No vetor representado acima temos, por exemplo, armazenado no índice “2” o valor “9.3”. Note que, como declaramos um vetor com 10 posições, os índices variam de 0 a 9. Mas, resta uma dúvida: como referenciar as posições do vetor e armazenar dados nelas? A sintaxe para utilizar uma posição do vetor é: nome do vetor [índice]; assim, para armazenar o valor 8.5 na primeira posição do nosso vetor, seria utilizado o comando: notas [0] = 8.5. 1.1 - O que são vetores, como declarar e quando usar Nesta seção vamos estudar o tipo de estrutura de dados mais simples: os vetores, também conhecidos por arrays. O que é um vetor em C... E para quê serve? Imagine que você foi contratado para criar um programa em C para uma escola. Nesse programa você tem que armazenar as notas dos alunos, nomes, médias, nome dos pais, faltas e tudo mais. E aí? Vai declarar quantos inteiros para armazenar as notas? Centenas? Milhares? E quantos caracteres para armazenar esses nomes? E quantos floats para armazenar as notas e médias de cada matéria, para cada aluno? É quase que humanamente impossível fazer isso. Mas não se preocupe, pois você programa em C e tem total domínio de sua máquina. Você não perderá tempo declarando inúmeras variáveis, fará com que o computador faça isso pra você. E é disso que se trata a estrutura de dados: estudar, manipular, organizar, salvar e extrair informações de uma grande quantidade de dados. Automatizar esse processo para que não precisemos declarar, inicializar e fazer outras operações em nossas variáveis de um modo manual. 2 - Como declarar um vetor em C agora que já sabe para que serve, e como são importantes. Agora vamos começar a usar os vetores/arrays em linguagem C/C++ Para criar um vetor, precisamos declarar três atributos dela: • O tipo de valor que vai ser armazenado no vetor • O nome do vetor, para que possamos acessá-la • O número de elementos do vetor A declaração de um vetor é muito parecida com a declaração de uma variável, bastando adicionar o número de elementos que desejamos que ela tenha. A sintaxe é a seguinte: <tipo> <nome> [<número de elementos>]; Por exemplo, caso quiséssemos criar uma matriz chamada catálogo para armazenar 156 inteiros, a declaração seria assim: int catálogo [156]; Podemos utilizar qualquer tipo de variáveis já estudadas anteriormente para criar um vetor, como float, int, char. Uma vez criada uma matriz de um determinado tipo, ela só pode receber valores desse tipo. Note que precisamos definir um tipo para uma matriz: não é possível criar um vetor “genérico” que aceite qualquer tipo, ou vários tipos. Isso acontece porque ao declarar uma matriz, o compilador aloca memória suficiente para conter o número de valores especificado de acordo com 44Linguagem da Programação I o tipo da matriz. Por exemplo, um vetor de 100 elementos do tipo int normalmente irá requerer 100*2 ou 200 bytes de memória. Por outro lado, um vetor de 100 elementos do tipo float irá requerer 100*4 bytes ou 400 bytes (VICTORINE, 1994). Assim como uma variável normal, podemos atribuir valores para uma matriz no momento de sua declaração. Isso é feito utilizando o operador de atribuição “=” seguido dos valores contidos entre chaves e separados por vírgulas. Por exemplo, considere a matriz de inteiros “teste” abaixo: int teste [5] = {1, 2, 3, 4 , 5}; Também podemos atribuir apenas parte dos valores de uma matriz, por exemplo, podemos criar um vetor que comporte 50 valores do tipo float e atribuir apenas 5 valores a ela, deixando para atribuir o restante dos valores no decorrer do programa. float notas [50] = {7.65, 8.48, 4.27, 6.78, 9.10 }; A linguagem C++ faz com que toda matriz parcialmente inicializada tenha seus valores restantes automaticamente transformados em zero. Assim, caso precisemos de uma matriz que só contenha zeros, podemos atribuir o primeiro elemento da matriz como zero e deixar que o compilador transforme os elementos restantes em zero, como vemos abaixo (VICTORINE, 1994): int zeros [75] = {0}; A sintaxe é a seguinte: tipo nome variável [número de elementos]; Ou seja, a sintaxe é a mesma de declarar uma variável normal, mas não vamos declarar somente uma, vamos declarar várias. E o par de colchetes ao lado do nome da variável serve para isso: especificar quantas daquelas variáveis estamos declarando. Por exemplo, vamos declarar 10 inteiros que vão representar a idade de 10 pessoas: int idade [10]; Agora 50 floats que vão representar a nota de 50 alunos: float notas [50]; Bem simples. Observação: a contagem do índice sempre começa do 0. Embora tenhamos declarado as variáveis com um nome, elas não podem ter um mesmo nome. Por isso, um número é associado ao seu nome. No caso da idade [10], as variáveis inteiras são: Idade [0], idade [1], idade [2], ..., idade [9] Isso mesmo, o primeiro elemento é sempre o zero. Então, se uma variável tem ‘n’ elementos, seus índices variam, sempre, de 0 até n-1, totalizando ‘n’ elementos. 3 - Acesso aos elementos de um vetor ou matriz 3.1 - Acessar os elementos de um vetor em C Declaramos várias variáveis com o mesmo nome, mas como se referir, individualmente, a cada uma delas? A resposta é simples: usando números, ou índices. ‘notas’ é um vetor de floats. Se quiser utilizar um tipo float, use aseguinte sintaxe: nome [índice]. Suas variáveis, de forma independente, são chamadas de: notas [0]. Notas [1], notas [10] etc. Você pode utilizá-las como as variáveis (na verdade elas são variáveis, como se tivessem sido declaradas manualmente), por exemplo: Armazenar a nota de um aluno que tirou 10 Nota [10] = 10.0 //esse programa em C Somar a nota de dois alunos: float soma = nota [3] + nota [4]; Incrementar: Nota [5] ++; Por fim, pode fazer tudo. São variáveis do tipo float normais. A diferença é que os nomes das variáveis têm números, que são chamados de índice, que são criados automaticamente quando você declara um bloco de vários elementos (vulgo vetores, ou arrays) (CARVALHO, 2008). Como de costume, para fixar melhor. 3.2 - Acessando Valores de uma Matriz Após criar uma matriz, podemos acessar qualquer valor dentro dela. Cada valor, ou elemento de uma matriz, possui um número próprio. Toda matriz começa no elemento 0. Precisamos ter isso em mente quando acessamos valores dentro de uma matriz, pois o primeiro elemento será o elemento “0”, o segundo elemento será o elemento “1” (CARVALHO, 2008). Cada elemento de uma matriz é tratado como uma variável separada. Assim, podemos atribuir valor para um elemento, exibi-lo na tela, utilizá-lo em operações matemáticas e em laços condicionais. O programa abaixo ilustra essas várias ações: #include <iostream> using namespace std; int main() { int matriz[5] = {1,2,3,4,5}; cout<<”o primeiro valor da matriz é: “<<matriz[0]<<endl; cout<<”o último valor da matriz é: “<<matriz[4]<<endl; cout<<”Somando o segundo e o quarto elementos da matriz temos: “<< matriz[1] + matriz[3]<<endl; matriz[2] = 27; cout<<”Mudamos o valor do terceiro elemento da matriz para: “<<matriz[2]<<endl; system (“PAUSE > null”); return 0; } 3.3 - Utilizando Laços para Percorrer vetores Uma das utilizações mais úteis dos laços condicionais 45 é o acesso a vários (ou todos) elementos de uma matriz rapidamente. Podemos utilizar qualquer um dos laços que estudamos, mas sem dúvida o laço for é o mais prático para trabalhar-se com matrizes. Utilizamos a variável de controle do laço para acessar cada um dos elementos desejados (lembre-se de que a matriz sempre começa no elemento 0). Como vemos no programa abaixo que percorre os elementos de uma matriz, primeiro preenchendo a matriz com os dados entrados pelo usuário, depois exibindo esses dados na tela. #include <iostream> using namespace std; int main() { int sequência[4]; for (int i = 0; i < 4; i++) { cout << “Entre com o elemento número “<<(i+1)<<” da sequência: “; cin >> sequência[i]; cout << endl; } cout << “A sequência entrada pelo usuário foi: “; for (int i = 0; i < 4; i++) { cout << sequência[i]<<” “; } System (“PAUSE > null”); return 0; } Importante: como vimos no exemplo anterior, podemos utilizar variáveis para acessar os elementos de uma matriz. Da mesma forma, podemos definir constantes para indicar o número de elementos de uma matriz. Essa técnica é muito útil, pois caso precisemos alterar o número de elementos da matriz ao invés de caçarmos no código todas as referências a este número, tudo que precisamos fazer é alterar o valor da constante (JAMSA, 1999). Assim, veja o mesmo programa anterior reescrito utilizando uma definição de constante. #include <iostream> using namespace std; int main() { const int TAMANHO = 4; int sequência[TAMANHO]; for (int i = 0; i < 4; i++) { cout << “Entre com o elemento número “<<(i+1)<<” da sequência: “; cin >> sequência[i]; cout << endl; } cout << “A sequência entrada pelo usuário foi: “; for (int i = 0; i < 4; i++) { cout << sequência[i]<<” “; } System (“PAUSE > null”); return 0; } Exemplo: Faça um programa que peça 3 números inteiros ao usuário, armazene em um vetor, depois mostre o valor de cada elemento do vetor, assim como seu índice. Primeiro declaramos um vetor de inteiros, contendo 3 elementos: int NUMERO[3]; Agora vamos pedir para o usuário preencher esses três números. Lembre-se de que você é programador e sabe que os índices vão de 0 até 2. Mas o usuário não. Para o leigo, é número 1, número 2 e número 3, não inicia no 0. No laço for, o nosso ‘índice’ vai de 0 até 2. Porém, ao recebermos o valor de índice ‘índice’, estamos pedindo ao usuário o valor do número ‘índice+1’. Por exemplo, para armazenar um valor no ‘NUMERO[0]’, vamos pedir o número ‘0+1’ ao usuário. Para armazenar um valor no ‘NUMERO[1]’, vamos pedir o número ‘1+1’ ao usuário. Para armazenar um valor no ‘NUMERO[2]’, vamos pedir o número ‘2+1’ ao usuário. Usaremos outro laço for para exibir o valor dos números, através dos índices, que variam de 0 até 2. Porém, novamente, temos que mostrar 1 ao 3 para o cliente, pois para ele não faz sentido ‘número 0 -> valor 10 ‘ e sim ‘número 1 -> valor 10’. Então, nosso código em C fica: #include <stdio.h> int main() { int NUMERO[3], índice; for (índice = 0; índice < = 2; índice ++) { Printf (“Entre com o número %d: “, indice+1); Scanf (“%d”, &NUMERO [índice]); } For (índice = 0; índice < = 2; índice ++) Printf (“Número %d = %d\n”, índice +1, NUMERO [índice]); } Exemplo: Faça um programa em C que peça ao usuário duas notas que ele tirou e mostre a média. Use vetores! Aliás, use somente um vetor para essas três variáveis. Agora vamos declarar vetor de float de 3 elementos. Nas duas primeiras posições armazenamos as notas do usuário (nota[0] e nota[1]), e na terceira posição (nota[2]) armazenaremos a média (nota[0] + nota[1])/2. Veja como ficou nosso código C: #include <stdio.h> int main() { 46Linguagem da Programação I float notas [3]; printf (“Insira sua primeira nota: “); scanf (“%f ”, ¬as[0]); printf (“Insira sua segunda nota: “); scanf (“%f ”, ¬as[1]); notas [2] = (notas[0] + notas[1])/2; printf (“Sua media e: %.2f\n”, notas[2]); } Sim, muito simples. São simplesmente variáveis normais, a diferença é que são várias delas. É até mais fácil trabalhar com vetores do que com variáveis declaradas manualmente, por conta dos índices. Afinal, números têm uma ordem lógica, já os nomes que damos às variáveis não. Até fazemos uma ressalva, evite usar variáveis como: a, b, c, x, y, i, j... ou a primeira letra que você encontrou. Use ‘linha’, ‘coluna’, ‘índice’, ‘contador’, ‘count’, ‘média’, ‘nota’, ‘continuar’ etc, como fizemos aqui. Pode parecer perda de tempo usar uma variável com nome tão grande. Mas é porque ainda estamos estudando. Quando você for profissional e já tiver feito programa com milhares de linhas de código, ficará impossível entender o que é sopa de letras que você usou como nome de variáveis. Mas se tiver usado nomes que façam sentido, você e outros programadores também entenderão de maneira mais simples. Não é um conselho, é um diferencial. 4 - Matrizes Além dos vetores de uma única dimensão, C++ permite a criação de matrizes de múltiplas dimensões. As matrizes bidimensionais são sem dúvida as mais utilizadas e as mais úteis, pois comportam-se como tabelas com linhas e colunas. Ao declarar uma matriz multidimensional, adicionamos um conjunto de colchetes para cada dimensão extra. Entre os colchetes de cada dimensão, colocamos o número de elementos que aquela dimensão terá (ou uma variável que represente o número de elementos) (JAMSA, 1999). Assim: int tabela [10] [5]; //matriz bidimensional int horas [12] [30] [24]; //matriz de três dimensões int minutos [12] [30] [24] [60]; //matriz de quatro dimensões Normalmente trabalhamos no máximo com matrizes bidimensionais, mas podem surgir ocasiões onde matrizes de mais de duas dimensões sejam necessárias. Matrizes multidimensionais funcionam como matrizes dentro de matrizes. Por exemplo, uma matriz bidimensional pode ser vista como uma matriz de uma dimensão cujos elementos são outras matrizes. Essa analogia é útil para entender como é feita a inicialização dosvalores de matrizes multidimensionais: inicializamos a matriz separando seus elementos por vírgulas, onde cada elemento é uma matriz individual e é inicializada da mesma forma que a matriz “principal” (JAMSA, 1999). Por exemplo, seja a matriz bidimensional da tabela: int tabela [2] [3] = { { 1, 2, 3} , { 4, 5, 6}}; Veja que cada “elemento” é fechado por chaves e separado por vírgulas. A mesma coisa acontece com matrizes de três dimensões, e assim por diante. O exemplo abaixo mostra a declaração de uma matriz tridimensional. Preste atenção na presença das chaves e das vírgulas separando cada elemento diferente: int tritabela [2] [2] [2] = { {{ 9, 8}, {7,6}} , {{5, 4},{3, 2}} }; Cada elemento de uma matriz multidimensional pode ser acessado individualmente, indicando a posição exata do valor dentro da matriz. Como vimos anteriormente no caso das matrizes simples, a utilização dos laços condicionais facilita o acesso aos vários elementos de uma matriz. No caso das matrizes multidimensionais, utilizamos laços aninhados para acessar cada dimensão de uma vez. O programa abaixo declara a matriz tridimensional que vimos anteriormente e utiliza uma sucessão de laços for aninhados para exibir a matriz na tela. #include <iostream> using namespace std; int main() { int tritabela [2] [2] [2] = {{{ 9, 8}, {7,6}},{{5, 4},{3, 2}}}; for (int i = 0; i < 2; i++) { for (int j = 0; j < 2; j++) { for (int k = 0; k < 2; k++) { cout << tritabela[i][j][k]<<” “; } cout<<endl; } cout<<endl; } System (“PAUSE > null”); return 0; } Retomando a aula Parece que estamos indo bem. Então, para encerrar esta aula, vamos recordar: Na aula anterior foram apresentados as estruturas de repetições e dependendo da interação dentro do laço, nossas variáveis tinham seus valores sobrescritos, ou teríamos que declarar n variáveis. Agora, através de matrizes e vetores podemos declarar uma variável que representará um conjunto de valores. Portanto, agora, as estruturas de repetição apresentam uma importância ainda maior na nossa programação. Também com os vetores e as matrizes conseguiremos otimizar e desenvolver programas mais compactos. Vimos que para interagir nesses conjuntos sempre necessitamos de variáveis para utilizarmos como índice. Esses índices sempre serão inteiros, já que não existem posições de vetores ou matrizes quebrados. 47 CARVALHO, Flávia Pereira de; Apostila de Programação II- Linguagem de Programação C, Faculdade de Informática de Taquara, Curso de Sistemas de Informação 2008. JAMSA, Kris; KLANDERM LARS; SANTOS, Jeremias René D. Pereira dos. Programando em C/C++: a bíblia. São Paulo: Makron Books do Brasil, 1999. DELGADO, Armando Luiz; Linguagem C++; usp; 2012. Vale a pena Vale a pena ler Disponível em: <http://www.dainf.ct.utfpr.edu. br/~pbueno/Arquivos/Algoritmos.pdf>. Acesso em: 25 de nov. 2017. Disponível em: <https://www.devmedia.com.br/ estrutura-de-repeticao-c/24121>. Acesso em: 25 de nov. 2017. Disponível em: <http://www.professores.uff.br/ screspo/wp-content/uploads/sites/127/2017/09/mat. pdf>. Acesso em: 25 de nov. 2017. Vale a pena acessar Programar em C - Ciclo for | Laço for | Repetição for. Disponível em: <https://www.youtube.com/ watch?v=lRuQ8S-jXcY>. Acesso em: 25 de nov. 2017. Vale a pena assistir Minhas anotações
Compartilhar