Ir ao conteúdo

C++ Como utilizar uma struct generica


Ir à solução Resolvido por arfneto,

Posts recomendados

Postado

estou fazendo um trabalho para a faculdade e preciso utilizar 1 struct generica na bibloteca e 2 "originais" no main, como eu utilizo?

#include <iostream>
using namespace std;
#include "agenda.h"
#include <windows.h>
#include <stdlib.h>
#include "biblioteca.h"

template <typename TIPO, int MAX>       //DEFINE AS STRUCS DA AGENDA
struct pessoa_fisica
{
    TIPO ID[MAX]= {}, CPF[MAX]= {}, Cel[MAX]= {}, CNPJ[MAX]= {},Empresa[MAX]= {}, Tcomercial[MAX]= {};
    string nome[MAX];
    int quantidade;

};
template <typename TIPO, int MAX>       //DEFINE AS STRUCS DA AGENDA
struct pessoa_juridica
{
    TIPO ID[MAX]= {}, CPF[MAX]= {}, Cel[MAX]= {}, CNPJ[MAX]= {},Empresa[MAX]= {}, Tcomercial[MAX]= {};
    string nome[MAX];
    int quantidade;

};

int main()
{
   
    return 0;
}
#ifndef BIBLIOTECA_H_INCLUDED
#define BIBLIOTECA_H_INCLUDED
#include <iostream>
using namespace std;
#include <stdlib.h>
#include <conio.h>


template <typename TIPO, int MAX>
struct Agenda {
 TIPO itens[MAX];
 int quantidade;
};

template <typename TIPO,int MAX>        //ZERA A AGENDA
bool inicializa_agenda(Agenda <TIPO,MAX> &ag)
{
    ag.quantidade = 0;
    return true;
}


}


template <typename TIPO,int MAX>
bool insere(Agenda <TIPO,MAX> &ag,int a)
{
    TIPO ID;
    cout<<"\tID: ";
    cin>>ID;
    for(int i=0; i<MAX; i++)
    {
        if(ID==ag.ID[i])
            return false;
    }
    ag.ID[a]=ID;
    return true;
}



#endif // BIBLIOTECA_H_INCLUDED

 

  • Curtir 1
Postado

@arfneto meu professor quer que eu crie 2 agendas no main, e utilize uma as funcoes do main de forma generica, por exemplo: se eu quiser inserir algo no CPF seria igual inserir no ID, entendeu?

adicionado 2 minutos depois

eu tenho q fazer isso,

• inicializar a agenda

• inserir um item na agenda

• remover um item da agenda

• fazer uma pesquisa na agenda

• A estrutura de itens e funções da biblioteca devem ter uma implementação única assumindo o tipo de contato de acordo com o parâmetro utilizando templates.

e ele passou esse exemplo como base de como fazer

template <typename TIPO, int MAX>
bool insere(Agenda <TIPO,MAX> &ag, TIPO dado); ...

 

  • Obrigado 1
Postado

mas eu ja postei

adicionado 1 minuto depois
#include <iostream>
using namespace std;
#include "agenda.h"
#include <windows.h>
#include <stdlib.h>
#include "biblioteca.h"
#define MAX 5

struct pessoa_juridica
{
    int ID, CNPJ,Empresa, Tcomercial;
    string nome;
    int quantidade;

};

struct pessoa_fisica
{
    int ID, CPF,Cel;
    string nome;
    int quantidade;

};





