Doubts about pointers and dynamic allocation

-1

I'm having a hard time doing this activity. If possible, give me tips and solutions to improve the code. And explain to me why the compiler is able to run the program but when it gets to the end of the option it registers the error. Anyone who can run the program on your compiler to test it and see what I mean, thank you very much. I do not trust that the problem is with pointers or with the dynamic allocation made.

  

Make a program that registers clients with a bank. Each   customer has a name, a surname, an address, an email, a   phone, a cpf and a handle. A customer may have one of the four   account types allowed by the bank: current, salary, savings and   university For each type, there are different types of   customers. For the university account, the client must student and must   tuition, date of enrollment, completion   university. For the savings account, the   information about when the customer deposited the money and how much   in the last month. For the salary account, the client must have a salary,   body in which you work, position, date of engagement. The checking account is   for other cases and has no specific information. Every   accounts must contain an agency and a number.

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



typedef struct{
    int dia,mes,ano;
}data;

typedef struct {
    char matricula[10];
    data _matricula;
    data _conclusao;
    char curso[25];
    char universidade[50];

}universitario;

typedef struct {
    data _deposito;
    float renda;    
}poupanca;

typedef struct {

    float salario;
    char orgao_trabalha[50];
    char cargo[12];
    data _contratacao;
}salario;


typedef struct{ 

}corrente;

typedef struct {

    char nome [25];
    char sobrenome[25];
    char endereco[50];
    char email[25];
    char telefone[12];
    char CPF[12];
    int ID;
    int  agencia;
    int numero;
union {
     universitario u;   
     poupanca p;
     salario s;
     corrente c;
    }conta_tipo;
}cadastro;

// VARIAVEL GLOBAL
cadastro *c1;
int k=1;
// ENUM
enum funcao_menu{cadastrar=1,remover,alterar_cliente,alterar_conta,saque_deposito,rendimento,exibir
};
enum saque_deposito{saque=1,deposito
};
enum conta_tipo{univer=1,poup,salar,corren
};

// PROTOTIPAGEM DE FUNÇOES
void funcao_menu ();
void ler_codigo(int n);
void preencher_cadastro (cadastro *p,int tipo_conta,int k);
void exibir_cliente (cadastro *p,int k);

//FUNCAO PRINCIPAL

int main () {
int funcao;
// INICIO DO MENU PRINCIPAL
funcao_menu();
scanf ("%i",&funcao);
ler_codigo(funcao);


    system ("pause");
    return 0;
}


// Funcao Menu

void funcao_menu (){

printf ("Banco Caraca\n\n");
printf ("-Cadastro de Clientes-\n\n");
printf ("Menu Principal\n--------------\n");
printf ("1-Cadastrar Cliente\n");
printf ("2-Remover Cliente\n");
printf ("3-Alterar Cliente\n");
printf ("4-Alterar Tipo De Conta\n");
printf ("5-Realizar Saque ou Deposito\n");
printf ("6-Calcular Rendimento da Poupanca\n");
printf ("7-Exibir clientes cadastrados\n");
printf ("---------------------------------\n");
printf ("Insira o codigo numerico da funcao: ");    
}


// Funcao de leitura e preenchimento de dados 

