Vetores

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

Vetores

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.

Declaração de um vetor

A declaração de um vetor é feita da seguinte maneira:

Onde:

  • tipo é o tipo de dado que será armazenado no vetor;
  • tamanho é quantidade de variáveis que vão compor o vetor;
  • nome é o nome da variável do tipo vetor

Dessa forma temos, por exemplo:

Declaração em pseudocódigo
Declaração em C

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.

Exemplo de vetor

Em pseudocódigo

Em pseudocódigo, as posições de um vetor começam em 1 (um) e vão até o tamanho do vetor.

Em C

Em C, as posições de um vetor começam em 0 (zero) e vão até o tamanho do vetor menos uma unidade.

Atribuindo valores ao vetor

Para atribuir valores a um vetor procedemos da seguinte maneira:

Em pseudocódigo

Utilizamos o comando de atribuição como por exemplo:

Em C

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.

Carregando um vetor

Para carregar um vetor ou parte dele com valores, ou seja, preenchê-lo com valores digitados, procedemos da seguinte maneira:

Em pseudocódigo

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.

Em C

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.

Mostrando os elementos do vetor

Em pseudocódigo

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.

Em C

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.

Erros comuns:
Atribuir o valor de todos os elementos de uma só vez

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.

Copiar vetores

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.

Exemplo 1:

Faça um programa que leia dez números e os imprima em ordem inversa:

Solução em pseudocódigo
Solução em C

Exemplo 2:

Faça um programa que execute as seguintes etapas:

  • Digite 10 números inteiros e os armazene em um vetor;
  • Verifique qual desses números é maior;
  • Imprima os elementos do vetor e em seguida o seu maior elemento.
Solução em pseudocódigo
Solução em C

Video Explicativo - Vetores

Strings

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.

Declaração de uma String

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.

Como ler Strings

Pela função SCANF

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.

Pela função GETS

Para usar a função gets() é bem simples, bastando passar uma string como argumento. A sintaxe é:

Não é necessário utilizar o &.

Exemplo:

Como imprimir Strings

Printf( )

Para exibir uma string "str" com o printf(), fazemos:

Puts( )

Para exibir uma string "str" com o puts(), fazemos:

Funções da biblioteca padrão

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

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

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

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.

strcmp

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 é:

  • Menor que zero se string1 for menor que string2;
  • Igual a zero se string1 e string2 são iguais;
  • Maior que zero se string1 for maior que string2.

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:

  • strncmp - compara apenas os n primeiros caracteres das duas strings, sendo n um terceiro argumento.
  • stricmp - compara duas strings sem distinção entre maiúsculas e minúsculas. A sintaxe é igual à de strcmp. Essa função não faz parte da biblioteca padrão, mas é comumente encontrada como extensão particular de várias delas.

Exemplo

Vamos ver um exemplo utilizando algumas das funções mencionadas.

Respectiva saída:

Video Explicativo - Strings