Vetores 2
Imprimindo Vetores
Uma tarefa comum ao lidar com vetores é imprimir o seu conteúdo na tela. Você pode fazer isso imprimindo posição-a-posição.
#include <stdio.h>
int main()
{
float lista_temperaturas[7]={35.0, 32.5, 15.3, 20.2, 31.5, 40.0, 27.2};
printf("Dia 1: %.2f\n", lista_temperaturas[0]);
printf("Dia 2: %.2f\n", lista_temperaturas[1]);
printf("Dia 3: %.2f\n", lista_temperaturas[2]);
printf("Dia 4: %.2f\n", lista_temperaturas[3]);
printf("Dia 5: %.2f\n", lista_temperaturas[4]);
printf("Dia 6: %.2f\n", lista_temperaturas[5]);
printf("Dia 7: %.2f\n", lista_temperaturas[6]);
return 0;
}
Essa estratégia, porém, não é adequada, imagine um vetor de 300.000 posições! Para isso, utilize uma estrutura de repetição para percorrer o vetor da primeira até a última posição e imprimir cada posição. Vamos alterar o programa acima para utilizar a estrutura For.
#include <stdio.h>
int main()
{
float lista_temperaturas[7]={35.0, 32.5, 15.3, 20.2, 31.5, 40.0, 27.2};
int index;
for(index=0; index<7; index++)
{
printf("Dia %i: %.2f\n", index + 1, lista_temperaturas[index]);
}
return 0;
}
No código acima, criamos uma variável chamada index que vai fazer a contagem de 0 à 6 e utilizamos a estrutura de repetição For para imprimir cada posição do vetor lista_temperaturas. Repare que ao invés de utilizar valores fixos para acessar as posições do vetor, utilizamos a variável index (lista_temperaturas[index]). Dessa forma, como a variável index inicia com valor 0 e é incrementada até 6 (index < 6), todas as posições serão impressas na tela. Também, utilizamos a própria variável index para apresentar o dia da semana referente a temperatura, no comando printf .
Leitura de Vetores
Até esse ponto, você utilizou valores fixos pré-definidos para preencher o vetor lista_temperaturas no momento da sua declaração. Porém, em aplicações reais, os vetores são criados vazios e devem ser preenchidos a partir de dados provenientes de um arquivo ou a partir de valores digitados pelo usuário do seu programa. Altere o programa para pedir as temperaturas aos usuários do programa:
#include <stdio.h>
int main()
{
float lista_temperaturas[7]; //remova os dados inicialização
int index;
printf("Digite a temperatura do dia 1: ");
scanf("%f", &lista_temperaturas[0]);
printf("\nDigite a temperatura do dia 2: ");
scanf("%f", &lista_temperaturas[1]);
printf("\nDigite a temperatura do dia 3: ");
scanf("%f", &lista_temperaturas[2]);
printf("\nDigite a temperatura do dia 4: ");
scanf("%f", &lista_temperaturas[3]);
printf("\nDigite a temperatura do dia 5: ");
scanf("%f", &lista_temperaturas[4]);
printf("\nDigite a temperatura do dia 6: ");
scanf("%f", &lista_temperaturas[5]);
printf("\nDigite a temperatura do dia 7: ");
scanf("%f", &lista_temperaturas[6]);
printf("-----------TEMPERATURAS REGISTRADAS-------------\n\n");
for(index=0; index<7; index++)
{
printf("Dia %i: %.2f\n", index + 1, lista_temperaturas[index]);
}
return 0;
}
No programa acima, solicitamos ao usuário a temperatura referente a um dia da semana usando o printf e, em seguida, fazemos a leitura da temperatura digitada pelo usuário com o comando scanf. Armazenando-a na sua respectiva posição no vetor. Desse modo, a temperatura do primeiro dia foi armazenada na posição 0 (zero) do vetor, a do segundo dia na posição 1, até a última posição.
Repare na sintaxe dos comandos scanf acima. Utilizamos o caractere de controle "%f", indicando o tipo float, e informamos a posição do vetor para armazenar cada informação: &lista_temperaturas[0], &lista_temperaturas[1], ..., &lista_temperaturas[6].
Do mesmo modo que fizemos para a saída de dados de um vetor, devemos também utilizar uma estrutura de repetição para fazer a sua leitura. Altere o programa acima para substituir a leitura de cada posição individual por uma estrutura de repetição:
#include <stdio.h>
int main()
{
float lista_temperaturas[7]; //remova os dados inicialização
int index;
for(index=0; index<7; index++)
{
printf("\nDigite a temperatura do dia %i: ", index + 1);
scanf("%f", &lista_temperaturas[index]);
}
printf("-----------TEMPERATURAS REGISTRADAS-------------\n\n");
for(index=0; index<7; index++)
{
printf("Dia %i: %.2f\n", index + 1, lista_temperaturas[index]);
}
return 0;
}
Nesse ponto, temos duas estruturas de repetição for, uma para entrada e outra para saída. A primeira controla a entrada de 7 temperaturas no vetor lista_temperaturas e a segunda controla a impressão das informações armazenadas no vetor.
Lendo Vetores de Arquivos
As informações da entrada de dados de um programa não necessariamente são digitadas uma-a-uma pelo usuário. Uma forma muito comum de fornecer dados como entrada de um programa é obtê-los de um arquivo gravado em um dispositivo de armazenamento permanente do computador, como um disco rígido, um pen-drive, ou uma mídia óptica (CDs, DVDs, BlueRays). Vamos alterar o programa acima para ler as temperaturas de um arquivo texto.
- Abra o bloco de notas e adicione as temperaturas abaixo, uma por linha:
20.50
24.30
34.25
15.70
19.20
21.45
42.70
- Salve o arquivo na mesma pasta do seu programa com o nome "temperaturas.txt";
Vamos inserir um novo tipo de variável chamado PONTEIRO. Essa variável armazenará uma referência para um arquivo no disco. No nosso caso o arquivo é o temperaturas.txt.
#include <stdio.h>
int main()
{
FILE *arquivo; //variável ponteiro para um arquivo (FILE)
float lista_temperaturas[7];
int index;
for(index=0; index<7; index++)
{
printf("\nDigite a temperatura do dia %i: ", index + 1);
scanf("%f", &lista_temperaturas[index]);
}
printf("-----------TEMPERATURAS REGISTRADAS-------------\n\n");
for(index=0; index<7; index++)
{
printf("Dia %i: %.2f\n", index + 1, lista_temperaturas[index]);
}
return 0;
}
A grosso modo, o tipo FILE é um tipo especial para arquivos. Agora, precisamos "abrir" o arquivo temperaturas.txt em disco para que possamos fazer a leitura das temperaturas que ele armazena. Utilize a função fopen da biblioteca stdio.h para isso:
#include <stdio.h>
int main()
{
FILE *arquivo; //variável ponteiro para um arquivo (FILE)
float lista_temperaturas[7];
int index;
arquivo = fopen("temperaturas.txt", "r"); //abre o arquivo em modo de leitura
for(index=0; index<7; index++)
{
printf("\nDigite a temperatura do dia %i: ", index + 1);
scanf("%f", &lista_temperaturas[index]);
}
printf("-----------TEMPERATURAS REGISTRADAS-------------\n\n");
for(index=0; index<7; index++)
{
printf("Dia %i: %.2f\n", index + 1, lista_temperaturas[index]);
}
fclose(arquivo);
return 0;
}
A função fopen(nomeArquivo, modoAcesso) recebe dois parâmetros, o caminho para um arquivo em disco e o modo de acesso desejado, que pode ser leitura, escrita ou alteração. Nesse caso, a instrução arquivo = fopen("temperaturas".txt, "r"); abre o arquivo de nome temperaturas.txt em modo de leitura, indicado pelo parâmetro "r". A referência para o arquivo aberto é guardada na variável arquivo. Como o arquivo temperaturas.txt encontra-se na mesma pasta do programa executável, apenas o seu nome é suficiente para que a função fopen o encontre. Todo arquivo aberto precisa ser fechado ao final do programa. Fazemos isso na penúltima linha com a função fclose.
Uma vez que um ponteiro para o arquivo aberto já se encontra na variável arquivo, podemos fazer a leitura do seu conteúdo. Para isso, vamos utilizar uma função especial chamada fscanf(ponteiroArquivo, caractereControle, referenciaVariavel) da biblioteca stdio.h. Substitua os comandos printf e scanf da entrada de dados pelo fscanf de acordo com o código abaixo:
#include <stdio.h>
int main()
{
FILE *arquivo; //variável ponteiro para um arquivo (FILE)
float lista_temperaturas[7];
int index;
arquivo = fopen("temperaturas.txt", "r"); //abre o arquivo em modo de leitura
for(index=0; index<7; index++)
{
fscanf(arquivo, "%f", &lista_temperaturas[index]);
}
printf("-----------TEMPERATURAS REGISTRADAS-------------\n\n");
for(index=0; index<7; index++)
{
printf("Dia %i: %.2f\n", index + 1, lista_temperaturas[index]);
}
fclose(arquivo);
return 0;
}
A função fscanf recebe três parâmetros: a referência para o arquivo aberto (variável arquivo), o caractere que indica o tipo da informação que será lida do arquivo ("%f" indicando float) e a referência para a variável que armazenará a informação proveniente do arquivo (&lista_temperaturas[index]). Repare também que as chamadas a função fscanf são governadas pelo laço for que executa 7 vezes. Isso garante que as 7 temperaturas serão lidas do arquivo e armazenadas no vetor lista_temperaturas em suas respectivas posições.
Nesse ponto, aprendemos como fazer a entrada de dados em vetores, onde, os dados podem vir tanto a partir do teclado quanto a partir de informações gravadas em um arquivo. Também aprendemos como imprimir o conteúdo de vetores na saída do programa. Para isso utilizamos combinações da estrutura de repetição for com os comandos de entrada e saída desejados. A partir desse momento podemos explorar algumas computações sobre o conteúdo dos vetores.
Materiais Adicionais
Para mais informações sobre manipulação de arquivos em C veja:
- Tutorial: http://linguagemc.com.br/arquivos-em-c-categoria-usando-arquivos/
- Gravando em Arquivos:
-
Lendo de arquivos:
Operações com Vetores
Uma vez que as informações das temperaturas encontam-se armazenadas no vetor lista_temperaturas, podemos realizar algumas computações com esses valores. Vamos alterar o nosso programa para calcular a temperatura média a partir do vetor lista_temperaturas.
Adicione uma variável soma do tipo float e um outro laço for antes da chamada a função fclose(arquivio) ao final, como abaixo:
#include <stdio.h>
int main()
{
FILE *arquivo; //variável ponteiro para um arquivo (FILE)
float lista_temperaturas[7];
int index;
float soma=0.0; //armazena o somatório das temperaturas
arquivo = fopen("temperaturas.txt", "r"); //abre o arquivo em modo de leitura
for(index=0; index<7; index++)
{
fscanf(arquivo, "%f", &lista_temperaturas[index]);
}
printf("-----------TEMPERATURAS REGISTRADAS-------------\n\n");
for(index=0; index<7; index++)
{
printf("Dia %i: %.2f\n", index + 1, lista_temperaturas[index]);
}
for(index=0; index<7; index++)
{
//insira aqui o código para fazer o somatório das temperaturas
}
fclose(arquivo);
return 0;
}
Agora modifique o código para computar o somatório na variável soma:
#include <stdio.h>
int main()
{
FILE *arquivo; //variável ponteiro para um arquivo (FILE)
float lista_temperaturas[7];
int index;
float soma=0.0; //armazena o somatório das temperaturas
arquivo = fopen("temperaturas.txt", "r"); //abre o arquivo em modo de leitura
for(index=0; index<7; index++)
{
fscanf(arquivo, "%f", &lista_temperaturas[index]);
}
printf("-----------TEMPERATURAS REGISTRADAS-------------\n\n");
for(index=0; index<7; index++)
{
printf("Dia %i: %.2f\n", index + 1, lista_temperaturas[index]);
}
for(index=0; index<7; index++)
{
soma = soma + lista_temperaturas[index]; //somatório
}
fclose(arquivo);
return 0;
}
A variável soma no código acima irá acumular o valor de todas as temperaturas no vetor lista_temperaturas, uma vez que, a variável index irá variar da posição 0 até a posição 6, recuperando as respectivas temperaturas do vetor. Após isso, basta computar a média e apresentar o resultado:
#include <stdio.h>
int main()
{
FILE *arquivo; //variável ponteiro para um arquivo (FILE)
float lista_temperaturas[7];
int index;
float soma=0.0; //armazena o somatório das temperaturas
arquivo = fopen("temperaturas.txt", "r"); //abre o arquivo em modo de leitura
for(index=0; index<7; index++)
{
fscanf(arquivo, "%f", &lista_temperaturas[index]);
}
printf("-----------TEMPERATURAS REGISTRADAS-------------\n\n");
for(index=0; index<7; index++)
{
printf("Dia %i: %.2f\n", index + 1, lista_temperaturas[index]);
}
for(index=0; index<7; index++)
{
soma = soma + lista_temperaturas[index]; //somatório
}
printf("A temperatura média é: %.2f\n", soma/7.0)
fclose(arquivo);
return 0;
}
O comando printf adicionado imprime a média obtida pela divisão do conteúdo da variável soma pela quantidade. Execute o código e observe o resultado!