1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

SOS - estruturas e ficheiros binarios "c/c++"

Discussão em 'Programação' iniciada por bushin, 31 de Outubro de 2007. (Respostas: 5; Visualizações: 2033)

  1. Pessoal preciso de ajuda, o programa esta a gravar lixo ou seja qdo introduzo o 1º valor = 1 e 2º valor = 1, o resultado final deveria ser 2,3 e 3. fechando o programa e voltando a executar o programa escolhendo a segunda opçao mostrar dados anteriores ele estoira ou seja estoira na função void le_valores(struct struct_empresa *p)


    Código

    #include <stdio.h>
    #include <Windows.h>
    #include <conio.h>

    struct struct_empresa;

    struct struct_empresa{

    float liq_geral;
    float liq_reduzida;
    float liq_imediata;
    }dados[3];

    void liquidez(void);
    void le_valores(struct struct_empresa *);
    void guardar_valores(struct struct_empresa);


    void main(void){
    struct struct_empresa x;


    int opcao;

    printf("(prima 1) para calcular a liquidez\n");

    printf("(prima 2)mostrar dados anteriores\n\n");




    do{
    printf("(Escolha a opcao) ");
    opcao=getch();
    switch (opcao){
    case '1':
    system("cls");
    liquidez();
    break;

    case'2':
    system("cls");
    struct struct_empresa *data;
    le_valores(data);
    printf("liquidez geral %d\n liq_reduzida: %d\n liq_imediata: %d\n",data->liq_geral, data->liq_reduzida, data->liq_imediata);
    break;
    default:
    printf( "Op%c%co inv%clida!!! ",135,132,160);getch();
    printf( " ");
    break;
    }
    } while (opcao!='27');
    }



    void liquidez(){
    float prim;
    float seg;
    float liq_g;
    float liq_r;
    float liq_i;
    struct_empresa liquid;

    printf("introduza o primeiro numero: \n");
    scanf("%.2f",&prim);
    fflush(stdin);
    printf("introduza o segundo numero: \n");
    scanf("%.2f",&seg);
    //liquidez geral
    liq_g=prim+seg;
    liquid.liq_geral=liq_g;

    printf("liquidez geral: %.2f\n",liquid.liq_geral);

    //liquidez reduzida
    liq_r=(prim*2)+seg;
    liquid.liq_reduzida=liq_r;
    printf("liquidez reduzida: %.2f\n",liquid.liq_reduzida);

    //liquidez imediata
    liq_i=prim+(seg*2);
    liquid.liq_imediata=liq_i;
    printf("liquidez imediata: %.2f\n",liquid.liq_imediata);

    guardar_valores(liquid);

    }


    void guardar_valores(struct struct_empresa liquid){

    FILE *Liq;
    Liq=fopen("experiencia.dat","wb");

    if (!Liq)
    {
    printf("Erro a guardar ....!!");
    }


    fwrite(&liquid,sizeof(struct struct_empresa),1,Liq);
    fclose(Liq);

    }


    void le_valores(struct struct_empresa *p){

    FILE *Liq;

    if((Liq=fopen("experiencia.dat","rb"))==NULL)
    printf("Erro\n");

    fread((struct struct_empresa*)p,sizeof(struct struct_empresa),1,Liq);

    //printf("liquidez geral %d\n liq_reduzida: %d\n liq_imediata: %d\n",p->liq_geral, p->liq_reduzida, p->liq_imediata);
    fclose(Liq);
    }
     
  2. hYpe

    hYpe [email protected] Member

    Tive a fazer o debug, para te ajudar, e um dos teus problemas está no scanf da funçao liquidez().

    Em vez de:

    PHP:
    printf("introduza o primeiro numero: \n");
    scanf("%.2f",&prim);
    fflush(stdin);
    printf("introduza o segundo numero: \n");
    scanf("%.2f",&seg);
    deves por

    PHP:
    printf("introduza o primeiro numero: \n");
    scanf("%f",&prim);
    fflush(stdin);
    printf("introduza o segundo numero: \n");
    scanf("%f",&seg);
    (mudar de %.2f pra %f)

    Isto já faz com que os valores apareçam direitos. Eu sei que estás a tentar limitar a duas casas decimais, mas deve haver outra maneira de fazer (ja nao pego nisto ah muito tempo) que não essa.

    Em relaçao à leitura do ficheiro, vou ver agora... já ca venho fazer EDIT.

    EDIT: sorry mate.. não consegui ver onde estava o erro nisto dos ficheiros.. já não pegava nisto ah bue.. Eu assim q tiver tempo procuro pelos meus exercicios antigos q tem la carradas de cenas c ficheiros... Boa Sorte!
     
    Última edição: 31 de Outubro de 2007
  3. HecKel

    HecKel The WORM

    Ele deve limitar o número de casas decimais é na apresentação, na inserção de valores não deve restringir isso (e pelos vistos nem consegue).
     
  4. hYpe

    hYpe [email protected] Member

    Exactamente.. E' mesmo isso.. Ja' nao me lembrava hehe..

    Eu fiz o debug daquilo, mas como ja' nao pego nisto ha bue, ja nao sei onde esta' o erro..
     
  5. Obrigado pessoal pela dica.

    se se lembrarem de mais alguma , digam alguma coisa...
     
  6. SOS- urgente!!

    ja consegui resolver alguns problemas, mas continua a estoirar qdo consulto os dados anteriores :confused:

    #include <stdio.h>
    #include <Windows.h>
    #include <conio.h>

    struct struct_empresa;

    struct struct_empresa{

    float liq_geral;
    float liq_reduzida;
    float liq_imediata;
    };

    void liquidez(void);
    void guardar_valores(struct struct_empresa liquid);
    void mostrar_dados(void);



    int main(){


    //struct struct_empresa data;
    int opcao;

    printf("(prima 1) para calcular a liquidez\n");

    printf("(prima 2)mostrar dados anteriores\n\n");

    do{
    printf("(Escolha a opcao) ");
    opcao=getch();
    switch (opcao){
    case '1':
    system("cls");
    liquidez();
    break;
    case'2':
    system("cls");
    mostrar_dados();
    break;
    default:
    printf( "Op%c%co inv%clida!!! ",135,132,160);getch();
    printf( " ");
    break;
    }
    } while (opcao!='27');
    return (0);
    }

    void liquidez(void){
    float prim;
    float seg;
    float liq_g;
    float liq_r;
    float liq_i;
    struct_empresa liquid;

    printf("introduza o primeiro numero: \n");
    scanf("%f",&prim);
    fflush(stdin);
    printf("introduza o segundo numero: \n");
    scanf("%f",&seg);
    //liquidez geral
    liq_g=prim+seg;
    liquid.liq_geral=liq_g;

    printf("liquidez geral: %f\n",liquid.liq_geral);

    //liquidez reduzida
    liq_r=(prim*2)+seg;
    liquid.liq_reduzida=liq_r;
    printf("liquidez reduzida: %f\n",liquid.liq_reduzida);

    //liquidez imediata
    liq_i=prim+(seg*2);
    liquid.liq_imediata=liq_i;
    printf("liquidez imediata: %f\n",liquid.liq_imediata);

    guardar_valores(liquid);

    }

    void guardar_valores(struct struct_empresa liquid){

    FILE *Liq;
    Liq=fopen("experiencia.dat","wb");

    if (!Liq)
    {
    printf("Erro a guardar ....!!");
    }

    fwrite(&liquid,sizeof(struct struct_empresa),1,Liq);
    fclose(Liq);

    }

    void mostrar_dados(void){

    FILE *Liq;

    struct_empresa *p;


    if((Liq=fopen("experiencia.dat","rb"))==NULL){
    printf("Erro\n");
    }

    fread(p,sizeof(struct struct_empresa),1,Liq);

    printf("liquidez geral %f\n liq_reduzida: %f\n liq_imediata: %f\n",p->liq_geral, p->liq_reduzida, p->liq_imediata);


    fclose(Liq);

    }
     

Partilhar esta Página