Ir ao conteúdo

Posts recomendados

Postado

Boa noite, preciso da ajuda de vocês, estou tentando criar um sistema de covid para o projeto da faculdade, porém não estou conseguindo desenvolver algumas coisas!

Preciso salvar em arquivo e quando eu salvo vem duplicado, preciso criar a opção pesquisar paciente e não consigo, preciso por a função cadastrar novo paciente? Preciso por login e senha ao entrar no sistema, e por ultimo o sitema quando eu cadastrar um paciente ele me informar se o paciente é maior de 65 anos e se for faz parte do grupo de risco e verificar se o paciente tem alguma comorbidade!

 

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h> //Biblioteca para usar a funçao strcmp
#include <conio.h>
#include <locale.h>

/* Começo Matriz*/

char name[50];
char email[50];
char cpf[11];
char birthDay[10];
char phoneNumber[15];
char street[50];
char streetNumber[10];
char neighborhood[30];
char city[30];
char state[2];
char cep[9];
char diagnosisDay[10];
char comorbidity[20];

// FUNÇÕES

int validate_password() {
    char login[20];
    char senha[20];
    int i, senha_ok;
    char c;

    do {
        system("CLS");
    printf(">>> Sistema de cadastro de pacientes diagnosticados com Covid-19 >>>\n\n\n\n\n");
    fflush(stdin);
    printf("Login: ");
    gets(login);
    printf("\nSenha: ");
    i = 0;
        while((c=getch())!=13){ //13 é o valor de ENTER na tabela ASCII
            senha[i]=c;
            i++;
            printf("*");      //imprime o * Anterisco
        }
        senha[i]='\0';

    senha_ok = strcmp(senha, "geovane");
    if(!senha_ok) return 1;
       } while (senha_ok);
}


int read_option(){ // Ler opções do programa
    int opcao, passagem = 0;

    do {
    system("cls");
        printf("Menu Principal\n");
        printf("--------------\n");
        printf("1- Cadastrar Paciente\n");
        printf("2- Consultar Paciente\n");
        printf("3- Pesquisar Paciente (Nome/CPF)\n");
        printf("0- Sair do Programa\n");
        if (passagem)
        printf("\n *** Opção inválida!\n");
    printf ("Escolha uma das opções:\n");
        printf(">>> ");
        scanf("%d",&opcao);
    getchar();
        printf("\n");
    if (opcao != 0 && opcao != 1 && opcao != 2 && opcao != 3) passagem = 0;

       } while (opcao != 0 && opcao != 1 && opcao != 2 && opcao != 3);
    return opcao;
}


/*
void pause(char mensagem[]){
    printf("%s",mensagem);
    getch();
}
*/

int salvar(void) {
    FILE *fp;

    fp = fopen("arquivo.txt", "a");

    if (fp == NULL) {
    return 0;
    }

    fprintf(fp, "%s", name);
    fprintf(fp, "%s", email);
    fprintf(fp, "%s", cpf);
    fprintf(fp, "%s", birthDay);
    fprintf(fp, "%s", phoneNumber);
    fprintf(fp, "%s", street);
    fprintf(fp, "%s", streetNumber);
    fprintf(fp, "%s", neighborhood);
    fprintf(fp, "%s", city);
    fprintf(fp, "%s", state);
    fprintf(fp, "%s", cep);
    fprintf(fp, "%s", diagnosisDay);
    fprintf(fp, "%s", comorbidity);

    fclose(fp);
    return 1;
}

