Ir ao conteúdo

C++ c/c++ Retorno da função, crash na aplicação


Ir à solução Resolvido por Midori,

Posts recomendados

Postado

Olá, estou aprendendo a programar em c++, e devo admitir não é fácil, e tive a ideia de desenvolver um pequeno projete de uma AGENDA.

O problema consiste em que não recebo o retorno das funções de exibir o contato selecionado e nem a alteração de contato caso o usuario deseje alterar algum contato.

Os problemas estão ao fim do código marcados com comentarios!

Segue abaixo o codigo:

#include <iostream>
#include <cstring>
#include <locale>
#define MAX 50//Para não precisar mudar cada um individualmente

using namespace std;
//PROTOTIPOS---------------
void menu();
void cadastro(int cadastro);
char* needMemoria(int tam);
void NumeroCont(int Tcont);
int indic(int totalCont, char* Snome);
int mostraC(int indice);
void modificar(int indice);
//-------------------------

struct Agenda
{
    char* nome;
    char telefone[18];
    char* email;

}agenda[MAX];

int main()
{
    setlocale(LC_ALL,"");
    int Cadas=0;
    char nome[MAX];
    int opc;
    int indice;
    do
    {
        system("cls");
        menu();
        cin>>opc;
        switch(opc)
        {
            case 1:
                Cadas++;//acrescenta a quantidade de cadastros realizados
                cadastro(Cadas);
                break;
            case 2:
                NumeroCont(Cadas);
                break;
            case 3:
                cin.ignore(1000,'\n');
                cout<<"Nome do contato: \n";
                scanf("%[^\n]c",nome);
                setbuf(stdin,NULL);
                indice=indic(Cadas, nome);
                if(indice >= 0 && indice <= 99)
                {
                    mostraC(indice);
                }
                else
                {
                    cout<<"Contato não cadastrado!\n";
                }
                break;
            case 4:
                cout<<"Indice do contato[1 - 99]: \n";
                cin>>indice;
                indice-=1;
                if(indice>=0 && indice <=99)
                {
                    modificar(indice);
                }
                else {cout<<"Contato não existente!\n";}
                break;
            case 5:
                cout<<"5\n\n";
            case 0:
                cout<<"OBRIGADO, PELA preferência\n\n";
                break;
            default:
                cout<<"ERRO! opção desconhecida\n";
        }
        cout<<Cadas<<"  <-REGISTROS\n";//EXCLUIR DEPOIS
        system("pause");
    }while(opc!=0);
    return 0;
}
//MENU-------------
void menu()
{
    cout<<"-----MENU-----\n";
    cout<<"1-- Adicionar contato: \n";
    cout<<"2-- Ver lista de contatos: \n";
    cout<<"3-- Ver contato: \n";
    cout<<"4-- Modificar contato: \n";
    cout<<"5-- Excluir contatos: \n";
    cout<<"0-- SAIR! \n";
}
//Funcao adiciona novos contatos
void cadastro(int registro)
{
    char dd[MAX];

        cin.ignore(100,'\n');
    cout<<"Nome do contato: ";
        scanf("%[^\n]c",dd);
        setbuf(stdin,NULL);
        agenda[registro].nome=needMemoria(strlen(dd));//verifica o tamanho e aloca
        strcpy(agenda[registro].nome,dd);
    cout<<"Numero do contato: ";
        scanf("%[^\n]c",agenda[registro].telefone);
        setbuf(stdin,NULL);//ideia de test para limpar buff
    cout<<"Email do contato: ";
        scanf("%[^\n]c",dd);
        setbuf(stdin,NULL);
        agenda[registro].email=needMemoria(strlen(dd));
        strcpy(agenda[registro].email,dd);
}
//tentativa de alocar memoria e verificar se a espaco
//não consegui com new mas esta funcionando com malloc
char* needMemoria(int tam){
    char* info = NULL;
    info = (char*) malloc(sizeof(tam) * sizeof(char));

    if(info == NULL){
        printf("ERRO: impossível alocar a quantidade de memória requisitada!");
        exit(1);
    }
    return info;
}
//Total de contatos
void NumeroCont(int Tcont)
{
    int cont=1;
    for(int i=1;i<=Tcont;i++)
    {
        cout<<"Contato nº: "<<cont++;
        cout<<"Nome      : "<<agenda[i].nome<<endl;
        cout<<"Numero    : "<<agenda[i].telefone<<endl;
        cout<<"Email     : "<<agenda[i].email<<"\n\n";
    }
    cout<<"Total de contatos: "<<cont<<"\n\n";
}
//Mostra um contato especifico
int indic(int totalCont, char* Snome)
{
    for(int i=0;i<totalCont;i++)
    {
        if(strcmp(Snome,agenda[i].nome) == 0)
        {
            return i;
        }
    }
    return -1;
}
//Mostra o indice selecionado
int mostraC(int indice)//PROBLEMA não RETORNA E FECHA O PROGRAMA COM ERRO!
{
    cout<<"Nome    : "<<agenda[indice].nome;
    cout<<"Telefone: "<<agenda[indice].telefone;
    cout<<"Email   : "<<agenda[indice].email;
}
//Modifica um contato
void modificar(int indice)//PROBLEMA não RETORNA E FECHA O PROGRAMA COM ERRO!
{
    char* nome;
    char telefone[18];
    char* email;
    char dd[MAX];


    cin.ignore(100,'\n');
    cout<<"Nome do contato: ";
        scanf("%[^\n]c",dd);
        setbuf(stdin,NULL);
        nome=needMemoria(strlen(dd));//verifica o tamanho e aloca
    cout<<"Numero do contato: ";
        scanf("%[^\n]c",agenda[indice].telefone);
        setbuf(stdin,NULL);//ideia de test para limpar buff
    cout<<"Email do contato: ";
        scanf("%[^\n]c",dd);
        setbuf(stdin,NULL);
        email=needMemoria(strlen(dd));

        strcpy(agenda[indice].nome,nome);
        strcpy(agenda[indice].telefone,telefone);
        strcpy(agenda[indice].email,email);
}