int main()
{
    system("color 70");
    int  aux,aux2;
    Agenda<pessoa_fisica,5> A1;
    Agenda <pessoa_juridica,5> A2;

    pessoa_fisica a1;

    inicializa_agenda(A1);
    inicializa_agenda(A2);
    insere(A1,a1);
do{

    Infos();
    cin>>aux;
    system("cls");
    if(aux==1) {
        tipos();
        cin>>aux2;
        system("cls");

        if(aux2==1) {
                if( A1.quantidade<MAX){
            cin.sync();
            int i;
            i=verifica_pos(A1);
            cout<<"\tNOME: ";
            getline(cin, A1.itens[i].nome);
            cin.sync();
            while(!geraID(A1,i)) {
                cout<<"\tID invalido"<<endl;
            }
            while(!geraCPF(A1,i)) {
                cout<<"\tCPF invalido"<<endl;
            }
            while(!geraCel(A1,i)) {
                cout<<"\tCelular invalido"<<endl;
            }
            A1.quantidade+=1;
        }
        else{
            cout<<"A agenda atingiu o numero maximo"<<endl;
        }

        }
        if(aux2==2) {
            if( A1.quantidade<MAX){
            cin.sync();
            int i;
            i=verifica_pos(A2);
            cout<<"\tNOME DA EMPRESA: ";
            getline(cin, A1.itens[i].nome);
            cin.sync();
            while(!geraID(A2,i)) {
                cout<<"\tID invalido"<<endl;
            }
            while(!geraCNPJ(A2,i)) {
                cout<<"\tCNPJ invalido"<<endl;
            }
            while(!geraEmpresa(A2,i)) {
                cout<<"\tNUMERO EMPRESARIAl invalido"<<endl;
            }
            A1.quantidade+=1;


        }}
        getch();
        system("cls");
    }

    if(aux==2){
            tipos();
        cin>>aux2;
            if(aux2==1){
                    pesquisar(A1);




            }


    }
    if(aux==3){
        int id;
    cout<<"DIGITE O ID QUE DESEJA EXCLUIR: ";
    cin>>id;
//    remover(A1,id);
  //   remover(A2,id);





    }


    if(aux==4){
            mostrar(A1);
            mostrar2(A2);






    }






    }while(aux!=5);












    return 0;
}
#ifndef BIBLIOTECA_H_INCLUDED
#define BIBLIOTECA_H_INCLUDED
#include <iostream>
using namespace std;
#include <stdlib.h>
#include <conio.h>


template <typename TIPO, int MAX>
struct Agenda {
    TIPO itens[MAX];
    int quantidade;
};

template <typename TIPO,int MAX>
bool inicializa_agenda(Agenda <TIPO,MAX> &ag)
{
    ag.quantidade = 0;
    return true;
}
template <typename TIPO,int MAX>
int verifica_pos(Agenda <TIPO,MAX> &ag) {

    for(int i=0; i<MAX; i++) {

        if(ag.itens[i].ID==0)
            return i;
    }
    return false;
}




template <typename TIPO,int MAX>
bool geraID(Agenda <TIPO,MAX> &ag,int a) {
    int ID;
    cout<<"\tID: ";
    cin>>ID;
    for(int i=0; i<MAX; i++) {
        if(ID==ag.itens[i].ID)
            return false;
    }
    ag.itens[a].ID=ID;
    return true;
}



template <typename TIPO,int MAX>
bool geraCPF(Agenda <TIPO,MAX> &ag,int a) {
    int CPF;
    cout<<"\tCPF: ";
    cin>>CPF;
    for(int i=0; i<MAX; i++) {
        if(CPF==ag.itens[i].CPF)
            return false;
    }
    ag.itens[a].CPF=CPF;
    return true;
}

template <typename TIPO,int MAX>
bool geraCel(Agenda <TIPO,MAX> &ag,int a) {
    int Cel;
    cout<<"\tCELULAR: ";
    cin>>Cel;
    for(int i=0; i<MAX; i++) {
        if(Cel==ag.itens[i].Cel)
            return false;
    }
    ag.itens[a].Cel=Cel;
    return true;
}

template <typename TIPO,int MAX>
bool geraCNPJ(Agenda <TIPO,MAX> &ag,int a) {
    int CNPJ;
    cout<<"\tCNPJ: ";
    cin>>CNPJ;
    for(int i=0; i<MAX; i++) {
        if(CNPJ==ag.itens[i].CNPJ)
            return false;
    }
    ag.itens[a].CNPJ=CNPJ;
    return true;
}
template <typename TIPO,int MAX>
bool geraEmpresa(Agenda <TIPO,MAX> &ag,int a) {
    int Empresa;
    cout<<"\tNUMERO EMPRESARIAL: ";
    cin>>Empresa;
    for(int i=0; i<MAX; i++) {
        if(Empresa==ag.itens[i].Empresa)
            return false;
    }
    ag.itens[a].Empresa=Empresa;
    return true;
}