void cadastrar(){
    system("cls");
    printf("<<< Entrada de paciente >>>\n\n\n ");
    printf("\nDigite o Nome do Paciente: ");
    scanf ("%[^\n]s", &name);
    getchar();
    printf("\nDigite o Email do Paciente: ");
    scanf ("%[^\n]s", &email);
    getchar();
    printf("\nDigite o CPF do Paciente ( Somente Numeros 😞 ");
    scanf ("%[^\n]s", &cpf);
    getchar();
    printf("\nData de nascimento do Paciente?\nNo formato DD/MM/AAAA: ");
    scanf ("%[^\n]s", &birthDay);
    getchar();
    printf("\nDigite o telefone do Paciente (Somente Numeros 😞 ");
    scanf ("%[^\n]s", &phoneNumber);
    getchar();
    printf("\nEndereço:\nLogradouro (rua, avenida, alameda ou outro): ");
    scanf ("%[^\n]s", &street);
    getchar();
    printf("\nNúmero: ");
    scanf ("%[^\n]s", &streetNumber);
    getchar();
    printf("\nBairro: ");
    scanf ("%[^\n]s", &neighborhood);
    getchar();
    printf("\nCidade: ");
    scanf ("%[^\n]s", &city);
    getchar();
    printf("\nEstado (sigla = XX): ");
    scanf ("%[^\n]s", &state);
    getchar();
    printf("\nCEP (no formato 99999-999): ");
    scanf ("%[^\n]s", &cep);
    getchar();
    printf("\nQual Dia do diagnostico?\nNo formato DD/MM/AAAA: ");
    scanf ("%[^\n]s", &diagnosisDay);
    getchar();
    printf("\n O paciente tem alguma comorbidade?");
    scanf ("%[^\n]s", &comorbidity);
    getchar();

    if (salvar()) printf ("\n\nDados do paciente salvo em arquivo!\n\n");
    else printf ("\n\nHouve um problema com a manipulação do arquivo.\n\n");

    system("pause");
}

/*
int comorbidity_option() { // ler tipos de comorbidades
    printf("Qual o tipo de comorbidade?\nEscolha entre as opções:\n");
    printf("1- Diabetes");
    printf("2- Obesidade\n");
    printf("3- Hipertensão\n");
    printf("4- Tuberculose\n");
    printf("Opção: ");
    scanf("%d",&x);
    printf("\n");
    return x;

}
*/

int consultar() {
    system("cls");
    FILE *fp;

    fp = fopen("arquivo.txt", "r");

    if (fp == NULL) {
    return 0;
    }

    fscanf(fp, "%s", &name);
    fscanf(fp, "%s", &email);
    fscanf(fp, "%s", &cpf);
    fscanf(fp, "%s", &birthDay);
    fscanf(fp, "%s", &phoneNumber);
    fscanf(fp, "%s", &street);
    fscanf(fp, "%s", &streetNumber);
    fscanf(fp, "%s", &neighborhood);
    fscanf(fp, "%s", &city);
    fscanf(fp, "%s", &state);
    fscanf(fp, "%s", &cep);
    fscanf(fp, "%s", &diagnosisDay);
    fscanf(fp, "%s", &comorbidity);

    fclose(fp);
    return 1;
}

int pesquisar() {
    system("cls");
    printf("*** Pesquisa sendo construída ***\n\n");
    system("pause");
}


void imprimir() {
    system("cls");
    printf ("*** Consulta de Paciente ***\n\n\n\n\n");
    printf ("Nome do Paciente: %s\n", name);
    printf ("E-mail: %s\n", email);
    printf ("Data de Nascimento: %s\n", birthDay);
    printf ("Telefone: %s\n", phoneNumber);
    printf ("Endereço:\n");
    printf ("%s número: %s bairro: %s\n", street, streetNumber, neighborhood);
    printf ("cidade: %s estado: %s CEP: %s\n", city, state, cep);
    printf ("Data do diagnóstico: %s\n", diagnosisDay);
    printf ("Comorbidade: %s\n", comorbidity);
    printf ("\n\n * Dados do paciente recuperados do arquivo *\n\n");
}

// FIM FUNÇÕES

int main()
{
    int opcao;
    setlocale(LC_ALL, "Portuguese");

    if(validate_password()) {
    do {
        opcao = read_option();
        switch(opcao)
        {
            case 0:
            system("cls");
            printf ("* Você acabou de sair do sistema *\n\n");
            system("pause");
            return 0;
            case 1:
            cadastrar();
            break;
            case 2:
            if (consultar()) imprimir();
                else printf ("\n\nHouve um problema com a manipulação do arquivo.\n\n");
            system ("pause");
            break;
            case 3:
            pesquisar();
            break;
        }
       } while (1);
    }
}
 

Postado

@GeovaneAvilla