Desde ja agradeço toda ajuda!

  • Curtir 1
  • Solução
Postado

@Ninenome A forma como está fazendo vai dar mais trabalho e deixará a manutenção do código mais difícil. Está programando no "estilo C", mas com alguns comandos do C++. Se quer programar em C++ pode simplificar o código com string no lugar do vetor de char e containers (como vector) no lugar de alocação dinâmica. Há várias formas de fazer, mas um exemplo simples de como poderia ser feito em C++.

 

#include <iostream>
#include <vector>
using namespace std;

typedef struct{
    string nome;
    string telefone;
    string email;
}Registro;

typedef struct{
    int codigo;
    Registro reg;
}Agenda;

vector <Agenda> &cadastro(int codigo, vector <Agenda> &agenda);
bool imprime(int codigo, vector <Agenda> &agenda);
int menu(void);

int main(void){
    int opcao;
    int codigo = 1;
    vector <Agenda> agenda;
    
    while((opcao = menu())){
        cin.ignore();
        if(opcao == 1){
            cadastro(codigo, agenda);
            codigo += 1;
        }else if(opcao == 2){
            int codigo;
            cout << "Codigo: ";
            cin >> codigo;
            if(imprime(codigo, agenda) == false){
                cout << "Codigo não encontrado\n";
            }
        }
    }
    return 0;
}

int menu(void){
    int opcao;
    cout <<
        "1 - Cadastra\n"
        "2 - Imrpime\n"
        "0 - Sai\n: ";
    cin >> opcao;
    return opcao;
}

vector <Agenda> &cadastro(int codigo, vector <Agenda> &agenda){
    Registro reg;
    Agenda ag;
    cout << "Nome: ";
    getline(cin, reg.nome);
    cout << "Telefone: ";
    getline(cin, reg.telefone);
    cout << "Email: ";
    getline(cin, reg.email);
    ag.codigo = codigo;
    ag.reg = reg;
    agenda.push_back(ag);
    return agenda;
}

bool imprime(int codigo, vector <Agenda> &agenda){
    bool existe = false;
    for(auto ag : agenda){
        if(ag.codigo == codigo){
            cout << ag.reg.nome << endl;
            cout << ag.reg.telefone << endl;
            cout << ag.reg.email << endl;
            existe = true;
            break;
        }
    }
    return existe;
}

 

Mas se quer programar em C com entradas dinâmicas, procure por Lista Encadeada que é um assunto no estudo da estrutura de dados.

 

  • Curtir 1
  • Amei 1
