Mensagens Recentes

Páginas: « 1 2 3 4 5 6 7 8 9 10 »
11
Estrutura de Dados / Aula 8 - Aplicação contextualizada
« Última Mensagem: por Jefferson Online Abril 25, 2019, 01:37:04 pm »
Citar
A Imobiliária Pirâmide deseja emitir fatura para pagamento de aluguéis dos imóveis locados. A imobiliária pode inserir e remover imóveis (um por um) que possuem: código_imóvel, código_cliente (código_cliente, nome, struct endereço e cpf), valor_aluguel, IPTU e situação. (TAD's - Cliente e Imóveis) O valor da fatura é: fatura = valor_aluguel + IPTU + tx_administracao + tx_banco

Taxas de administração (percentual do valor do aluguel)
Aluguel de até R$500: 8%
Aluguel entre R$500 e R$2000: 5%
Aluguel acima de R$2000: 3%

Taxa do banco
Aluguel de até R$1000: R$1,50
Aluguel acima de R$1000: R$0,95

As taxas de administração e do banco utilizam-se das tabelas, respectivamente. O sistema deve calcular e emitir as faturas sendo que, se a situação for igual a <<atraso>>, escrever também uma mensagem convidando o cliente a comparecer ao escritório da imobiliária. OBS: um cliente pode ter mais de um imóvel.

Menu:
  • Inserir um novo Imóvel/Cliente
  • Remover um Imóvel pelo Código
  • Alterar um Imóvel pelo Código
  • Calcular o Valor da Fatura de um Imóvel apresentando a situação.
  • Imprimir todos os Clientes/Imóveis

Eu incluí o projeto inteiro (Dev-C++) em um zip anexo, para facilitar.
Meu programa requer dois arquivos: clientes.txt e imoveis.txt que não estão exibidos aqui, mas estão no zip em anexo. Notar que todos os dados pessoais em clientes.txt são fictícios, obtidos em um gerador online.

main.cpp

Código: C++
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
#include <iostream>#include <strings.h>#include <sstream>#include <locale>#include <fstream>#include "imovel.h"#include "cliente.h" using std::cout;using std::cin;using std::string;using std::stringstream; bool arquivoExiste(const char *arquivo);int receberValor(string texto);void emitirFatura (Timovel *imovel, int numRec, Tcliente *cliente);int main() {     setlocale(LC_ALL,"");        //==================================================================================    Timovel * ptrImoveis= imovel_criar();     int numImoveis=0;     if (arquivoExiste("imoveis.txt")){        //Eu uso fstream e não ifstream porque pretendo usar o mesmo arquivo como saída de dados        std::fstream arqImoveis("imoveis.txt");         string linha="";        getline(arqImoveis, linha);        //A primeira linha do arquivo contém o número de registros armazenados nele        int numImoveisArq=stoi(linha);         //Leio o registros com os clientes a partir do arquivo e adiciono ao array        for (int i=0;i<numImoveisArq;i++){            imovel_adicionar(ptrImoveis,&numImoveis, &arqImoveis);        }    }     //==================================================================================    Tcliente * ptrClientes= cliente_criar();     int numClientes=0;        if (arquivoExiste("clientes.txt")){        //Eu uso fstream e não ifstream porque pretendo usar o mesmo arquivo como saída de dados        std::fstream arqClientes("clientes.txt");         string linha="";        getline(arqClientes, linha);        //A primeira linha do arquivo contém o número de registros armazenados nele        int numClientesArq=stoi(linha);         //Leio o registros com os clientes a partir do arquivo e adiciono ao array        for (int i=0;i<numClientesArq;i++){            cliente_adicionar(ptrClientes,&numClientes, &arqClientes);        }    }    //==================================================================================        string opcao="";     while (opcao!="0"){         cout <<"Número de clientes cadastrados: " << numClientes << '\n';        cout <<"Número de imóveis cadastrados: " << numImoveis << "\n\n";        cout <<"Escolha uma opção e em seguida tecle [ENTER]:\n\n";         cout <<"1 - Adicionar um imovel.\n";        if (numImoveis>0) cout <<"2 - Listar todos os imoveis.\n";        if (numImoveis>0) cout <<"3 - Deletar imovel.\n";        if (numImoveis>0) cout <<"4 - Editar imovel.\n";        if (numImoveis>0) cout <<"5 - Emitir Fatura.\n";        cout <<"6 - Adicionar um cliente.\n";        if (numClientes>0) cout <<"7 - Listar todos os clientes.\n";        cout <<"0 - Sair do programa.\n";                getline(cin, opcao);        if (opcao=="1"){            if (system("CLS")) system("clear");            imovel_adicionar(ptrImoveis,&numImoveis);            cout << "imovel adicionado.";            cout << "Tecle ENTER para voltar ao menu.";        };         if (opcao=="2"){            imovel_imprimirTodos(ptrImoveis, numImoveis);            cout << "tecle ENTER para voltar ao menu.";            getline(cin, opcao);        };         if (opcao=="3"){            if (system("CLS")) system("clear");            imovel_deletar(ptrImoveis, &numImoveis, receberValor("Digite o número do imovel a deletar: "));            cout << "imovel deletado. ";            cout << "Tecle ENTER para voltar ao menu.";            getline(cin, opcao);        };                if (opcao=="4"){            if (system("CLS")) system("clear");            imovel_editar(ptrImoveis,  receberValor("Digite o número do imovel a editar: ")-1);            cout << "imovel editado. ";            cout << "Tecle ENTER para voltar ao menu.";            getline(cin, opcao);        };                if (opcao=="5"){            if (system("CLS")) system("clear");            emitirFatura(ptrImoveis,  receberValor("Digite o número do imovel a faturar: ")-1, ptrClientes);            cout << "imovel faturado. ";            cout << "Tecle ENTER para voltar ao menu.";            getline(cin, opcao);        };                if (opcao=="6"){            if (system("CLS")) system("clear");            cliente_adicionar(ptrClientes,&numClientes);            cout << "cliente adicionado. ";            cout << "Tecle ENTER para voltar ao menu.";            getline(cin, opcao);        };         if (opcao=="7"){            cliente_imprimirTodos(ptrClientes, numClientes);            cout << "Tecle ENTER para voltar ao menu.";            getline(cin, opcao);        };      if (system("CLS")) system("clear");     }         // se eu tentar sair do programa sem ter adicionado nenhum item o programa trava    if (numImoveis>0) imovel_destruir(ptrImoveis);    if (numClientes>0) cliente_destruir(ptrClientes);return 0;} int receberValor(string texto){    string temp="";    int num=0;    while (true){        cout <<  texto;        getline(cin, temp);        stringstream myStream(temp);        if (myStream >>num) break; //sucesso na conversão            else            cout << "\nNúmero inválido. Tente de novo." << '\n';    };   return num;} bool arquivoExiste(const char *arquivo){    //Não é preciso fechar o stream porque o destrutor de ifstream é chamado    //na saída da função    std::ifstream infile(arquivo);    return infile.good();} void emitirFatura (Timovel *imovel, int numRec, Tcliente *cliente){        string codCliente= "";    string situacaoImovel= "";     float valorFatura= imovel_calcularFatura(imovel, numRec, &codCliente, &situacaoImovel);        //codCliente e situacaoCliente voltam de imovel_calcularFatura preenchido    cliente_imprimir( cliente, stoi(codCliente)-1);    cout << "Valor a pagar: R$" << valorFatura <<"\n";    if (situacaoImovel=="atrasado"){        cout<< "\n\nCaro cliente. Nosso sistema indica um débito em atraso.\n";        cout<< "Por favor entre am contato com nossa Central de Atendimento\n";        cout<< "para regularizar sua situação. Se esse débito já foi pago,\n";        cout<< "favor desconsiderar este aviso.\n\n";            }}

imovel.h

Código: C++
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
#include <iostream>#include <strings.h>#include <sstream>#include <locale>#include <fstream>#include "imovel.h"#include "cliente.h" using std::cout;using std::cin;using std::string;using std::stringstream; bool arquivoExiste(const char *arquivo);int receberValor(string texto);void emitirFatura (Timovel *imovel, int numRec, Tcliente *cliente);int main() {     setlocale(LC_ALL,"");        //==================================================================================    Timovel * ptrImoveis= imovel_criar();     int numImoveis=0;     if (arquivoExiste("imoveis.txt")){        //Eu uso fstream e não ifstream porque pretendo usar o mesmo arquivo como saída de dados        std::fstream arqImoveis("imoveis.txt");         string linha="";        getline(arqImoveis, linha);        //A primeira linha do arquivo contém o número de registros armazenados nele        int numImoveisArq=stoi(linha);         //Leio o registros com os clientes a partir do arquivo e adiciono ao array        for (int i=0;i<numImoveisArq;i++){            imovel_adicionar(ptrImoveis,&numImoveis, &arqImoveis);        }    }     //==================================================================================    Tcliente * ptrClientes= cliente_criar();     int numClientes=0;        if (arquivoExiste("clientes.txt")){        //Eu uso fstream e não ifstream porque pretendo usar o mesmo arquivo como saída de dados        std::fstream arqClientes("clientes.txt");         string linha="";        getline(arqClientes, linha);        //A primeira linha do arquivo contém o número de registros armazenados nele        int numClientesArq=stoi(linha);         //Leio o registros com os clientes a partir do arquivo e adiciono ao array        for (int i=0;i<numClientesArq;i++){            cliente_adicionar(ptrClientes,&numClientes, &arqClientes);        }    }    //==================================================================================        string opcao="";     while (opcao!="0"){         cout <<"Número de clientes cadastrados: " << numClientes << '\n';        cout <<"Número de imóveis cadastrados: " << numImoveis << "\n\n";        cout <<"Escolha uma opção e em seguida tecle [ENTER]:\n\n";         cout <<"1 - Adicionar um imovel.\n";        if (numImoveis>0) cout <<"2 - Listar todos os imoveis.\n";        if (numImoveis>0) cout <<"3 - Deletar imovel.\n";        if (numImoveis>0) cout <<"4 - Editar imovel.\n";        if (numImoveis>0) cout <<"5 - Emitir Fatura.\n";        cout <<"6 - Adicionar um cliente.\n";        if (numClientes>0) cout <<"7 - Listar todos os clientes.\n";        cout <<"0 - Sair do programa.\n";                getline(cin, opcao);        if (opcao=="1"){            if (system("CLS")) system("clear");            imovel_adicionar(ptrImoveis,&numImoveis);            cout << "imovel adicionado.";            cout << "Tecle ENTER para voltar ao menu.";        };         if (opcao=="2"){            imovel_imprimirTodos(ptrImoveis, numImoveis);            cout << "tecle ENTER para voltar ao menu.";            getline(cin, opcao);        };         if (opcao=="3"){            if (system("CLS")) system("clear");            imovel_deletar(ptrImoveis, &numImoveis, receberValor("Digite o número do imovel a deletar: "));            cout << "imovel deletado. ";            cout << "Tecle ENTER para voltar ao menu.";            getline(cin, opcao);        };                if (opcao=="4"){            if (system("CLS")) system("clear");            imovel_editar(ptrImoveis,  receberValor("Digite o número do imovel a editar: ")-1);            cout << "imovel editado. ";            cout << "Tecle ENTER para voltar ao menu.";            getline(cin, opcao);        };                if (opcao=="5"){            if (system("CLS")) system("clear");            emitirFatura(ptrImoveis,  receberValor("Digite o número do imovel a faturar: ")-1, ptrClientes);            cout << "imovel faturado. ";            cout << "Tecle ENTER para voltar ao menu.";            getline(cin, opcao);        };                if (opcao=="6"){            if (system("CLS")) system("clear");            cliente_adicionar(ptrClientes,&numClientes);            cout << "cliente adicionado. ";            cout << "Tecle ENTER para voltar ao menu.";            getline(cin, opcao);        };         if (opcao=="7"){            cliente_imprimirTodos(ptrClientes, numClientes);            cout << "Tecle ENTER para voltar ao menu.";            getline(cin, opcao);        };      if (system("CLS")) system("clear");     }         // se eu tentar sair do programa sem ter adicionado nenhum item o programa trava    if (numImoveis>0) imovel_destruir(ptrImoveis);    if (numClientes>0) cliente_destruir(ptrClientes);return 0;} int receberValor(string texto){    string temp="";    int num=0;    while (true){        cout <<  texto;        getline(cin, temp);        stringstream myStream(temp);        if (myStream >>num) break; //sucesso na conversão            else            cout << "\nNúmero inválido. Tente de novo." << '\n';    };   return num;} bool arquivoExiste(const char *arquivo){    //Não é preciso fechar o stream porque o destrutor de ifstream é chamado    //na saída da função    std::ifstream infile(arquivo);    return infile.good();} void emitirFatura (Timovel *imovel, int numRec, Tcliente *cliente){        string codCliente= "";    string situacaoImovel= "";     float valorFatura= imovel_calcularFatura(imovel, numRec, &codCliente, &situacaoImovel);        //codCliente e situacaoCliente voltam de imovel_calcularFatura preenchido    cliente_imprimir( cliente, stoi(codCliente)-1);    cout << "Valor a pagar: R$" << valorFatura <<"\n";    if (situacaoImovel=="atrasado"){        cout<< "\n\nCaro cliente. Nosso sistema indica um débito em atraso.\n";        cout<< "Por favor entre am contato com nossa Central de Atendimento\n";        cout<< "para regularizar sua situação. Se esse débito já foi pago,\n";        cout<< "favor desconsiderar este aviso.\n\n";            }}

imovel.cpp

Código: C++
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
#include <iostream>#include "imovel.h"#include <sstream> using std::cout;using std::cin;using std::string;using std::stringstream; struct Timovel{    string codigo_imovel;    string codigo_cliente;    float iptu;    float valor_aluguel;    string situacao; }; Timovel *imovel_criar(){ Timovel *imovel = new Timovel;     if (imovel == NULL) {        cout << "Memória insuficiente!\n" << '\n';        exit(1);    } return imovel;} void imovel_destruir (Timovel *imoveis){     delete []imoveis;}  float receberValorFloat(string texto){    string temp="";    float num=0;    while (true){        cout <<  texto;        getline(cin, temp);        stringstream myStream(temp);        if (myStream >>num) break; //sucesso na conversão            else            cout << "\nNúmero inválido: (" << temp <<") Tente de novo." << '\n';    }   return num;} void imovel_imprimirTodos (Timovel *imovel, int total){    cout <<"Exibindo agora os dados gravados\n\n";    for (int i=0;i<total;i++){      imovel_imprimir(imovel, i);    } } void imovel_imprimir (Timovel *imovel, int numRec){     cout <<"Codigo Imovel: " << imovel[numRec].codigo_imovel <<'\n';    cout <<"Codigo Cliente: " << imovel[numRec].codigo_cliente <<'\n';    cout <<"Valor aluguel: " << imovel[numRec].valor_aluguel <<'\n';    cout <<"IPTU: " << imovel[numRec].iptu <<'\n';    cout <<"Situação: " << imovel[numRec].situacao <<'\n';    cout <<'\n'; }  void imovel_editar (Timovel *imovel, int numRec){     string texto;    cout <<"Editando imovel de código: " << imovel[numRec].codigo_imovel <<"\n\n";    cout <<"O valor atual de cada campo será exibido entre parênteses\n";    cout <<"Basta teclar ENTER para deixar esse campo inalterado\n\n";     cout <<"Codigo Cliente (" << imovel[numRec].codigo_cliente << "): ";    getline(cin, texto);    if (texto!="") imovel[numRec].codigo_cliente=texto;        cout <<"\nValor aluguel (" << imovel[numRec].valor_aluguel << "): ";    getline(cin, texto);    if (texto!="") imovel[numRec].valor_aluguel=stof(texto);     cout <<"\nIPTU (" << imovel[numRec].iptu <<  "): ";    getline(cin, texto);    if (texto!="") imovel[numRec].iptu=stof(texto);     cout <<"\nSituação (" << imovel[numRec].situacao <<  "): ";    getline(cin, texto);    if (texto!="") imovel[numRec].situacao=texto;    cout <<'\n'; } void imovel_adicionar(Timovel *&imovel, int *numRegistros, std::fstream *arq){    //Aumenta o tamanho do vetor em um elemento e preenche esse elemento     Timovel *temp = new Timovel[*numRegistros+1];    std::copy(imovel,imovel+*numRegistros,temp);     delete imovel;    imovel=temp;     //preenche o registro adicionado com os dados do imovel        //Como imoveis podem ser deletados, a partir do segundo imóvel o codigo de registro    // é determinado somando um ao código do imóvel anterior    if (*numRegistros <2) imovel[*numRegistros].codigo_imovel = *numRegistros;    else{        string codigo_imovel_anterior = imovel[(*numRegistros)-1].codigo_imovel;        imovel[*numRegistros].codigo_imovel=std::to_string(stoi(codigo_imovel_anterior)+1);    }    //imovel_cadastrar(&imovel[*numRegistros], *numRegistros);    if (arq==NULL){ //se não for definido um arquivo ao ser chamada a função, lê do prompt         cout <<"Código_Cliente: ";        getline(cin, imovel->codigo_cliente);         imovel->valor_aluguel=receberValorFloat("Valor Aluguel: ");        imovel->iptu=receberValorFloat("Valor IPTU: ");        cout <<"Situação: ";        getline(cin, imovel->situacao);        cout <<'\n';    }else{  //carrega do arquivo    string linha;        getline(*arq, imovel[*numRegistros].codigo_imovel);        getline(*arq, imovel[*numRegistros].codigo_cliente);        getline(*arq, linha);        imovel[*numRegistros].valor_aluguel=stof(linha);        getline(*arq, linha);        imovel[*numRegistros].iptu=stof(linha);        getline(*arq, imovel[*numRegistros].situacao);    }     *numRegistros=*numRegistros+1; } void imovel_deletar(Timovel *&imovel, int *numRegistros, int numRec){    //crio um novo vetor com um elemento a menos e copio do vetor antigo    //todos os elemmentos anteriores e posteriores ao registro a ser apagado    Timovel *temp = new Timovel[*numRegistros-1];    std::copy(imovel,imovel+numRec-1,temp);    std::copy(imovel+numRec,imovel+*numRegistros,temp+numRec-1);     delete imovel;    imovel=temp;    *numRegistros=*numRegistros-1; } float imovel_calcularFatura (Timovel *imovel, int numRec, string *codCliente, string *situacaoImovel){     *codCliente= imovel[numRec].codigo_cliente;    *situacaoImovel= imovel[numRec].situacao;        float aluguel = imovel[numRec].valor_aluguel;    float iptu = imovel[numRec].iptu;     float txAdm = 0.03;    if ((aluguel > 500) && (aluguel<=2000))txAdm=0.05;    if (aluguel <=500) txAdm=0.08;     float txBanco = 1.50;    if (aluguel >1000) txBanco=0.95;     float valorFatura = aluguel + iptu + (aluguel*txAdm) +txBanco;     cout <<"Situação: " << imovel[numRec].situacao <<'\n';    cout <<'\n';        return valorFatura; }

cliente.h

Código: C++
123456789101112
#include <fstream>using std::fstream;struct Tcliente; Tcliente *cliente_criar();void cliente_cadastrar (Tcliente *cliente, int indice);void cliente_imprimirTodos (Tcliente *cliente, int total);void cliente_imprimir (Tcliente *cliente, int numRec);//Defini um argumento default NULL para "arq" porque essa função só será chamada com//esse argumento na inicialização do programavoid cliente_adicionar(Tcliente *&cliente, int *numRegistros, fstream *arq=NULL);void cliente_destruir (Tcliente *cliente);

cliente.cpp

Código: C++
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
#include <iostream>#include "cliente.h" using std::cout;using std::cin;using std::string; struct Tendereco{  string logradouro;  string numero;  string complemento;  string cep;  string bairro;  string cidade;  string uf;}; struct Tcliente{    string nome;    string cpf;    int codigo_cliente;    Tendereco endereco; }; Tcliente *cliente_criar(){ Tcliente *cliente = new Tcliente;     if (cliente == NULL) {        cout << "Memória insuficiente!\n" << '\n';        exit(1);    } return cliente;} void cliente_destruir (Tcliente *clientes){     delete []clientes;}   void cliente_imprimirTodos (Tcliente *cliente, int total){    cout <<"Exibindo agora os dados gravados\n\n";    for (int i=0;i<total;i++){      cliente_imprimir(cliente, i);    } } void cliente_imprimir (Tcliente *cliente, int numRec){     cout <<"Código cliente: " << cliente[numRec].codigo_cliente <<'\n';    cout <<"Nome: " << cliente[numRec].nome <<'\n';    cout <<"CPF: " << cliente[numRec].cpf <<'\n';    cout <<"Endereço: " << cliente[numRec].endereco.logradouro <<", " <<cliente[numRec].endereco.numero ;    if (cliente[numRec].endereco.complemento !="") cout << ", " <<cliente[numRec].endereco.complemento;    cout <<"\n" <<cliente[numRec].endereco.bairro ;    cout <<"\n" <<cliente[numRec].endereco.cidade ;    cout <<"\n" <<cliente[numRec].endereco.uf ;    cout <<"\n" <<cliente[numRec].endereco.cep ;     cout <<"\n\n"; } void cliente_adicionar(Tcliente *&cliente, int *numRegistros, fstream *arq){    //Aumenta o tamanho do vetor em um elemento e preenche esse elemento     Tcliente *temp = new Tcliente[*numRegistros+1];    std::copy(cliente,cliente+*numRegistros,temp);     delete cliente;    cliente=temp;        //preenche o registro adicionado com os dados do cliente    cliente[*numRegistros].codigo_cliente=*numRegistros+1;    //cliente_cadastrar(&cliente[*numRegistros], *numRegistros);    if (arq==NULL){ //se não for definido um arquivo ao ser chamada a função, lê do prompt         cout <<"Nome: ";        getline(cin, cliente[*numRegistros].nome);        cout <<"CPF: ";        getline(cin, cliente[*numRegistros].cpf);        cout <<"Logradouro: ";        getline(cin, cliente[*numRegistros].endereco.logradouro);        cout <<"Número: ";        getline(cin, cliente[*numRegistros].endereco.numero);        cout <<"Complemento: ";        getline(cin, cliente[*numRegistros].endereco.complemento);        cout <<"Bairro: ";        getline(cin, cliente[*numRegistros].endereco.bairro);        cout <<"Logradouro: ";        getline(cin, cliente[*numRegistros].endereco.cidade);        cout <<"UF: ";        getline(cin, cliente[*numRegistros].endereco.uf);        cout <<"CEP: ";        getline(cin, cliente[*numRegistros].endereco.cep);        cout <<'\n';    }else{  //carrega do arquivo        getline(*arq, cliente[*numRegistros].nome);        getline(*arq, cliente[*numRegistros].cpf);        getline(*arq, cliente[*numRegistros].endereco.logradouro);        getline(*arq, cliente[*numRegistros].endereco.numero);        getline(*arq, cliente[*numRegistros].endereco.complemento);        getline(*arq, cliente[*numRegistros].endereco.bairro);        getline(*arq, cliente[*numRegistros].endereco.cidade);        getline(*arq, cliente[*numRegistros].endereco.uf);        getline(*arq, cliente[*numRegistros].endereco.cep);    }     *numRegistros=*numRegistros+1; } 

12
Programação em geral / Formatar CPF e telefone em Java
« Última Mensagem: por Jefferson Online Abril 19, 2019, 07:05:35 pm »
Código: [Selecionar]
[code-java]private String formatarNumero(String tipo, String numero) {
 
    numero=numero.replaceAll("\\D", ""); //Removo todos os caracteres não-numéricos
    String mascara="";
   
    if (tipo.equalsIgnoreCase("telefone")) {
//Neste ponto o telefone ou tem 11 digitos (celulares) ou 10 digitos (fixos)
mascara= "(##) #####-####"; //Celulares
if (numero.length()==10) mascara="(##) ####-####"; //Telefones fixos
    }
    if (tipo.equalsIgnoreCase("cpf")) {
mascara="###.###.###-##"; 
    }    
try {
javax.swing.text.MaskFormatter formatadorNumero = new javax.swing.text.MaskFormatter(mascara);
javax.swing.JFormattedTextField txtNumero = new javax.swing.JFormattedTextField(formatadorNumero);
txtNumero.setText(numero);
return txtNumero.getText();
} catch (java.text.ParseException e) {
e.printStackTrace();
return "";
}

 }

O método usa três máscaras diferentes:

"###.###.###-##" para CPF

"(##) #####-####" para celulares
"(##) ####-####" para telefones fixos

Você pode mudar a formatação modificando a máscara correspondente

Exemplos de como chamar o método:

   this.telefone=formatarNumero("telefone", numero);
   this.cpf=formatarNumero("cpf", numero);
13
Programação em geral / Validação de telefone em Java
« Última Mensagem: por Jefferson Online Abril 19, 2019, 07:00:33 pm »
Código: Java
123456789101112131415161718192021222324252627282930313233343536373839
private boolean validarTelefone(String telefone) {         //Baseado no original para javascript:         //https://gist.github.com/jonathangoncalves/7bdec924e9bd2bdf353d6b7520820b62             //retira todos os caracteres não-numéricos (incluindo espaço,tab, etc)    telefone = telefone.replaceAll("\\D","");        //verifica se tem a qtde de numeros correta    if (!(telefone.length() >= 10 && telefone.length() <= 11)) return false;     //Se tiver 11 caracteres, verificar se começa com 9 o celular    if (telefone.length() == 11 && Integer.parseInt(telefone.substring(2, 3)) != 9) return false;     //verifica se o numero foi digitado com todos os dígitos iguais    java.util.regex.Pattern p = java.util.regex.Pattern.compile(telefone.charAt(0)+"{"+telefone.length()+"}");    java.util.regex.Matcher m = p.matcher(telefone);    if(m.find()) return false;        //DDDs validos    Integer[] codigosDDD = {        11, 12, 13, 14, 15, 16, 17, 18, 19,        21, 22, 24, 27, 28, 31, 32, 33, 34,        35, 37, 38, 41, 42, 43, 44, 45, 46,        47, 48, 49, 51, 53, 54, 55, 61, 62,        64, 63, 65, 66, 67, 68, 69, 71, 73,        74, 75, 77, 79, 81, 82, 83, 84, 85,        86, 87, 88, 89, 91, 92, 93, 94, 95,        96, 97, 98, 99};    //verifica se o DDD é valido (sim, da pra verificar rsrsrs)    if ( java.util.Arrays.asList(codigosDDD).indexOf(Integer.parseInt(telefone.substring(0, 2))) == -1) return false;        //Se o número só tiver dez digitos não é um celular e por isso o número logo após o DDD deve ser 2, 3, 4, 5 ou 7     Integer[] prefixos = {2, 3, 4, 5, 7};        if (telefone.length() == 10 && java.util.Arrays.asList(prefixos).indexOf(Integer.parseInt(telefone.substring(2, 3))) == -1) return false;     //se passar por todas as validações acima, então está tudo certo    return true;}
14
Programação em geral / Re:Validação de CPF em Java
« Última Mensagem: por Jefferson Online Abril 17, 2019, 01:48:36 am »
Duas coisas que me deixaram confuso ao ler essa função, mas só por eu ser inexperiente:

return soma > 9 ? 0 : soma;

Essa é uma aplicação do operador ternário e equivale a:

if (soma>9) {
    return 0;
} else {
return soma;
}

A segunda foi o que danado "digito" está fazendo nesta linha:

for (int indice=str.length()-1, digito; indice >= 0; indice-- ) {


Mas descobri que isso é uma simplificação de:

int digito;
for (int indice=str.length()-1; indice >= 0; indice-- ) {

15
Programação em geral / Validação de CPF em Java
« Última Mensagem: por Jefferson Online Abril 16, 2019, 05:23:22 pm »
Se você procurar por isso na Internet uma das funções mais fáceis de entender que você encontra é esta aqui, que também valida o CNPJ:

Código: Java
1234567891011121314151617181920212223242526272829
public class ValidaCPFCNPJ {   private static final int[] pesoCPF = {11, 10, 9, 8, 7, 6, 5, 4, 3, 2};   private static final int[] pesoCNPJ = {6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2};   private static int calcularDigito(String str, int[] peso) {      int soma = 0;      for (int indice=str.length()-1, digito; indice >= 0; indice-- ) {         digito = Integer.parseInt(str.substring(indice,indice+1));         soma += digito*peso[peso.length-str.length()+indice];      }      soma = 11 - soma % 11;      return soma > 9 ? 0 : soma;   }   public static boolean isValidCPF(String cpf) {      if ((cpf==null) || (cpf.length()!=11)) return false;      Integer digito1 = calcularDigito(cpf.substring(0,9), pesoCPF);      Integer digito2 = calcularDigito(cpf.substring(0,9) + digito1, pesoCPF);      return cpf.equals(cpf.substring(0,9) + digito1.toString() + digito2.toString());   }   public static boolean isValidCNPJ(String cnpj) {      if ((cnpj==null)||(cnpj.length()!=14)) return false;      Integer digito1 = calcularDigito(cnpj.substring(0,12), pesoCNPJ);      Integer digito2 = calcularDigito(cnpj.substring(0,12) + digito1, pesoCNPJ);      return cnpj.equals(cnpj.substring(0,12) + digito1.toString() + digito2.toString());   }   public static void main(String[] args) {      System.out.printf("CPF Valido:%s \n", isValidCPF("01115375502"));      System.out.printf("CNPJ Valido:%s \n", isValidCNPJ("13642634756318"));   }}

Para melhorar a clareza, vamos retirar a parte relacionada com a validação do CNPJ. Aproveitei para acrescentar alguns casos de teste do CPF:

Código: Java
123456789101112131415161718192021222324
public class ValidaCPF {   private static final int[] pesoCPF = {11, 10, 9, 8, 7, 6, 5, 4, 3, 2};   private static int calcularDigito(String str, int[] peso) {      int soma = 0;      for (int indice=str.length()-1, digito; indice >= 0; indice-- ) {         digito = Integer.parseInt(str.substring(indice,indice+1));         soma += digito*peso[peso.length-str.length()+indice];      }      soma = 11 - soma % 11;      return soma > 9 ? 0 : soma;   }   public static boolean isValidCPF(String cpf) {      if ((cpf==null) || (cpf.length()!=11)) return false;      Integer digito1 = calcularDigito(cpf.substring(0,9), pesoCPF);      Integer digito2 = calcularDigito(cpf.substring(0,9) + digito1, pesoCPF);      return cpf.equals(cpf.substring(0,9) + digito1.toString() + digito2.toString());   }   public static void main(String[] args) {              System.out.printf("CPF Valido:%s \n", CNP.isValidCPF("622.673.390-05")); //válido              System.out.printf("CPF Valido:%s \n", CNP.isValidCPF("871.790.960-08")); //válido              System.out.printf("CPF Valido:%s \n", CNP.isValidCPF("871.790.100-08")); //inválido              System.out.printf("CPF Valido:%s \n", CNP.isValidCPF("999.999.999-99")); //inválido   }}

O algoritmo usado para gerar o CPF tem uma "falha": CPFs com todos os dígitos iguais são considerados válidos, como se vê ao rodar o código anterior. Mas para a Receita são inválidos, logo você precisa desconsiderá-los "por fora". A função original não prevê isso, mas podemos acrescentar com isto:

 if ((cpf==null) || (cpf.length()!=11) ||
               cpf.equals("00000000000") || cpf.equals("11111111111") ||
               cpf.equals("22222222222") || cpf.equals("33333333333") ||
               cpf.equals("44444444444") || cpf.equals("55555555555") ||
               cpf.equals("66666666666") || cpf.equals("77777777777") ||
               cpf.equals("88888888888") || cpf.equals("99999999999")) return false;

Ou isto (fonte):

         java.util.regex.Pattern p = java.util.regex.Pattern.compile(cpf.charAt(0)+"{"+cpf.length()+"}");
         java.util.regex.Matcher m = p.matcher(cpf);
         if(m.find()) return false;

Eu vou manter a primeira opção por ser mais "clara". Não é fácil entender a segunda numa primeira olhada sem entender expressões regulares. O que esse trecho aparentemente faz é pegar o primeiro dígito do CPF, transformar em uma string do mesmo comprimento do CPF e verificar se essa string aparece no CPF. Por exemplo, se o primeiro dígito for '1', verifica se '11111111111' aparece na string.

E já que estamos aqui, por que não aproveitar para fazer a remoção de todos os caracteres não-numéricos, para que isso não precise ser feito antes de chamar a função? Em Java, basta uma linha:

cpf=cpf.replaceAll("\\D","");

Código: Java
123456789101112131415161718192021222324252627282930
public class ValidaCPF {   private static final int[] pesoCPF = {11, 10, 9, 8, 7, 6, 5, 4, 3, 2};   private static int calcularDigito(String str, int[] peso) {      int soma = 0;      for (int indice=str.length()-1, digito; indice >= 0; indice-- ) {         digito = Integer.parseInt(str.substring(indice,indice+1));         soma += digito*peso[peso.length-str.length()+indice];      }      soma = 11 - soma % 11;      return soma > 9 ? 0 : soma;   }   public static boolean isValidCPF(String cpf) {  cpf=cpf.replaceAll("\\D","");  if ((cpf==null) || (cpf.length()!=11) ||                                   cpf.equals("00000000000") || cpf.equals("11111111111") ||                                   cpf.equals("22222222222") || cpf.equals("33333333333") ||                                   cpf.equals("44444444444") || cpf.equals("55555555555") ||                                   cpf.equals("66666666666") || cpf.equals("77777777777") ||                                   cpf.equals("88888888888") || cpf.equals("99999999999")) return false;       Integer digito1 = calcularDigito(cpf.substring(0,9), pesoCPF);      Integer digito2 = calcularDigito(cpf.substring(0,9) + digito1, pesoCPF);      return cpf.equals(cpf.substring(0,9) + digito1.toString() + digito2.toString());   }   public static void main(String[] args) {              System.out.printf("CPF Valido:%s \n", CNP.isValidCPF("622.673.390-05")); //válido              System.out.printf("CPF Valido:%s \n", CNP.isValidCPF("871.790.960-08")); //válido              System.out.printf("CPF Valido:%s \n", CNP.isValidCPF("871.790.100-08")); //inválido              System.out.printf("CPF Valido:%s \n", CNP.isValidCPF("999.999.999-99")); //inválido   }}

Como o peso adicionado a cada dígito varia linearmente (de 2 a 10 ao calcular o dígito 1 e de 2 a 11 ao calcular o dígito 2), o uso do array pode ser substituído por uma expressão matemática simples.:

 int valorPeso=str.length()+1-indice;

Eu admito que acho mais fácil entender o que está havendo quando é usado o array de pesos, mas se você preferir algo mais "enxuto":


Código: Java
1234567891011121314151617181920212223242526272829
public class ValidaCPF {   private static int calcularDigito(String str) {      int soma = 0;      for (int indice=str.length()-1, digito; indice >= 0; indice-- ) {         digito = Integer.parseInt(str.substring(indice,indice+1));                 soma += digito*(str.length()+1-indice);      }      soma = 11 - soma % 11;      return soma > 9 ? 0 : soma;   }   public static boolean isValidCPF(String cpf) {  cpf=cpf.replaceAll("\\D","");  if ((cpf==null) || (cpf.length()!=11) ||                                   cpf.equals("00000000000") || cpf.equals("11111111111") ||                                   cpf.equals("22222222222") || cpf.equals("33333333333") ||                                   cpf.equals("44444444444") || cpf.equals("55555555555") ||                                   cpf.equals("66666666666") || cpf.equals("77777777777") ||                                   cpf.equals("88888888888") || cpf.equals("99999999999")) return false;       Integer digito1 = calcularDigito(cpf.substring(0,9));      Integer digito2 = calcularDigito(cpf.substring(0,9) + digito1);      return cpf.equals(cpf.substring(0,9) + digito1.toString() + digito2.toString());   }   public static void main(String[] args) {              System.out.printf("CPF Valido:%s \n", CNP.isValidCPF("622.673.390-05")); //válido              System.out.printf("CPF Valido:%s \n", CNP.isValidCPF("871.790.960-08")); //válido              System.out.printf("CPF Valido:%s \n", CNP.isValidCPF("871.790.100-08")); //inválido              System.out.printf("CPF Valido:%s \n", CNP.isValidCPF("999.999.999-99")); //inválido   }}

Eu não sou muito fã de usar .substring para obter apenas um caractere da string. Se você também não gosta, pode substituir a linha:

         digito = Integer.parseInt(str.substring(indice,indice+1));
por
         digito = Character.getNumericValue(str.charAt(indice));
16
Estrutura de Dados / Re:Aula 6 - Alocação dinâmica de memória
« Última Mensagem: por Jefferson Online Abril 11, 2019, 07:33:11 pm »
O professor me explicou por email onde está meu erro.

void adicionarPessoa(Tpessoa *p, int *numRegistros);
void deletarPessoa(Tpessoa *p, int *numRegistros, int numRec);

deve ser corrigido para:

void adicionarPessoa(Tpessoa *&p, int *numRegistros);
void deletarPessoa(Tpessoa *&p, int *numRegistros, int numRec);

Sim, basta acrescentar o "&" onde indicado. O problema desapareceu.
Não, eu não faço idéia do que seja isso. O professor disse que explicaria na próxima aula.
17
Estrutura de Dados / Re:Aula 6 - Alocação dinâmica de memória
« Última Mensagem: por Jefferson Online Abril 11, 2019, 07:29:07 pm »
Descobri ontem que minha função calcularMedia() tem um erro, repetido em todos os exercícios onde eu a aproveitei:

Onde está escrito:
float menorNota=0;
deve ser:
float menorNota=10;
18
Estrutura de Dados / Re:Aula 7 - Tipos Abstratos de Dados
« Última Mensagem: por Jefferson Online Abril 11, 2019, 03:57:43 pm »
Até onde pude entender, o objetivo do exercício é isolar funções e tipos relativos a um determinado dado em arquivos distintos e separados do principal.  Isso parece simples, mas sem ter uma razoável compreensão de como a coisa toda funciona tentar fazer isso pode ser extremamente frustrante por causa de novas mensagens de erro que não são nada intuitivas.

Por exemplo, após mover a struct para outro arquivo a seguinte declaração não funciona mais em main.cpp:

Taluno * ptrAlunos= new Taluno;

Acusa os erros:
[Error] invalid use of incomplete type 'struct Taluno'
[Error] forward declaration of 'struct Taluno'

Já esta aqui funciona (desde que a função  aluno_criar() já exista, claro):

Taluno * ptrAlunos= aluno_criar();

Depois que você entende de onde vem o erro percebe que apesar de "Taluno" ser aceito pelo compilador, "new Taluno" só pode ocorrer no mesmo arquivo onde a struct Taluno foi declarada. O compilador sabe o que é Taluno (aparentemente por causa da declaração typedef) mas não sabe do que ele é feito, daí o "incomplete". Eu confesso que ainda não entendi realmente como a coisa funciona. Só consegui consertar atrav´és de tentativa e erro, comparando com o exemplo dado pelo professor.

Para quem entende inglês, este texto parece ser bem esclarecedor.
19
Estrutura de Dados / Re:Aula 7 - Tipos Abstratos de Dados
« Última Mensagem: por Jefferson Online Abril 11, 2019, 03:26:29 pm »
Exercício 2

Citar
Especifique um novo TAD para representar o resultado da avaliação de um aluno. O TAD deve ser composto de uma estrutura que irá representar alunos em uma faculdade que contenha o nome, curso, período, disciplinas atuais e notas de uma disciplina que o aluno está pagando atualmente.
Devem ser especificadas e implementadas subrotinas para - criar, acessar, liberar e atribuir valores - a um Aluno, calcular sua média (Estácio) e verificar se o aluno está ou não aprovado. Por fim, crie um menu para o usuário permitindo que ele adicione quantos alunos ele desejar dinamicamente.

Meu programa ainda tem uma deficiência: eu não implementei a adição dinâmica de disciplinas. Embora isso não tenha sido explicitamente pedido pelo professor é razoável esperar que um programa desse tipo não crie essa limitação. Eu limitei o número de disciplinas a três para facilitar os testes.

main.cpp

Código: C++
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
#include <iostream>#include <strings.h>#include <sstream>#include <locale.h>#include "aluno.h" using std::cout;using std::cin;using std::string;using std::stringstream; int receberValor(string texto);int main() {     setlocale(LC_ALL,"");        Taluno * ptrAlunos= aluno_criar();    int numAlunos=0;     string resposta;    cout <<"Você deseja ler os dados do (a)rquivo ex4.txt ou (d)igitá-los?\n";    getline(cin, resposta);    if (resposta=="a")  {        freopen("ex4.txt", "r", stdin);         string temp="";        //cout << "Quantos alunos? ";        getline(cin, temp);        int numAlunosArq=stoi(temp);         for (int i=0;i<numAlunosArq;i++){            cout <<"Dados do aluno "<< i+1 <<": \n";            aluno_adicionar(ptrAlunos,&numAlunos);        }         aluno_imprimirTodos(ptrAlunos, numAlunos);    }    if (resposta!="a"){ //Só exibo o menu se não estiver lendo de um arquivo    string opcao="";     while (opcao!="0"){          cout <<"Escolha uma opção e em seguida tecle [ENTER]:\n\n";        cout <<"0 - Sair do programa.\n";        cout <<"1 - Adicionar um aluno.\n";        if (numAlunos>0) cout <<"2 - Listar todos os alunos.\n";        if (numAlunos>0) cout <<"3 - Deletar aluno.\n";         getline(cin, opcao);        if (opcao=="1"){            aluno_adicionar(ptrAlunos,&numAlunos);            cout << "Aluno adicionado.";            cout << "Tecle ENTER para voltar ao menu.";        };         if (opcao=="2"){            aluno_imprimirTodos(ptrAlunos, numAlunos);            cout << "tecle ENTER para voltar ao menu.";            getline(cin, opcao);        };         if (opcao=="3"){             aluno_deletar(ptrAlunos, &numAlunos, receberValor("Digite o número do aluno a deletar"));            cout << "Aluno deletado.";            cout << "Tecle ENTER para voltar ao menu.";        };      if (system("CLS")) system("clear"); //apago a tela. Este método é simples mas tem problemas de segurança    }}         aluno_liberar(ptrAlunos);return 0;} int receberValor(string texto){    string temp="";    int num=0;    while (true){        cout <<  texto;        cin >> temp;        stringstream myStream(temp);        if (myStream >>num) break; //sucesso na conversão            else            cout << "\nNúmero inválido. Tente de novo." << '\n';    };   return num;}


aluno.h

Código: C++
123456789101112131415
/*A linha typedef seguinte foi colocada apenas para evitar o erro[Error] 'Taluno' was not declared in this scopeO alias "Aluno" poderia ser qualquer outra coisa*/typedef struct Taluno Aluno; float aluno_calcularMedia(Taluno *a);void aluno_cadastrar (Taluno *a);void aluno_imprimirTodos (Taluno *a, int total);void aluno_imprimir (Taluno *a, int numRec);void aluno_adicionar(Taluno *&a, int *numRegistros);void aluno_deletar(Taluno *&a, int *numRegistros, int numRec);Taluno *aluno_criar();void aluno_liberar (Taluno *a);

aluno.cpp

Código: C++
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
#include <iostream>#include "aluno.h" using std::cout;using std::cin;using std::string; struct Taluno{    string nome;    string periodo;    string curso;    string disciplinas[3];    float notas[3]; }; Taluno *aluno_criar(){ Taluno *a = new Taluno;     if (a == NULL) {        cout << "Memória insuficiente!\n" << '\n';        exit(1);    } return a;} void aluno_liberar (Taluno *a){     delete []a;} void aluno_cadastrar (Taluno *a){    //Esta é a rotina que eu considero que se encaixa no requerimento "atribuir valores"    cout <<"Nome: ";    getline(cin, a->nome);    cout <<"Período: ";    getline(cin, a->periodo);    cout <<"Curso: ";    getline(cin, a->curso);    cout <<"Disciplina 1: ";    getline(cin, a->disciplinas[0]);    cout <<"Disciplina 2: ";    getline(cin, a->disciplinas[1]);    cout <<"Disciplina 3: ";    getline(cin, a->disciplinas[2]);     string temp="";    for (int j=0; j<3;j++){        cout <<"Nota " << j+1 << ": ";        getline(cin, temp);        a->notas[j]=stof(temp);     }     cout <<'\n';} float aluno_calcularMedia(Taluno *a){    //O cálculo é feito seguindo as regras da Estácio     float menorNota=10;    unsigned int indiceMenorNota=0;    float notas[3];     for (int j=0; j<3; j++){         if (a->notas[j]<4) notas[j]=0; else notas[j]=a->notas[j]; //se alguma nota for menor que 4 é o mesmo que ser zero        if (notas[j]<menorNota) {            menorNota=notas[j];            indiceMenorNota=j;        }    }       //Ignoro o menor valor, somo os restantes e divido por dois    float k=0;    if (indiceMenorNota==0) {k=((notas[1]+notas[2])/2);};    if (indiceMenorNota==1) {k=((notas[0]+notas[2])/2);};    if (indiceMenorNota==2) {k=((notas[0]+notas[1])/2);};    return k;} void aluno_imprimirTodos (Taluno *a, int total){    cout <<"Exibindo agora os dados gravados\n\n";    for (int i=0;i<total;i++){      aluno_imprimir(a, i);    } } void aluno_imprimir (Taluno *a, int numRec){    //Esta é a rotina que eu considero que se encaixa no requerimento "acessar valores"    cout <<"Nome: " << a[numRec].nome <<'\n';    cout <<"Período: " << a[numRec].periodo <<'\n';    cout <<"Curso: " << a[numRec].curso <<'\n';    for (int j=0; j<3;j++){        cout <<"Disciplina " << j+1 <<": " << a[numRec].disciplinas[j] <<'\n';    }    for (int j=0; j<3;j++){        cout <<"Nota " << j+1 <<": " << a[numRec].notas[j] <<'\n';    }    float media = aluno_calcularMedia(&a[numRec]);     if (media>=6) cout <<"Aluno APROVADO\n"; else cout <<"Aluno REPROVADO\n";     cout <<'\n'; } void aluno_adicionar(Taluno *&a, int *numRegistros){    //Aumenta o tamanho do vetor em um elemento e preenche esse elemento     Taluno *temp = new Taluno[*numRegistros+1];    std::copy(a,a+*numRegistros,temp);     delete a;    a=temp;    aluno_cadastrar(&a[*numRegistros]); //Agora que o vetor tem um elemento extra, numRec aponta para ele    *numRegistros=*numRegistros+1; } void aluno_deletar(Taluno *&a, int *numRegistros, int numRec){    //crio um novo vetor com um elemento a menos e copio do vetor antigo    //todos os elemmentos anteriores e posteriores ao registro a ser apagado    Taluno *temp = new Taluno[*numRegistros-1];    std::copy(a,a+numRec-1,temp);    std::copy(a+numRec,a+*numRegistros,temp+numRec-1);     delete a;    a=temp;    *numRegistros=*numRegistros-1; }
20
Estrutura de Dados / Re:Aula 7 - Tipo Abstrato de Dados
« Última Mensagem: por Jefferson Online Abril 09, 2019, 07:48:22 pm »
Exercício 1

Citar
Programe uma aplicação que leia o valor de dois
pares de pontos, representando cada par um
uma reta, e diga se as retas são ou não paralelas
(duas retas são paralelas se possuem o mesmo
coeficiente angular).

Não está no enunciado que devemos usar ponteiros, TAD, etc. Mas é óbvio pelo contexto que é isso que o professor deseja.

reta.h

Código: C++
123456
 typedef struct Treta Reta; bool reta_paralelas (Reta* r1, Reta* r2);float reta_calcularCoeficienteAngular(Reta* r);Reta * reta_cria( float x1, float y1, float x2, float y2);void reta_libera (Reta* r);

reta.cpp

Código: C++
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
#include "reta.h"#include <iostream> using std::cout;using std::endl; struct Tponto {    float x;    float y;}; struct Treta{  Tponto ponto1;  Tponto ponto2; };  float reta_calcularCoeficienteAngular(Reta *r){     float deltay=r->ponto2.y-r->ponto1.y;    float deltax=r->ponto2.x-r->ponto1.x;    float m= deltay/deltax;        //TODO: debug. Remover após testes    cout <<"\np1x: " << r->ponto1.x << '\n';    cout <<"p1y: " << r->ponto1.y << '\n';    cout <<"p2x: " << r->ponto2.x << '\n';    cout <<"p2y: " << r->ponto2.y << '\n';    cout <<"deltax: " << deltax << '\n';    cout <<"deltay: " << deltay << '\n';    cout <<"coeficiente: " << m << "\n\n";  return m;} Reta *reta_cria( float x1, float y1, float x2, float y2){ Reta *r = new Reta;     if (r == NULL) {        cout << "Memória insuficiente!\n" << endl;        exit(1);    }    r->ponto1.x=x1;    r->ponto1.y=y1;    r->ponto2.x=x2;    r->ponto2.y=y2; return r;} bool reta_paralelas (Reta *r1, Reta *r2){     float m1=reta_calcularCoeficienteAngular(r1);    float m2=reta_calcularCoeficienteAngular(r2);     if (m1==m2) return true;        else        return false; } void reta_libera (Reta *r){        delete r;}

main.cpp

Código: C++
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
#include <iostream>#include <sstream>#include "reta.h" using std::cin;using std::cout;using std::string;using std::stringstream; int receberValor(string texto); int main(){      cout << "Reta 1 - Ponto 1\n";    float x1 = receberValor("X: ");    float y1= receberValor("Y: ");     cout << "Reta 1 - Ponto 2\n";    float x2= receberValor("X: ");    float y2= receberValor("Y: ");     Reta * reta1= reta_cria(x1,y1,x2,y2);        cout << "Reta 2 - Ponto 1\n";    x1 = receberValor("X: ");    y1= receberValor("Y: ");     cout << "Reta 2 - Ponto 2\n";    x2= receberValor("X: ");    y2= receberValor("Y: ");     Reta * reta2= reta_cria(x1,y1,x2,y2);        if (reta_paralelas(reta1, reta2)) cout << "As retas são paralelas";    else    cout << "As retas não são paralelas";        reta_libera(reta1);    reta_libera(reta2); }  int receberValor(string texto){    string temp="";    int num=0;    while (true){        cout << texto;        getline(cin, temp);        stringstream myStream(temp);        if (myStream >>num) break; //sucesso na conversão            else            cout << "\nNúmero inválido. Tente de novo." << '\n';    };   return num;} 
Páginas: « 1 2 3 4 5 6 7 8 9 10 »