template <typename TIPO,int MAX>
int pesquisar(Agenda <TIPO,MAX> &ag) {

    int id;
    string name;
    int aux=0;
    cout<<"pesquisar pelo id digite 1"<<endl<<"pesquisar pelo nome digite 2"<<endl;
    cin>>aux;
    if(aux==1) {

        cout<<"Digite o id: ";
        cin>>id;
        for(int i=0; i<MAX; i++) {
            if(id==ag.itens[i].ID) {
                cout<<"NOME: "<<ag.itens[i].nome<<endl<<"CPF: "<<ag.itens[i].CPF<<endl<<"ID: "<<ag.itens[i].ID<<endl<<"Celular: "<<ag.itens[i].Cel<<endl;
                return 1;
            }
        }
    } else if(aux==2) {
        cout<<"Digite o nome: ";
        cin>>name;
        /* for(int i=0; i<MAX; i++) {
             if(name==ag.nome[i]) {
                 cout<<"NOME: "<<ag.itens[i].nome<<endl<<"CPF: "<<ag.itens[i].CPF<<endl<<"ID: "<<ag.itens[i].ID<<endl<<"Celular: "<<ag.itens[i].Cel<<endl;
                 return 1;
             }
         }*/

    }
    cout<<"Codigo ou nome invalido";
    return 0;

}

template <typename TIPO,int MAX>
void mostrar(Agenda <TIPO,MAX> ag) {
    for(int i=0; i<MAX; i++) {
        if(ag.itens[i].ID!=0) {
            cout<<"NOME: "<<ag.itens[i].nome<<endl;
            cout<<"CPF: "<<ag.itens[i].CPF<<endl<<"ID: "<<ag.itens[i].ID<<endl<<"Celular: "<<ag.itens[i].Cel<<endl<<endl;
        }
    }

}
template <typename TIPO,int MAX>
void mostrar2(Agenda <TIPO,MAX> ag) {
    for(int i=0; i<MAX; i++) {
        if(ag.itens[i].ID!=0) {
            cout<<"NOME: "<<ag.itens[i].nome<<endl;
            cout<<"CNPJ: "<<ag.itens[i].CNPJ<<endl<<"ID: "<<ag.itens[i].ID<<endl<<"TELEFONE EMPRESARIAL: "<<ag.itens[i].Empresa<<endl<<endl;
        }
    }
}




/*template <typename TIPO,int MAX>
bool remover(Agenda <TIPO,MAX> &ag,int id) {

    for(int i=0; i<MAX; i++) {
        if(id==ag.itens[i].ID&&id!=0) {
            ag.itens[i].=0;
            ag.quantidade-=1;
            return true;
        }
    }
    return false;
}*/








void Infos() {                                       //abrir menu da agenda
    cout<<"\t\t**  Agenda   **"<<endl<<endl;
    cout<<"\t[1] - inserir um novo item na agenda"<<endl;
    cout<<"\t[2] - Procurar contato"<<endl;
    cout<<"\t[3] - remover um item da agenda"<<endl;
    cout<<"\t[4] - Mostrar todos os contatos"<<endl;
    cout<<"\t[5] - Sair"<<endl;
    cout<<"\t->";

}
void tipos()
{

    cout<<"\t\t**  Agenda   **"<<endl<<endl;
    cout<<"\n\t [1] - PARA PESSOA FISICA\n\t [2] - PARA PESSOA JURIDICA"<<endl;
    cout<<"\t->"; // MENU NA TELA
}





#endif // BIBLIOTECA_H_INCLUDED

 

Postado

Olá Felipe

 

Depois eu entendi que estava lá o código do header...

 

templates podem ser mesmo muito úteis, como maneira de personalizar códigos que podem tratar vários tipos de dados, Confesso no entanto que não entendi esse exemplo: usar para uma agenda não parece ser vantagem.

Para excelentes exemplos basta olhar na própria  STL --- e veja que STL significa exatamente isso, biblioteca padrão de templates --- e ver que se pode declarar conjuntos, listas, filas e vetores de qualquer coisa e o código já está pronto lá.

 

Seu programa é um programa em C na prática. Por exemplo é raro em C++ se ter uma função inicializa() para algo. Um construtor faz isso normalmente. 

 

Uma classe agenda --- struct agenda --- do modo como foi escrita não usa nenhuma vantagem de C++ exceto usar essas tais templates onde --- posso estar errado --- não é um bom cenário. 

 

Exemplos para declarações usando essas templates para dados

pessoa_fisica<string, 1>        		uma_pessoa_fisica;
Agenda<pessoa_fisica<string, 1>, 100>* 	uma_agenda = new(Agenda<pessoa_fisica<string, 1>, 100>);