Postado

 

Seu programa como está escrito é um programa em C. Não há qualquer razão para programar assim em C++. Só vai ter (muito) mais trabalho e menos resultados

 

Isso que escreveu é um vetor de estruturas, compilável em C. E isso não é bom. Como deve estar já vendo, C++ é uma linguagem enorme e complexa. O fato de um dia ter sido chamada "C com classes" é histórico apenas, e já se vão 42 anos.

 

Se tem um livro ou um tutorial ou um roteiro para aprender sugiro mudar.

 

Vou tentar mostrar um pouco do que está errado e a diferença, escrevendo o programa em C e C++.

 

o programa C

 

22 horas atrás, Ninenome disse:
struct Agenda
{
    char* nome;
    char telefone[18];
    char* email;

}agenda[MAX];

 

Isso que escreveu é um vetor de struct, e está declarando agenda como struct Agenda[] e não está bom. Em C. Isso porque:

  • você está claramente criando um container, um vetor de contatos. E não tem isso no seu programa C. E claro que isso vai sair caro na hora de construir o programa.
  • agenda é global em seu programa e isso não é mesmo uma boa ideia. É um desastre proibido em toda parte, escolas e, claro, empresas.
  • a estrutura pode e devia ser anônima.
// PROTOTIPOS---------------
void  menu();
void  cadastro(int cadastro);
char* needMemoria(int tam);
void  NumeroCont(int Tcont);
int   indic(int totalCont, char* Snome);
int   mostraC(int indice);
void  modificar(int indice);
//-------------------------

 

Sugiro comentar o que está fazendo e/ou porque está fazendo. E evitar comentários meio óbvios como: protótipos, declarações, bibliotecas...

 

  • evite void a todo custo. Retorne algo, use argumentos, passe parâmetros. Não use nada global.
  • claro que menu deve retorna a opção
  • cadastro() não é um bom nome, mas se vai cadastrar algo deve cadastrar um item num cadastro. Escreva então o simples e consagrado
        int    cadastrar( Contato* contato, Agenda* agenda );

    onde você insere um certo contato numa certa agenda e retorna a posição no vetor, ou um número negativo se deu erro, talvez porque atingiu o limite. Assim tudo que a função usa está dentro dela (variáveis locais) ou entrou via argumentos. ;) é isso que se procura.

Exemplo (em C)

 

Note que 18 dígitos é pouco para um telefone. Considere o formato internacional.
 

typedef struct
{
    char* nome;
    char  telefone[25];
    char* email;

} Contato;

typedef struct
{
    int   capacidade;
    int   tam;
    Contato C[MAX];

} Agenda;

int     menu();  // retorna a opcao
int     cadastra(Contato* contato, Agenda* agenda);
Agenda* cria_cad(int tamanho);
Agenda* destroi_cad(Agenda* agenda);
int     mostra_cad(Agenda* agenda);
int     pesquisa(const char* nome, Agenda* agenda);
int     mostra_um(int indice, Agenda* agenda);
void    modifica(int indice, Agenda* agenda, Contato* contato);

 

Compare e entenda como é mais claro e seguro escrever assim. Ou escreva de volta.

 

Em C++

 

Em C++ é muito mais simples escrever essas coisas. Use uma classe ou struct. E um container. C++ tem várias dessas coisas, como vetores, listas, pilhas, filas e mapas. Basta declarar e usar. E são classes, e crescem ou diminuem dinamicamente. Claro que pode também ir criando um vetor de ponteiros para os contatos, no modo C, apenas não há razão para tal em uma agenda. E não se aloca memória via malloc(). Se for o caso use new e delete, mas seu uso é desencorajado há mais de uma década: o recomendado é usar smart_pointers, um tipo de alocação em que o compilador gera código para liberar a memória automaticamente, usando unique_ptr e shared_ptr como descritos na documentação, por exemplo aqui em português

 

Um exemplo

 

Total de contatos em "Agenda UM": 0

Total de contatos em "Agenda UM": 2

Contato #1
Nome      : Jhonny
Numero    : +55 (11) 123-456-789
Email     : [email protected]

Contato #2
Nome      : Willie
Numero    : +55 (11) 123-456-7909
Email     : [email protected]

