Jump to content

Linguagem C manuseamento de ficheiros binarios.


ELKS
 Share

Recommended Posts

Alguem me poderia ajudar a resolver este enunciado? Algumas dicas, ou ate mesmo resulução preciso disto com muita urgencia! Agradecia 😁

Exercicio 2:

Contrua um programa, que le o ficheiro binario receita.dat, que contem os ingridientes, a quantidade em gramas e o peço de uma receita. devera informar o utilizador do valor total da receita, qual o ingridiente mais caro (nome e valor ). Considere que a informação foi gravada no ficheiro utilizando a seguinte estrutura:

typedef strcut{

char nome[100];

int quantidade;

float preco;

} INGREDIENTE;

Obrigado

Link to comment
Share on other sites

Eh pá...

A malta ajuda e tal... mas e como já disse (aliás, dissemos), a malta não está aqui para te resolver os trabalhos de casa.

E não leves isto a mal... eu estou a falar para teu bem. Agora estou a fazer um logger para a minha hamster e acredita que este teu TPC é bem mais interessante para os neurónios que isso, mas não vou sequer pensar nisto porque tu nem sequer esboçaste uma solução. Uma coisa é teres uma dúvida concreta e a gente ajuda, outra é estarmos aqui a fazer-te os trabalhos de casa.

E pensas tu: "Mas afinal tás a falar para meu bem? Porquê?"

Sim, estou... o objectivo destes exercícios é desenvolveres o raciocínio lógico e conheceres a linguagem de programação. O raciocínio lógico será importante para o resto da tua vida (se fores programador ou tiveres de lidar com programas), afinal é a única coisa que é comum a todas as linguagens de programação. A linguagem em questão é para poderes expressar o teu raciocínio lógico na resolução dum problema.

Logo agora tens várias hipóteses... ou reconheces que realmente não sabes programar e tens de aprender (existem bons livros para o nível que te é exigido agora) e aprendes agora como deve de ser.

Ou não aprendes agora, passas com exercícios semi-resolvidos por ti e depois mais tarde vais ter o triplo do trabalho a aprender a programar (em cerca dum quinto do tempo) para poderes acabar o curso em questão.

Ou por último passas às cadeiras, acabas o curso e depois tens de aprender a programar durante um fim de semana para poderes mostrar o resultado ao patrão.

Te garanto que a primeira é a melhor opção. Eu sei que é a melhor opção visto do meu ponto de vista... que já passei por onde estás e se existissem fóruns deste género nessa altura tinha feito exactamente o mesmo (talvez tivesse evitado usar a palavra enunciado) que tu. Não o fiz, consegui passar e depois mais tarde lá tive de aprender a programar para acabar o curso. Do teu ponto de vista o que importa é passar... mas acredita em mim quando digo que estás errado.

Também imagino o que estás a pensar agora... e não, a culpa não é da linguagem C... repara que nas opções listadas em cima não referi linguagem, mas sim o acto de programar. Porque o que importa desenvolver é o raciocínio... depois de teres desenvolvido o raciocínio numa perspectiva de programador, "qualquer" linguagem que uses será relativamente fácil de aprender uma vez que a parte mais difícil já sabes.

Tenta lá resolver o problema e se encontrares dúvidas/problemas pergunta e cá estaremos para te ajudar. 😁

As aspas do "qualquer" são apenas para abrir uma excepção a algumas linguagens também já referidas neste fórum.

Fica bem e boa sorte...

include <ai se te avio>

Mãe () {

}

Link to comment
Share on other sites

Ja comecei a fazer o programa, mas ha aqui coisas, continuando....

Tenho duvidas de como ir buscar os dados ao ficheiro binario receita.dat, e tirar de la para as variaveis na estrutura.

Depois como achar qual o ingrediente mais caro?

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

typedef struct{
        char nome[100];
        int quantidade;
        float preco;
} INGREDIENTE;