Essa é a ideia de usar templates. Talvez essas declarações não funcionem no seu programa atual mas essa é a ideia: o compilador usa o código no template para gerar a declaração a cada momento. É um modelo.
 

E para métodos? Por exemplo

insere <pessoa_fisica<string,1>, 100> ( uma_pf, agenda_pf );

Esse método por exemplo seguiria o mesmo princípio e isso é muito útil. Mas temo que não nesse exemplo

 

Confesso que ainda não entendi o propósito. Vai gerar uma agenda que pode ser para pessoa jurídica ou para pessoa física e vai usar templates para definir o máximo de itens na agenda? E então uma agenda de 98 itens vai ser estruturalmente diferente de uma agenda de 89 itens? Só que não é.

 

Em C++ uma classe Agenda poderia ser implementada justamente usando coisas da STL e você poderia ter a Agenda armazenada em vetores, ou listas ou conjuntos ou sei lá. Esse era o propósito original dessas tais templates.

 

Veja esse seu caso

template <typename TIPO, int MAX>
struct Agenda {
    TIPO itens[MAX];
    int quantidade;
};

Isso quer dizer que, até onde eu entendi, vai ter uma agenda que pode ser de pessoa jurídica ou pessoa física, e o tamanho faz parte da definição da template. Fixo. Mas em C++ tem um enorme suporte para gravar entradas de agenda em estruturas de dados diversas... 

E pessoa_jurídica é a pessoa_física mais uns campos. E a agenda não tem nome...

 

Outra hora mostro um exemplo. Vejo que seu programa está aumentando :) foi boa ideia mudar a declaração dos ítens da agenda. Aqueles [] na versão inicial não eram boa ideia. MAs temo que os int de agora também não sejam...

Postado

@arfneto nao consegui explicar de uma forma clara, eu preciso que a mesma funcao da biblioteca insira valores em diferentes dados , por exemplo inserir no CPF e no ID, Eu o que eu tenho que fazer para eu conseguir fazer  isso

adicionado 2 minutos depois

@arfneto a struct agenda foi o professor que passou, nao fui eu quem criei vou lhe mostrar uma foto do enunciado do trabalho para ver se voce consegue entender e me ajudar image.thumb.png.c0d2c67c99a77254aa5a3e278e1cd8b9.png 

Postado

Olá Felipe

 

Legal incluir o enunciado :tw_thumbsup:

Afinal é como um contrato. Como falei, não é um bom exemplo. É uma pena uma escolha dessas. O que vai mudar para o template é

  • o máximo de ítens, que podia ser uma constante na struct, e
  • o conteúdo, que é irrelevante. poderia ter uma lista de contatos de cada tipo na mesma agenda

Esse conceito de template nem foi pensado para isso. E em C++ em situações normais não se usa uma rotina inicializar() porque cada struct já vem com isso de fábrica, digamos.

 

2 horas atrás, Felipe Hoffmeister disse:

funcao da biblioteca insira valores em diferentes dados , por exemplo inserir no CPF e no ID

 

A rotina que insere tem acesso à estrutura inteira então pode preencher todos os campos como preferir. Não recomendo ficar lendo nada do teclado enquanto está testando. Demora uma eternidade e fica difícil de reproduzir m erro. Use constantes e quando estiver funcionando em minutos você insere a leitura...

 

Vou te ajudar

  • Curtir 1
Postado

Pensando melhor, talvez tenha sido injusto dizendo que é um exemplo ruim e que é praticamente C e não C++. Pode ser que o instrutor queira justamente começar assim e ir revendo o código até ficar mais próximo de um programa comum em C++. Mas já é outubro e logo acaba o período então talvez nem seja o caso. E usar templates nesse exemplo não foi mesmo uma boa ideia...

 

Mas não dá pra discutir com um enunciado. Vamos ver até onde dá pra ir.

 

Usando o que você já tinha digitado e mais uns 15' escrevi um esqueleto de um exemplo para você considerar.

 

O exemplo mostra isso:

[Usando Agenda Pessoal - 0 para alterar]

1. Inserir novo item no final da agenda
2. remover um item da agenda (pelo ID)
3. pesquisar um item na agenda (por ID ou nome)
4. mostrar todos os itens da agenda
5. encerrar o programa
6. Bonus: Ordena a agenda

Opcao:

