Ir ao conteúdo
  • Cadastre-se

C Programa entrando em loop infinito ao listar/exibir


Otavio Pereira

Posts recomendados

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>

/*
autor: Luiz Otávio da Silva Pereira
Curso: Sistema de Inf. 4º Período, noturno.

*/



//criando registros
typedef struct Funcionario{
	char nome[20], email[25];
	int tel, mat;
	
} Funcionario;

typedef struct Medico{
	char nome[20], especialidadem[25];
	int cpf,cod,CRM;
} Medico;

typedef struct Paciente{
	char nome[20], email[25], endereco[40];
	int telefone;
} Paciente;

typedef struct Login {
    char login[10];
    int senha;
} Login;

FILE *p;

//declaracao das funcoes
void Loginadm();
void LoginFuncionario();
void Menuadm();
void MenuFuncionario();
void MenuPrincipal();
void MenuFuncionario();
void CadFuncionario();
void CadEspecialidade();
void CadPaciente();
void CadMedico();
void ExibirFuncionario();
void ExibirMedico();
void ExibirPaciente();




//declarando variavies globais
Funcionario funcionario[2];
Paciente paciente[2];
Medico medico[2];

int cont = 0;

main(){
	
	MenuPrincipal(); //chamando a funcao dentro da main

}//fim da main

void MenuPrincipal(){
        int op1; //variavei para opcao de mnu

    do {
        system("cls");
        system("title Menu Principal"); //setando nome para aparecer no console
        system("color 30"); //setando uma cor para o console
        printf("1-Logar como Administrador\n");
        printf("2-Logar como Funcionario\n");
        printf("3-Funcionarios Cadastrados\n");
        printf("4-Medicos Cadastrados\n");
        printf("5-Pacientes Cadastrados\n");
        printf("0-Sair\n");
        scanf("%i",&op1);
        system("cls");
        switch(op1) { //opcao para menu
            case 1:
            	system("title LOGIN ADMINISTRADOR");
                Loginadm();
                break;
            case 2:
                LoginFuncionario();
                break;
            case 3:
                ExibirFuncionario();
                break;
			case 4:
				ExibirMedico();
				break;
			case 5:
				ExibirPaciente();
				break;    
            case 0:
                exit(0);
                break;
            default:
            	system("title ERROR");
            	system("color 40");
                printf("\n-------------Opcao invalida-------------\n");

        }//fim switch
        system("pause");
    } while(op1!=0);
}//fim menu principal

void Menuadm(){
    int op1;
    do {
        system("cls");
        system("title MENU DE GERENCIAMENTO");
        system("color 20");
        printf("1-CADASTRAR FUNCIONARIO\n");
        printf("2-CADASTRAR MEDICO\n");
        printf("3-CADASTRAR PACIENTE\n");
        printf("0-VOLTAR\n");
        scanf("%i",&op1);
        system("cls");
        switch(op1) {
            case 1:
            	system("color 30");
            	system("title Cadastrar funcionario");
                CadFuncionario();
                break;
            case 2:
            	system("color 30");
            	system("title Cadastrar Medico");
                CadMedico();
                break;
            case 3:
            	system("color 30");
            	system("title Cadastrar Paciente");
                CadPaciente();
                break;
            case 0:
                MenuPrincipal();
                break;
            default:
            	system("color 40");
            	system("title ERROR");
                printf("\n-------------Opcao invalida-------------\n");

        }//fim swhitch
        system("pause");
    } while(op1!=0);
}//fim do menu

void Loginadm(){
    int op;
    Login aux,a;

//atribuicao de valores para administrador geral
    strcpy(aux.login,"adm");
    aux.senha=123;

    do {
        printf("\nLogin: ");
        fflush(stdin);
        gets(a.login);
        printf("\nSenha: ");
        scanf("%i",&a.senha);
	
		system("cls");
	
        if(strcmp(aux.login,a.login)==0  && aux.senha==a.senha) {
            system("color 20");
			printf("Bem vindo ADM\n");
            Sleep(1000);
            Menuadm();
        }
        else
        	system("color 40");
        	system("ERRO DE LOGIN");
            printf("\n------------Login ou Senha Errado!------------\n");
            Sleep(1000);
            MenuPrincipal();
    } while(op!=0);
}//fim login adm

