Baixe o app para aproveitar ainda mais
Prévia do material em texto
Algoritmos e Programação Professor Marco A. Sartori marco.sartori@fag.edu.br Matrizes | Vetores Página 1 de 7 Matrizes e vetores ......................................................................................................................... 2 Declaração de vetores ............................................................................................................... 2 Vetores dinâmicos ................................................................................................................. 3 Vetores de múltiplas dimensões ............................................................................................... 4 Declaração de inicialização de vetores de múltiplas dimensões .......................................... 5 Geração de números aleatórios ................................................................................................ 5 A função rand() ...................................................................................................................... 5 Referências .................................................................................................................................... 7 Algoritmos e Programação Professor Marco A. Sartori marco.sartori@fag.edu.br Matrizes | Vetores Página 2 de 7 Matrizes e vetores Um vetor é um conjunto de espaços de memória que se relacionam pelo fato de que todos têm o mesmo nome e o mesmo tipo. Para se referir a um local ou elemento onde em particular no vetor, especificamos o nome do vetor e o número da posição do elemento em particular nesse vetor. A Figura 1 mostra um vetor de inteiros chamado C. Esse vetor contém 12 elementos. Qualquer um desses elementos pode ser referenciado com o nome do vetor seguido pelo número de posição do elemento em particular entre colchetes ([]). O primeiro elemento de cada vetor é identificado pela posição elemento zerésimo. Assim, o primeiro elemento do vetor é referenciado como c[0], o segundo elemento como c[1], o sétimo elemento como c[6], e, em geral, o i- ésimo elemento do vetor c é referenciado como c[i – 1]. Os nomes do vetor, assim como outros nomes de variáveis, só podem conter letras, dígitos e sublinhados. Nomes de vetores não podem começar com um dígito. O número da posição contido dentro dos colchetes é, formalmente, chamado de subscrito ou índice. Um índice precisa ser um número inteiro ou uma expressão inteira. Se um programa usa uma expressão como índice, então a expressão é avaliada para determinar o índice. Por exemplo, se a = 5 e b = 6, então a instrução c [a + b] += 2; soma 2 ao elemento c[11] do vetor. Para impressão de um elemento do vetor, a seguinte instrução poderia ser utilizada: printf (“%d”,c[0]); Para leitura de um número para um elemento do vetor, a seguinte instrução poderia ser utilizada: scanf(“%d”,&c[6]); Para realização um cálculo qualquer, a instrução a seguir poderia ser utilizada como modelo: C[0] += c[1]; Declaração de vetores Os vetores ocupam espaço na memória. Você especifica o tipo de cada elemento e o número de elementos exigidos pelo vetor, de modo que o computador possa reservar a quantidade de memória apropriada. Figura 1 - Exemplo de um vetor de 12 posições. Algoritmos e Programação Professor Marco A. Sartori marco.sartori@fag.edu.br Matrizes | Vetores Página 3 de 7 Figura 2 - Declaração de vetores. A quantidade de elementos do vetor pode ser definida por meio de uma constante, ou ainda, por meio de uma constante simbólica. O exemplo a seguir mostra como ocorreria a declaração de um vetor que utiliza uma constante t para definição do total de elementos. Figura 3 - Utilização de constantes na definição do total de elementos do vetor. Vetores dinâmicos A linguagem C prima pela economia de memória durante a execução de seus programas. Quando declaramos um vetor no início de um programa, o compilador separa um “pedaço” da memória do computador de tamanho equivalente ao tamanho máximo do vetor. Assim, se criarmos um vetor de inteiros com 200 elementos, o compilador separa na memória do computador um espaço de 400 bytes (2 bytes x 200 elementos). Entretanto, quando trabalhamos com vetores, frequentemente não sabemos qual o tamanho exato de elementos que precisamos. Ao criar um vetor, estipulamos um valor que seja maior do que o valor máximo de elementos que precisamos, mesmo que não utilizemos todos os espaços disponíveis no vetor. Isso causa desperdício de memória do computador e lentidão na execução de programas. Para evitar este problema, a linguagem C possui dois operadores de controle de memória. Em primeiro lugar, temos o operador new, que é utilizado para alocar espaços na memória do computador durante a execução de um programa. Em segundo lugar, o operador delete, que libera a memória alocada com o operador new, após sua utilização. Este tipo de criação e destruição de variáveis é chamado de alocação dinâmica. Um vetor criado dessa forma é chamado de vetor dinâmico. A vantagem de se criar vetores dinâmicos é que a memória utilizada pelo vetor, só é “tirada” do sistema após a execução do operador new, e pode ser liberada novamente após sua utilização do operador delete. Quando criamos um vetor do jeito “normal”, a memória utilizada por ela é guardada pelo programa durante toda sua execução, consumindo recursos desnecessários do computador. Algoritmos e Programação Professor Marco A. Sartori marco.sartori@fag.edu.br Matrizes | Vetores Página 4 de 7 A sintaxe para declaração de um vetor utilizando o operador new é a seguinte: <tipo> *<nome> = new <tipo> [ <numero de elementos> ]; Por exemplo, para criar um vetor do tipo float com 10 elementos: float *lista = new float [10]; O acesso aos elementos do novo vetor é feito de forma análoga ao de um vetor criado do jeito “normal”: utilizamos o nome do vetor, seguido do número do elemento acessado. Como já dito anteriormente, o primeiro elemento de um vetor é sempre o elemento 0. Note que não podemos inicializar automaticamente os valores de um vetor criado dessa forma. Cada elemento do vetor deve ter seu valor atribuído separadamente. A outra face do operador new é o operador delete. Só podemos utilizar este operador com vetores criados pelo operador new, ou seja, vetores criados por declaração normal não podem ser apagados durante a execução do programa. Para utilizar o operador delete para apagar um vetor, a sintaxe é a seguinte: delete <nome>; O programa a seguir mostra um exemplo de utilização de um vetor dinâmico: Figura 4 - Exemplo de utilização de vetores dinâmicos. Vetores de múltiplas dimensões As matrizes (ou vetores) em C podem ter vários índices. Os vetores de índices múltiplos (ou vetores multimensionais) podem ser utilizados na representação de tabelas de valores que consistem em informações organizadas em linhas e colunas. Para identificar determinado elemento da tabela, devemos especificar dois índices: o primeiro (por convenção) identifica a linha do elemento, e o segundo (por convenção) identifica a coluna do elemento. Tabelas ou vetores que Figura 5 - Vetor de índice duplo com 3 linhas e 4 colunas. Algoritmos e Programação Professor Marco A. Sartori marco.sartori@fag.edu.br Matrizes | Vetores Página 5 de 7 exigem dois índices para identificar determinado elemento são chamados de vetores de índiceduplo. Vetores de índices múltiplos podem ter mais de dois índices. Declaração de inicialização de vetores de múltiplas dimensões Um vetor de índices múltiplos pode ser inicializado quando declarado, assim como um vetor de índice único. Por exemplo, um vetor de índice duplo int b[2][2] poderia ser definido e inicializado como: int b[2][2] = { {1 , 2} , {3 , 4} }; Os valores são agrupados por linha em chaves. Os valores no primeiro conjunto de chaves inicializam a linha 0, e os valores no segundo conjunto de chaves inicializam a linha 1. Assim, os valores 1 e 2 inicializam os elementos b[0][0] e b[0][1], respectivamente, e os valores 3 e 4 inicializam os elementos b[1][0] e b[1][1], respectivamente. Se não houver inicializadores suficientes para determinada linha, os elementos restantes dessa linha serão inicializados em 0. Desta forma, int b[2][2] = { {1} , {3 , 4} }; inicializaria b[0][0] em 1, b[0][1] em 0, b[1][0] em 3 e b[1][1] em 4; O exemplo a seguir mostra a declaração, inicialização e manipulação de um vetor de índice duplo: Figura 6 - Exemplo de declaração, inicialização e manipulação de um vetor de índice duplo. Geração de números aleatórios A função rand() A função rand() gera um número inteiro entre 0 e RAND_MAX (uma constante simbólica definida no cabeçalho <stdlib.h>). A C padrão indica que o valor de RAND_MAX deve ser pelo menos 32767, que é o valor máximo para um inteiro de dois bytes, ou seja, 16 bits. O intervalo de valores produzidos diretamente por rand(), normalmente é diferente daquele que é necessário em uma aplicação específica. Por exemplo, um programa que simula o lançamento de um dado, deverá considerar um intervalo de valores entre 1 e 6, correspondente aos lados do dado. A instrução rand() % 6 produz números em um intervalo de 0 a 5. Isso é chamado de escala. O número 6 é chamado de fator de escala. Ao modificarmos a instrução anterior para acrescentando 1 ao resultado, 1 + (rand() % 6), os números gerados passam a estar contidos no intervalo de 1 a 6. Algoritmos e Programação Professor Marco A. Sartori marco.sartori@fag.edu.br Matrizes | Vetores Página 6 de 7 Apesar de gerar números aleatórios, a combinação de valores geradas por rand() resulta sempre nos mesmo números a cada execução do programa. Para que as combinações de valores passem a conter valores diferentes daqueles gerados na execução anterior do programa, é necessário que o programa utilize a randomização. A randomização é um processo que ocorre na função srand(). A função srand() utiliza um argumento inteiro unsigned e “semeia” a função rand(), para que ela possa produzir uma nova sequência de números a cada execução do programa. O exemplo a seguir mostra a utilização da função srand() para “semear” novas sementes de números aleatórios: Figura 7 - Exemplo de utilização da função srand(). No exemplo acima, a cada execução pode ser informado um valor diferente para a semente, resultando, portanto, em valores aleatórios diferentes a cada execução. Caso seja necessário plantar novas sementes sem a necessidade de informa-la manualmente, o comando a seguir poderá ser utilizado: srand(time(NULL)); A instrução acima faz com que o computador leia seu clock para obter o valor da semente automaticamente. A função time retorna o número de segundos que se passaram desde a meia noite de 1º de janeiro de 1970. Esse valor é convertido em um inteiro não sinalizado (unsigned), e é usado como semente do gerador de números aleatórios. A função time recebe NULL como um argumento (time é capaz de lhe oferecer uma string que represente o valor que ele retorna; NULL desativa essa capacidade para uma chama específica a time). Para utilização da função time, é necessária a utilização do cabeçalho <time.h> no programa, conforme mostra o exemplo a seguir: Algoritmos e Programação Professor Marco A. Sartori marco.sartori@fag.edu.br Matrizes | Vetores Página 7 de 7 Figura 8 - Exemplo de utilização da função time como semente para rand(). Referências DEITEL, H.M; DEITEL,P.J. C Como programar. 6ª edição. São Paulo: Pearson, 2011.
Compartilhar