• 0
Sign in to follow this  
JonatasBorges

Chamar função menu após execução de funções

Question

Pessoal consegui resolver o problema das minhas estruturas de repetição, porém não consigo fazer minhas funções retornarem para o menu principal, alguém sabe como posso direcionar minhas funções cadastrar, alterar e listar para o menu principal?

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

#define MAX 12

struct DADOS {
	char nome[30];
	char cpf[11];
	int apartamento;
	float condominio;
};

struct DADOS dados[MAX];
int i, j, contador = 0, flag;

//Função 1 - cadastrar
void cadastrar() {
	
		do {
		system ("cls");
		printf("***CADASTRAR NOVO MORADOR***\n");
		printf("Informe o nome do morador: ");
		fflush(stdin);
		gets(dados[i].nome);
		
		printf("Informe o cpf do morador: ");
		fflush(stdin);
		gets(dados[i].cpf);
		
		printf("Informe o número do apartamento: ");
		scanf("%i", &dados[i].apartamento);
		
		printf("Informe a taxa de condomínio: ");
		scanf("%i", &dados[i].condominio);
		
		printf ("\nDeseja cadastrar outro morador? \n1 - Sim \n2 - Não\nOpção: ");
		scanf ("%i", &flag);
		while (flag != 1 || flag != 2) {
			printf ("Opção inválida\n");
			flag = 2;
		}
	contador++;
	} while (flag == 1);
}

//Função 2 - alterar
void alterar(void) {
	
	char nome[30], cpf[11];
	int apartamento;
	float condominio;
	
	printf("***ALTERAÇÃO DE CADASTRO***\n");
	printf("Informe o nome: ");
	fflush(stdin);
	gets(nome);
	
		if (strcmp(dados[i].nome, dados[j + 1].nome) == 0) {
			printf("\nNome: %c\nCPF: %c\nApartamento: %i\nCondominio: %f\n\n", dados[i].nome, dados[i].cpf, dados[i].apartamento, dados[i].condominio);
			printf("\nDeseja alterar este cadastro? \n 1 - sim\n2 - não\nOpção: ");
			scanf("%i", &flag);
			
			if (flag == 1) {
				printf("Informe o nome do morador: ");
				fflush(stdin);
				gets(nome);
				strcpy(nome, dados[i].nome);
				
				printf("Informe o cpf do morador: ");
				fflush(stdin);
				gets(cpf);
				strcpy(cpf, dados[i].cpf);
				
				printf("Informe o número do apartamento: ");
				scanf("%i", &apartamento);
				dados[i].apartamento = apartamento;
				
				printf("Informe a taxa de condomínio: ");
				scanf("%i", &condominio);
				dados[i].condominio = condominio;
			}
		}
		else{
			printf("Nenhum contrato encontrado!");
		}
	return;
}

//Função 3 - listar
void listar(void) {
	char auxChar[30];
	int auxInt;
	
	printf("***LISTAR MORADORES***\n");
	for(i = 0; i < MAX; i++) {
		for(j = i + 1; j < MAX; j++) {
			if(strcmp(dados[i].nome, dados[j + 1].nome) > 1) {
			strcpy(auxChar, dados[i].nome);
			strcpy(dados[i].nome, dados[j].nome);
			strcpy(dados[j].nome, auxChar);
			
			strcpy(auxChar, dados[i].cpf);
			strcpy(dados[i].cpf, dados[j].cpf);
			strcpy(dados[j].cpf, auxChar);
			
			auxInt = dados[i].apartamento;
			dados[i].apartamento = dados[j].apartamento;
			dados[j].apartamento = auxInt;
			
			auxInt = dados[i].condominio;
			dados[i].condominio = dados[j].condominio;
			dados[j].condominio = auxInt;
			}
		}
	}
	return;
}


//Função menu
void menu (void) {
	setlocale(LC_ALL, "Portuguese");
	int opcao;
	
	printf ("***CADASTRO DE MORADORES***\n");
	printf ("Selecione a opção desejada \n1 - Cadastrar \n2 - Alterar \n3 - Listar \n0 - Sair \nOpção:");
	scanf("%i", &opcao);
	
	switch (opcao) {
		case 1: {
			cadastrar();
			break;
			menu();
		}
		
		case 2: {
			alterar();
			menu();
		}
		
		case 3: {
			listar();
			menu();
		}
		
		case 0: {
			
			break;
			menu();
		}
		default: {
			printf ("\nOpção inválida!");
			system("pause");
			menu();
		}
			
	}
	return;
}