void MenuFuncionario(){
	int op1;
	
    do {
        system("cls");
        system("title Menu Funcionario");
        system("color 20");
        printf("1-CADASTRAR PACIENTE\n");
        printf("0-VOLTAR\n");
        scanf("%i",&op1);
        system("cls");
        switch(op1) {
            case 1:
            	system("title Cadastrar Paciente");
                CadPaciente();
                break;
            case 0:
                MenuPrincipal();
                break;
            default:
            	system("color 40");
            	system("title ERROR");
                printf("\n------------Opcao invalida------------\n");

        }//fim swhitch
        system("pause");
    } while(op1!=0);
}//fim do menu funcionario

void LoginFuncionario(){
    int op3,m;
    char name[30];
    int achou;
    achou=0;

    do {
        printf("\nLogin: ");
        fflush(stdin);
        gets(name);
        printf("\nSenha: ");
        scanf("%i",&m);
        for(int f = 0 ; f < 2 ; f++)
		{
            if(strcmp(funcionario[f].nome,name)==0    &&      funcionario[f].mat==m  )
			{
                achou=1;
				system("cls");
        	    MenuFuncionario();
        	}
        }
            if(achou==0)
			{
				system("color 40");
				system("title ERRO DE LOGIN");
                printf("Senha ou login invalido!\n");
                Sleep(1000);
                MenuFuncionario();

            }

    } while(op3!=0);
}//fim do login funcionario

void CadMedico(){
	int op2;

    do{

        for(int f = 0 ; f < 2; f++) {
            system("color e0");
			system("title CADASTRAR");
			Medico medico; //variavel e tipo
			//abrindo arquivo.
			p=fopen("HOSPITAL-Otavio.txt", "a+"); //"nome do arquivo" "modo do arquivo"
	
			//entrada de dados
			printf("Nome: \n");
			fflush(stdin);
			gets(funcionario.nome);
			
	
			//escrevendo no arquivo
			fwrite(&medico,sizeof(Medico),1,p);
			//fechar
			fclose(p);

        }
                Menuadm();

    }while(op2!=2);
	
}//fim do cadastrar medico

void CadFuncionario(){
    int op2;

    do{

        for(int i = 0 ; i < 2; i++) {
        system("color e0");
		system("title CADASTRAR");
		Funcionario funcionario; //variavel e tipo
		//abrindo arquivo.
		p=fopen("HOSPITAL-Otavio.txt", "a+"); //"nome do arquivo" "modo do arquivo"
	
		//entrada de dados
		printf("Nome: \n");
		fflush(stdin);
		gets(funcionario.nome);
		printf("Email: \n");
		scanf("%c", &funcionario.email);
		printf("Matricula: \n");
		scanf("%i", &funcionario.mat);
		printf("Telefone: \n");
		scanf("%i", &funcionario.tel);
	
		//escrevendo no arquivo
		fwrite(&funcionario,sizeof(Funcionario),1,p);
		//fechar
		fclose(p);

        }
                Menuadm();

    }while(op2!=2);
}//fim do cadastrar funcionario

void CadPaciente(){
	int op2;
	do{

        for(int f = 0 ; f < 2; f++) {
            system("color e0");
			system("title CADASTRAR");
			Paciente paciente; //variavel e tipo
			//abrindo arquivo.
			p=fopen("HOSPITAL-Otavio.txt", "a+"); //"nome do arquivo" "modo do arquivo"
	
			//entrada de dados
			printf("Nome: \n");
			fflush(stdin);
			gets(paciente.nome);
			printf("Email: \n");
			scanf("%c",&paciente.email);
			printf("Endereco: \n");
			scanf("%c",&paciente.endereco);
			printf("Telefone: \n");
			scanf("%i",&paciente.telefone);
		
	
		//escrevendo no arquivo
		fwrite(&paciente,sizeof(Paciente),1,p);
		//fechar
		fclose(p);

        }
            MenuPrincipal();

    }while(op2!=2);
}//fim do cadastrar paciente

