Jump to content
p3druh77

Listar de ficheiro

Recommended Posts

p3druh77

Boas, estou a fazer um trabalho para a universidade, de um consultorio de dentista, tenho 4 funçoes, inserir dentista, inserir paciente, marcar consulta e listar as consultas por medico. Tou com um problema na função marcar consulta, nao consigo listar os pacientes e o Strcmp nao esta a funcionar.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct{
        char codigo[10];
        char nome[100];
        int cont;
        }DENTISTA;
typedef struct{
        int numero;
        char nome[100];
        int telefone;
        }PACIENTE;
typedef struct{
        int mes;
        int dia;
        int hora;
        }DATA;
int inserirDentista(){
    DENTISTA d;
    FILE *fp;
    fp=fopen("Dentista.dat","a+");
    if(fp==NULL){
                 printf("Erro abertura!");
                 return -1;
                 }
    printf("Introduza o Codigo\n");
    fflush(stdin);
    gets(d.codigo);
    printf("Introduza o Nome\n");
    gets(d.nome);
    printf("Introduza o numero de Contribuinte\n");
    scanf("%d",&d.cont);
    fprintf(fp,"%s %s %d\n",d.codigo,d.nome, d.cont);
    fclose(fp);
    
}
int inserirPaciente(){
    PACIENTE p;
    FILE* arq;
    arq=fopen("Paciente.dat","a+");
    if(arq==NULL){
                 printf("Erro abertura!");
                 return -1;
                 }
    printf("Introduza o Numero\n");
    scanf("%d",&p.numero);
    printf("Introduza o Nome\n");
    fflush(stdin);
    gets(p.nome);
    printf("Introduza o numero de Telefone\n");
    scanf("%d",&p.telefone);
    fprintf(arq,"%d %s %d\n",p.numero,p.nome, p.telefone);
    fclose(arq);
}
int marcaconsulta(char medico[100], char paciente[100]){
    DATA a;
    DENTISTA d;
    PACIENTE p;
    FILE* fp;
    FILE* arq;
    int n, num, nlidos;
    char aux[100], aux2[100];
    printf("Introduza o mes da consulta\n");
    scanf("%d",&a.mes);
    if(a.mes>12){
                 printf("Erro\n");
                  system("PAUSE");
                 return -1;
                 }
    printf("Introduza o dia\n");
    scanf("%d",&a.dia);
    if(a.dia>31){
                 printf("Erro\n");
                  system("PAUSE");
                 return -1;
                 }
    printf("Introduza a hora\n");
    scanf("%d",&a.hora);
    if(a.hora<8 && a.hora>20){
                 printf("Erro\n");
                  system("PAUSE");
                 return -1;
                 }
    fp=fopen("Dentista.dat","rb");
    if(fp==NULL){
                 printf("Erro abertura!\n");
                 return -1;
                 }
    arq=fopen("Paciente.dat","rb");
    if(arq==NULL){
                    printf("Erro abertura!\n");
                    return -1;
                    }
     while(fscanf(fp,"%s %s %s %d",d.codigo, d.nome, aux, d.cont)!=EOF){
     printf("Codigo: %s\n",d.codigo);
     printf("Nome: %s %s\n",d.nome,aux);//a variavel aux é para o apelido
     }
     printf("Introduza o codigo do Dentista\n");
     fflush(stdin);
     gets(medico);
     if(strcmp(medico,d.codigo)!=0){
                                    printf("Codigo do Medico nao encontrado\n");
                                    system("PAUSE");
                                    }
     while(fscanf(arq,"%d %s %s %d",p.numero, p.nome, aux2, p.telefone)!=EOF){
                            printf("Numero: %d\n",p.numero);
                            printf("Nome: %s %s\n",p.nome, aux2);
                            }
       printf("Introduza o codigo do Paciente\n");
       fflush(stdin);
       gets(paciente);
       fclose(fp2); 
}
int main(int argc, char *argv[])
{
    DENTISTA d;
    PACIENTE p;
    DATA a;
    int op;
    char medico[100], paciente[100], ficheiro[100];
    do{
    printf("CLIVIANA\n");
    printf("Menu:\n");
    printf("[1]-Inserir Dentista\n");
    printf("[2]-Inserir Paciente\n");
    printf("[3]-Marcar Consulta\n");
    printf("[4]-Listar Consultas\n");
    printf("[0]-Sair\n");
    scanf("%d",&op);
    switch(op){
               case 1:
                   inserirDentista();
                   system("cls");
                   break;
               case 2:
                    inserirPaciente();
                     system("cls");
                    break;
               case 3:
                    marcaconsulta(medico,paciente);
                     system("cls");
                    break;
               case 4:
                    break;
               case 0:
                    exit(1);
                    }
                    }while(op!=0);    
    
  system("PAUSE");	
  return 0;
}

Tudo corre bem, até que ao escolher o dentista, o programa deixa de funcionar.

