Jump to content
Sign in to follow this  
p3druh77

Gestão Clinica Dentária- Listas Ligadas, problema ao ler arquivo

Recommended Posts

p3druh77

Boas...Tou a fazer um trabalho que é a gerir uma clinica, mas tou com um problema ao marcar consulta...Basicamente, consigo inserir uma  consulta, mas quando o programa a lê aparece só simbolos (função ler_consultas ou lista_consultas), ainda por cima uso o mesmo metodo nos dentistas e corre todo bem...Precisava de um grande ajuda....Obrigado

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


typedef struct dentista{ //struct dentista
        int numero;
        char codigo[10];
        char nome[100];
        int cont;
        struct Elem *consulta;
        }DENTISTA;
        
typedef DENTISTA Info;
typedef struct Elem {
        Info node;
        struct Elem *next;
} Elemento;

typedef struct consulta{//struct dados da consulta
        int dia;
        int mes;
        int hora;
        char paciente[50];
        char sala[5];
        float preco;
        }CONSULTA;
typedef CONSULTA InfoMAR;

typedef struct ElemMAR{//consultas
        InfoMAR nodeMAR;
        struct ElemMAR*next;
        }ElementoMAR;
        
        
// ler do teclado os dados de um dentista
DENTISTA le_dentista(){
            DENTISTA dentista;
            printf("Introduza o codigo:\n");
            fflush(stdin);
            gets(dentista.codigo); 
            printf("Introduza o nome\n");
            fflush(stdin);
            gets(dentista.nome); 
            printf("Introduza o contribuinte\n");
            scanf("%d",&dentista.cont);
            return dentista;
}

int insere_ordenado(Info v, Elemento **inicio){//insere dentistas ordenados por contribuinte
    Elemento *novo=NULL, *actual=NULL, *anterior=NULL;
    // alocar memoria para o novo
    novo = (Elemento *) malloc(sizeof(Elemento));
    novo->node= v; 
    novo->next= NULL; 
    //
    actual=*inicio;
    while (actual!=NULL &&v.cont > actual->node.cont){
          anterior= actual;
          actual= actual->next;
    }
    if (anterior == NULL){ // insercao no inicio
          novo->next= actual; //
          *inicio= novo;      //
    }else{  // insercao no meio, ou no final da lista
          novo->next= anterior->next; // 
          anterior->next= novo;      // 
    }
    return 0;  
}

void escreve_dentista(DENTISTA dentista){//lista ecra
     printf("----------------------------\n");
     printf("Codigo:   %s\n",dentista.codigo);
     printf("Nome:     %s\n",dentista.nome);
     printf("Contribuinte:  %d\n",dentista.cont);
     printf("----------------------------\n");
}
void lista_dentista(Elemento *inicio){
    Elemento *aux;
    if (inicio == NULL)
       printf("Lista Vazia!\n");
    else
        for(aux=inicio; aux!=NULL; aux=aux->next)
                    escreve_dentista(aux->node); 
}

void liberta(Elemento **inicio){
    Elemento *actual= NULL, *anterior=NULL;
    
    for(actual=*inicio; actual!=NULL; ){
            anterior = actual;
            actual=actual->next;
            free(anterior);                    
    }
    *inicio = NULL;
}
int totaldentista(Elemento *inicioLista){//conta structs
      if (inicioLista == NULL){ // lista vazia
         return 0;
      }else{
         return (1 + totaldentista(inicioLista->next));
         }
}
void grava(Elemento *inicio) {//grava dentistas
    FILE *fp;
    int ndent=0;
    Elemento *actual=inicio;
    
    fp=fopen("Dentista.dat","wb");
    if (fp != NULL) {
        ndent =  totaldentista(inicio);
	      fwrite(&ndent,sizeof(int),1,fp);
	      for(  ;actual!=NULL; actual=actual->next){
	            fwrite(&(actual->node),sizeof(Info),1,fp);
        }
	      fclose(fp);
	      printf("Dados guardados com sucesso\n");
	      return;
	   } 
    printf("Ocorreu um erro ao guardar os dados\n");
}

int ler(Elemento **inicio) {//le ficheiro dentistas
   FILE *fp;
    int n_dent=0, i;
    Elemento *ultimo = NULL;
  	 
    fp=fopen("Dentista.dat","rb");
   if (fp != NULL) {
		   fread(&n_dent,sizeof(int),1,fp);
		   printf("Numero Dentistas: %d\n\n", n_dent);;
		   if (n_dent == 0){ 
             *inicio = NULL; // Lista vazia
      }else{
            // insercao do 1? elemento
            *inicio = (Elemento *)malloc(sizeof(Elemento));
            fread(&((*inicio)->node ),sizeof(Info),1,fp);
            (*inicio)->next = NULL;
            ultimo = *inicio;
		         for(i=1; i<n_dent; i++){  // insercao a partir do 2? elemento
               ultimo->next= (Elemento *)malloc(sizeof(Elemento));
               fread(&(ultimo->next->node),sizeof(Info),1,fp);
               ultimo= ultimo->next;
               ultimo->next = NULL;
            }
      }
      fclose(fp);
		   return n_dent;
   }
    return 0;
}
int consulta_ordenada(InfoMAR a, ElementoMAR **inicio){//insere consulta ordenada
ElementoMAR *novo=NULL, *actual=NULL, *anterior=NULL;
    // alocar memoria para o novo
    novo = (ElementoMAR *) malloc(sizeof(ElementoMAR));
    novo->nodeMAR= a; 
    novo->next= NULL; 
    //
    actual=*inicio;
    while (actual!=NULL &&a.dia > actual->nodeMAR.dia){
          anterior= actual;
          actual= actual->next;
    }
    if (anterior == NULL){ // insercao no inicio
          novo->next= actual; //
          *inicio= novo;      //
    }else{  // insercao no meio, ou no final da lista
          novo->next= anterior->next; // 
          anterior->next= novo;      // 
    }
    return 0;  
}