1 hora atrás, GeovaneAvilla disse:

fflush(stdin);

O comportamento de fflush() para fluxos de entrada é indefinido, não o use dessa forma.

 

1 hora atrás, GeovaneAvilla disse:

gets(login);

Isso pode ocasionar um buffer overflow, você deve evitar usar gets(). No lugar disso, você pode usar fgets().

 

1 hora atrás, GeovaneAvilla disse:

scanf ("%[^\n]s", &name);

Está usando scanset negado de forma errada. O especificador deveria ser %[^\n], e não há & nesse caso, você está lendo uma string.

Não entendi o motivo de você ter usado gets() antes e agora estar usando scanf(), de qualquer forma, há uma solução bem mais simples:

fgets(frase, sizeof(frase), stdin);
frase[strlen(frase)-1] = 0;

 

1 hora atrás, GeovaneAvilla disse:

printf("\nDigite o Nome do Paciente: ");
scanf ("%[^\n]s", &name);
getchar();
printf("\nDigite o Email do Paciente: ");
scanf ("%[^\n]s", &email);
getchar();

Pra que todos esses getchar()'s depois dos scanf()'s? Dessa forma, você vai ter que apertar a tecla Enter duas vezes, isso se não tiver nenhum lixo no buffer.

 

1 hora atrás, GeovaneAvilla disse:

fscanf(fp, "%s", &name);

Aqui também vale aquilo de não precisar do &.

 

1 hora atrás, GeovaneAvilla disse:

printf("\nDigite o telefone do Paciente (Somente Numeros 😞 ");

Acho que não vai conseguir imprimir emojis dessa forma, não sei dar uma explicação a respeito disso.

Postado

@GeovaneAvilla Seria melhor se deixasse aí o enunciado da questão também, enfim...

 

Primeiramente, corrija lá o que eu lhe disse para corrigir e poste novamente o programa, usando o botão Code:

image.png.8ac2fe412f0a3fb12d53843b2bc762ce.png

Lembre-se de escolher a opção C, C++, C#, Java, Objective C antes de clicar em inserir.

 

1 hora atrás, Lucca Rodrigues disse:

O comportamento de fflush() para fluxos de entrada é indefinido, não o use dessa forma.

Você pode usar o seguinte no lugar de fflush(stdin):

int ch;
do {
    ch = fgetc(stdin);
} while (ch != EOF && ch != '\n');

É o que eu costumo usar, mas claro que existem várias outras formas de limpar o buffer.

É bem simples: fgetc() lê o caractere presente na posição atual do fluxo interno. Após a leitura, a posição atual é avançada para o próximo caractere, e isso se repete enquanto a condição do while for verdadeira.

 

No lugar de gets() e scanf(), quando lendo strings, use fgets() do jeito que lhe mostrei. É melhor e mais fácil.

 

Quanto ao resto, pode ler o que disse anteriormente, não tenho muito a acrescentar.

Postado

@Lucca Rodrigues

#include <stdio.h>
#include <stdlib.h>
#include <string.h> //Biblioteca para usar a funçao strcmp
#include <conio.h>
#include <locale.h>

/* Começo Matriz*/

    char *name;
    char *email;
    char *cpf;
    char *birthDay;
    char *phoneNumber;
    char *street;
    char *streetNumber;
    char *neighborhood;
    char *city;
    char *state;
    char *cep;
    char *diagnosisDay;
    char *comorbidity;

// variavel para leitura de dados

char leitura[50];

// variavel de tratamento do registro
char registro[297];

// ponteiro para arquivo
    FILE *fp;

// FUNÇÕES

int validate_password() {
    char login[20];
    char senha[20];
    int i, senha_ok;
    char c;

    do {
        system("CLS");
	printf(">>> Sistema de cadastro de pacientes diagnosticados com Covid-19 >>>\n\n\n\n\n");
	fflush(stdin);
	printf("Login: ");
	gets(login);
	printf("\nSenha: ");
	i = 0;
        while((c=getch())!=13){ //13 é o valor de ENTER na tabela ASCII
            senha[i]=c;
            i++;
            printf("*");      //imprime o * Anterisco
        }
        senha[i]='\0';

	senha_ok = strcmp(senha, "geovane");
	if(!senha_ok) return 1;
       } while (senha_ok);
}


