LA – Ling C – Aula 07A – Vetores e Exercicios

Vetores

Um vetor (ou uma matriz unidimencional ou também conhecida como variável indexada) é uma coleção de variáveis de mesmo tipo que compartilham um mesmo nome.

São variáveis que podem conter diversos valores e seus valores podem ser acessados através de um índice numérico. (iniciado pelo índice 0 (zero))

Para facilitar a idéia, imagine-o como uma tabela e em cada linha temos um valor.

vetor_exemplo-R02

Declaração e Atribuição

Vetores precisam ser declarados, informando seu tipo e tamanho, como qualquer outra variável.

Os elementos de um vetor são armazenados em uma seqüência contínua na memória. O que diferencia a declaração de um vetor de outra variável são os colchetes envolvendo a quantidade de valores que o vetor poderá ter. Além disso, durante a declaração um vetor pode ser inicializado usando o operador de atribuição e os valores separados por vírgula, delimitado entre chaves.

A atribuição de um valor num vetor é feito por um número entre colchetes. Voltando a analogia da tabela, o número referencia a linha desejada. o índice da primeira linha é sempre ZERO.

Exemplos:

float notas[80];
int ultdias[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
int medias[] = {8,7,9,10,3}
notas[2] = 10; // atribuí o valor 10 para a terceira linha
scanf("%d", &ultdias[3]); //obtem um valor inteiro do teclado e guarda 
                          //na quarta linha, mudando o valor atual

Representação

Na memória, os dados de um vetor são armazenados seqüencialmente. Na verdade o nome do vetor é um endereço para o primeiro valor do vetor alocado em memória. Quando referenciamos o índice 2 de um vetor, na verdade estamos referenciando o endereço do primeiro valor mais dois, ou seja, o terceiro valor em memória.
Considere o vetor int notas[4] = {8, 10, 7, 8};
Na memória, ele seria armazenado da seguinte forma:

endereco_memoria

A representação é uma forma simples que podemos imaginar o formato de um vetor, a qual pode ser visto verticalmente e horizontalmente:

[0][valor x]
[1][valor y]
[2][valor w]
[3][valor z]

ou
[x][y][w][z]
[0][1][2][3]

Exemplo – Usando Vetores

Escreva um programa que leia 10 números positivos informados pelo usuário, guarde em um vetor. No final leia o vetor novamente e imprima o maior deles.
exemplo_vetor01

Neste exemplo, iremos repetir a proposta do exercício anterior, porém deixando nosso código mais flexivel.
exemplo_vetor02

Strings

Em C, um dos usos mais comuns de um vetor é aplicado à criação de tipos de dados para manipular textos, como palavras, nomes ou sentenças.
Uma string é um vetor do tipo char que armazena caracteres e seu término é identificado pelo caractere ‘\0’. Sendo um vetor, cada elemento de uma string é independente e pode ser acesso pelo índice do vetor.
Já usamos diversas vezes strings constantes, como no exemplo:
printf(“Ola C!”);
Na memória, este texto é armazenado da seguinte forma:

string_memoria

Função getchar

O scanf pode se comportar de maneira inesperada para a leitura de variáveis do tipo char. Isto ocorre pois o é um caractere “deixado” pela função no buffer do teclado.
Se usarmos uma sequência de duas leituras com o scanf, sendo que a segunda é a leitura de um tipo char, teremos problemas com o deixado: ele será lido e guardado na variável char, sem permitir que o usuário informe algo.
Para resolvermos isso, podemos usar a função getchar. Ela aguarda o próximo caractere da entrada padrão (teclado) e retorna o caractere lido.

Sintaxe
variavel = getchar();

Inicialização de Strings

Como strings são vetores do tipo char, podemos usar o mesmo formato para inicializá-las:

char nome[] = {‘T’,’E’,’X’,’T’,’O’,’\0′};

Desta forma, precisamos colocar o caractere de final de string!
Além disso, tratando-se de strings, temos uma outra forma de inicialização, bem mais simples:

char nome[] = “TEXTO”;

O compilador se encarrega de colocar o caractere de final de string!

Exibição de Strings

Para exibir strings, podemos usar a já conhecida função printf em conjunto com o caractere de controle %s.

Além disso, podemos usar a função puts, passando a variável ou constante string
desejada.

Além disso, podemos fazer a exibição caractere a caractere, usando o printf em conjunto com o caractere de controle %c.

Exemplo 4 – Exibição de Strings

O programa abaixo inicializa duas strings (vetores de caracteres) e faz a exibição destes textos das 3 formas apresentadas.
exemplo_string01

Leitura de Strings

Para ler strings do teclado podemos usar a função scanf em conjunto com o caractere de controle %s. No final do texto é automaticamente adicionado o caractere ‘\0’.

Entretanto esta função considera o espaço em branco como final de texto, inviabilizando seu uso para leitura de textos mais complexos.

Quando usamos o scanf para leitura de strings, a variável não acompanha o operador &. Isto ocorre pois um vetor sem seu índice já é o endereço do primeiro valor do vetor.

Sendo mais conveniente, podemos usar a função gets, passando a variável string desejada. Esta função lê uma string até que seja pressionado o e coloca o caractere NULL no final do texto obtido.

Exemplo 5 – Leitura de Strings

O programa abaixo lê duas strings (vetores de caracteres) das formas apresentadas e depois as exibe em tela.

exemplo_string02

Outras funções

Os compiladores oferece várias funções para trabalhar com strings. Algumas das mais úteis, são:

strlen, strcat, strcmp e strcpy

Todas estas funções recebem endereços de strings, portanto podemos utilizá-las de diversas formas, algumas bastante criativas.

Função strlen

strlen(string) – Retorna o comprimento da string fornecida. O caractere NULL não é contado.

Exemplo 6 – Utilização do strlen
exemplo_strlen

Função strcat

strcat (string_destino, string_origem) – Concatena (junta) as duas strings, acrescentando o texto da string de origem no final da string de destino.
Cuidado! Esta função não verifica se a string de destino tem espaço suficiente para a segunda string ser adicionada.

Exemplo 7 – Utilização do strcat
exemplo_strcat

Função strcmp

strcmp(string1, string2) – Compara as duas strings. Se forem iguais, retorna zero. Se a string1 for maior que a string2, retorna um número maior que zero. Se a string2 for maior que a string1, retorna um número menor que zero. Nesta função, “maior que” e “menor que” referem-se à ordem alfabética

Exemplo 8 – Utilização do strcmp
exemplo_strcmp

Função strcpy

strcpy(string_destino, string_origem) – Copia a string de origem sobre a string de destino.

Exemplo 9 – Utilização do strcpy
exemplo_strcpy

Obs: Material desenvolvido pelo professor César Tofanini, adaptado pelo professor Rodrigo Saito.

 

Exercícios Extra-Classe

Treinamento em Código 1

exercicio_treinamento_vetores01

Treinamento em Código 2

exercicio_treinamento_vetores02

Treinamento em Código 3

exercicio_treinamento_vetores03_Parte1

exercicio_treinamento_vetores03_Parte2

Treinamento em Código 4

exercicio_treinamento_vetores04

Treinamento em Código 5

exercicio_treinamento_vetores05

Treinamento em Código 6

exercicio_treinamento_vetores06_Parte1

exercicio_treinamento_vetores06_Parte2

Treinamento em Código 7

exercicio_treinamento_vetores07.JPG

Exercícios: (Professor Peter)

  1. Escreva um programa que leia um conjunto de 20 valores inteiros fornecidos pelo usuário, armazenando-os em um vetor e depois exibindo-os na mesma ordem em que foram dados.
  2. Escreva um programa que leia um conjunto de 20 valores reais fornecidos pelo usuário, armazenando-os em um vetor e depois exibindo-os em ordem inversa da entrada, isto é, o último, o penúltimo e assim por diante até o primeiro.
  3. Escreva um programa que leia um conjunto de 25 valores reais fornecidos pelo usuário, armazenando-os em um vetor e depois exibindo sua soma total (seu somatório) e sua média aritmética.
  4. Escreva um programa que receba como entrada dois conjuntos de 20 valores inteiros que serão armazenados em vetores distintos. Sabendo que em cada conjunto não existem valores repetidos, mas que podem existir valores idênticos entre os conjuntos, o programa deve determinar quais elementos do primeiro vetor tem um correspondente no segundo vetor, exibindo uma lista com as seguintes informações:
    valor: posicaoArranjo1 — posicaoArranjo2
  5. Escreva um programa que realize a entrada dos valores relativos a dois vetores inteiros de 10 elementos, realizando a soma destes vetores, elemento a elemento (oi-ésimo elemento de um arranjo é somado com o i-ésimo elemento do outro arranjo), produzindo um terceiro arranjo com o mesmo número de elementos. Apresentar os 3 vetores.
  6. Escreva um programa que preencha um vetor com 20 elementos com a seqüência 1 ..20. Em seguida o programa deveembaralhar os elementos do arranjo, isto é, deve organizá-los desordenadamente (aleatóriamente). Dica: pesquise como funcionam as funções rand() e srand(int) da biblioteca padrão.
  7. Faça um programa que leia as notas das duas provas de programação de uma classe, armazenando cada conjunto em um vetor distinto. Depois deve ser calculada a média aritmética de cada aluno sendo tais resultados armazenados em um terceiro arranjo. O programa também deve calcular a média da classe em cada prova.
Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s