Doubts about pointers and dynamic allocation

Asked

Viewed 76 times

-1

I’m having difficulty doing this activity. If possible, give me tips and solutions to improve the code. And explain to me why the compiler can run the program but when arriving at the end of the option REGISTER it error. Who can run the program in your compiler to test and see what I mean , I thank you very much.I suspect that the problem is with pointers or with the dynamic allocation made.

Make a program that performs the customer registration of a bank. Each customer has a name, a surname, an address, an email, a phone, a Cpf and an identifier. A customer may have one of the four account types allowed by the bank: current, salary, savings and university. For each of the types, there are different types of clients. For the university account, the client must student and must have registration, registration date, completion forecast, course and university. For the savings account, the information on when the customer deposited the money and how much he made in the last month. For the salary account, the client must have a salary, agency in which he works, position, date of employment. Current account is for other cases and does not have a specific information. All accounts shall 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));
}

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 a key not put kkkk I haven’t found any problems related to your allocation, but I will continue to take another look at the code and exercise.

A tip: you could put a repetition system when displaying the notes, in case the user wants to return to the menu without the program closes.

  • 1

    better your answer to make it easier to understand

Browser other questions tagged

You are not signed in. Login or sign up in order to post.