Total de contatos em "Anonima": 0

Apagando a agenda "Anonima"
Apagando a agenda "Agenda UM"

 

 

Essa é a saída desse programa

 

int main()
{
    Agenda uma("Agenda UM");
    Agenda outra;

    uma.mostra();
    uma.insere(
        Contato("Jhonny", "+55 (11) 123-456-789", "[email protected]"));
    uma.insere(
        Contato("Willie", "+55 (11) 123-456-7909", "[email protected]"));
    uma.mostra();
    outra.mostra();
    return 0;
}

 

São criadas duas agendas, uma tem nome a outra não. Cada agenda tem um campo nome, claro. O programa está abaixo. Itens podem ser inseridos direto na chamada. Depois as agendas são mostradas na tela e ao final do programa são destruídas, no modo normal de C++ encerrar a vida de uma classe,

 

#include <iostream>
#include <locale>
#include <string>
#include <vector>
using namespace std;

struct Contato
{
    string nome;
    string telefone;
    string email;

    Contato(string nome, string telefone, string email)
        : nome(nome), telefone(telefone), email(email){};
    int mostra();
};

struct Agenda
{
    int             tamanho;
    string          nome;
    vector<Contato> cont;
    int mostra();
    size_t insere(Contato c);
    Agenda(string nome) : nome(nome), tamanho(0){};
    Agenda() : Agenda("Anonima") {}; // nome padrão
    ~Agenda() { cout << "Apagando a agenda \"" << nome << "\"\n"; };
};


int main()
{
    Agenda uma("Agenda UM");
    Agenda outra;

    uma.mostra();
    uma.insere(
        Contato("Jhonny", "+55 (11) 123-456-789", "[email protected]"));
    uma.insere(
        Contato("Willie", "+55 (11) 123-456-7909", "[email protected]"));
    uma.mostra();
    outra.mostra();
    return 0;
}

int Contato::mostra()
{
    cout << "Nome      : " << nome << "\n";
    cout << "Numero    : " << telefone << "\n";
    cout << "Email     : " << email << "\n\n";
    return 0;
}

int Agenda::mostra()
{
    cout << "Total de contatos em \"" << nome << "\": " <<  tamanho << "\n\n";

    int cont = 1;
    for ( auto um : Agenda::cont )
    {
        cout << "Contato #" << cont++ << "\n";
        um.mostra();
    }
    return 0;
}

size_t Agenda::insere(Contato c)
{ 
    Agenda::cont.push_back(c);
    tamanho = cont.size();
    return tamanho;
}

 

Conclusão

 

Não tenho tempo de escrever muito mais. Nem estou dizendo que essa é a melhor maneira ou nem como escrever isso em C. É só uma maneira de te mostrar algumas das diferenças.

 

O código em C++

 

#include <iostream>
#include <locale>
#include <string>
#include <vector>
using namespace std;

struct Contato
{
    string nome;
    string telefone;
    string email;

    Contato(string nome, string telefone, string email)
        : nome(nome), telefone(telefone), email(email){};
    int mostra();
};

struct Agenda
{
    int             tamanho;
    string          nome;
    vector<Contato> cont;
    int mostra();
    size_t insere(Contato c);
    Agenda(string nome) : nome(nome), tamanho(0){};
    Agenda() : Agenda("Anonima") {}; // nome padrão
    ~Agenda() { cout << "Apagando a agenda \"" << nome << "\"\n"; };
};


int main()
{
    Agenda uma("Agenda UM");
    Agenda outra;

    uma.mostra();
    uma.insere(
        Contato("Jhonny", "+55 (11) 123-456-789", "[email protected]"));
    uma.insere(
        Contato("Willie", "+55 (11) 123-456-7909", "[email protected]"));
    uma.mostra();
    outra.mostra();
    return 0;
}

int Contato::mostra()
{
    cout << "Nome      : " << nome << "\n";
    cout << "Numero    : " << telefone << "\n";
    cout << "Email     : " << email << "\n\n";
    return 0;
}

int Agenda::mostra()
{
    cout << "Total de contatos em \"" << nome << "\": " <<  tamanho << "\n\n";

    int cont = 1;
    for ( auto um : Agenda::cont )
    {
        cout << "Contato #" << cont++ << "\n";
        um.mostra();
    }
    return 0;
}

