Jump to content
Fórum Script Brasil
  • 0

Algorítimo em C com Arquivos de Texto, Vetores e Funções


Dejair Junior
 Share

Question

Bom dia galera!

Preciso de um auxílio pra resolver essa situação problema que me deparei no fim do semestre, acredito que para os grandes gurus da linguagem C isso seja tranquilo, porém para mim está como um túnel sem luz no final! Peço auxílio por favor!

Os links são dos arquivos de texto arquivo dados_coletados.txt (https://drive.google.com/file/d/0B7IzC05oTXBoMjVkLWZaNHBNSW8/view?usp=sharing) que contém os dados coletados pelo grupo que observou o trecho escolhido para o pedágio e o arquivo analise_pedagio.txt (https://drive.google.com/file/d/0B7IzC05oTXBoMjdBdFY5Tl9UUlE/view?usp=sharing) que contém o resultado esperado para o programa a ser desenvolvido.

Desde já agradeço muito a ajuda pra esse caso que preciso solucionar até dia 16 de novembro!

PEDÁGIO.jpg

Link to comment
Share on other sites

15 answers to this question

Recommended Posts

  • 0

Para abrir arquivos, utilize a função fopen. Para ler linha por linha do arquivo, utilize a função fgets, da stdio.h (ver primeiro exemplo).

Para ler uma linha em especifico, utilize sscanf:
 

 sscanf(linha, "%d %d %d %d %d", &semana, &dia, &hora, &carros, &motos, &caminhoes);

Onde semana, dia, hora, carros, motos e caminhoes são inteiros. O resto da lógica e análise, por enquanto, fica por você. Quando começar a trabalhar em cima do problema e enfrente alguma dúvida mais específica em relação a lógica, venha falar conosco!

Abraços.

Link to comment
Share on other sites

  • 0

acredito que o início do programa seja esse, porém acho que faltam variáveis relacionadas a cada dia da semana pro cálculo das médias, tipo domingo=1, segunda=2....etc

#include <stdio.h>
#include <stdlib.h>

int main()
{
    float vcarro=5, vmoto=2.5, vcami=10;//valores unitários de cada tipo de veículo
    float mcarro_dom, mmoto_dom, mcami_dom;//média do total de veículos em todos domingos
    float mcarro_seg, mmoto_seg, mcami_seg;//média do total de veículos em todas segundas-feiras
    float mcarro_ter, mmoto_ter, mcami_ter;//média do total de veículos em todas terças-feiras
    float mcarro_qua, mmoto_qua, mcami_qua;//média do total de veículos em todas quartas-feiras
    float mcarro_qui, mmoto_qui, mcami_qui;//média do total de veículos em todas quintas-feiras
    float mcarro_sex, mmoto_sex, mcami_sex;//média do total de veículos em todas sextas-feiras
    float mcarro_sab, mmoto_sab, mcami_sab;//média do total de veículos em todos sábados
    float valorm_dom, valorm_seg, valorm_ter, valorm_qua, valorm_qui, valorm_sex, valorm_sab;//valor médio por dia da semana, sendo considerado todas 5 semanas

    FILE *dados;
    dados = fopen("dados_coletados.txt", "r");//irá abrir o arquivo somente com permissão de leitura
    if (dados == NULL)
    {
        printf("Arquivo dados_coletados.txt não localizado!\n");//exibe mensagem de erro caso o arquivo não esteja na pasta de compilação
        system("pause");//pausa o sistema antes de reiniciar
        exit(1);//aborta o programa

//espaço pra absorver dados do arquivo e fazer os cálculos


    }
    fclose(dados);

FILE *estudo;
    estudo = fopen("estudo_pedagio.txt", "w");//irá abrir o arquivo com permissão de gravação
    if (estudo == NULL)
    {
        printf("Arquivo estudo_pedagio.txt não localizado!\n");//exibe mensagem de erro caso o arquivo não esteja na pasta de compilação
        system("pause");//pausa o sistema antes de reiniciar
        exit(1);//aborta o programa

//espaço pra escrever resultados obtidos no arquivo e demonstrar ao usuário


    }
    fclose(estudo);

    system("pause");
    return 0;
}

Link to comment
Share on other sites

  • 0

Não consigo entender como fazer o programa ler os dados específicos do arquivo dados_coletados.txt, por exemplo: ler todos a quantidade de carros em todas as horas (0-23), em todos domingos (dia 1), nas 5 semanas (1-5) para que a partir destes dados possa calcular as médias e grave em um novo arquivo estudo_pedagio.txt para ser demonstrado na tela. 

Para abrir arquivos, utilize a função fopen. Para ler linha por linha do arquivo, utilize a função fgets, da stdio.h (ver primeiro exemplo).

Para ler uma linha em especifico, utilize sscanf:
 

 sscanf(linha, "%d %d %d %d %d", &semana, &dia, &hora, &carros, &motos, &caminhoes);

Onde semana, dia, hora, carros, motos e caminhoes são inteiros. O resto da lógica e análise, por enquanto, fica por você. Quando começar a trabalhar em cima do problema e enfrente alguma dúvida mais específica em relação a lógica, venha falar conosco!

Abraços.

 

Durub:

O sscanf é para ler uma linha específica (sentence)? Qual a diferença para o fscanf? O que estou em dúvida também é q são 840 linhas no total em 7 dias para 5 semanas, deverei fazer então um sscanf para cada linha que preciso buscar determinado valor? Sendo assim então terei que criar variáveis para alocar os valores para os cálculos? Por exemplo: para receber a quantidade de carros no primeiro domingo da primeira semana.

Edited by Dejair Junior
Link to comment
Share on other sites

  • 0

A diferença é que se tiver uma linha mal formada, o programa continua sem problemas. Lendo uma linha por vez, caso a linha contenha problemas, a entrada continua ok para a próxima linha. Todavia, ainda é bom disparar um erro. Pode-se verificar quantos dados o sscanf leu com seu valor de retorno. Se ele for diferente de 5, um erro de leitura ocorreu.

O sscanf deverá estar em um loop, onde os dados são lidos e armazenados corretamente de acordo com a semana. Recomendo utilizar arrays (vetores) para fazer isso.

Abraços.

Link to comment
Share on other sites

  • 0
#include <stdio.h>
#include <stdlib.h>

typedef struct {
    int nSemana;
    int diaSemana;
    int hora;
    int nCarros;
    int nMotos;
    int nCaminhoes;
}Dados;

int main (){
    Dados d;
    
    FILE *f = fopen("dados_coletados.txt", "r");
    if ( f == NULL ){
        perror("Erro");
        getchar();
        return 1;
    }
    
    while(  fscanf(f,"%d %d %d %d %d %d%*c", &d.nSemana, &d.diaSemana, &d.hora, &d.nCarros, &d.nMotos, &d.nCaminhoes ) != EOF ){
        
        //Processar
        printf( "%d %d %2d %2d %2d %2d\n", 
            d.nSemana, d.diaSemana, d.hora, 
            d.nCarros, d.nMotos, d.nCaminhoes );
    }
    
    
    fclose(f);
    getchar();
    return 0;
}

Esse código lê completamente o arquivo dados_coletados.txt, depois disso você só precisa usar contadores para ir obtendo os dados. por exemplo, para obter os dados dos carros passados cada dia da semana você vai precisar de um vetor de inteiros tipo int nCarrosDia[7];, esse vetor vai guardar o total de carros durante uma semana. Nós sabemos que são 5 semanas, então podemos ter uma matriz em vez de um vetor, tipo int nCarros[5][7] (5 semanas de 7 dias). Si queremos contar os carros da segunda feira da semana 2 seria nCarros[1][0]++; por cada carro que passe esse dia. você vai precisar de algo parecido para motos e caminhões também, você pode agrupar tudo isso baixo uma estrutura, algo como:

#include <stdio.h>
#include <stdlib.h>
#define SEMANAS 5
#define DIAS 7

typedef struct {
    int nCarros   [DIAS];
    int nMotos    [DIAS];
    int nCaminhoes[DIAS];
}Contadores;

int main (){
    
    Contadores semana[SEMANAS] = {0}; // 5 semanas por 7 dias = um mes
    
    //contar 2 carros quarta feira da semana 3:
    
    semana[2].nCarros[2]++;
    semana[2].nCarros[2]++;
    
    printf ( "Quarta feira da semana numero 3 passaram %d carros.", semana[2].nCarros[2] );
    
    getchar();
    return 0;
}

 

Vou deixar um exemplo que diz todos os carros que passaram durante a encosta:

#include <stdio.h>
#include <stdlib.h>
#define SEMANAS 5
#define DIAS 7
#define HORAS 24

typedef struct {
    int nSemana;
    int diaSemana;
    int hora;
    int nCarros;
    int nMotos;
    int nCaminhoes;
}Dados;

typedef struct {
    int nCarros   [DIAS][HORAS];
    int nMotos    [DIAS][HORAS];
    int nCaminhoes[DIAS][HORAS];
}Contadores;

FILE *fileOpen();

int main (){
    Contadores semana[SEMANAS] = {0}; // 5 semanas por 7 dias = um mes
    Dados d;
    FILE *f = fileOpen();
    
    int allCar = 0;
    //lemos o arquivo e guardamos os numeros no array de structs Contador chamado semana.
    while(  fscanf(f,"%d %d %d %d %d %d%*c", &d.nSemana, &d.diaSemana, &d.hora, &d.nCarros, &d.nMotos, &d.nCaminhoes ) != EOF ){
        //Processar
        allCar += d.nCarros; // para comparar com contadorCarros e ver si bate o resultado, teoricamente é a mesma coisa, só que aqui obtenho o resultado desde o ficheiro, e mais abaixo desde a memoria.
        semana[ d.nSemana-1 ].nCarros   [d.diaSemana-1][d.hora] += d.nCarros;
        //semana[ d.nSemana-1 ].nMotos    [d.diaSemana-1][d.hora] += d.nMotos;
        //semana[ d.nSemana-1 ].nCaminhoes[d.diaSemana-1][d.hora] += d.nCaminhoes;
    }
    
    
    //Agora posso fazer coisas como contar o numero total de carros que passaram
    int s, _d, h, contadorCarros=0;
    for ( s = 0; s < SEMANAS; s++ ){
        for ( _d = 0; _d < DIAS; _d++ ){
            for ( h = 0; h < HORAS; h++ ){
                contadorCarros += semana[ s ].nCarros [_d][h];
                //printf ( "carros semana[%d] dia[%d] hora[%d]: %d\n", s, _d, h, contadorCarros );
            }
        }
    }
    
    //informar o numero total de carros desde a memoria
    printf ( "Todos os carros que passaram = %d(memoria) \n\n", contadorCarros);
    
    //informar o numero total de carros desde o arquivo para comparar com o resultado anterior
    //printf ( "Todos os carros que passaram = %d(arquivo) \n\n", contadorCarros);
    
    fclose(f);
    getchar();
    return 0;
}

FILE *fileOpen(){
    FILE* f = fopen("dados_coletados.txt", "r");
    if ( f == NULL ){
        perror("Erro");
        getchar();
        exit(1);
    }
    return f;
}

Como você pode ver, uma vez obtido os números desde o arquivo, você pode fazer o que quiser com ele, para obter o numero de carros total eu somei todos os carros que passaram em um contador durante as 5 semanas todos os 7 dias e 23 horas cada dia. isso me da o total de carros que passaram, para obter uma media deveria dividir esse números devidamente para obter o resultado. Mas as mates se me dão fatal hahaha, igual que a língua portuguesa. XD

Tente fazer seu código em base a esse si precisar de algo vai expondo aqui suas duvidas.

 

Sorte.

Link to comment
Share on other sites

  • 0

Valeu por hora VANGODP!

Como resultado deste problema tenho que implementar um código que apresente este resultado:

Numero de semanas: 5
Numero de dias por semana: 7

Valor pedagio para carros: R$ 5,00
Valor pedagio para motos: R$ 2,50
Valor pedagio para caminh?es: R$ 10,00

Domingo
-------
Numero medio de veiculos: 617,400
Numero medio de carros: 222,000
Numero medio de motos: 233,600
Numero medio de camihoes: 161,800
Rendimento medio por semana: R$ 3312,00

Segunda
-------
Numero medio de veiculos: 730,000
Numero medio de carros: 261,800
Numero medio de motos: 224,400
Numero medio de camihoes: 243,800
Rendimento medio por semana: R$ 4308,00

Terca
-------
Numero medio de veiculos: 619,600
Numero medio de carros: 201,600
Numero medio de motos: 214,600
Numero medio de camihoes: 203,400
Rendimento medio por semana: R$ 3578,50

Quarta
-------
Numero medio de veiculos: 733,400
Numero medio de carros: 206,200
Numero medio de motos: 240,200
Numero medio de camihoes: 287,000
Rendimento medio por semana: R$ 4501,50

Quinta
-------
Numero medio de veiculos: 654,000
Numero medio de carros: 171,600
Numero medio de motos: 228,600
Numero medio de camihoes: 253,800
Rendimento medio por semana: R$ 3967,50

Sexta
-------
Numero medio de veiculos: 598,000
Numero medio de carros: 195,200
Numero medio de motos: 214,200
Numero medio de camihoes: 188,600
Rendimento medio por semana: R$ 3397,50

Sabado
-------
Numero medio de veiculos: 537,200
Numero medio de carros: 204,800
Numero medio de motos: 137,200
Numero medio de camihoes: 195,200
Rendimento medio por semana: R$ 3319,00

Maior movimento ocorrido foi 65 veiculos na semana 3, dia 2, hora 0.

 

Sendo que o professor disse que no dia irá mudar valores para ver se o processamento está correto.
Como foi extremamente superficial os conteúdos ensinados por ser o primeiro nível, ele não ensinou STRUCT, acredito que seja semelhante à FUNÇÃO mas realmente fiquei sem muita compreensão, e outra coisa que fiquei sem entender é o símbolo de += em  (allCar += d.nCarros).
Fico no teu aguardo de mais auxílio!!

Link to comment
Share on other sites

  • 0

Bom dia amigo Durub,

não estou conseguindo entender essa matéria STRUCT e inclusive falei com um colega e ele disse que como não foi visto em aula o professor prefere que não coloque conteúdos não vistos em aula.

Teria como me ajudarem com esse código sem a utilização de STRUCT em C?

Fico no aguardo galera e desde já te agradeço!!!

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

  • Forum Statistics

    • Total Topics
      149.6k
    • Total Posts
      646.2k
×
×
  • Create New...