CONSULTA marca_consulta(char cod[5], Elemento **inicio, Elemento *aux){//marcaçao consulta
      Elemento *actual= *inicio, *anterior = NULL;
     CONSULTA consulta;

    do{
       printf("Introduza o mes\n");
       scanf("%d",&consulta.mes);
       if(consulta.mes<1 || consulta.mes>12){
                        printf("Mes incorrecto! Tente outra vez\n");
                        }
    }while(consulta.mes<1 || consulta.mes>12);
     do{
       printf("Introduza o dia\n");
       scanf("%d",&consulta.dia);
       if(consulta.dia<1|| consulta.dia>31){
                        printf("Dia incorrecto! Tente outra vez\n");
                        }
    }while(consulta.dia<1 || consulta.dia>31);
    do{
       printf("Introduza a hora\n");
       scanf("%d",&consulta.hora);
       if(consulta.hora<8|| consulta.hora>20){
                        printf("Hora incorrecta!\nHorario de funcionamento:\n8h00 as 20h00\nTente outra vez\n");
                        }
    }while(consulta.hora<8 || consulta.hora>20);
     printf("Introduza a Sala\n");fflush(stdin);
     gets(consulta.sala);
    printf("Introduza o nome do paciente\n");
    fflush(stdin);
    gets(consulta.paciente);
    printf("Dentistas:\n");
    lista_dentista(aux);
    printf("Introduza o codigo do Dentista\n");
    gets(cod);
     while(actual!=NULL && strcmp(cod, actual->node.codigo)!=0){
                        anterior = actual;
                        actual  = actual->next;
     }
     if (actual != NULL &&  strcmp(cod, actual->node.codigo)==0){  // codigo encontrado
       if(anterior==NULL){
               printf("Dentista Encontrado\n");
               
        }
         
     }else{
           printf("Erro: Dentista nao encontrado!\n");
           exit(1);
     }
     printf("Consulta Marcada com sucesso!\n\n");
     printf("----------------------------------\n");
     printf("Dia:%d||Mes:%d||Hora:%d||Sala:%s\n",consulta.dia, consulta.mes, consulta.hora,consulta.sala);
     printf("Dentista: %s\n",cod);
     printf("Paciente: %s\n",consulta.paciente);
     printf("-----------------------------------\n");
     }
void escreve_consultas(CONSULTA consulta){//escreve consultas para o ecra
     DENTISTA dentista;
     printf("----------------------------------\n");
     printf("Dia:%d||Mes:%d||Hora:%d||Sala:%s\n",consulta.dia, consulta.mes, consulta.hora,consulta.sala);
     printf("Dentista: %s\n",dentista.codigo);
     printf("Paciente: %s\n",consulta.paciente);
     printf("-----------------------------------\n");

}
void lista_consultas(ElementoMAR *inicio, Elemento *auxiliar){
    ElementoMAR *aux;
    char cod[5];
    Elemento *actual=auxiliar, *anterior=NULL;
    if (inicio == NULL)
       printf("Lista Vazia!\n");
    else{
         lista_dentista(auxiliar);
         printf("Introduza o codigo do Dentista\n");
         fflush(stdin);
         gets(cod);
         while(actual!=NULL && strcmp(cod, actual->node.codigo)!=0){
                        anterior = actual;
                        actual  = actual->next;
                        }
         if (actual != NULL &&  strcmp(cod, actual->node.codigo)==0){  // codigo encontrado
            if(anterior==NULL){
               printf("Dentista Encontrado\n");     
        }
     }else{
           printf("Erro: Dentista nao encontrado!\n");
           system("PAUSE");
     }
        for(aux=inicio; aux!=NULL; aux=aux->next){
                    escreve_consultas(aux->nodeMAR);
                    }
                    }
}
void consulta_simples(ElementoMAR *inicio){
    ElementoMAR *aux;
    if (inicio == NULL)
       printf("Lista Vazia!\n");
    else{
        for(aux=inicio; aux!=NULL; aux=aux->next){
                    escreve_consultas(aux->nodeMAR);
                    }
                    }
}