E se teclar 0 passa para isso:

[Usando Agenda Comercial - 0 para alterar]

1. Inserir novo item no final da agenda
2. remover um item da agenda (pelo ID)
3. pesquisar um item na agenda (por ID ou nome)
4. mostrar todos os itens da agenda
5. encerrar o programa
6. Bonus: Ordena a agenda

Opcao:

Bem óbvio. E se teclar 5 encerra. E a cada vez que tecla 0 o programa vai alterando entre as agendas como pedido.Está espelhando o enunciado. E as rotinas já estão declaradas. Pode ser um bom começo :D E já alterna entre as duas agendas como pedido.

 

Veja o programa:

#include <iostream>

#include "PF.h"
#include "PJ.h"
#include "Agenda.h"

using namespace std;


int            le_opcao()
{
    int o;
    cout << "\nOpcao: ";
    cin >> o;
    return o;
};    // end le_opcao()


void        mostra_menu(int* tipo)
{
    if (*tipo == 0)
    {
        cout << "\n\n[Usando Agenda Pessoal - 0 para alterar]\n" << endl;
    }
    else
    {
        cout << "\n\n[Usando Agenda Comercial - 0 para alterar]\n" << endl;
    };    // end if
    cout << "1. Inserir novo item no final da agenda" << endl;
    cout << "2. remover um item da agenda (pelo ID)" << endl;
    cout << "3. pesquisar um item na agenda (por ID ou nome)" << endl;
    cout << "4. mostrar todos os itens da agenda" << endl;
    cout << "5. encerrar o programa" << endl;
    cout << "6. Bonus: Ordena a agenda" << endl;

    return;
}

int main()
{
    int        op = 0;
    int        tipo_de_agenda = 0;
    //
    // faz o simples: mostra o menu, le a opcao, executa a opcao
    do
    {
        mostra_menu(&tipo_de_agenda);
        op = le_opcao();

        switch (op)
        {
        case 5:    // fim da linha
            cout << "Encerrando..." << endl;
            return 0;
        case 0:    // muda o tipo de agenda
            if (tipo_de_agenda == 0)
                tipo_de_agenda = 1;
            else
                tipo_de_agenda = 0;
            break;
        }
    } while (op != 5);
}

E o header Agenda.h já tem as funções declaradas usando as tais templates:

#pragma once
#include <iostream>

using namespace std;

template <typename TIPO, int MAX>
struct Agenda
{
    TIPO itens[MAX];
    int quantidade;
};


template <typename TIPO, int MAX>
bool        inicializa_agenda(Agenda<TIPO, MAX>& agenda)
{
    agenda.quantidade = 0;
    return true;
}    // end inicializa_agenda()


template <typename TIPO, int MAX>
bool        inserir(TIPO entrada, Agenda<TIPO, MAX>& agenda)
{
    return true;
};    // end inserir()


template <typename TIPO, int MAX>
bool        mostrar(Agenda<TIPO, MAX>& agenda)
{
    return true;
};    // end mostrar()


template <typename TIPO, int MAX>
bool        pesquisar(int ID, Agenda<TIPO, MAX>& agenda)
{
    return true;
};    // end pesquisar(ID)


template <typename TIPO, int MAX>
bool        pesquisar(string nome, Agenda<TIPO, MAX>& agenda)
{
    return true;
};    // end pesquisar(nome)


template <typename TIPO, int MAX>
bool        remover(int ID, Agenda<TIPO, MAX>& agenda)
{
    return true;
};    // end remover()

As outras estruturas para pessoa física e pessoa jurídica ainda estão em branco porque ainda não são necessárias

 

TEMPLATES em ação: veja como declarar as agendas por exemplo:

    const int    PESSOAL{ 0 };
    const int    COMERCIAL{ 1 };

    int        op = 0;
    int        tipo_de_agenda = PESSOAL;

    Agenda<PF, 200>            pessoal;
    inicializa_agenda <PF, 200>(pessoal);

    Agenda<PJ, 200>            comercial;
    inicializa_agenda <PJ, 200>(comercial);

Isso cria e inicializa as duas agendas, com um máximo de 200 itens em cada uma. E inicializa, que é uma coisa estranha em C++.