size_t Agenda::insere(Contato c)
{ 
    Agenda::cont.push_back(c);
    tamanho = cont.size();
    return tamanho;
}

 

1 hora atrás, Midori disse:
typedef struct{
    string nome;
    string telefone;
    string email;
}Registro;

typedef struct{
    int codigo;
    Registro reg;
}Agenda;

 

Não há razão para usar typedef em C++. Quando preciso o equivalente é using
 

1 hora atrás, Midori disse:
vector <Agenda> &cadastro(int codigo, vector <Agenda> &agenda);


Agenda seria um vetor de contatos, ou de Registro nesse caso. Sugiro escrever como tal:

 

struct Registro
{
    string nome;
    string telefone;
    string email;
};

struct Agenda
{
    int codigo;
    vector<Registro> reg;   
};

 

E usar o simples: escreva os métodos DENTRO da struct.

  • Curtir 1
  • Obrigado 1
  • Amei 1
Postado
7 horas atrás, arfneto disse:

 

Seu programa como está escrito é um programa em C. Não há qualquer razão para programar assim em C++. Só vai ter (muito) mais trabalho e menos resultados

 

Isso que escreveu é um vetor de estruturas, compilável em C. E isso não é bom. Como deve estar já vendo, C++ é uma linguagem enorme e complexa. O fato de um dia ter sido chamada "C com classes" é histórico apenas, e já se vão 42 anos.

 

Se tem um livro ou um tutorial ou um roteiro para aprender sugiro mudar.

 

Vou tentar mostrar um pouco do que está errado e a diferença, escrevendo o programa em C e C++.

 

o programa C

 

 

Isso que escreveu é um vetor de struct, e está declarando agenda como struct Agenda[] e não está bom. Em C. Isso porque:

  • você está claramente criando um container, um vetor de contatos. E não tem isso no seu programa C. E claro que isso vai sair caro na hora de construir o programa.
  • agenda é global em seu programa e isso não é mesmo uma boa ideia. É um desastre proibido em toda parte, escolas e, claro, empresas.
  • a estrutura pode e devia ser anônima.
// PROTOTIPOS---------------
void  menu();
void  cadastro(int cadastro);
char* needMemoria(int tam);
void  NumeroCont(int Tcont);
int   indic(int totalCont, char* Snome);
int   mostraC(int indice);
void  modificar(int indice);
//-------------------------

 

Sugiro comentar o que está fazendo e/ou porque está fazendo. E evitar comentários meio óbvios como: protótipos, declarações, bibliotecas...

 

  • evite void a todo custo. Retorne algo, use argumentos, passe parâmetros. Não use nada global.
  • claro que menu deve retorna a opção
  • cadastro() não é um bom nome, mas se vai cadastrar algo deve cadastrar um item num cadastro. Escreva então o simples e consagrado
        int    cadastrar( Contato* contato, Agenda* agenda );

    onde você insere um certo contato numa certa agenda e retorna a posição no vetor, ou um número negativo se deu erro, talvez porque atingiu o limite. Assim tudo que a função usa está dentro dela (variáveis locais) ou entrou via argumentos. ;) é isso que se procura.

Exemplo (em C)

 

Note que 18 dígitos é pouco para um telefone. Considere o formato internacional.
 

typedef struct
{
    char* nome;
    char  telefone[25];
    char* email;

} Contato;

typedef struct
{
    int   capacidade;
    int   tam;
    Contato C[MAX];

} Agenda;

int     menu();  // retorna a opcao
int     cadastra(Contato* contato, Agenda* agenda);
Agenda* cria_cad(int tamanho);
Agenda* destroi_cad(Agenda* agenda);
int     mostra_cad(Agenda* agenda);
int     pesquisa(const char* nome, Agenda* agenda);
int     mostra_um(int indice, Agenda* agenda);
void    modifica(int indice, Agenda* agenda, Contato* contato);

 

Compare e entenda como é mais claro e seguro escrever assim. Ou escreva de volta.

 

Em C++

 