void ler_codigo(int n){
    int opcao;
        c1 = (cadastro *) malloc(sizeof(cadastro));
switch (n){

    case 1:{
        int tipo_conta;
        printf ("Cadastrar Cliente\n");
        printf ("-----------------\n");
        printf("Insira o codigo numerico do tipo de conta:\n");
        printf("1-Universitario\n");
        printf("2-Poupanca\n");
        printf("3-Salario\n");
        printf("4-Corrente\n");
        printf("--------------\n");
        printf("Opcao Escolhida:  ");
        scanf ("%i",&tipo_conta);
            switch (tipo_conta){
                case univer:{
                printf ("Conta Universitario\n");
                printf ("-------------------\n");

                preencher_cadastro (c1,tipo_conta,k);
                break;
            }
                case poup:{
                printf ("Conta Poupanca\n");
                printf ("--------------\n");
                preencher_cadastro (c1,tipo_conta,k);
                break;
            }

                case salar:{
                printf ("Conta Salario\n");
                printf ("-------------\n");
                preencher_cadastro (c1,tipo_conta,k);
                break;
            }

                case corren:{
                printf ("Conta Corrente\n");
                printf ("--------------\n");
                preencher_cadastro (c1,tipo_conta,k);
                break;
            }



        }

        break;
    }

    case 2:{
        printf("Remover Cliente\n");
        printf("---------------\n");

        break;
    }   
    case 3:{
        printf ("Alterar Cliente\n");
        printf ("----------------\n");

        break;
    }
    case 4: {
        printf ("Alterar Tipo De Conta\n");
        printf ("---------------------\n");

        break;
    }
    case 5:{
        printf ("Realizar Saque ou Deposito\n");
        printf ("Insira a opcao:\n");
        printf ("1-Saque\n");
        printf ("2-Deposito\n");
        printf ("----------\n");
        printf("Opcao Escolhida: ");    
        scanf ("%i",&opcao);
            if (opcao==saque){
            printf ("Realizar Saque\n");
            printf ("--------------\n");

        }

            else if(opcao==deposito){
            printf("Realizar Deposito\n");
            printf("-----------------\n");

        }

            else if (opcao!=deposito||opcao!=saque){
            printf("Opcao Invalida.Tente Novamente.");

        }
            break;
    }

    case 6:{    
        printf ("Calcular Rendimento Da Poupança\n");
        printf ("-------------------------------\n");
        break;
    }
    case 7:{    
        printf ("Exibir clientes cadastrados\n");
        printf ("-------------------------------\n");
        exibir_cliente(c1,k);
        break;
    }


    default :{
        printf ("Opcao Invalida.Tente Novamente.\n");
        break;
    }
}

}

// FUNÇÃO DE EXIBIR CLIENTES