int read_option(){ // Ler opções do programa
    int opcao, passagem = 0;

    do {
	system("cls");
        printf("Menu Principal\n");
        printf("--------------\n");
        printf("1- Cadastrar Paciente\n");
        printf("2- Consultar Paciente\n");
        printf("3- Pesquisar Paciente (Nome/CPF)\n");
        printf("0- Sair do Programa\n");
        if (passagem)
	    printf("\n *** Opção inválida!\n");
	printf ("Escolha uma das opções:\n");
        printf(">>> ");
        scanf("%d",&opcao);
	getchar();
        printf("\n");
	if (opcao != 0 && opcao != 1 && opcao != 2 && opcao != 3) passagem = 1;

       } while (opcao != 0 && opcao != 1 && opcao != 2 && opcao != 3);
    return opcao;
}


/*
void pause(char mensagem[]){
    printf("%s",mensagem);
    getch();
}
*/

void preencher_espacos(char *sequencia, int tamanho) {
    int tam, espacos, i;

    strcat(registro, sequencia);
    tam = strlen(sequencia);
    espacos = tamanho - tam;
    for (i=1;i<=espacos;i++) strcat(registro, " ");
}

void tratar_registro() {
    preencher_espacos(name, 50);
    preencher_espacos(email, 50);
    strcat(registro, cpf);
    strcat(registro, birthDay);
    preencher_espacos(phoneNumber, 15);
    preencher_espacos(street, 50);
    preencher_espacos(streetNumber, 10);
    preencher_espacos(neighborhood, 30);
    preencher_espacos(city, 30);
    strcat(registro, state);
    strcat(registro, cep);
    strcat(registro, diagnosisDay);
    preencher_espacos(comorbidity, 20);
}

int salvar() {

    fp = fopen("arquivo.txt", "a");

    if (fp == NULL) {
	return 0;
    }

    fprintf(fp, "%s", registro);

    fclose(fp);
    return 1;
}

int cadastrar() {
    system("cls");
    printf("<<< Entrada de paciente >>>\n\n\n ");

    fflush(stdin);
    printf ("\nDigite o Nome do Paciente: ");
    gets(leitura);
    name = (char *) calloc((strlen(leitura)+1), sizeof(char));
    if (!name)
        {
            printf ("** Erro: Memoria Insuficiente **");
                free(name);
            return 0;
        }
    strcpy(name, leitura);

    printf ("\nDigite o Email do Paciente: ");
    gets(leitura);
    email = (char *) calloc((strlen(leitura)+1), sizeof(char));
    if (!email)
        {
            printf ("** Erro: Memoria Insuficiente **");
                free(email);
            return 0;
        }
    strcpy(email, leitura);

    printf ("\nDigite o CPF do Paciente ( Somente Numeros ): ");
    gets(leitura);
    cpf = (char *) calloc((strlen(leitura)+1), sizeof(char));
    if (!cpf)
        {
            printf ("** Erro: Memoria Insuficiente **");
                free(cpf);
            return 0;
        }
    strcpy(cpf, leitura);

    printf ("\nData de nascimento do Paciente?\nNo formato DD/MM/AAAA: ");
    gets(leitura);
    birthDay = (char *) calloc((strlen(leitura)+1), sizeof(char));
    if (!birthDay)
        {
            printf ("** Erro: Memoria Insuficiente **");
                free(birthDay);
            return 0;
        }
    strcpy(birthDay, leitura);

    printf ("\nDigite o telefone do Paciente (Somente Numeros ): ");
    gets(leitura);
    phoneNumber = (char *) calloc((strlen(leitura)+1), sizeof(char));
    if (!phoneNumber)
        {
            printf ("** Erro: Memoria Insuficiente **");
                free(phoneNumber);
            return 0;
        }
    strcpy(phoneNumber, leitura);

    printf ("\nEndereço:\nLogradouro (rua, avenida, alameda ou outro): ");
    gets(leitura);
    street = (char *) calloc((strlen(leitura)+1), sizeof(char));
    if (!street)
        {
            printf ("** Erro: Memoria Insuficiente **");
                free(street);
            return 0;
        }
    strcpy(street, leitura);

    printf ("\nNumero: ");
    gets(leitura);
    streetNumber = (char *) calloc((strlen(leitura)+1), sizeof(char));
    if (!streetNumber)
        {
            printf ("** Erro: Memoria Insuficiente **");
                free(streetNumber);
            return 0;
        }
    strcpy(streetNumber, leitura);

    printf ("\nBairro: ");
    gets(leitura);
    neighborhood = (char *) calloc((strlen(leitura)+1), sizeof(char));
    if (!neighborhood)
        {
            printf ("** Erro: Memoria Insuficiente **");
                free(neighborhood);
            return 0;
        }
    strcpy(neighborhood, leitura);

    printf ("\nCidade: ");
    gets(leitura);
    city = (char *) calloc((strlen(leitura)+1), sizeof(char));
    if (!city)
        {
            printf ("** Erro: Memoria Insuficiente **");
                free(city);
            return 0;
        }
    strcpy(city, leitura);

    printf ("\nEstado: ");
    gets(leitura);
    state = (char *) calloc((strlen(leitura)+1), sizeof(char));
    if (!state)
        {
            printf ("** Erro: Memoria Insuficiente **");
                free(state);
            return 0;
        }
    strcpy(state, leitura);

    printf ("\nCEP: ");
    gets(leitura);
    cep = (char *) calloc((strlen(leitura)+1), sizeof(char));
    if (!cep)
        {
            printf ("** Erro: Memoria Insuficiente **");
                free(cep);
            return 0;
        }
    strcpy(cep, leitura);

    printf ("\nQual Dia do diagnostico?\nNo formato DD/MM/AAAA: ");
    gets(leitura);
    diagnosisDay = (char *) calloc((strlen(leitura)+1), sizeof(char));
    if (!diagnosisDay)
        {
            printf ("** Erro: Memoria Insuficiente **");
                free(diagnosisDay);
            return 0;
        }
    strcpy(diagnosisDay, leitura);

    printf ("\n O paciente tem alguma comorbidade?");
    gets(leitura);
    comorbidity = (char *) calloc((strlen(leitura)+1), sizeof(char));
    if (!comorbidity)
        {
            printf ("** Erro: Memoria Insuficiente **");
                free(comorbidity);
            return 0;
        }
    strcpy(comorbidity, leitura);

    tratar_registro();

    if (salvar()) printf ("\n\nDados do paciente salvo em arquivo!\n\n");

    else printf ("\n\nHouve um problema com a manipulação do arquivo.\n\n");

    free(name);
        free(email);
        free(cpf);
        free(birthDay);
        free(phoneNumber);
        free(street);
        free(streetNumber);
        free(neighborhood);
        free(city);
        free(state);
        free(cep);
        free(diagnosisDay);
        free(comorbidity);

    printf ("\n\nTamanho do registro: %d caracteres\n\n", strlen(registro));

    system("pause");
    return 1;
}

/*
int comorbidity_option() { // ler tipos de comorbidades
    printf("Qual o tipo de comorbidade?\nEscolha entre as opções:\n");
    printf("1- Diabetes");
    printf("2- Obesidade\n");
    printf("3- Hipertensão\n");
    printf("4- Tuberculose\n");
    printf("Opção: ");
    scanf("%d",&x);
    printf("\n");
    return x;

}
*/

int consultar() {
    system("cls");
    FILE *fp;

    fp = fopen("arquivo.txt", "r");

    if (fp == NULL) {
	return 0;
    }

    fscanf(fp, "%s", &name);
    fscanf(fp, "%s", &email);
    fscanf(fp, "%s", &cpf);
    fscanf(fp, "%s", &birthDay);
    fscanf(fp, "%s", &phoneNumber);
    fscanf(fp, "%s", &street);
    fscanf(fp, "%s", &streetNumber);
    fscanf(fp, "%s", &neighborhood);
    fscanf(fp, "%s", &city);
    fscanf(fp, "%s", &state);
    fscanf(fp, "%s", &cep);
    fscanf(fp, "%s", &diagnosisDay);
    fscanf(fp, "%s", &comorbidity);
    fclose(fp);

    return 1;
}