void ExibirFuncionario(){
	char nome[25];
	system("cls");
	puts("Lista de Funcionarios");
				
	for(int i = 0; i<2; i++){
		Funcionario funcionario;
		p=fopen("HOSPITA-Otavio.txt", "r");
		rewind(p);//localizar ponteiro para o início do arquivo
		while(!feof(p)){//estrutura para resgatar todos os dados.
	
		fread(&funcionario,sizeof(Funcionario),1,p);//ler
		if(!feof(p)){
	
		printf("Nome: %c\tEmail: %c\tMatricula: %i\tTelefone: %i",funcionario.nome,funcionario.email,funcionario.mat,funcionario.tel);
		printf("\n\n");	
		}//tratando erro de repetição do ultimo dado
		}//fim do while
		fclose(p);
		}
	}	
//fim do listar funcionario


void ExibirMedico(){
	system("cls");
	puts("Lista de Medicos");
				
		for(int i = 0; i<2; i++){
		Medico medico;
		p=fopen("HOSPITA-Otavio.txt", "r");
		rewind(p);//localizar ponteiro para o início do arquivo
		while(!feof(p)){//estrutura para resgatar todos os dados.
	
		fread(&medico,sizeof(Medico),1,p);//ler
		if(!feof(p)){
	
		printf("Nome: %c\tEspecialidade: %i\tCPF: %i\tCRM: %i\tCodigo: %i",medico.nome,medico.especialidadem,medico.cpf,medico.CRM,medico.cod);
		printf("\n\n");	
		}//tratando erro de repetição do ultimo dado
		}//fim do while
		fclose(p);
		
		
		}
	}//fim do exibir medico					


void ExibirPaciente(){
	system("cls");
	puts("Lista de Pacientes");
				
	for(int i = 0; i<2; i++){
		Paciente paciente;
		p=fopen("HOSPITA-Otavio.txt", "r");
		rewind(p);//localizar ponteiro para o início do arquivo
		while(!feof(p)){//estrutura para resgatar todos os dados.
	
		fread(&paciente,sizeof(Paciente),1,p);//ler
		if(!feof(p)){
	
		printf("Nome: %s\tEmail: %c\tEndereco: %c\tTelefone: %i",paciente.nome,paciente.email,paciente.endereco,paciente.telefone);
		printf("\n\n");	
		}//tratando erro de repetição do ultimo dado
		}//fim do while
		fclose(p);
		}
	}						
//fim do exibir paciente

Ao listar/exibir os pacientes, funcionários e médicos, meu programa entra em loop infinito sem parar, como resolver ?

Link para o comentário
Compartilhar em outros sites

Seu programa tem um certo número de problemas, pelo modo como foi escrito. E vai te dar um grande trabalho para testar, concluir e manter. Talvez ganhasse muito tempo mudando algumas coisas, como:

 

  • não misture o uso de gets() --- que devia ser fgets() --- com scanf()
  • não use fflush() na entrada. Não está previsto e pode não funcionar.
  • não use scanf() para ler do teclado. Essa função foi escrita para ler entrada formatada --- scan formatted input é a origem do nome --- e vai ter muitos problemas para ler de algo que não é assim formatado, muito pelo contrário
  • se insiste em usar use direito: scanf() retorna um int. Leia o retorno e teste antes de seguir pelo programa
  • não use variáveis globais. É um pesadelo. É proibido e condenado em quase todo lugar, por boa razão. Sempre vai cair na sua cabeça. Ou descontar de sua nota. Ou irritar seu chefe.
  • nunca use gets(). Isso não existe mais há décadas. É marcada como obsoleta, proibida em todo canto e não funciona em alguns compiladores.
  • main() deve ser a primeira função de seu programa, e ter algo expressivo, se possível em um arquivo separado
  • (l 356) chama rewind() em um arquivo que acabou de abrir para leitura é inócuo.
  • escreva seu programa em torno dos dados e não duplique coisas a toa: funcionários, médicos e pacientes são pessoas. Use isso a seu favor. Não faz sentido um médico ter CPF e não ter telefone, mas um funcionário tem email que o médico não tem. O paciente tem telefone e o funcionario tem tel! Para que isso? Crie uma estrutura Pessoa e especialize apenas. 
  • evite void(). É um desperdício, muitas vezes um erro. Use parâmetros e NUNCA variáveis globais
  • podia ter um campo id nas estruturas e que incorporasse o tipo de login. simplificaria as telas...
  • não use system(). Não estará fazendo nada. Está programando em C.
  • teste seu programa em partes. É mais fácil. Tem 400 linhas de programa ...
  • scanf() precisa de um endereço para transferir os dados. No caso de vetores como nome já é passado um endereço então não pode usar &
  • Obrigado 2