void exibir_cliente (cadastro *p,int k){
    int i;
    printf("Clientes cadastrados: \n ----------------------------------------- \n");
    printf("Nome\n");
    for (i=1;i<=k;i++){
        printf("%s",(p+i)->nome);   
    }

}
// FUNÇÃO DE PREENCHIMENTO GERAL DO CADASTRO

    void preencher_cadastro (cadastro *p,int tipo_conta,int k){

        printf ("Insira o nome do cliente a ser cadastrado:  ");
        setbuf (stdin,NULL);
        fgets ((p+k)->nome,25,stdin);
        printf("Insira o sobrenome do cliente a ser cadastrado:  ");
        setbuf (stdin,NULL);
        fgets ((p+k)->sobrenome,25,stdin);
        setbuf (stdin,NULL);
        printf("Insira o endereco do cliente a ser cadastrado:  ");
        fgets ((p+k)->endereco,50,stdin);
        setbuf (stdin,NULL);
        printf("Insira o e-mail do cliente a ser cadastrado:  ");
        setbuf (stdin,NULL);
        fgets ((p+k)->email,25,stdin);
        setbuf (stdin,NULL);
        printf("Insira o telefone (com DD) do cliente a ser cadastrado:  ");
        setbuf (stdin,NULL);
        fgets ((p+k)->telefone,12,stdin); b
        setbuf (stdin,NULL);
        printf("Insira o CPF do cliente a ser cadastrado:  ");
        fgets ((p+k)->CPF,12,stdin);
        setbuf (stdin,NULL);    

        switch (tipo_conta){

        case univer:{     

            printf ("Insira o nome da universidade do cliente a ser cadastrado:  ");
            fgets ((p+k)->conta_tipo.u.universidade,50,stdin);
            setbuf (stdin,NULL);
            printf ("Insira o curso de graducao do cliente a ser cadastrado:  ");
            fgets ((p+k)->conta_tipo.u.curso,25,stdin);   
            setbuf (stdin,NULL);                                 
            printf ("Insira a matricula institucional do cliente a ser cadastrado:  ");
            fgets ((p+k)->conta_tipo.u.matricula,10,stdin);
            printf ("Insira a data de matricula do curso do cliente a ser cadastrado:  ");
            setbuf (stdin,NULL);
            scanf("%i%i%",&(p+k)->conta_tipo.u._matricula.dia,&(p+k)->conta_tipo.u._matricula.mes,&(p+k)->conta_tipo.u._matricula.ano);
            setbuf (stdin,NULL);
            printf ("Insira a data de conclusao de curso do cliente a ser cadastrado:  ");
            scanf("%i%i%",&(p+k)->conta_tipo.u._conclusao.dia,&(p+k)->conta_tipo.u._conclusao.mes,&(p+k)->conta_tipo.u._conclusao.ano);
            setbuf (stdin,NULL);

            break;
        }
        case poup:{

            printf ("Insira a data do deposito:  ");
            scanf ("%i%i%i",&(p+k)->conta_tipo.p._deposito.dia,&(p+k)->conta_tipo.p._deposito.mes,&(p+k)->conta_tipo.p._deposito.ano);
            // chamar a funcao pra calcular o quanto rendeu (JOAO VITOR);
            break;
        }

        case salar:{
            printf("Insira o valor em reais do salario: R$  ");
            scanf("%f",(p+k)->conta_tipo.s.salario);
            printf("Insira o nome do orgao em que o cliente trabalha:  ");
            fgets((p+k)->conta_tipo.s.orgao_trabalha,50,stdin);
            printf("Insira o cargo profissional ocupado pelo cliente:  ");
            fgets((p+k)->conta_tipo.s.cargo,12,stdin);
            printf("Insira a data de contracao profissional do cliente:  ");
            scanf("%i%i%i",&(p+k)->conta_tipo.s._contratacao.dia,&(p+k)->conta_tipo.s._contratacao.mes,&(p+k)->conta_tipo.s._contratacao.ano);
            break;
        }

        case corren:{
            break;
        }

    default :{
        printf("Opcao Invalida.Tente Novamente.");
        break;
    }   
    }
    c1 = (cadastro *) realloc(c1, (k+1)*sizeof(cadastro));
}
    
asked by anonymous 15.06.2018 / 03:06

1 answer

-1
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <stdio.h>



typedef struct{
    int dia,mes,ano;
}data;

typedef struct {
   char matricula[10];
   data _matricula;
   data _conclusao;
   char curso[25];
   char universidade[50];

}universitario;

typedef struct {
   data _deposito;
   float renda;
}poupanca;

typedef struct {
   float salario;
   char orgao_trabalha[50];
   char cargo[12];
   data _contratacao;
}salario;


 typedef struct{

 }corrente;

 typedef struct {
   char nome [25];
   char sobrenome[25];
   char endereco[50];
   char email[25];
   char telefone[12];
   char CPF[12];
   int ID;
   int  agencia;
   int numero;
 union {
   universitario u;
   poupanca p;
   salario s;
   corrente c;
 }conta_tipo;
}cadastro;

// VARIAVEL GLOBAL
cadastro *c1;
int k=1;

// ENUM
enum funcao_menu{cadastrar=1,remover,alterar_cliente,alterar_conta,
saque_deposito, rendimento,exibir};
enum saque_deposito{saque=1,deposito};
enum conta_tipo{univer=1,poup,salar,corren};

// PROTOTIPAGEM DE FUNÇOES
void funcao_menu ();
void ler_codigo(int n);
void preencher_cadastro (cadastro *p,int tipo_conta,int k);
void exibir_cliente (cadastro *p,int k);


//FUNCAO PRINCIPAL
int main () {
  int funcao;
  // INICIO DO MENU PRINCIPAL
  funcao_menu();
  scanf ("%i",&funcao);
  ler_codigo(funcao);
  system ("pause");
  return 0;
}


