O objetivo dessa unidade é apresentar ao aluno aos Vetores. Será feita uma abordagem focando na linguagem C e também em alguns algoritmos para ajudar na compreensão
Um vetor é uma variável composta unidimensional formada por uma sequência de variáveis, todas do mesmo tipo, com o mesmo nome e alocadas sequencialmente na memória. Uma vez que as variáveis têm o mesmo nome, o que as distingue é um índice, que referencia sua localização dentro da estrutura.
A declaração de um vetor é feita da seguinte maneira:
Onde:
Dessa forma temos, por exemplo:
Em ambos os casos, declaramos um vetor de números inteiros de 10 posições (k) , um vetor de números reais de 5 posições (vet) e um vetor de caracteres de 20 posições (nome).
Na declaração de um vetor podemos omitir seu tamanho , desde que quando seja feita a declaração, já sejam atribuídos seus valores, como no exemplo abaixo:
Neste caso, automaticamente o índice 4 é atribuído ao vetor num.
Em pseudocódigo, as posições de um vetor começam em 1 (um) e vão até o tamanho do vetor.
Em C, as posições de um vetor começam em 0 (zero) e vão até o tamanho do vetor menos uma unidade.
Para atribuir valores a um vetor procedemos da seguinte maneira:
Utilizamos o comando de atribuição como por exemplo:
Podemos fazer de duas maneiras:
A primeira é simplesmente atribuir valores ao vetor na posição desejada, como por exemplo:
E a segunda seria após a declaração do vetor, colocando-se um sinal de igual (=) seguido de todos os valores separados por vírgula entre colchetes. Exemplo:
Neste caso, durante a declaração é possível omitir o número correspondente ao tamanho do vetor, porém a quantidade de valores que serão atribuídos será igual ao seu tamanho (como já havia sido dito), já ao se declarar o tamanho não é obrigatório atribuir valores a todas as posições do vetor, quando se for inicializá-lo dessa maneira.
Para carregar um vetor ou parte dele com valores, ou seja, preenchê-lo com valores digitados, procedemos da seguinte maneira:
Utilizamos a estrutura de repetição PARA, com isso o vetor será percorrido e, a cada iteração, o comando LEIA solicitará a entrada do dado via teclado.
Utilizamos a estrutura de repetição FOR, com isso o vetor será percorrido e, a cada iteração, o comando SCANF solicitará a entrada do dado via teclado.
Em ambos os casos poderia se fazer um comando de entrada de dados via teclado para cada posição do vetor, porém isso tornaria o código extenso e desprenderia mais tempo, tornando-se inviável.
Utilizamos a estrutura de repetição PARA, com isso o vetor será percorrido e, a cada iteração, o comando ESCREVA mostrará o valor do vetor correspondente à posição do contador.
Utilizamos a estrutura de repetição FOR, com isso o vetor será percorrido e, a cada iteração, o comando PRINTF mostrará o valor do vetor correspondente à posição do contador.
Em ambos os casos poderia se fazer um comando de saída de dados para cada posição do vetor, porém isso tornaria o código extenso e desprenderia mais tempo, tornando-se inviável.
Exceto na declaração do vetor, não é possível atribuir valores a todos os elementos em uma só linha. Cada elemento precisa ser acessado individualmente. Tampouco é possível usar um único scanf para ler todo o conteúdo do vetor. O código abaixo está, portanto, errado:
Como vimos acima, o correto é utilizar uma estrutura de repetição for para atribuir o valor a cada elemento.
Tampouco é possível copiar o conteúdo de um vetor para um outro, mesmo que os dois sejam de mesmo tamanho e os elementos sejam de mesmo tipo.
O correto é utilizar uma estrutura de repetição for para copiar um elemento de cada vez.
Faça um programa que leia dez números e os imprima em ordem inversa:
Faça um programa que execute as seguintes etapas:
Imagine-se na seguinte situação: você precisa escrever um programa que imprima “Linguagem C” na tela. Se pensarmos rapidamente, poderíamos resolver esta situação declarando 11 variáveis char e preenchendo-as uma a uma.
Obviamente, essa alternativa seria inviável, pois daria muito trabalho. Imagine então escrever textos longos dessa maneira.
Para contornar isso, o C utiliza Strings. String é um vetor de caracteres com um delimitador que indica o final da string: o caractere nulo \0.
As Strings possuem mais detalhes e opções em relação aos outros tipos de vetores, por isso é necessário tratá-las separadamente.
Para declarar uma string em C não há segredo, pois é a mesma coisa de se declarar um vetor de variáveis do tipo char. A sintaxe é sempre a seguinte:
Aqui, porém, vale uma ressalva muito importante que geralmente é esquecida: o caractere delimitador - \0 – também fará parte da string. Ou seja, ele conta o número de caracteres, no tamanho da String.
Por exemplo em “Linguagem C” existem 11 caracteres. Mas o número total de caracteres é 12, pois o caractere \0 também vai contar como uma variável do tipo char. Então faríamos a seguinte declaração:
E o caractere delimitador? O C coloca, automaticamente, ao fim da string.
Ficaria da seguinte maneira:
Podemos fazer assim também:
E se declararmos com um tamanho maior que o texto? Por exemplo:
Da posição 0 até a 11, existirão os caracteres da frase. Na posição 12, o caractere delimitador, sinalizando o final da string. E nas outras posições? Lixo.
A sintaxe para receber uma string por meio da scanf() é:
Não é necessário utilizar o &.
O problema dessa sintaxe é que a função scanf pegará os caracteres até encontrar um espaço em branco, caractere new line \n, tab ou ENTER.
Então, vamos dizer para scanf( ) parar de pegar nossa string somente quando encontrar um caractere de NEW LINE (um enter). Para isso, usamos o operador: [^\n]
Logo, nosso código da scanf( ) para ler strings com espaços e armazenar na variável "str" é:
Então podemos corrigir fazendo:
Podemos ainda limitar o tamanho de nossa string, basta colocar um número inteiro ao lado do %, representando o número máximo de caracteres que serão contados na leitura, o que é uma excelente prática, pois essa função pode ocasionar problemas na memória, caso você estoure os limites do número de caracteres reservados de uma string.
Por exemplo:
Neste caso serão contados apenas os 256 primeiros caracteres digitados.
Para usar a função gets() é bem simples, bastando passar uma string como argumento. A sintaxe é:
Não é necessário utilizar o &.
Exemplo:
Para exibir uma string "str" com o printf(), fazemos:
Para exibir uma string "str" com o puts(), fazemos:
A biblioteca padrão fornece várias funções úteis para manipular strings. A seguir, mostraremos algumas delas. Para usá-las, você deve incluir o cabeçalho string.h no início dos seus arquivos.
strlen retorna o tamanho, em caracteres, de uma string dada. Na verdade, o strlen() procura o terminador de string e calcula a distância dele ao início da string. Por exemplo:
strcpy copia o conteúdo de uma string para outra e coloca um terminador de string. Sua sintaxe é strcpy (destino, origem).
Tome cuidado com strcpy( ), pois se a string a ser copiada for maior que a string de destino, provavelmente você gravará dados em lugares indesejados ― um problema conhecido como estouro de buffer. Para evitar esse problema, use a função strncpy, que recebe um terceiro argumento que corresponde ao número máximo de caracteres a serem copiados:
strcat concatena duas strings, adicionando o conteúdo da segunda ao final da primeira, além do terminador (\0). Note que a primeira string deve ter espaço suficiente para conter a segunda, para que não ocorra um "estouro de buffer". Por exemplo:
Analogamente à função strncpy, existe também a função strncat, onde o número máximo de caracteres a serem copiados é o terceiro argumento.
Se você tentar criar duas strings com o mesmo conteúdo e compará-las como faria com números, verá que elas "não são iguais". Isso ocorre porque, na verdade, o que está sendo comparado são os endereços de memória onde estão guardadas as strings. Para comparar o conteúdo de duas strings, você deve usar a função strcmp (ou suas variantes):
Seu valor de retorno é:
Costuma parecer estranho dizer que uma string é menor ou maior que outra; na verdade essa comparação é entre a primeira letra que difere nas duas strings. Assim, se tivermos string1 = "abc" e string2 = "abd", diremos que string2 é maior que string1, pois na primeira posição em que as duas strings diferem, a letra em string2 é "maior".
É importante notar que a comparação feita por strcmp distingue maiúsculas de minúsculas. Isto é, as strings "ABC" e "abc" não são iguais para essa função.
Exemplo:
As variantes mais usadas de strcmp são:
Vamos ver um exemplo utilizando algumas das funções mencionadas.
Respectiva saída: