Voltar Lista de Tópicos

Editar | Versões | Fórum de Discussão

Prazos para Envio


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.

  1. 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

  1. 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:

  • 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!


Questões

Questão 1
Questão 2
Questão 3
Questão 4
Questão 5
Questão 6

Comentários...

Não há comentários ainda... Seja o primeiro!