// Funcao Menu
void funcao_menu (){ 
  printf ("Banco Caraca\n\n");
  printf ("-Cadastro de Clientes-\n\n");
  printf ("Menu Principal\n--------------\n");
  printf ("1-Cadastrar Cliente\n");
  printf ("2-Remover Cliente\n");
  printf ("3-Alterar Cliente\n");
  printf ("4-Alterar Tipo De Conta\n");
  printf ("5-Realizar Saque ou Deposito\n");
  printf ("6-Calcular Rendimento da Poupanca\n");
  printf ("7-Exibir clientes cadastrados\n");
  printf ("---------------------------------\n");
  printf ("Insira o codigo numerico da funcao: ");
}


 // Funcao de leitura e preenchimento de dados

void ler_codigo(int n){
    int opcao;
    c1 = (cadastro *) malloc(sizeof(cadastro));
switch (n){

case 1:{
    int tipo_conta;
    printf ("Cadastrar Cliente\n");
    printf ("-----------------\n");
    printf("Insira o codigo numerico do tipo de conta:\n");
    printf("1-Universitario\n");
    printf("2-Poupanca\n");
    printf("3-Salario\n");
    printf("4-Corrente\n");
    printf("--------------\n");
    printf("Opcao Escolhida:  ");
    scanf ("%i",&tipo_conta);
        switch (tipo_conta){
            case univer:{
            printf ("Conta Universitario\n");
            printf ("-------------------\n");

            preencher_cadastro (c1,tipo_conta,k);
            break;
        }
            case poup:{
            printf ("Conta Poupanca\n");
            printf ("--------------\n");
            preencher_cadastro (c1,tipo_conta,k);
            break;
        }

            case salar:{
            printf ("Conta Salario\n");
            printf ("-------------\n");
            preencher_cadastro (c1,tipo_conta,k);
            break;
        }

            case corren:{
            printf ("Conta Corrente\n");
            printf ("--------------\n");
            preencher_cadastro (c1,tipo_conta,k);
            break;
        }



    }

    break;
}

case 2:{
    printf("Remover Cliente\n");
    printf("---------------\n");

    break;
}
case 3:{
    printf ("Alterar Cliente\n");
    printf ("----------------\n");

    break;
}
case 4: {
    printf ("Alterar Tipo De Conta\n");
    printf ("---------------------\n");

    break;
}
case 5:{
    printf ("Realizar Saque ou Deposito\n");
    printf ("Insira a opcao:\n");
    printf ("1-Saque\n");
    printf ("2-Deposito\n");
    printf ("----------\n");
    printf("Opcao Escolhida: ");
    scanf ("%i",&opcao);
        if (opcao==saque){
        printf ("Realizar Saque\n");
        printf ("--------------\n");

    }

        else if(opcao==deposito){
        printf("Realizar Deposito\n");
        printf("-----------------\n");

    }

        else if (opcao!=deposito||opcao!=saque){
        printf("Opcao Invalida.Tente Novamente.");

    }
        break;
}

case 6:{
    printf ("Calcular Rendimento Da Poupança\n");
    printf ("-------------------------------\n");
    break;
}
case 7:{
    printf ("Exibir clientes cadastrados\n");
    printf ("-------------------------------\n");
    exibir_cliente(c1,k);
    break;
}


 default :{
    printf ("Opcao Invalida.Tente Novamente.\n");
     break;
  }
 }

}

// FUNÇÃO DE EXIBIR CLIENTES
  void exibir_cliente (cadastro *p,int k){
    int i;
    printf("Clientes cadastrados: \n --------------------------------------- 
    -- \n");
    printf("Nome\n");
    for (i=1;i<=k;i++){
        printf("%s",(p+i)->nome);
    }
 }

 // FUNÇÃO DE PREENCHIMENTO GERAL DO CADASTRO
   void preencher_cadastro (cadastro *p,int tipo_conta,int k){
     printf ("Insira o nome do cliente a ser cadastrado:  ");
     fflush(stdin);
     fgets ((p+k)->nome,25,stdin);
    printf("Insira o sobrenome do cliente a ser cadastrado:  ");
    fflush(stdin);
    fgets ((p+k)->sobrenome,25,stdin);
    fflush(stdin);
    printf("Insira o endereco do cliente a ser cadastrado:  ");
    fgets ((p+k)->endereco,50,stdin);
    fflush(stdin);
    printf("Insira o e-mail do cliente a ser cadastrado:  ");
    fflush(stdin);
    fgets ((p+k)->email,25,stdin);
    fflush(stdin);
    printf("Insira o telefone (com DD) do cliente a ser cadastrado:  ");
    fflush(stdin);
    fgets ((p+k)->telefone,12,stdin); c
    fflush(stdin);
    printf("Insira o CPF do cliente a ser cadastrado:  ");
    fgets ((p+k)->CPF,12,stdin);
    fflush(stdin);

    switch (tipo_conta){

    case univer:{

        printf ("Insira o nome da universidade do cliente a ser cadastrado:  ");
        fgets ((p+k)->conta_tipo.u.universidade,50,stdin);
        setbuf (stdin,NULL);
        printf ("Insira o curso de graducao do cliente a ser cadastrado:  ");
        fgets ((p+k)->conta_tipo.u.curso,25,stdin);
        setbuf (stdin,NULL);
        printf ("Insira a matricula institucional do cliente a ser cadastrado:  ");
        fgets ((p+k)->conta_tipo.u.matricula,10,stdin);
        printf ("Insira a data de matricula do curso do cliente a ser cadastrado:  ");
        setbuf (stdin,NULL);
        scanf("%i%i%",&(p+k)->conta_tipo.u._matricula.dia,&(p+k)->conta_tipo.u._matricula.mes,&(p+k)->conta_tipo.u._matricula.ano);
        setbuf (stdin,NULL);
        printf ("Insira a data de conclusao de curso do cliente a ser cadastrado:  ");
        scanf("%i%i%",&(p+k)->conta_tipo.u._conclusao.dia,&(p+k)->conta_tipo.u._conclusao.mes,&(p+k)->conta_tipo.u._conclusao.ano);
        setbuf (stdin,NULL);

        break;
    }
    case poup:{

        printf ("Insira a data do deposito:  ");
        scanf ("%i%i%i",&(p+k)->conta_tipo.p._deposito.dia,&(p+k)->conta_tipo.p._deposito.mes,&(p+k)->conta_tipo.p._deposito.ano);
        // chamar a funcao pra calcular o quanto rendeu (JOAO VITOR);
        break;
    }

    case salar:{
        printf("Insira o valor em reais do salario: R$  ");
        scanf("%f",(p+k)->conta_tipo.s.salario);
        printf("Insira o nome do orgao em que o cliente trabalha:  ");
        fgets((p+k)->conta_tipo.s.orgao_trabalha,50,stdin);
        printf("Insira o cargo profissional ocupado pelo cliente:  ");
        fgets((p+k)->conta_tipo.s.cargo,12,stdin);
        printf("Insira a data de contracao profissional do cliente:  ");
        scanf("%i%i%i",&(p+k)->conta_tipo.s._contratacao.dia,&(p+k)- 
      >conta_tipo.s._contratacao.mes,&(p+k)->conta_tipo.s._contratacao.ano);
        break;
    }

    case corren:{
        break;
    }

default :{
    printf("Opcao Invalida.Tente Novamente.");
    break;
  }
 }
  p = (cadastro *) realloc(c1, (k+1)*sizeof(cadastro));
}

Your problem was only in the library import and in an unplaced key kkkk I have not encountered any issues related to your allocation, but I will continue to take a closer look at the code and exercise.

One tip: you could put a repeat system in the time to show the notes, in case the user wants to return to the menu without the program closing.

    
15.06.2018 / 03:55