Jump to content
joanacs

Como procurar um elemento num vetor de estruturas?

Recommended Posts

joanacs

Boa noite!
Estou a fazer um trabalho em ´C´ onde tenho de procurar médicos por especialidade, ou seja, pergunto ao utilizador o nome da especialidade a procurar e faço um ´printf´ dos médicos dessa especialidade.
Eu tentei fazer isso mas dá-me sempre "Especialidade inexistente." mesmo procurando por uma especialidade que sei que está no ficheiro. 

Alguém me consegue ajudar?

Até agora o meu código é este:

    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 inixestente.\n");

    }

 

Edited by joanacs

Share this post


Link to post
Share on other sites
HappyHippyHippo

comparação de string deverá ser realizada através da função strcmp, caso contrário o que estás a comparar é o valor dos ponteiros e não o valor das strings

Edited by HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
joanacs
6 horas atrás, HappyHippyHippo disse:

comparação de string deverá ser realizada através da função strcmp, caso contrário o que estás a comparar é o valor dos ponteiros e não o valor das strings

int pesquisa (p_med v){
    char *esp;
    printf("Insira uma especialidade a pesquisar:\n");
    scanf("%s", &esp);
    while (v!=NULL && strcmp(v->especialidade,esp))
        v=v->prox;
    if (v!=NULL)
        printf("%s\n",v->nome);
    else
        printf("Especialidade inexistente.\n");
}

É assim, certo? Eu fiz e continua a dizer "Especialidade inexistente" :s

Share this post


Link to post
Share on other sites
HappyHippyHippo

qual o valor de v ?

ps : confirma a tua resposta aqui no fórum com código


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
joanacs
3 horas atrás, HappyHippyHippo disse:

qual o valor de v ?

ps : confirma a tua resposta aqui no fórum com código

supostamente o v era o vetor de estruturas que criei na primeira função, mas provavelmente não está certo...

Share this post


Link to post
Share on other sites
HappyHippyHippo

pelo código que apresentas não posso precisar o que essa variável tem porque não apresentas o código da chamada da função, mas como a funçao le_dados não retorna nada, posso supor com segurança que o que passas para a função pesquisa não é o que foi lido na função prévia.


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
joanacs
2 horas atrás, HappyHippyHippo disse:

pelo código que apresentas não posso precisar o que essa variável tem porque não apresentas o código da chamada da função, mas como a funçao le_dados não retorna nada, posso supor com segurança que o que passas para a função pesquisa não é o que foi lido na função prévia.

Então tenho de alterar a função le_dados para "p_med le_dados()" e fazer "return v"?

A minha função main é esta:

int main(int argc, char *argv[]) {
    int i;
    // Ponteiro de lista
    p_med lista = NULL;
    char str[50]="pacientes.txt";

    do {
        i = menu();
        switch (i) {
            case 1: le_dados();
                break;
            case 2: pesquisa(lista);
                break;
           // case 3:
                break;
        }
    } while (i != 3);

    return 0;
}

 

Share this post


Link to post
Share on other sites
HappyHippyHippo

sim, tens de retornar os dados lidos na função le_dados e guardar na variavel lista

no código que tens, estás a passar o valor NULL para a função pesquisa


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
joanacs
1 hora atrás, HappyHippyHippo disse:

sim, tens de retornar os dados lidos na função le_dados e guardar na variavel lista

no código que tens, estás a passar o valor NULL para a função pesquisa

Obrigada! Achas que é assim?

p_med 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);
    return v;
}


//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 && strcmp(v->especialidade,esp))
        v=v->prox;
    if (v!=NULL)
        printf("%s\n",v->nome);
    else
        printf("Especialidade inexistente.\n");
}


//Listas ligadas
p_ag nova_marcacao(p_ag lista) {
    p_ag novo, aux;
    int escolha;

    novo=malloc(sizeof(ag));
    if (novo==NULL) {
        printf("Erro na alocaçao de memoria.\n");
        return lista;
    }

    printf("Nome: ");
    scanf(" %49[^\n]", novo->paciente);
    printf("\nEspecialidade: ");
    scanf(" %49[^\n]", novo->especialidade);
    printf("\nDeseja escolher o medico? (Sim - 1 | Nao - 0");
    scanf("%d", &escolha);
    if (escolha==1){
        printf("\nNome do medico: ");
        scanf(" %49[^\n]", novo->medico);
    }
    printf("\nGrau de urgencia: (Urgente - 1 | Normal - 0)");
    scanf(" %d", &novo->grau);
    if (novo->grau==1){
        printf("\nA sua marcacao sera feita o mais cedo possivel.\n");
    }
    else if (novo->grau==0){
        printf("Indique o periodo do dia preferencial: (Manha - 1 | Tarde - 0)\n");
        scanf("%d", &novo->p_dia);
        if (novo->p_dia==1){
            printf("Selecione um intervalo de tempo das 9.30 as 12.30 (ex: 9.30 - 10.30)\n");
            scanf("%d.%d - %d.%d", &novo->h_i_m.horas, &novo->h_i_m.minutos, &novo->h_f_m.horas, &novo->h_f_m.minutos);
        }
        else if (novo->p_dia==0){
            printf("Selecione um intervalo de tempo das 13.30 as 20.30 (ex: 13.30 - 14.30)\n");
            scanf("%d.%d - %d.%d", &novo->h_i_t.horas, &novo->h_i_t.minutos, &novo->h_f_t.horas, &novo->h_f_t.minutos);
        }
        else{
            printf("Erro na selecao do periodo.\n");
        }
    }
    else{
        printf("Erro na selecao do grau de urgencia.\n");
    }

    novo->prox=NULL;

    if (lista==NULL || novo->grau<lista->grau){
        novo->prox=lista;
        lista=novo;
    } else {
        aux=lista;
        while (aux->prox==NULL || aux->prox->grau <= novo->grau){
            if(aux->prox==NULL){
                aux->prox=novo;
                return lista;
            }
            aux=aux->prox;
        }
        novo->prox=aux->prox;
        aux->prox=novo;
    }
    return lista;
}


