Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Exercício Particular

Olá amigos, tudo bem?

Vou explicar de maneira resumida essa parte do código que estou tendo problemas.

Na funcão MostraIMC (), eu preciso pegar os nomes e valores de IMC de pacientes, dados esses salvos em um arquivo .txt e, ordena-los em ordem alfabética. A variável max, recebe o valor retornado da função Contar (), que lê a quantidade de linhas que o arquivo possui e retorna esse valor. Ai, eu atribuo ao vetor de struct chamado ordenacao, o valor da variável max. Assim, consigo alocar todos os valores cadastrados para que sejam ordenados. O problema é: ele ordena os dados, porém, na hora de mostra-los, ele mostra apenas o 1º nome de paciente e o 1º valor de IMC, deixando os outros em branco.

Além do problema citado acima, a função MostraDiabeticos (), que deveria mostrar os nomes dos pacientes diabéticos (nesse caso, representado por glicemia > 120), também não está funcionando como deveria, uma vez que ela sempre mostra a mensagem de que não há pacientes diabéticos.

Obrigado desde já. Segue código:

int Contar () {

    int numreg = 0;
    pont_cadastro = fopen ("Cadastro_Pacientes.txt", "r");

    while ((fread(&dados_pacientes, sizeof(dados_pacientes), 1, pont_cadastro)) == 1) {
        numreg++;
    }

    fclose (pont_cadastro);
    return numreg;
}

void MostraIMC () {

    int max = Contar ();
    int i = 0, j = 0;
    struct dados auxiliar;
    struct dados ordenacao[max];

    if ((pont_calcIMC = fopen ("CalculoIMC.txt", "r")) == NULL) {

        printf("Erro ao abrir arquivo de IMC.\n");
        printf("Voce deseja cadastrar algum paciente para calcular o IMC? <s/n>\n");
        resposta = getche();

        if (toupper(resposta) == 'S') {
            CadastroPaciente ();
        }

        else {
            printf("Voce sera redirecionado para o Menu\n");
            system ("pause");
            Menu ();
        }
    }

    else {

        while ((fscanf(pont_calcIMC, "%s %f", dados_pacientes.nome_paciente, &dados_pacientes.imc)) != EOF) {

            strcpy (ordenacao[i].nome_paciente, dados_pacientes.nome_paciente);
            ordenacao[i].imc = dados_pacientes.imc;

            i++;
        }

        for (i = 0; i < max; i++) {

            for (j = i+1; j < max; j++) {

                if (strcmp (ordenacao[i].nome_paciente, ordenacao[j].nome_paciente) > 0) {

                    strcpy (ordenacao[i].nome_paciente, auxiliar.nome_paciente);
                    strcpy (ordenacao[i].nome_paciente, ordenacao[j].nome_paciente);
                    strcpy (ordenacao[j].nome_paciente, auxiliar.nome_paciente);

                    ordenacao[i].imc = auxiliar.imc;
                    ordenacao[i].imc = ordenacao[j].imc;
                    ordenacao[j].imc = auxiliar.imc;
                }
            }
        }

        for (i = 0; i < max; i++) {

            printf("Nome Paciente: %s\nValor IMC: %.2f\n\n", ordenacao[i].nome_paciente, ordenacao[i].imc);
        }
    }

    fclose (pont_calcIMC);
    system("pause");
    printf("Voce sera redirecionado para o Menu\n");
    system("pause");
}

void MostraDiabeticos () {

    if ((pont_cadastro = fopen ("Cadastro_Pacientes.txt", "r")) == NULL) {

        printf("Erro ao abrir arquivo de Pacientes Cadastrados.\n");
        printf("Voce deseja cadastrar algum paciente? <s/n>\n");
        resposta = getche();

        if (toupper(resposta) == 'S') {
            CadastroPaciente ();
        }

        else {
            printf("Voce sera redirecionado para o Menu\n");
            system ("pause");
            Menu ();
        }
    }

    else {

        int max = Contar ();
        int contador = 0, i = 0;
        struct dados diabeticos[max];

        while (fread(&dados_pacientes, sizeof (dados_pacientes), 1, pont_cadastro) == 1) {

            strcpy (diabeticos[i].nome_paciente, dados_pacientes.nome_paciente);
            diabeticos[i].glicemia = dados_pacientes.glicemia;

            if (diabeticos[i].glicemia > 120) {
                contador++;
            }

            i++;
        }

        if (contador == 0) {
            printf("Nao ha pacientes diabeticos.\n");
        }

        else {

            printf("Os pacientes diabeticos sao: \n");
            for (i = 0; i < max; i++) {

                if (diabeticos[i].glicemia > 120) {
                    printf("%s\n", diabeticos[i].nome_paciente);
                }
            }
        }
    }

    fclose (pont_cadastro);
    system("pause");
    printf("\nVoce sera redirecionado para o Menu\n");
    system("pause");
}
4 respostas

Oi Guilherme,

Coloca seu código completo para eu tentar rodar e verificar o que está faltando?

Abraço!

solução!

Joviane, boa noite.

Consegui resolve-lo agora a tarde, hahaha.

O problema da função MostraIMC estava na ordem do primeiro strcpy. Eu estava atribuindo um valor vazio a ordenacao[i].nome_paciente com o i valendo 0 e ele estava "perpetuando" esse valor, por isso o erro.

Já na função MostraDiabeticos, o erro estava na posição da variável max que chamava a função Contar. Aparentemente, o arquivo era aberto a primeira vez para leitura na função MostraDiabeticos e, depois, quando eu chamava a função Contar, ele era reaberto para leitura, sobrepondo o primeiro. Com isso, o loop while nem era executado na função MostraDiabeticos. Apenas declarando o max no começo da função, resolvi meu problema.

Obrigado pela disposição.

Devo deletar este tópico?

Opa Guilherme,

O importante é que você conseguiu resolver. Só marca a sua resposta como solução que está tudo certo. :)

Qualquer dúvida só falar!

Abraço!

Pronto!

Muito Obrigado!