Repito, esse é um exemplo bem ruim :( 

 

Quando tiver um tempo vou acrescentar algum código para o resto. Sugiro rodar esse programa em sua máquina.

 

Tem interesse de fato no que estou explicando?

Postado

@arfneto tenho sim , mais tem coisas no codigo que postou que eu nao entendo , como #pragma once e #include "PF.h" #include "PJ.h"

 

adicionado 3 minutos depois

@arfneto e outra coisa, a agenda é uma só, quando for inserir algo nela e pressionar 1 la dentro voce escolhe em qual tipo de agenda você insere, entre a pessoal e juridica

 

adicionado 26 minutos depois

@arfneto  se você conseguir me ajudar somente em uma funcao, como na insere por ex, eu consigo fazer o resto pois estou com muita duvida no que meu professor pediu,  na minha logica a funcao insere tem q inserir qualquer tipo de dado como cpf, cnpj, id etc independente de qual struct você tem, nao sei se isso é possivel e se for nao sei como fazer

Postado
1 hora atrás, Felipe Hoffmeister disse:

coisas no codigo que postou que eu nao entendo , como #pragma once e #include "PF.h" #include "PJ.h

 

1 hora atrás, arfneto disse:

As outras estruturas para pessoa física e pessoa jurídica ainda estão em branco porque ainda não são necessárias

 

Pois é: como eu disse, estão em branco porque ainda não são necessárias.

#pragma once é a versão do meu compilador para esses #ifndef / #define que você usa em seu compilador, que não sei qual é...

1 hora atrás, Felipe Hoffmeister disse:

a agenda é uma só, quando for inserir algo nela e pressionar 1 la dentro voce escolhe em qual tipo de agenda você insere, entre a pessoal e juridica

 

Não, não é. A menos que você tenha trocado de enunciado e declarado a agenda de outro jeito.

 

2134615486_image.png.280de3d20d2c2d6854f7738da5071d6f(2).png.aa37192adf48ccb9e348810994f4b5f4.png

 

1 hora atrás, Felipe Hoffmeister disse:

me ajudar somente em uma funcao, como na insere por ex, eu consigo fazer o resto pois estou com muita duvida no que meu professor pediu,  na minha logica a funcao insere tem q inserir qualquer tipo de dado como cpf, cnpj, id etc independente de qual struct você tem

 

Você está com muita dúvida mas quer ajuda em uma única função?

 

Você entendeu as declarações que te mostrei? Das agendas? 

 

Vai chegar um momento no programa em que vai ter que sair das templates e programar precisamente para a agenda em questão. As rotinas que inserem e mostram os dados.

 

Brinde: um gabarito

 

Muitas vezes é melhor usar um editor de texto e formatar mais ou menos como vai ser a saída. Veja esse possível exemplo para seu exercício. Tem uma régua com os números das colunas :) 

Agenda Pessoal

 ID       CPF                    Nome                   Celular
         1         2         3         4         5         6         7
....5....0....5....0....5....0....5....0....5....0....5....0....5....0
000 012.345.67X-YZ                           nome +55 11 9 5678 1234
000 012.345.67X-YZ                           nome +55 11 9 5678 1234
000 012.345.67X-YZ                           nome +55 11 9 5678 1234


Agenda Comercial

 ID       CNPJ                    Nome                   Celular
         1         2         3         4         5         6         7
....5....0....5....0....5....0....5....0....5....0....5....0....5....0
001 12.345.XYZ/000X-YZ               EMPRESA XYZ   +55 12 1234-5XYZ
001 12.345.XYZ/000X-YZ               EMPRESA XYZ   +55 12 1234-5XYZ
001 12.345.XYZ/000X-YZ               EMPRESA XYZ   +55 12 1234-5XYZ
001 12.345.XYZ/000X-YZ               EMPRESA XYZ   +55 12 1234-5XYZ
001 12.345.XYZ/000X-YZ               EMPRESA XYZ   +55 12 1234-5XYZ
001 12.345.XYZ/000X-YZ               EMPRESA XYZ   +55 12 1234-5XYZ
001 12.345.XYZ/000X-YZ               EMPRESA XYZ   +55 12 1234-5XYZ

E um exemplo de uma struct que funciona para seu caso, podia ser um PF.h

#include <iostream>

using namespace std;

struct PF
{
    string                celular;
    string                CPF;
    unsigned short int    ID;
    string                nome;

