Ir para conteúdo
Fórum Script Brasil
  • 0

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


JonatasBorges

Pergunta

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();
}

 

Editado por JonatasBorges
Link para o comentário
Compartilhar em outros sites

4 respostass a esta questão

Posts Recomendados

  • 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();
}

 

Link para o comentário
Compartilhar em outros sites

  • 0

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);

}

 

Link para o comentário
Compartilhar em outros sites

  • 0

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 

Link para o comentário
Compartilhar em outros sites

  • 0

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? 

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,5k
×
×
  • Criar Novo...