int totalconsultas(ElementoMAR *inicioLista){//contar o numero de estruturas
      if (inicioLista == NULL){ // lista vazia
         return 0;
      }else{
         return (1 + totalconsultas(inicioLista->next));
         }
}
void grava_consultas(ElementoMAR *inicio) { //grava consultas 
    FILE *arq;
    int nconsultas=0;
    ElementoMAR *actual=inicio;
    
    arq=fopen("Consultas.dat","wb");
    if (arq!= NULL) {
        nconsultas =  totalconsultas(inicio);
	      fwrite(&nconsultas,sizeof(int),1,arq);
	      for(  ;actual!=NULL; actual=actual->next){
	            fwrite(&(actual->nodeMAR),sizeof(Info),1,arq);
        }
	      fclose(arq);
	      printf("Dados guardados com sucesso\n");
	      return;
	   } 
    printf("Ocorreu um erro ao guardar os dados\n");
}

int ler_consultas(ElementoMAR **inicio) {//le consultas gravadas aqui está o erro
   FILE *arq;
    int n_con=0, i;
    ElementoMAR *ultimo = NULL;
  	 
    arq=fopen("Consultas.dat","rb");
   if (arq != NULL) {
		   fread(&n_con,sizeof(int),1,arq);
		   printf("Numero Consultas: %d\n\n", n_con);;
		   if (n_con == 0){ 
             *inicio = NULL; // Lista vazia
      }else{
            // insercao do 1? elemento
            *inicio = (ElementoMAR *)malloc(sizeof(ElementoMAR));
            fread(&((*inicio)->nodeMAR),sizeof(InfoMAR),1,arq);
            (*inicio)->next = NULL;
            ultimo = *inicio;
		         for(i=1; i<n_con; i++){  // insercao a partir do 2? elemento
               ultimo->next= (ElementoMAR *)malloc(sizeof(ElementoMAR));
               fread(&(ultimo->next->nodeMAR),sizeof(InfoMAR),1,arq);
               ultimo= ultimo->next;
               ultimo->next = NULL;
            }
      }
      fclose(arq);
		   return n_con;
   }
    return 0;
}
int main()
{
int op, op2, numero;
Elemento *lista = NULL; // apontador para o incio da lista de dentistas
ElementoMAR *lista2=NULL;
char  cod[5];
CONSULTA consulta;
ler(&lista);
ler_consultas(&lista2);

do{
  printf("******************CLIVIANA******************\n");
      printf("*[1]-Inserir Dentista\t\t\t   *\n");
       printf("*[2]-Listar Dentista\t\t\t   *\n");
       printf("*[3]-Marcar Consulta\t\t\t   *\n");
       printf("*[4]-Historico Consultas Realizadas\t   *\n");
       printf("*[5]-Listar Consultas por Dentista\t   *\n");
       printf("*[6]-Alterar dados da consulta\t\t   *\n");
       printf("*[7]-Exportar XML\t\t\t   *\n");
       printf("*[0]-Sair\t\t\t\t   *\n");
       printf("*Introduza a sua opcao\t\t\t   *\n");
       scanf("%d",&op);
   switch (op) {
	  case 1 : system("cls");
               printf("MENU>>INSERIR DENTISTAS\n");
            insere_ordenado(le_dentista(),&lista);
         			break;
  	case 2 : system("cls");
               printf("MENU>>LISTAR DENTISTAS\n");
		         lista_dentista(lista);
		         break;
        case 3:
               system("cls");
               printf("MENU>>MARCAR CONSULTA\n");
               consulta_ordenada(marca_consulta(cod,&lista,lista),&lista2);
               break;
        case 4:system("cls");
              printf("MENU>>HISTORICO DE CONSULTAS\n");
              //lista_historico(lista2);
		         break;
             break;
        case 5:
               system("cls");
              printf("MENU>>LISTAR CONSULTAS\n");
		        lista_consultas(lista2,lista);
		         break;
        case 6:
              system("cls");
              printf("MENU>>ALTERAR DADOS DAS CONSULTAS\n");
              /*do{
              menu_altera();
              printf("Introduza uma opcao\n");
              scanf("%d",&op2);
              switch(op2){
                          case 0: system("cls");
                                  main();
                                  break;
                          case 1: system("cls");
                                  printf("MENU>>ALTERAR DADOS DAS CONSULTAS>>ALTERAR DATA\n");
                                  altera_data(lista2,lista2,lista);
                                  break;
                          }
                          }while(op!=0);*/
              break;
        case 7:
              system("cls");
              printf("MENU>>EXPORTAR XML\n");
		         break;
        

   }
}while (op != 0);

grava(lista);
liberta(&lista);
grava_consultas(lista2);

} 

Desde já muito obrigado a todos

Share this post


Link to post
Share on other sites
RSFalcon7

Não percebi esta parte do código da funcao ler_consultas:

arq=fopen("Consultas.dat","rb");
           if (arq != NULL) {
                           fread(&n_con,sizeof(int),1,arq);
...
      }else{
            // insercao do 1? elemento
            *inicio = (ElementoMAR *)malloc(sizeof(ElementoMAR));
            fread(&((*inicio)->nodeMAR),sizeof(InfoMAR),1,arq);
...
            }
      }

supostamente o programa entra no else com arq=NULL logo nunca vais conseguir ler.

Share this post


Link to post
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
Sign in to follow this  

×
×
  • 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.