Em C++ é muito mais simples escrever essas coisas. Use uma classe ou struct. E um container. C++ tem várias dessas coisas, como vetores, listas, pilhas, filas e mapas. Basta declarar e usar. E são classes, e crescem ou diminuem dinamicamente. Claro que pode também ir criando um vetor de ponteiros para os contatos, no modo C, apenas não há razão para tal em uma agenda. E não se aloca memória via malloc(). Se for o caso use new e delete, mas seu uso é desencorajado há mais de uma década: o recomendado é usar smart_pointers, um tipo de alocação em que o compilador gera código para liberar a memória automaticamente, usando unique_ptr e shared_ptr como descritos na documentação, por exemplo aqui em português

 

Um exemplo

 

Total de contatos em "Agenda UM": 0

Total de contatos em "Agenda UM": 2

Contato #1
Nome      : Jhonny
Numero    : +55 (11) 123-456-789
Email     : [email protected]

Contato #2
Nome      : Willie
Numero    : +55 (11) 123-456-7909
Email     : [email protected]

Total de contatos em "Anonima": 0

Apagando a agenda "Anonima"
Apagando a agenda "Agenda UM"

 

 

Essa é a saída desse programa

 

int main()
{
    Agenda uma("Agenda UM");
    Agenda outra;

    uma.mostra();
    uma.insere(
        Contato("Jhonny", "+55 (11) 123-456-789", "[email protected]"));
    uma.insere(
        Contato("Willie", "+55 (11) 123-456-7909", "[email protected]"));
    uma.mostra();
    outra.mostra();
    return 0;
}

 

São criadas duas agendas, uma tem nome a outra não. Cada agenda tem um campo nome, claro. O programa está abaixo. Itens podem ser inseridos direto na chamada. Depois as agendas são mostradas na tela e ao final do programa são destruídas, no modo normal de C++ encerrar a vida de uma classe,

 

#include <iostream>
#include <locale>
#include <string>
#include <vector>
using namespace std;

struct Contato
{
    string nome;
    string telefone;
    string email;

    Contato(string nome, string telefone, string email)
        : nome(nome), telefone(telefone), email(email){};
    int mostra();
};

struct Agenda
{
    int             tamanho;
    string          nome;
    vector<Contato> cont;
    int mostra();
    size_t insere(Contato c);
    Agenda(string nome) : nome(nome), tamanho(0){};
    Agenda() : Agenda("Anonima") {}; // nome padrão
    ~Agenda() { cout << "Apagando a agenda \"" << nome << "\"\n"; };
};


int main()
{
    Agenda uma("Agenda UM");
    Agenda outra;

    uma.mostra();
    uma.insere(
        Contato("Jhonny", "+55 (11) 123-456-789", "[email protected]"));
    uma.insere(
        Contato("Willie", "+55 (11) 123-456-7909", "[email protected]"));
    uma.mostra();
    outra.mostra();
    return 0;
}

int Contato::mostra()
{
    cout << "Nome      : " << nome << "\n";
    cout << "Numero    : " << telefone << "\n";
    cout << "Email     : " << email << "\n\n";
    return 0;
}

int Agenda::mostra()
{
    cout << "Total de contatos em \"" << nome << "\": " <<  tamanho << "\n\n";

    int cont = 1;
    for ( auto um : Agenda::cont )
    {
        cout << "Contato #" << cont++ << "\n";
        um.mostra();
    }
    return 0;
}

size_t Agenda::insere(Contato c)
{ 
    Agenda::cont.push_back(c);
    tamanho = cont.size();
    return tamanho;
}

 

Conclusão

 

Não tenho tempo de escrever muito mais. Nem estou dizendo que essa é a melhor maneira ou nem como escrever isso em C. É só uma maneira de te mostrar algumas das diferenças.

 

O código em C++

 

#include <iostream>
#include <locale>
#include <string>
#include <vector>
using namespace std;

struct Contato
{
    string nome;
    string telefone;
    string email;

    Contato(string nome, string telefone, string email)
        : nome(nome), telefone(telefone), email(email){};
    int mostra();
};

struct Agenda
{
    int             tamanho;
    string          nome;
    vector<Contato> cont;
    int mostra();
    size_t insere(Contato c);
    Agenda(string nome) : nome(nome), tamanho(0){};
    Agenda() : Agenda("Anonima") {}; // nome padrão
    ~Agenda() { cout << "Apagando a agenda \"" << nome << "\"\n"; };
};