//Função principal
main (void) {
	menu();
}

 

Edited by JonatasBorges

Share this post


Link to post
Share on other sites

4 answers to this question

Recommended Posts

  • 0

Galera o problema era apenas uma questão de semântica no código e a declaração de protótipos das funções...Adm pode fechar o tópico, caso o problema ocorra com mais alguém eu resolvi o problema conforme código abaixo, não está 100% ainda, mas as funções estão funcionando perfeitamente!

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

#define MAX 12

struct DADOS {
	char nome[30];
	char cpf[11];
	int apartamento;
	float condominio;
};

struct DADOS dados[MAX];
int i, j, contador = 0, flag = 0;

//Declaração das funções protótipos
int cadastrar();
void alterar();
void listar();


//Função menu
void menu (void) {
	setlocale(LC_ALL, "Portuguese");
	int opcao;
	
	printf ("***CADASTRO DE MORADORES***\n");
	printf ("Selecione a opção desejada \n1 - Cadastrar \n2 - Alterar \n3 - Listar \n0 - Sair \nOpção:");
	scanf("%i", &opcao);
	
	switch (opcao) {
		case 1: {
			cadastrar();
			menu();
		}
		
		case 2: {
			alterar();
			menu();
		}
		
		case 3: {
			listar();
			menu();
		}
		
		case 0: {
			
			break;
			menu();
		}
		default: {
			printf ("\nOpção inválida!");
			system("pause");
			menu();
		}
			
	}
	return;
}

//Função 1 - cadastrar
int cadastrar(void) {
	
		do {
		system ("cls");
		printf("***CADASTRAR NOVO MORADOR***\n");
		printf("Informe o nome do morador: ");
		fflush(stdin);
		gets(dados[i].nome);
		
		printf("Informe o cpf do morador: ");
		fflush(stdin);
		gets(dados[i].cpf);
		
		printf("Informe o número do apartamento: ");
		scanf("%i", &dados[i].apartamento);
		
		printf("Informe a taxa de condomínio: ");
		scanf("%i", &dados[i].condominio);
		
		printf ("\nDeseja cadastrar outro morador? \n1 - Sim \n2 - Não\nOpção: ");
		scanf ("%i", &flag);
		while (flag != 1 && flag != 2) {
			printf ("Opção inválida\n");
			flag = 2;
		}
	contador++;
	} while (flag == 1);
	return(contador);
}

//Função 2 - alterar
void alterar(void) {
	
	char nome[30], cpf[11];
	int apartamento;
	float condominio;
	
	printf("***ALTERAÇÃO DE CADASTRO***\n");
	printf("Informe o nome: ");
	fflush(stdin);
	gets(nome);
	
		if (strcmp(dados[i].nome, dados[j + 1].nome) == 0) {
			printf("\nNome: %c\nCPF: %c\nApartamento: %i\nCondominio: %f\n\n", dados[i].nome, dados[i].cpf, dados[i].apartamento, dados[i].condominio);
			printf("\nDeseja alterar este cadastro? \n 1 - sim\n2 - não\nOpção: ");
			scanf("%i", &flag);
			
			if (flag == 1) {
				printf("Informe o nome do morador: ");
				fflush(stdin);
				gets(nome);
				strcpy(nome, dados[i].nome);
				
				printf("Informe o cpf do morador: ");
				fflush(stdin);
				gets(cpf);
				strcpy(cpf, dados[i].cpf);
				
				printf("Informe o número do apartamento: ");
				scanf("%i", &apartamento);
				dados[i].apartamento = apartamento;
				
				printf("Informe a taxa de condomínio: ");
				scanf("%i", &condominio);
				dados[i].condominio = condominio;
			}
		}
		else{
			printf("Nenhum contrato encontrado!");
		}
	return;
}

//Função 3 - listar
void listar(void) {
	char auxChar[30];
	int auxInt;
	
	printf("***LISTAR MORADORES***\n");
	for(i = 0; i < contador; i++) {
		for(j = i + 1; j < contador; j++) {
			if(strcmp(dados[i].nome, dados[j + 1].nome) > 0) {
			fflush(stdin);
			strcpy(auxChar, dados[i].nome);
			strcpy(dados[i].nome, dados[j].nome);
			strcpy(dados[j].nome, auxChar);
			
			fflush(stdin);
			strcpy(auxChar, dados[i].cpf);
			strcpy(dados[i].cpf, dados[j].cpf);
			strcpy(dados[j].cpf, auxChar);
			
			auxInt = dados[i].apartamento;
			dados[i].apartamento = dados[j].apartamento;
			dados[j].apartamento = auxInt;
			
			auxInt = dados[i].condominio;
			dados[i].condominio = dados[j].condominio;
			dados[j].condominio = auxInt;
			}
		}
		printf("\nNome: %s\nCPF: %s\nApartamento: %i\nCondominio: %f\n\n", dados[i].nome, dados[i].cpf, dados[i].apartamento, dados[i].condominio);
	}
	return;
}