Obrigado

Share this post


Link to post
Share on other sites
Localhost

Utiliza as tags code. [ code = C ] código aqui [ /code ], sem os espaços.

Depois disso vou poder analisar melhor o teu código e ajudar-te. Mas assim por alto já vi algumas coisas que te vou aconselhar a modificar no futuro.


here since 2009

Share this post


Link to post
Share on other sites
bubulindo

Importas-te de explicar qual é a hora que satisfaz esta condicão? ;)

if(a.hora<8 && a.hora>20){

Podes marcar aí uma consulta para 30 de Fevereiro, por favor.

    if(a.dia>31){

Eu não sou adepto do fflush(), mas não deverias fazer flush antes de dizeres às pessoas para escrever o nome do dentista?

printf("Introduza o codigo do Dentista\n");
     fflush(stdin);
     gets(medico);

Quanto à funcão strcmp() dentro da marcaconsulta() não percebi exactamente o que pretendes. Tu listas todos os médicos disponíveis que tens listados no ficheiro dos médicos, depois pedes para a pessoa inserir o nome do médico, e comparas esse nome com o do último nome de médico no ficheiro. Logo, se a pessoa não quiser esse médico, o programa dá sempre erro.

Não devias, depois de saber o nome do médico, fazer um ciclo para testar o nome do médico por cada linha que lês?

Acontece o mesmo com os pacientes.

Não olhei para o resto do programa...


include <ai se te avio>

Mãe () {

}

Share this post


Link to post
Share on other sites
p3druh77

Importas-te de explicar qual é a hora que satisfaz esta condicão? ;)

if(a.hora<8 && a.hora>20){

Abre das 8h00 as 20h00...Então quanto ao strcmp devo fazer

while(strcmp(medico,d.codigo))!EOF){ 
printf("Erro\n");
return -1;
}

E quanto ao erro de crashar? A que se deve?

Obrigado

Share this post


Link to post
Share on other sites
bubulindo

Se hora menor que 8 E hora maior que 20 -> Erro...

Qual é a hora que é menor que 8 E maior que 20?

Não será, OU???

Quanto ao outro problema, acho que tens de pedir o código. Procurar dentro do ficheiro se algum dos códigos lá guardados é igual ao código que o operador inseriu e se for, retirar todos os dados relativos a esse médico/paciente.

Quanto a crashar... antes de fazeres o strcmp, porque não imprimes ambas as strings que vais comparar? Talvez isso ajude a ver onde está o problema. Não fazia mal, especificares um pouco mais qual é o problema que ocorre... a janela fica parada sem fazer nada? Faz isto:

if(strcmp(medico,d.codigo)!=0){
                                    printf("Codigo do Medico nao encontrado\n");
                                    system("PAUSE");
                                    }
else{ printf("encontrei-o!!!\n");} 

     while(fscanf(arq,"%d %s %s %d",p.numero, p.nome, aux2, p.telefone)!=EOF){
                            printf("Numero: %d\n",p.numero);
                            printf("Nome: %s %s\n",p.nome, aux2);
                            }

Vê se realmente encontraste o médico ou não. Como não tens feedback vindo do sucesso da operacão de encontrar um médico, o problema pode estar no fscanf e não no strcmp. ;)

Assim de repente... que números de telefone escreveste no ficheiro paciente.dat? int vai de -32767 até 32768. Se queres um número de telefone em forma decimal, convém usares unsigned long (acho que já dá assim).

Mete aqui os resultados.


include <ai se te avio>

Mãe () {

}

Share this post


Link to post
Share on other sites
p3druh77

Quanto a crashar... antes de fazeres o strcmp, porque não imprimes ambas as strings que vais comparar? Talvez isso ajude a ver onde está o problema. Não fazia mal, especificares um pouco mais qual é o problema que ocorre... a janela fica parada sem fazer nada? Faz isto:

if(strcmp(medico,d.codigo)!=0){
                                    printf("Codigo do Medico nao encontrado\n");
                                    system("PAUSE");
                                    }
else{ printf("encontrei-o!!!\n");} 

     while(fscanf(arq,"%d %s %s %d",p.numero, p.nome, aux2, p.telefone)!=EOF){
                            printf("Numero: %d\n",p.numero);
                            printf("Nome: %s %s\n",p.nome, aux2);
                            }

Já exprimentei, continua no mesmo, crasha  com a mensagem " O programa deixou de funcionar".

Quanto ao strcmp ele só compara com o ultimo do ficheiro, tentei fazer um while mas nada, aqui fica o ciclo

while(!feof(fp)){
     fscanf(fp,"%s %s %s %d",d.codigo, d.nome, aux, d.cont);
     if(strcmp(medico,d.codigo)!=0){
                                    printf("Codigo nao encontrado\n");
                                    }
     else{
          printf("Medico encontrado\n");
          }
          }

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

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