int main()
{
    Agenda uma("Agenda UM");
    Agenda outra;

    uma.mostra();
    uma.insere(
        Contato("Jhonny", "+55 (11) 123-456-789", "[email protected]"));
    uma.insere(
        Contato("Willie", "+55 (11) 123-456-7909", "[email protected]"));
    uma.mostra();
    outra.mostra();
    return 0;
}

int Contato::mostra()
{
    cout << "Nome      : " << nome << "\n";
    cout << "Numero    : " << telefone << "\n";
    cout << "Email     : " << email << "\n\n";
    return 0;
}

int Agenda::mostra()
{
    cout << "Total de contatos em \"" << nome << "\": " <<  tamanho << "\n\n";

    int cont = 1;
    for ( auto um : Agenda::cont )
    {
        cout << "Contato #" << cont++ << "\n";
        um.mostra();
    }
    return 0;
}

size_t Agenda::insere(Contato c)
{ 
    Agenda::cont.push_back(c);
    tamanho = cont.size();
    return tamanho;
}

 

 

Não há razão para usar typedef em C++. Quando preciso o equivalente é using
 


Agenda seria um vetor de contatos, ou de Registro nesse caso. Sugiro escrever como tal:

 

struct Registro
{
    string nome;
    string telefone;
    string email;
};

struct Agenda
{
    int codigo;
    vector<Registro> reg;   
};

 

E usar o simples: escreva os métodos DENTRO da struct.

Obrigado pela atenção vou procurar melhorar o max, e assim aprender com meus erros! A estrada vai ser longa :) comecei nesse mundo tem quase 3 meses

8 horas atrás, Midori disse:

@Ninenome A forma como está fazendo vai dar mais trabalho e deixará a manutenção do código mais difícil. Está programando no "estilo C", mas com alguns comandos do C++. Se quer programar em C++ pode simplificar o código com string no lugar do vetor de char e containers (como vector) no lugar de alocação dinâmica. Há várias formas de fazer, mas um exemplo simples de como poderia ser feito em C++.

 

#include <iostream>
#include <vector>
using namespace std;

typedef struct{
    string nome;
    string telefone;
    string email;
}Registro;

typedef struct{
    int codigo;
    Registro reg;
}Agenda;

vector <Agenda> &cadastro(int codigo, vector <Agenda> &agenda);
bool imprime(int codigo, vector <Agenda> &agenda);
int menu(void);

int main(void){
    int opcao;
    int codigo = 1;
    vector <Agenda> agenda;
    
    while((opcao = menu())){
        cin.ignore();
        if(opcao == 1){
            cadastro(codigo, agenda);
            codigo += 1;
        }else if(opcao == 2){
            int codigo;
            cout << "Codigo: ";
            cin >> codigo;
            if(imprime(codigo, agenda) == false){
                cout << "Codigo não encontrado\n";
            }
        }
    }
    return 0;
}

int menu(void){
    int opcao;
    cout <<
        "1 - Cadastra\n"
        "2 - Imrpime\n"
        "0 - Sai\n: ";
    cin >> opcao;
    return opcao;
}

vector <Agenda> &cadastro(int codigo, vector <Agenda> &agenda){
    Registro reg;
    Agenda ag;
    cout << "Nome: ";
    getline(cin, reg.nome);
    cout << "Telefone: ";
    getline(cin, reg.telefone);
    cout << "Email: ";
    getline(cin, reg.email);
    ag.codigo = codigo;
    ag.reg = reg;
    agenda.push_back(ag);
    return agenda;
}

bool imprime(int codigo, vector <Agenda> &agenda){
    bool existe = false;
    for(auto ag : agenda){
        if(ag.codigo == codigo){
            cout << ag.reg.nome << endl;
            cout << ag.reg.telefone << endl;
            cout << ag.reg.email << endl;
            existe = true;
            break;
        }
    }
    return existe;
}

 

Mas se quer programar em C com entradas dinâmicas, procure por Lista Encadeada que é um assunto no estudo da estrutura de dados.

 

faz quase 3 meses que comecei mas ja percebi que preciso melhorar e muito ainda, não vou mais misturar c com c++ um erro que agora possuo conhecimento disto pesquisarei mais a fundo o c++ inclusive  neste código em que você melhorou imensamente e assimilar o max muito obrigada :)

  • Obrigado 1

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