2
Good night! I am doing a work in C where I have to look for doctors by specialty, that is, I ask the user the name of the specialty to look for and I make a printf of the doctors of that specialty. I tried to do it but it always gives me "Expertise enixestente." even looking for a specialty that I know is in the file.
Someone can help me?
So far my code is this:
struct hora_entrada{int horas, minutos;};
struct hora_saida{int horas, minutos;};
typedef struct medico med, *p_med;
struct medico{
char nome[ST_TAM];
char especialidade[ST_TAM];
struct hora_entrada h_e;
struct hora_saida h_s;
p_med prox;
};
struct data_nasc{int dia, mes, ano;};
struct historico{
char grau[ST_TAM];
int d_dia;
int d_mes;
int d_ano;
char nome[ST_TAM];
};
typedef struct paciente pac, *p_pac;
struct paciente{
char nome[ST_TAM];
struct data_nasc d_n;
int consultas;
struct historico h;
p_pac prox;
};
//Listagem completa de medicos e pacientes
int le_dados (){
FILE *f, *g;
med *v;
pac *a;
int i;
f=fopen("medico.txt", "rt");
g=fopen("paciente.txt", "rt");
if (f==NULL || g==NULL){
printf("Erro no acesso ao ficheiro.\n");
return 0;
}
v=malloc(sizeof(med));
a=malloc(sizeof(pac));
if (v==NULL || a==NULL){
printf("Erro na alocaçao de memoria.\n");
return 0;
}
med *listaMedicos = v; //a lista começa no v, o primeiro médico
med *antMed = NULL;
printf("\nMEDICOS\n");
while (fscanf(f,"%49[^\n] %49s %d.%d - %d.%d\n",v->nome, v->especialidade, &v->h_e.horas, &v->h_e.minutos, &v->h_s.horas, &v->h_s.minutos )==6 ){
printf("%s\n%s %d.%d %d.%d\n",v->nome, v->especialidade, v->h_e.horas, v->h_e.minutos, v->h_s.horas, v->h_s.minutos);
v->prox = malloc(sizeof(med)); //aloca um nó para o próximo médico
antMed = v; //ponteiro para o médico antes do fim
v=v->prox;
}
if (antMed == NULL){ //não deu para ler nenhum médico, libertar o único nó alocado
free(listaMedicos);
listaMedicos = NULL; //por o a apontar para NULL para a impressão funcionar
}
else{
free(antMed->prox); //libertar o último médico alocado que não foi utilizado
antMed->prox = NULL; //por a apontar para NULL para a impressão funcionar
}
pac *listaPacientes = a; //a lista começa no a, o primeiro paciente
pac *antPac = NULL;
printf("\n\nPACIENTES\n");
while (fscanf(g,"%49[^\n] %d-%d-%d %d",a->nome, &a->d_n.dia, &a->d_n.mes, &a->d_n.ano, &a->consultas)==5){
printf("Nome: %s\nData de nascimento: %d-%d-%d\nConsultas: %d\n",a->nome, a->d_n.dia, a->d_n.mes, a->d_n.ano, a->consultas);
for(i=0;i<a->consultas;i++){
fscanf(g,"%s - %d/%d/%d - %[^\n]\n",a->h.grau, &a->h.d_dia, &a->h.d_mes, &a->h.d_ano, &a->h.nome);
printf("\t%s %d/%d/%d %s\n",a->h.grau, a->h.d_dia, a->h.d_mes, a->h.d_ano, a->h.nome);
}
a->prox = malloc(sizeof(pac)); //alocar um nó para o próximo paciente
antPac = a; //ponteiro para o paciente antes do fim
a = a->prox;
}
if (antPac == NULL){ //não deu para ler nenhum paciente, libertar o único nó alocado
free(listaPacientes);
listaPacientes = NULL; //por a apontar para NULL para a impressão funcionar
}
else{
free(antPac->prox); //libertar o ultimo paciente alocado que não foi utilizado
antPac->prox = NULL; //por a apontar para NULL para a impressão funcionar
}
fclose(f);
}
//Pesquisar médicos por especialidade
int pesquisa (p_med v){
char esp;
printf("Insira uma especialidade a pesquisar:\n");
scanf("%s", &esp);
while (v!=NULL && v->especialidade!=esp)
v=v->prox;
if (v!=NULL)
printf("%s\n",v->nome);
else
printf("Especialidade enixestente.\n");
}
int menu() {
int op;
printf("\n1 - Listagem completa de medicos e pacientes");
printf("\n2 - Pesquisar medicos por especialidade");
do {
printf("\nEscolha uma opcao: ");
scanf("%d", &op);
} while (op < 1 || op > 2);
return op;
}
int main(int argc, char *argv[]) {
int i;
// Ponteiro de lista
med *v;
p_med lista = v;
do {
i = menu();
switch (i) {
case 1: le_dados();
break;
case 2: pesquisa(lista);
break;
}
} while (i != 2);
return 0;
}
You stated
esp
as a char variable that will accept only one character, and you need to declare as a string that is represented as a character array, that is, you should declare sochar *esp;
and then you can use the functionstrstr()
to check if there is any occurrence.– gato
thank you! I already did that, but it still says "Nonexistent specialty"... :
– Joana Santos
Do so modify the
while
of functionpesquisa()
forwhile (v!=NULL && !strstr(v->especialidade,esp))
and see if it works.– gato
Still not working :S
– Joana Santos
You could post the whole code instead of the pieces so we can test?
– Gustavo Fragoso
I’ve already edited, I really appreciate your help!
– Joana Santos