//Função principal
main (void) {
	menu();
}

 

Share this post


Link to post
Share on other sites
  • 0
Guest

Cara. Muito bom seu código. 

Mas tem 2 pontos que não posso deixar de frisar: O uso do gets() para ler uma string já está em desuso. Nos compiladores atuais esse comando nem é mais aceito, como no caso do Visual Studio 2017.

Esse comando é considerado perigoso. Recomendo usar, ou o scanf() ou, melhor ainda, seria o fgets(), que surgiu justamente para substituir o gets().

Tem tbém a questão de sujeira no buffer de entrada que não está sendo tratada por completo. Em algumas partes até é tratado com o uso do

fflush(stdin);

mas o ideal seria em todas os comandos onde é solicitado entrada de dados.

Tem a parte da função menu que ficaria mais interessante com o uso de um do/while para evitar duplicidade d código.

Tipo assim:

void menu (void) {
	setlocale(LC_ALL, "Portuguese");
	int opcao;

	do
    {
        system("cls");

        printf ("***CADASTRO DE MORADORES***\n");
        printf ("Selecione a opção desejada \n1 - Cadastrar \n2 - Alterar \n3 - Listar \n0 - Sair \nOpção:");
        scanf("%i", &opcao);

        switch (opcao) {
            case 1: {
                cadastrar();
                break;
            }

            case 2: {
                alterar();
                break;
            }

            case 3: {
                listar();
                break;
            }

            case 0: {

                break;
            }
            default: {
                printf ("\nOpção inválida!\n\n");
                system("pause");
                break;
            }
        }

    } while (opcao != 0);

}

 

Share this post


Link to post
Share on other sites
  • 0
Guest

Tem um ponto que deixei passar na função menu(). Nessa parte deve ficar assim:

case 3: {
        listar();
        system("pause");
        break;
}

tem esse sytem("pause") para segurar a tela na lista 

Share this post


Link to post
Share on other sites
  • 0
Guest

Olá. Indicar os erros não resolve em tudo o problema, por isso resolvi dar um tapinha no código e ficou como vou postar abaixo.

A sugestão que eu daria p melhor o código seria salvar os cadastros em um arquivo e na função listar() fazer a leitura dos dados salvos no arquivo. Mas é apenas uma sugestão, pois gostei da proposta do sistema de cadastro e por isso, caso o código fosse meu, faria o uso da sugestão dada.

Devo já adiantar q inda não pude testar como deveria o código, então, se tiver algum bug, fiquem a vontade p corrigir

Segue o código:

 

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

#define MAX 12

struct cadastro
{
	char nome[30];
	char cpf[20];
	int apartamento;
	float condominio;
} dados[MAX];

//struct DADOS dados[MAX];
int contador = 0, index = 0;

//Declaração das funções protótipos
void cadastrar();
void alterar();
void listar();


//Função menu
void menu () {

    int opcao;
    char *c = NULL;

    do
    {
        system("cls");

        printf ("***CADASTRO DE MORADORES***\n");
        printf ("Selecione a opção desejada \n1 - Cadastrar \n2 - Alterar \n3 - Listar \n4 - Sair \nSua opção: ");
        scanf("%i", &opcao);
        scanf("%c", &c);

        switch (opcao)
        {
            case 1:
                cadastrar();
                break;
            case 2:
                alterar();
                printf("\n");
                system("pause");
                break;
            case 3:
                listar();
                printf("\n");
                system("pause");
                break;
           case 4:
                exit(0);
                break;

            default:
                printf ("\nOpção inválida!\n\n\n");
                system("pause");
                break;
        }

    } while (opcao != 4);

}