Link para o comentário
Compartilhar em outros sites

@Otavio Pereira    essa dunção de exibirpaciente poderia ser assim  :

void ExibirPaciente()
{
    system("cls");
    puts("Lista de Pacientes");
    FILE *p;
    p=fopen("HOSPITA-Otavio.txt", "rb");
    Paciente paciente;
    //while(!feof(p)){//estrutura para resgatar todos os dados.
    while ( fread(&paciente,sizeof(Paciente),1,p) == 1 )
    {
        if( ! feof ( p ) )
        {
            printf("Nome ------: %s  \n",paciente.nome    );
            printf("Email -----: %c  \n",paciente.email   );
            printf("Endereco --: %c  \n",paciente.endereco);
            printf("Telefone --: %i\n\n",paciente.telefone);
        }//tratando erro de repetição do ultimo dado
    }//fim do while
    fclose( p );
}

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

22 horas atrás, arfneto disse:

Seu programa tem um certo número de problemas, pelo modo como foi escrito. E vai te dar um grande trabalho para testar, concluir e manter. Talvez ganhasse muito tempo mudando algumas coisas, como:

 

  • não misture o uso de gets() --- que devia ser fgets() --- com scanf()
  • não use fflush() na entrada. Não está previsto e pode não funcionar.
  • não use scanf() para ler do teclado. Essa função foi escrita para ler entrada formatada --- scan formatted input é a origem do nome --- e vai ter muitos problemas para ler de algo que não é assim formatado, muito pelo contrário
  • se insiste em usar use direito: scanf() retorna um int. Leia o retorno e teste antes de seguir pelo programa
  • não use variáveis globais. É um pesadelo. É proibido e condenado em quase todo lugar, por boa razão. Sempre vai cair na sua cabeça. Ou descontar de sua nota. Ou irritar seu chefe.
  • nunca use gets(). Isso não existe mais há décadas. É marcada como obsoleta, proibida em todo canto e não funciona em alguns compiladores.
  • main() deve ser a primeira função de seu programa, e ter algo expressivo, se possível em um arquivo separado
  • (l 356) chama rewind() em um arquivo que acabou de abrir para leitura é inócuo.
  • escreva seu programa em torno dos dados e não duplique coisas a toa: funcionários, médicos e pacientes são pessoas. Use isso a seu favor. Não faz sentido um médico ter CPF e não ter telefone, mas um funcionário tem email que o médico não tem. O paciente tem telefone e o funcionario tem tel! Para que isso? Crie uma estrutura Pessoa e especialize apenas. 
  • evite void(). É um desperdício, muitas vezes um erro. Use parâmetros e NUNCA variáveis globais
  • podia ter um campo id nas estruturas e que incorporasse o tipo de login. simplificaria as telas...
  • não use system(). Não estará fazendo nada. Está programando em C.
  • teste seu programa em partes. É mais fácil. Tem 400 linhas de programa ...
  • scanf() precisa de um endereço para transferir os dados. No caso de vetores como nome já é passado um endereço então não pode usar &

Anotei tudo isso, realmente vejo que terei que reestudar novamente, aprendi assim na faculdade, mas por não ter contato com programação no mercado de trabalho (tirando o C que é mais para didática). Agradeço muito pelo tempo que você se dispôs para comentar o código,

 

19 horas atrás, devair1010 disse:

@Otavio Pereira    essa dunção de exibirpaciente poderia ser assim  :