void pesquisar() {
    system("cls");
    printf("\nInforme o CPF da pessoa: ");
    long long cpf_localizador;
    scanf("%Lu",&cpf_localizador);
    printf ("*** Consulta de Paciente ***\n\n\n\n\n");
    printf ("Nome do Paciente: %s\n", name);
    printf ("E-mail: %s\n", email);
    printf ("Data de Nascimento: %s\n", birthDay);
    printf ("Telefone: %s\n", phoneNumber);
    printf ("Data do diagnostico: %s\n", diagnosisDay);
    printf ("Comorbidade: %s\n", comorbidity);
    printf ("\n\n * Dados do paciente recuperados do arquivo *\n\n");
    system("pause");

}


void imprimir() {
    system("cls");
    printf ("*** Consulta de Paciente ***\n\n\n\n\n");
    printf ("Nome do Paciente: %s\n", name);
    printf ("E-mail: %s\n", email);
    printf ("Data de Nascimento: %s\n", birthDay);
    printf ("Telefone: %s\n", phoneNumber);
    printf ("Endereço:\n");
    printf ("%s número: %s bairro: %s\n", street, streetNumber, neighborhood);
    printf ("cidade: %s estado: %s CEP: %s\n", city, state, cep);
    printf ("Data do diagnóstico: %s\n", diagnosisDay);
    printf ("Comorbidade: %s\n", comorbidity);
    printf ("\n\n * Dados do paciente recuperados do arquivo *\n\n");
}

// FIM FUNÇÕES

int main()
{
    int opcao;
    setlocale(LC_ALL, "Portuguese");

    if(validate_password()) {
	do {
	    opcao = read_option();
	    switch(opcao)
	    {
	        case 0:
		    system("cls");
		    printf ("* Você acabou de sair do sistema *\n\n");
		    system("pause");
		    return 0;
	        case 1:
		    cadastrar();
		    break;
	        case 2:
		    if (consultar()) imprimir();
	            else printf ("\n\nHouve um problema com a manipulação do arquivo.\n\n");
		    system ("pause");
		    break;
	        case 3:
		    pesquisar();
		    break;
	    }
	   } while (1);
    }
}

 

  • Confuso 1
Postado

@GeovaneAvilla Você não mudou o que te pedi para mudar 😕

 

De qualquer forma, eu fiz as alterações lá que mencionei e notei o seguinte:

- Limpar o buffer como você estava fazendo com fflush(stdin) é desnecessário;

- O jeito que você está cobrando a senha não funciona. Imagino que você queria que o usuário digitasse a senha e os caracteres impressos fossem asteriscos. Pensou também na possibilidade do usuário apagar o que ele digitou? Como iria apagar aqueles asteriscos?

Um exemplo de programa que cobra uma senha e imprime ela no final:

#include <stdio.h>
#include <conio.h>
#include <ctype.h>
#include <locale.h>

int main()
{
    setlocale(LC_ALL, "Portuguese");
    int ch;
    char senha[20];
    int i = 0;

    puts ("Insira sua senha:");
    fflush(stdout);

    while ((ch = getch()) != EOF && ch != '\n' && ch != '\r' && i < sizeof(senha) - 1)
    {
        if (ch == '\b' && i > 0)
        {
            // Backspace
            printf("\b \b");
            fflush(stdout);
            i--;
            senha[i] = '\0';
        }
        else if (isalnum(ch))
        {
            /* letras, números e caracteres especiais
            (senha alfanumérica) */
            printf("*");
            senha[i++] = (char)ch;
        }
    }

    senha[i] = '\0';

    printf ("\n\nSua senha: %s\n", senha);

    return 0;
}

Deixei o mesmo comprimento da string senha que você deixou no seu programa, se bem que 19 caracteres (não-nulos) nem sempre pode ser suficiente para uma senha... Você pode deixar aí uns 50 que já ta bom.

 

Depois disso, se a senha for "geovane", o menu é impresso, ok...

O resto parece funcionar, tente aí fazer essas alterações que lhe pedi.

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...