//Função 1 - cadastrar
void cadastrar()
{
    char *limparBuffer = NULL, ch;
    int subOpcao;

    system ("cls");

    printf("\n*** CADASTRAR NOVO MORADOR ***\n\n");

    printf("Informe o nome do morador: ");
    fgets(dados[index].nome, 30, stdin);
    strtok(dados[index].nome, "\n");
    if (strlen(dados[index].nome) == 30 - 1)
    {
        while ((ch = getchar()) != '\n' && ch != EOF);
    }

    printf("Informe o cpf do morador: ");
    fgets(dados[index].cpf, 20, stdin);
    strtok(dados[index].cpf, "\n");
    if (strlen(dados[index].cpf) == 20 - 1)
    {
        while ((ch = getchar()) != '\n' && ch != EOF);
    }

    printf("Informe o número do apartamento: ");
    scanf("%d", &dados[index].apartamento);
    scanf("%c", &limparBuffer);

    printf("Informe a taxa de condomínio: ");
    scanf("%f", &dados[index].condominio);
    scanf("%c", &limparBuffer);

    contador++;

    index++;

    fflush(stdin);

    do
    {

        printf("\nDeseja cadastrar outro morador?\n1 - Sim \n2 - Não\n");
        printf("Sua opção: ");
        scanf("%d", &subOpcao);
        scanf("%c", &limparBuffer);

        switch (subOpcao)
        {
        case 1:
            cadastrar();
            break;
        case 2:
            menu();
            break;
        default:
            printf("\nOpcao inválida!\n\n");
            system("pause");
            break;
        }

	} while (subOpcao != 2);
}

//Função 2 - alterar
void alterar(void) {

	char nome[30], cpf[20];
	int apartamento;
	float condominio;
	char *c = NULL, ch;
	int i, opcao;
	int encontrado = 0;

	printf("\n\n*** ALTERAÇÃO DE CADASTRO ***\n\n");
	printf("\nInforme o nome: ");
	fgets(nome, 30, stdin);
    strtok(nome, "\n");
    if (strlen(nome) == 30 - 1)
    {
        while ((ch = getchar()) != '\n' && ch != EOF);
    }

    for (i = 0; i < contador; i++)
    {
        if (!strcmp(dados[i].nome, nome))
        {
            printf("\nNome: %s\nCPF: %s\nApartamento: %d\nCondominio: R$ %.2f\n\n", dados[i].nome, dados[i].cpf, dados[i].apartamento, dados[i].condominio);
            encontrado = 1;

            printf("\nDeseja alterar este cadastro? \n1 - Sim\n2 - Não\nSua opção: ");
            scanf("%i", &opcao);
            scanf("%c", &c);

            if (opcao == 1)
            {
                printf("\nInforme o nome do morador: ");
                fgets(nome, 30, stdin);
                strtok(nome, "\n");
                if (strlen(nome) == 30 - 1)
                {
                    while ((ch = getchar()) != '\n' && ch != EOF);
                }
                strcpy(dados[i].nome, nome);

                printf("Informe o cpf do morador: ");
                fgets(cpf, 20, stdin);
                strtok(cpf, "\n");
                if (strlen(cpf) == 20 - 1)
                {
                    while ((ch = getchar()) != '\n' && ch != EOF);
                }
                strcpy(dados[i].cpf, cpf);

                printf("Informe o número do apartamento: ");
                scanf("%d", &apartamento);
                scanf("%c", &c);
                dados[i].apartamento = apartamento;

                printf("Informe a taxa de condomínio: ");
                scanf("%f", &condominio);
                scanf("%c", &c);
                dados[i].condominio = condominio;

                fflush(stdin);
            }
            else
            {
                fflush(stdin);
                break;
            }
        }
    }

    if (!encontrado)
    {
        printf("\nNenhum contato encontrado!\n\n");
    }
}

//Função 3 - listar
void listar()
{

	char auxChar[30];
	int auxInt, i, j;

	printf("\n\n*** LISTAR MORADORES ***\n");
	for(i = 0; i < contador; i++)
    {
		printf("\nNome: %s\nCPF: %s\nApartamento: %i\nCondominio: R$ %.2f\n\n",
         dados[i].nome, dados[i].cpf, dados[i].apartamento, dados[i].condominio);
	}
}

//Função principal
int main ()
{
    setlocale(LC_ALL, "Portuguese");

	menu();

	return 0;
}

É... copia e colar um código do Code Blocks acaba não deixando o mesmo bem indentado.

Tem um ponto que é bom frisar: Como a linguagem do sistema está definida para Português, quando for preciso inserir o valor do condomínio é preciso usar a vírgula e não o ponto, caso for preciso o uso de valores como 450,50

Se deu p ajudar seria interessante comentar, ok? 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this