int menu() {
    int op;

    printf("\n\n1 - Novo paciente");
    printf("\n2 - Visualizar fila de espera");
    printf("\n3 - Atendimento");
    printf("\n4 - Desistencia");
    printf("\n5 - Terminar");
    printf("\n6 - Listagem completa de medicos e pacientes");
    printf("\n7 - Pesquisar medicos por especialidade");
    printf("\n8 - Listagem de pacientes com consultas numa determinada especialidade");
    do {
        printf("\nEscolha uma opcao: ");
        scanf("%d", &op);
    } while (op < 1 || op > 8);
    return op;
}


int main(int argc, char *argv[]) {
    int i;
    med *v;
    p_med lista = v;
    char str[50]="pacientes.txt";
    do {
        i = menu();
        switch (i) {
            case 1: le_dados();
                break;
            case 2: pesquisa(lista);
                break;
           // case 3:
                break;
        }
    } while (i != 3);

    return 0;
}

 

Share this post


Link to post
Share on other sites
HappyHippyHippo

novamente, qual  o valor que estás a passar para a função de pesquisa ? e porque?


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
joanacs
50 minutos atrás, HappyHippyHippo disse:

novamente, qual  o valor que estás a passar para a função de pesquisa ? e porque?

quero passar a lista ligada que criei na funçao le_dados porque tenho de apresentar os nomes dos médicos de uma determinada especialidade e penso que assim seja mais fácil.
Se conseguir passar esses valores depois, supostamente é só fazer printf de v->nome

Share this post


Link to post
Share on other sites
HappyHippyHippo
13 minutes ago, joanacs said:

quero passar a lista ligada que criei na funçao le_dados porque tenho de apresentar os nomes dos médicos de uma determinada especialidade e penso que assim seja mais fácil.
Se conseguir passar esses valores depois, supostamente é só fazer printf de v->nome

não responsdeste à questão.

dizer o que queres não é o mesmo que analizar código e confirmar com código o que realmente faz


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
joanacs

Eu sei, mas eu não sei bem como fazê-lo, por isso é que não consigo explicar por código :s

Share this post


Link to post
Share on other sites
HappyHippyHippo

eu não quero que explique com código.

quero que olhes para o teu código e respondas o que está a acontecer

int main(int argc, char *argv[]) {
    int i;
    med *v;
    p_med lista = v;
    char str[50]="pacientes.txt";
    do {
        i = menu();
        switch (i) {
            case 1: le_dados();
                break;
            case 2: pesquisa(lista);
                break;
           // case 3:
                break;
        }
    } while (i != 3);

    return 0;
}

novamente, diz o que está a ser passado para a função pesquisa ?

Edited by HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Nuno Bagulho Marques

Bom dia Joana

 

uma dica

strcmp(v->especialidade,esp) -> esta função retorna 0, quando as strings são iguais. portanto, deves negar a comparação

não recordo bem o C, mas acho que seria assim !strcmp(v->especialidade,esp)

Share this post


Link to post
Share on other sites
HappyHippyHippo
1 hour ago, Nuno Bagulho Marques said:

Bom dia Joana

 

uma dica

strcmp(v->especialidade,esp) -> esta função retorna 0, quando as strings são iguais. portanto, deves negar a comparação

não recordo bem o C, mas acho que seria assim !strcmp(v->especialidade,esp)

errado

o código que te referes é sobre a pesquisa e esse está bem, isto porque ela quer que a pesquisa continue enquanto as strings sáo diferentes, logo o resultado da função é diferente de zero

Edited by HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Nuno Bagulho Marques
9 minutos atrás, HappyHippyHippo disse:

errado

o código que te referes é sobre a pesquisa e esse está bem, isto porque ela quer que a pesquisa continue enquanto as strings sáo diferentes, logo o resultado da função é diferente de zero

certo! é isso mesmo! sorry

Estou mais no php e no MySql (não uma pesquisa assim)

 

 

Share this post


Link to post
Share on other sites
joanacs
9 horas atrás, HappyHippyHippo disse:

eu não quero que explique com código.

quero que olhes para o teu código e respondas o que está a acontecer


int main(int argc, char *argv[]) {
    int i;
    med *v;
    p_med lista = v;
    char str[50]="pacientes.txt";
    do {
        i = menu();
        switch (i) {
            case 1: le_dados();
                break;
            case 2: pesquisa(lista);
                break;
           // case 3:
                break;
        }
    } while (i != 3);

    return 0;
}

novamente, diz o que está a ser passado para a função pesquisa ?

 

a lista ligada que criei (p_med lista = v) que contém o vetor de estruturas criado na funçao le_dados com toda a informação do ficheiro de texto

Share this post


Link to post
Share on other sites
HappyHippyHippo

ok, tu disseste que estas a passar a lista que "criaste". Suponho que estas a basear essa presunção por ser esse ponteiro (lista) como argumento dessa função. Agora pergunto, porque achas tu que esse ponteiro tem essa lista? Qual a linha de código indica que esse ponteiro tem a lista que dizes ter?

Edited by HappyHippyHippo

IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
joanacs

pensei que ao fazer p_med lista = v, estaria a criar uma lista ligada com os elementos do vetor de estruturas... :s

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.