main(){
       
       INGREDIENTE stru;
       FILE *fp;
       
       fp = fopen("receitas.dat","rb");
       
       if( fp==NULL ){
           printf("Impossivel abrir o ficheiro\n");
       }else{
             fscanf("%c\n%d\n%f",stru.nome,stru.quantidade,stru.preco);
             fprintf("O valor total da receita é: %f",stru.preco);

««««««««««««««««««««««««««««««««««« FICHEIRO receita.dat

NOME,

QUANTIDADE,

PRECO.

OVOS

300 GRAMAS

0.50

ACUCAR

300 GRAMAS

0.50

FARINHA

250 GRAMAS

1

CHOCOLATE

150 GRAMAS

2.50

FERMENTO

5 GRAMAS

0.50

Link to comment
Share on other sites

Guest user14912

Primeiro, analisas linha a linha, crias uma variável do tipo de estrutura, e primeiramente pode armazenar os dados referente ao primeiro ingrediente, , em seguida testas se o próximo é mais caro e vais substituindo.

Link to comment
Share on other sites

sim, mas eu nao estou a conseguir tirar de la a informação que quero, nao a consigo apresentar no programa usando as variaveis, e nao sei que tipo de variavel me vai dizer qual e o valor mais elevado, e nao sei como vou somar todos os igredientes em termos de preço para me dar um total com todos eles na mesma variavel!

Obrigado

Link to comment
Share on other sites

Guest user14912

Primeiro, vais abrir o ficheiro e verificar, percorrer linha a linha até o seu final.

Para tal podes utilizar o feof: http://www.cplusplus.com/reference/clibrary/cstdio/feof/

Para extraíres os dados do ficheiro podes utilizar o fgets: http://www.cplusplus.com/reference/clibrary/cstdio/fgets/

E depois tens alocado num vector de x posições a tua linha pronta a ser tratada.

Sabes à priori que os dados têm o formato:

NOME,

QUANTIDADE,

PRECO

Portanto, vais ter string(nome), int(quantidade), int(preço) e é mesmo isso que tens de fazer dentro do ciclo da função eof que coloquei o link em cima, guardar esses dados em variáveis desse tipo.

Atenção: Tudo o que vem de um ficheiro é representado como string portanto irás de ter de converter primeiro com a função atoi os valores para poderes armazenar e fazer as operações desejadas.

atoi: http://www.cplusplus.com/reference/clibrary/cstdlib/atoi/

Penso que tens aí conteúdo suficiente e que baste para implementares isso, vá esforça-te um bocadinho e verás que no final serás recompensado 😁

Link to comment
Share on other sites

Eu sei que isto não está correcto, tou a tentar entender, mas isto nao esta a bater certo, claro que me estou a esforçar, mas ja montei o programa todo e isto nao esta a dar resultado, mas aqui vai, e depois a pressao que o professor me pos em cima nao e nada boa, tenho ate hoje a  00.00 para entregar este programa! tou mm....

aqui vai, uma ajudinha para isto arrancar como deve de ser sff.

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

typedef struct INGREDIENTE{
        char nome[100];
        int quantidade;
        float preco;
} INGREDIENTE;

main(){
       
       int n=0,i;       
       char fatoi[256];

       INGREDIENTE stru;
       FILE *fp;       

       fp = fopen("receitas.txt","rb");       

       if( fp==NULL ){
           printf("Impossivel abrir o ficheiro\n");
           
       }else{
           while(!feof(fp)){
           fgetc(fp);
           n++;
       }
       
           fgets(stru.nome,100,fp);
           puts(stru.nome);
           fgets(fatoi,256,stdin );
           i=atoi(fatoi);
           printf("O valor total é %d.\n",i);
       }
       
       fclose(fp);
       
system("pause");

}

Obrigado

Link to comment
Share on other sites

O que ainda tenho duvidas é como vou somar os ingridientes todos( o valor ), atribu-o uma variavel a cada um?( qual a funcao para o fazer?), ou da para fazer tudo com a mesma variavel? será que tenho de fazer um ciclo "for" para ele rodar o ficheiro de cima abaixo e ele memorizar cada preco que se situa de 3 em 3 linhas? ou faço um ciclo while que com um fgets ele podera conseguir tirar os preços de 3 em 3 linhas?

E depois como detecto qual deles e o maior? Esta receita tem 4 ingridientes, mas se for inserida uma com 5, tenho que fazer uma funçao que nao pode ser um "if" ou um "case", correcto?

Preciso de muita ajuda, e tenho alguma urgencia, desde ja agradeco a ajuda que me teem dado ate agora !

Obrigado

Link to comment
Share on other sites

Guest user14912

Em primeiro lugar penso que não valerá apena estares a por  fp = fopen("receitas.txt","rb");  , visto que não estás a ler nada em binário.

Em segundo lugar não percebes-te a estrutura do teu programa, lembra-te que primeiro terás de construir o algorimo na tua cabeça, e resolvê-lo, quando conseguires fazê-lo então tens o algoritmo 90% feito, é só passa-lo para o computador.

A estrutura é mais ou menos assim:


while(!feof(fp)){  //vais ate ao fim do file

     fgets() ... //obter linha
    
    //se for nome do produto entao
   
    strcpy(str.nome,variavel_do_fgets);

   //se for quantidade
   str.quantidade=atoi(variavel_do_fgets);

  //se for preco
  str.preco=atoi(variavel_do_fgets);

}

Isso é basicamente o que tens de fazer, mas toma atenção se fizeres exactamente o que aí está, no final do algoritmo terás os valores que correspondem a tua última linha do ficheiro, o que tens a fazer é um bloco condicional antes da atribuição, e assim verificar por exemplo se o preço que já tens alocado em memória é maior ou menor do que o preço que vem do ficheiro, e por aí em diante.

Se quiseres alocar todos os elementos, defines um vector de estruturas, e alocas os dados em cada posição do vector.

Por exemplo:

V[0].preco=atoi(valor_do_fgets);

E assim em diante 😁

Espero teres percebido os passos a seguir.

Link to comment
Share on other sites

Guest user14912

Que conhecimentos tens de ficheiros em C?

E em programação?

Estás a implementar este algoritmo, parti à partida que conhecesses os conceitos básicos para a sua implementação.

É claro que aquele troço de código foi só uma pequena amostra da ideia da estrutura do programa.

Link to comment
Share on other sites

Bom, já passou o prazo... conseguiste entregar algo?

Leste bem o meu post acerca de aprender a programar? Eu não estava a gozar nem a fazer pouco de ti, apenas te estou a dar um conselho que deves seguir.

Agora senta-te e tenta resolver o exercício. Não há pressão nenhuma... fá-lo agora para ti. Para aprenderes.

No entanto:

- Antes de começares com linhas de código, pensa naquilo que queres obter do programa e define variáveis para esses valores. Neste caso define as variáveis preco_total, ingrediente_caro_preco e ingrediente_caro_nome[]. Agora já tens um objectivo para o programa, certo? Ok.

- Depois fazes a primeira parte do problema que é recolher a informação que precisas. Então, vais ler o ficheiro linha a linha dentro dum ciclo até encontrares todos os dados que precisas.

- Quando vais ao continente e pedes 300 gramas de fiambre, como é que a operadora da caixa te calcula o preço? Da última vez que lá estive era multiplicando o preço por unidade (kg, unidade, litro, etc, etc) pela quantidade que ela pesou na balança.

- Não existem funções para tudo e mais alguma coisa em C... existem funções que estão feitas devido à utilidade que têm, e mesmo essas podem ser feitas por ti se quiseres. Aproveito para te dar um conselho, se conseguires fazer as funções que estão definidas no ficheiro string.h nunca mais vais ter problemas com strings. 😁

E isto vem acerca da tua dúvida para saberes se há uma função para te dar o maior número dum grupo... Tenho a certeza quase absoluta que esse foi um dos primeiros exercícios que te pediram para resolver antes de começares com ficheiros. Resolveste-o?

E nisto assenta outro ponto importante da programação... as coisas vão tendo precedência. E se não compreendes o funcionamento dum ciclo, ou de um apontador, não vais perceber como ler dados dum ficheiro ou seriar valores numa string ou usar funções. É tão simples como isso. Agora, que o prazo passou aproveita, pega num livro de C, lê e resolve os exercícios.

Se tiveres dúvidas, pergunta que cá estaremos para te ajudar. Nota que estamos para te ajudar em dúvidas específicas e não para te tentar ensinar uma linguagem. Isso tens de ser tu a fazer para que consigas perceber como programar.

Fica bem.

P.S.: Onde é que posso comprar 300 gramas de ovo?

include <ai se te avio>

Mãe () {

}

Link to comment
Share on other sites

Nao podes comprar 300 Gramas de ovo, mas cada ovo em estimativa, tem mais ou menos um peso, a minha namorada, com curso de pastelaria avançada, deu me esse numero, caso agora, eles nem usam ovo, chamam lhe pó de ovo, por causa das salmonelas, bla bla bla.

Nao nao consegui  o professor deu me ate hoje para entregar, porque eram dois e eu um consigui e outro esta a metade por isso ainda estou a precisar de ajuda em:

localizar de 3 em 3 linhas no ficheiro o que quero ( neste caso o preco )

adicinoar esses valores a uma variavel ou a varias

transmitir ao utilizador qual o ingridiente mais caro, analisando linha a linha ( qual funcao e que devo de usar para isso), e depois imprimir o nome e o valor

Obrigado

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.