void ExibirPaciente()
{
    system("cls");
    puts("Lista de Pacientes");
    FILE *p;
    p=fopen("HOSPITA-Otavio.txt", "rb");
    Paciente paciente;
    //while(!feof(p)){//estrutura para resgatar todos os dados.
    while ( fread(&paciente,sizeof(Paciente),1,p) == 1 )
    {
        if( ! feof ( p ) )
        {
            printf("Nome ------: %s  \n",paciente.nome    );
            printf("Email -----: %c  \n",paciente.email   );
            printf("Endereco --: %c  \n",paciente.endereco);
            printf("Telefone --: %i\n\n",paciente.telefone);
        }//tratando erro de repetição do ultimo dado
    }//fim do while
    fclose( p );
}

 

Irei testar dessa forma, você tem uma base de CRUD ? alterar e excluir ? não aprendi a fazer e estou tendo dificuldades.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

5 minutos atrás, Otavio Pereira disse:

Anotei tudo isso, realmente vejo que terei que reestudar novamente, aprendi assim na faculdade, mas por não ter contato com programação no mercado de trabalho (tirando o C que é mais para didática). Agradeço muito pelo tempo que você se dispôs para comentar o código

 

Isso que eu escrevei não é assim minha opinião. Não sei como ensinam na faculdade, mas essas são práticas presentes em guias de aderência de empresas, em códigos de boas práticas e em textos e conferências de autores importantes. E pode ser visto em códigos de produção por todo canto. Escreva assim e provavelmente vai receber antes ou ter sua nota antes :)

 

16 minutos atrás, Otavio Pereira disse:

base de CRUD ? alterar e excluir ? não aprendi a fazer e estou tendo dificuldades

 

A base está nos dados. Escreva em torno dos dados e não terá problemas. Junte dados, telas e o processo e terá problemas de toda sorte, como te expliquei e como está tendo.

 

Veja essa estrutura. copiada de seu programa
 


typedef struct
{
    char  id[4];

    char CPF[15];
    char email[30];
    char end[40];
    char nome[30];
    char tel[25];

}   Pessoa;

typedef struct
{
    char        matricula[15];
    Pessoa      P;

}   Funcionario;

typedef struct
{
    char        especialidade[25];
    char        CRM[15];
    Pessoa      P;

}   Medico;

typedef struct
{
    Pessoa      P;
} Paciente;

typedef struct
{
    int  id;
    char login[10];
    int senha;
} Login;

 

Isso já torna algumas coisas mais simples.

 

Agora veja isso direto, também de seu programa mas sem alterar nada:

 


FILE* p;

//declaracao das funcoes
void Loginadm();
void LoginFuncionario();
void Menuadm();
void MenuFuncionario();
void MenuPrincipal();
void MenuFuncionario();
void CadFuncionario();
void CadEspecialidade();
void CadPaciente();
void CadMedico();
void ExibirFuncionario();
void ExibirMedico();
void ExibirPaciente();

 

As funções não tem argumento. Tudo é global. Inclusive o singelo p

 

Sabe o que isso significa? as funções todas dependem de valores externos. Qualquer erro afeta tudo. E uma simples declaração 
 

    char* p = &linha;


em uma função dessas por exemplo vai sumir com p valor de p que é simplesmente o seu arquivo...

 

CRUD?

 

para manipular essas estruturas, como Funcionario, Medico e tal, em geral não se usa no arquivo em disco. Mas precisa ter um método. Pode muito bem ser o disco, mas não é o comum. Em geral você lê do disco para a memória essas coisas no início. Trata tudo na memória e aof inal grava o resultado em novos arquivos e muda os nomes dos antigos. O simples.

 

Como gravar na memória? Basta olhar aqui no forum por exemplo e já vai ver uns casos: vetores, listas ligadas, pilhas, arvores, tabelas de hash... Estruturas de dados.

 

As soluções mais comuns? um vetor de estruturas classificado por algum critério ou uma lista ligada. Isso em termos de programas de estudo ou hobby. Na prática há muito não se usa isso: os dados ficam em um banco de dados, programas que escrevem na console não existem mais e apenas se usa alguma interface gráfica.

 

Comece decidindo por um caminho de como gravar os dados. 

 

  • Curtir 1
  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

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

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!