    // o obvio, um parametro depois do outro, ordem alfabetica
    PF( string celular,  string CPF, unsigned short int ID, string nome) :
        celular{ celular },
        CPF{ CPF },
        ID{ ID },
        nome{ nome } {}

    PF() : ID{ 0 } {};
};

 

Postado

@arfneto A duvida que eu tenho e como fazer a funcao, pois eu fiz ja a agenda de uma forma que o meu professor disse q ta errado, na forma que eu fiz inserir algo no CPF por exemplo, tinha que ter uma funcao especifica para o CPF, a forma que ele quer seria como se tivesse uma funcao inserir e nela independente de qual itens que você tenha ela insere, você passa por parametro o CPF e dentro da funcao ela insere o cpf no local correto da mesma forma o id, cnpj etc, utlizando a mesam funcao

  • Solução
Postado

Felipe, você entendeu as duas declarações de Agenda que eu mostrei?

Rodou o programa que eu te mostrei?

Entendeu o gabarito que mostrei há pouco?

Entendeu que não há como ter uma única agenda com aquela declaração e aquele enunciado?

Entendeu a declaração de pessoa_fisica que eu te mostrei?

template <typename TIPO, int MAX>
struct Agenda
{
    TIPO itens[MAX];
    int quantidade;
};

Como vai ler os valores é irrelevante. São 3 ou 4 campos apenas. Pode ler em uma função qualquer e passar um parâmetro como o formato: Lê uma string e grava como determinado. Note que isso é muito secundário aqui: não vi validar CNPJ, CPF ou telefone, não vai de fato cadastrar os nomes, não tem qualquer regra para o ID.

 

Acho que foi a primeira coisa que eu recomendei: não perca tempo lendo valores do teclado. Faça o programa primeiro.

 

adicionado 22 minutos depois

 Dois cafés depois:

 

Se entendeu o que eu disse vai entender esse exemplo:

 

Considerando a struct de pessoa fisica que te mostrei, imagine uma função que a cada vez que você chama ela devolve uma struct arrumadinha e única, e você chama a cada vez ao invés de se preocupar em como vai ler. Se você chama 15 vezes ela traz 15 structs para você inserir. Quando demora pra escrever isso? muito menos do que demora pra ficar digitando para dezenas de cin >>

 

Uma rotina assim

//
// a cada vez que e chamada essa funcao retorna uma pessoa fisica assim
//
// celular            "+55 12 9 1234 5XYZ"
// CPF                "012.345.67X-YZ"
// ID                  XYZ
// nome               "nome XYZ"
//
// com XYZ a partir de 1
//

Podia ser essa ve_ai_uma_pf()

PF* ve_ai_uma_pf()
{
    static unsigned short    teste_id = 1;
    string            prefixo_CPF{ "012.345.67" };
    string            prefixo_nome{ "nome " };
    string            prefixo_celular{ "+55 12 9 1234 5" };
    char            valor[20];
    string            um_valor;

    PF* nova_pf = new(PF);        // cria uma nova struct PF para preencher 

    // celular
    sprintf(valor, "%s%03d", prefixo_celular.c_str(), teste_id);
    um_valor = valor;
    nova_pf->celular = um_valor;
    // CPF
    sprintf(valor, "%s%d-%02d", prefixo_CPF.c_str(), (teste_id / 100), (teste_id % 100));
    um_valor = valor;
    nova_pf->CPF = um_valor;
    // ID
    nova_pf->ID = teste_id;
    // nome
    sprintf(valor, "%s %03d", prefixo_nome.c_str(), teste_id);
    um_valor = valor;
    nova_pf->nome = um_valor;

    teste_id += 1;            // incrementa para o proximo ficar diferente
    return nova_pf;

};    // end ve_ai_uma_pf()

Que mostra isso para 15 caras

Testando leitura de dados para "pessoa fisica"


Agenda Pessoal


1       012.345.670-01  'nome  001'     +55 12 9 1234 5001
2       012.345.670-02  'nome  002'     +55 12 9 1234 5002
3       012.345.670-03  'nome  003'     +55 12 9 1234 5003
4       012.345.670-04  'nome  004'     +55 12 9 1234 5004
5       012.345.670-05  'nome  005'     +55 12 9 1234 5005
6       012.345.670-06  'nome  006'     +55 12 9 1234 5006
7       012.345.670-07  'nome  007'     +55 12 9 1234 5007
8       012.345.670-08  'nome  008'     +55 12 9 1234 5008
9       012.345.670-09  'nome  009'     +55 12 9 1234 5009
10      012.345.670-10  'nome  010'     +55 12 9 1234 5010
11      012.345.670-11  'nome  011'     +55 12 9 1234 5011
12      012.345.670-12  'nome  012'     +55 12 9 1234 5012
13      012.345.670-13  'nome  013'     +55 12 9 1234 5013
14      012.345.670-14  'nome  014'     +55 12 9 1234 5014
15      012.345.670-15  'nome  015'     +55 12 9 1234 5015

Chamando assim

int            testa_pf(int n)
{
    PF*            pessoa_fisica;
    cout << "Testando leitura de dados para \"pessoa fisica\"\n\n" << endl;
    cout << "Agenda Pessoal\n\n" << endl;
    for (int i = 0; i < n; i += 1)
    {
        pessoa_fisica = ve_ai_uma_pf();
        cout << 
            pessoa_fisica->ID << "\t" <<
            pessoa_fisica->CPF << "\t'" <<
            pessoa_fisica->nome << "'\t" <<
            pessoa_fisica->celular <<
            endl;
    }    // end for
    return 0;
}

com 

 

    testa_pf(15);

Não tem nem 10 linhas cada função, e os campos vem todos numerados pra facilitar. Entende a diferença?

 

Quando o programa estiver ok você troca essa ve_ai_uma_pf() por outra que le os 4 campos do teclado e pronto
    
 

Postado
Em 20/10/2019 às 17:18, arfneto disse:

Pode ler em uma função qualquer e passar um parâmetro como o formato: Lê uma string e grava como determinado

 

Olá Felipe

 

Imagino que já tenha terminado o programa, mas de todo modo veja essa função

char* le_algo(
    const char*             instrucao,
    const char*             mensagem,
    const unsigned short    tam,
    char*                   onde,
    unsigned short*         v
);

Onde

instrucao - a primeira mensagem, fica entre [ ] na tela
mensagem  - a segunda mensagem, que vai ficar antes do cursor
tam       - o tamanho maximo em bytes
onde      - endereco de onde vai montar o char[] com o retorno
v         - valor opcional, não precisa usar. Se usar, a função vai tentar converter
            para  int o valor digitado e devolver ai, ou zero se não conseguir


o valor de retorno é o endereço de onde :) 

Você chama assim por exemplo

 

    le_algo("ID: 1..999", "Entre ID a pesquisar: ", 3, valor, &id);

E fica assim na tela

[ID: 1..999]    Entre ID a pesquisar: 5

E retorna valor = "5" e id=5, claro

 

Eis um exemplo para a função. É bem simples e nem faz muitos testes, mas ao menos não cancela se o cara digitar letras ao invés de números. E trunca a saída se passar do tamanho. E converte pra int a ID :D no caso do seu exemplo

char* le_algo(
    const char* instrucao,
    const char* mensagem,
    const unsigned short    tam,
    char* onde,
    unsigned short* v
)
{
    int            i{};
    int            letra{};

    cout << "[" << instrucao << "]\t" <<
        mensagem << flush;

    letra = fgetc(stdin);            // fim da linha anterior
    onde[0] = 0;
    do
    {
        letra = fgetc(stdin);
        if (letra == EOF)
        {
            onde[i] = 0;
            break;
        }
        if (letra == '\n')
        {
            onde[i] = 0;
            break;
        }
        onde[i] = letra;
        i += 1;
    } while (1);                // le ate o fim da linha e termia a string
    if (v == NULL) return onde;    // nao foi pedido o numero
    *v = 0;                    // vai precisar do numero
    for (i = 0; i < (int) strlen(onde); i += 1)
    {    // se tem algo que nao seja numero retorna 0
        if ((onde[i] < '0') || (onde[i] > '9')) return onde;
    }    // end for
    // entao so tem numeros: converte
    *v = atoi(onde);
    return onde;
}    // end le_algo()

Se vai ler uma string apenas pode usar a versão com menos parâmetros

char* le_algo(
    const char* instrucao,
    const char* mensagem,
    const unsigned short    tam,
    char* onde
)
{
    // se nao vai ler um numero chama com NULL no final
    return le_algo(instrucao, mensagem, tam, onde, NULL);
}    // end le_algo()

Pode te ajudar se não terminou ainda

 

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

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!