Exibir mensagens

Esta seção lhe permite ver todas as mensagens deste membro. Note que você só pode ver as mensagens das áreas às quais você tem acesso.


Tópicos - Jefferson

Páginas: 1 2 3 4 5 6 7 »
1
Programação 1 / Projeto AV1
« Online: Maio 04, 2019, 03:22:55 pm »
Descrição do projeto publicada com a permissão do professor Anderson Silva


Citar
Locadora de Veículos

A APS Locadora de Veículos precisa de uma sistema que organize todos os carros que estão alugados e não alugados.

Sabendo que a locadora possui 20 carros em seu pátio, sendo eles divididos da seguinte forma:

  • 3 – Fiat Pálio 1.0 cor prata Totalflex – 50.000km rodados
  • 2 – Hyundai HB20 1.6 cor branco Totalflex – 40.000 km rodados;
  • 5 – Volkswagen Gol 1.0 cor preto Gasolina – 55.000 km rodados;
  • 3 – GM Camaros 3.0 cor amarelo TotalFlex – 7.000 km rodados;
  • 1 – Ford Fusion 2.0 cor preto TotalFlex – 15.000 km rodados;
  • 1 – Dodge Viper 8.3 cor azul Gasolina – 5.000 km rodados;

Cada cliente da locadora APS possui um cadastro com os seguintes itens:

  • Nome
  • Endereço
  • Telefone
  • Idade
  • RG
  • CPF
  • Carro alugado
  • Data de aluguel
  • Data de devolução

Os carros devem ter todos os atributos mencionados anteriormente no Slide 2;

Os carros devem possuir métodos para informar:

  • A quantidade de quilômetros rodados;

Os clientes, por sua vez, devem possuir métodos para informar todos os atributos apresentados no slide 3.

O Sr. Manoel, dono da Locadora APS, deseja controlar os carros que estão atualmente alugados e os carros que estão disponíveis na locadora.

Para isso crie um sistema que tenha as Classes:

  • Carro
  • Cliente

Crie também os arrays:
  • totalDeCarros;
  • carrosAlugados;
  • clientes;
  • clentesAlugando.

Crie um sistema que pergunte se o cliente quer alugar um carro:

Caso a resposta seja sim, crie um novo cliente e adicione-o a liste de clientes (no máximo 20);

Ao se cadastrar, o cliente escolhe um dos carros disponíveis (devem ser apresentados apenas os carros que estejam disponibilizados, não devem ser apresentados os carros já alugados);

No menu principal o usuário também pode escolher apresentar todos os clientes juntamente com os carros que ele está alugando.

Fim da descrição do projeto

AVISO: Meu projeto contém muito mais do que o que foi solicitado pelo professor e em alguns pontos não tem o que foi solicitado pelo mesmo, mas eu chequei com o professor se era aceitável antes de fazer a apresentação e ele concordou.

Por exemplo:
  • Eu ignorei as instruções para perguntar ao cliente se queria se cadastrar e depois alugar um carro, porque achei isso mais adequado para um quiosque. Optei por um design diferente, visando ser operado pelo funcionário da locadora;
  • Eu não uso os mesmos nomes de arrays indicados pelo professor;
  • Eu suprimi os dois arrays carrosAlugados e clientesAlugando, que tinham o objetivo de registrar as informações de aluguel e em vez disso usei atributos das classes


Menu do programa:

Citar
Digite a opcao desejada seguida de ENTER:

1 - Listar frota
2 - Listar clientes com os respectivos carros alugados - versão completa
3 - Listar clientes com os respectivos carros alugados - versão curta
4 - Adicionar cliente
5 - Editar cliente
6 - Procurar cliente pelo CPF
7 - Alugar veículo
8 - Listar veículos alugados
9 - Encerrar aluguel
0 - Sair do programa


O projeto é constituído de seis arquivos:
  • Principal.java  - A classe que contém a função Main e o menu
  • Funcoes.java - Uma classe com todas as funções de uso geral
  • Cliente.java - A classe que define o objeto Cliente com todos as funções de validação e formatação de dados
  • Carro.java - Idem para o objeto Carro
  • carros.txt - Banco de dados (do tipo flat-file database) com todos os carros da frota. Carregado ao iniciar o programa e salvo a cada alteração
  • clientes.txt - Banco de dados (também do tipo flat-file database) com clientes fictícios, usado para testar o programa. Nomes, telefones, CPF e RG (São Paulo) são válidos mas falsos. Os endereços são verdadeiros, mas não identificam nenhuma pessoa

Copiar  e colar o conteúdo dos arquivos clientes.txt e carros.txt pode não dar certo, principalmente no casso de carros.txt, que pode requerer uma linha em branco no final para que o programa inicie. Além disso, para não deixar esta página longa demais eu decidi exibir apenas uma amostra do conteúdo desses dois arquivos.  Por isso eu anexei no final do post um arquivo zip com todos os arquivos. Se quiser tentar rodar este projeto, use o conteúdo do zip e não o que está exibido aqui.

AVISO: O lugar certo para colocar carros.txt e clientes.txt depende do IDE que você está usando. No caso do Eclipse, se o nome do projeto for ProjetoAV1, os arquivos txt devem ser depositados em \eclipse-workspace\ProjetoAV1\.

Para descobrir qual o lugar correto, descomente a linha:
//System.out.println(new File(".").getAbsoluteFile());
no arquivo Principal.java.

Se ainda assim precisar de ajuda para descobrir o lugar certo no seu IDE, me pergunte isso na sala de aula.

Explicações para algumas decisões de design

  • Ler os dados de um arquivo externo: Misturar dados com código é uma prática deselegante. O professor não cobrou de ninguém nesse projeto o uso de algum tipo de banco de dados porque nesse estágio do curso ninguém é obrigado a saber como se usa um e muito menos saber distinguir práticas deselegantes de programação. Mas se você souber usar um, em um próximo projeto use pois isso certamente vai contar positivamente na sua nota. Além disso, colocar os dados em um arquivo externo permite sua fácil reutilização em outros projetos;
  • O programa já começar com diversos clientes cadastrados - Isso não foi solicitado pelo professor mas já começar automaticamente com diversos dados reais permite acelerar o teste das funções de validação e formatação, reduzindo o número de situações em que você tem que perder tempo digitando dados efêmeros; 
  • As funções AdicionarCliente() e CarregarClientes() foram desenhadas para trabalhar com um objeto "cliente" intermediário antes de salvar o cliente no array. Fiz isso porque me parece uma forma mais elegante e mais robusta de lidar com objetos.  Em vez de "abrir" o elemento no array e esperar pacientemente enquanto o usuário termina de preencher os campos usamos um objeto intermediário que faz todas as validações e que você só "aplica" no array quando estiver satisfeito. Isso possibilitou também incluir a oportunidade de cancelar o cadastro;
  • Fiz com que todo método que requeria um Scanner recebesse o Scanner de Main() como parâmetro, para evitar criar vários objetos Scanner e o problema que era gerado ao dar um .close() em um desses objetos (o Scanner em Main() parava de funcionar também);
  • Eu evito usar declarações "import" e em vez disso coloco o nome das funções externas por extenso no programa. Por exemplo,  onde eu escrevo:

          java.util.Scanner scan = new java.util.Scanner (System.in);

    Eu poderia simplesmente escrever:

          Scanner scan = new Scanner (System.in);

    Se fizesse um "import java.util.Scanner".

    Isso deixa várias linhas desnecessariamente longas, é verdade, mas eu prefiro dessa forma enquanto estou aprendendo Java porque basta olhar para o código para saber de onde danado vem as funções e é mais fácil reutilizá-las, porque você não precisa saber que "imports" são necessários.

2
Estrutura de Dados / Aula 8 - Aplicação contextualizada
« 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; } 


3
Programação em geral / Formatar CPF e telefone em Java
« 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);

4
Programação em geral / Validação de telefone em Java
« 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;}

5
Programação em geral / Validação de CPF em Java
« 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));

6
Estrutura de Dados / Aula 7 - Tipos Abstratos de Dados
« Online: Abril 09, 2019, 02:00:19 pm »
A primeira coisa a fazer é tentar entender o programa exemplo dado pelo professor. O programa mostrado nos slides tem alguns erros que eu espero ter corrigido aqui. Esse é o nosso primeiro exercício que requer mais de um arquivo:

ponto.h

Código: C++
12345678910111213
/* TAD: Ponto (x,y) *//* Tipo exportado */typedef struct ponto Ponto;/* Funções exportadas *//* Função cria - Aloca e retorna um ponto com coordenadas (x,y) */Ponto* pto_cria (float x, float y);/* Função libera - Libera a memória de um ponto previamente criado */void pto_libera (Ponto* p);/* Função acessa - Retorna os valores das coordenadas de um ponto*/void pto_acessa (Ponto* p, float* x, float* y);/* Função atribui - Atribui novos valores às coordenadas de um ponto */void pto_atribui (Ponto* p, float x, float y);/* Função distancia - Retorna a distância entre dois pontos */float pto_distancia (Ponto* p1, Ponto* p2);

ponto.cpp

Código: C++
12345678910111213141516171819202122232425262728293031323334353637383940
#include <iostream>#include <math.h>#include "ponto.h" using std::cout;using std::endl; struct ponto {    float x;    float y;};//Implementa as funções criadas no "ponto.h"Ponto* pto_cria (float x, float y) {    Ponto* p = new Ponto;    if (p == NULL) {        cout << "Memória insuficiente!\n" << endl;        exit(1);    }    p->x = x;    p->y = y;    return p;}void pto_libera (Ponto* p) {    delete p; } void pto_acessa (Ponto* p, float* x, float* y) {    *x = p->x;    *y = p->y;}void pto_atribui (Ponto* p, float x, float y) {    p->x = x;    p->y = y;}float pto_distancia (Ponto* p1, Ponto* p2) {    float dx = p2->x - p1->x;    float dy = p2->y - p1->y;    return sqrt(dx*dx + dy*dy);}

main.cpp

Código: C++
12345678910111213141516
#include <iostream>#include "ponto.h" using std::cout;using std::endl; int main (void) {    float x, y;    Ponto* p = pto_cria(2.0,1.0);    Ponto* q = pto_cria(3.4,2.1);    float d = pto_distancia(p,q);    cout <<"Distancia entre pontos: "<< d << endl;    pto_libera(q);    pto_libera(p);    return 0;}

Rodar esse programa é um pouco mais complicado que o que estávamos acostumados. Até agora todos os exercícios podiam ser executados no DevC++ em um único arquivo e sem a criação de um projeto. Mas agora você precisa criar um projeto e adicionar esses três arquivos, do contrário você vai se deparar com esses erros:

undefined reference to `'pto_cria(float, float)'
undefined reference to `'pto_cria(float, float)'
undefined reference to `'pto_distancia(ponto*, ponto*)'
undefined reference to 'pto_libera(ponto*)'
undefined reference to 'pto_libera(ponto*)'

Isso acontece porque o arquivo main.cpp tem uma referência a ponto.h, mas em ponto.h não h´á referência a ponto.cpp. Eu esperava que por terem o mesmo nome essa localização fosse automática, mas não é. "undefined reference" significa que o linker não consegue encontrar o arquivo compilado que tem a implementação das funções.

7
Estrutura de Dados / Aula 6 - Alocação dinâmica de memória
« Online: Abril 04, 2019, 05:46:14 pm »
Citar
Refazer os exercícios 2, 3, 4 e 5 da lista utilizando funções (onde for necessário) e alocando todos os vetores e structs de forma
dinâmica permitindo ao usuário escolher quantos dados ele gostaria inserir. OBS: Crie funções para adicionar e remover um dado.

Os exercícios da lista aos quais o professor se refere são estes. Consulte-os se você se deparar com algo faltando aqui (os arquivos de digitação automática, por exemplo).

Em todos os exercícios eu fiz a transição para modularização, ponteiros e alocação dinâmica em etapas para facilitar o debug e a compreensão do que foi feito, por isso cada exercício exibe três ou quatro versões do código, identificadas com um comentário.

É altamente recomendado que você faça o mesmo no seu código. Divida o problema em partes menores. Teste após terminar cada parte e só comece a  resolver a parte seguinte do problema após a parte anterior rodar sem erros. E quando eu digo "rodar sem erros" não quero dizer "compilar sem erros". 

É perfeitamente possível, partindo do exercício base, implementar tudo de uma vez só e sem erros, mas só deve tentar isso quem até agora estava achando os exercícios "um passeio". Qualquer um que chegou até aqui "aos trancos e barrancos" precisa aprender a dividir o problema em partes ou não vai conseguir avançar nessa disciplina.

Nota: todos os exercícios abaixo ainda tem problemas na versão com alocação dinâmica. Geralmente o problema só se manifesta na hora de adicionar o segundo elemento por meio de cópia do array. Se o array for criado dinamicamente com X posições essas X posições podem ser manipuladas (adicionar e deletar) por meio de ponteiros sem problemas. Mas na hora de fazer o vetor crescer para acomodar mais um item o problema aparece na segunda inserção. Por isso as versões com alocação ainda tem código de debug e/ou não tem toda a funcionalidade implementada

8
Programação 1 / Aula 5 - Arrays e Matrizes
« Online: Abril 01, 2019, 03:28:06 am »
Exercício 1

Citar
a) Crie uma classe carro que tenha as seguintes características:
   - Cor, Motorização (1.0 ou 1.6), Tipo de combustível, placa
O carro deve ter os seguintes métodos:
   - velocímetro() // mostra a velocidade do carro;
   - acelerar() // acelera a velocidade em + 10 km/h
   - frear() // reduz a velocidade em -10km/h

b) Crie um Array de carros, com 10 carros pertencentes a uma locadora de veículos;

c) Mostre todos os carros
através de um loop “for”;

Código: Java
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
public class Carro {         private int velocidade;        private String cor;        private String motor;        private String tipoCombustivel;        private String placa;             Carro(            ){                this.velocidade=0;                this.cor="";                this.placa="";                this.motor="";                this.tipoCombustivel="";    }        int velocimetro() {        return velocidade;    }        void acelerar () {                velocidade=velocidade+10;        };         void frear () {                velocidade=velocidade-10;        };                 String get_placa() {                return placa;         }        String get_tipoCombustivel() {                return tipoCombustivel;        }                String get_motor() {                return motor;        }                String get_cor() {                return cor;        }                void set_cor(String cor) {                this.cor=cor;        }                void set_placa(String placa) {                this.placa=placa;        }        void set_motor(String motor) {                this.motor=motor;        }        void set_tipoCombustivel(String tipoCombustivel) {                this.tipoCombustivel=tipoCombustivel;        }       } 

Código: Java
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
public class Exercicio1 {         public static void main(String[] args) {                                 Carro[] carros = new Carro[10];                                //Criar a matriz de objetos não instancia os objetos                //Sem isso vai dar Null Pointer Exception                for (int i=0; i<10; i++) {                        carros[i] = new Carro();                }                                //O enunciado não pede que o usuário tenha que digitar isso                carros[0].set_placa("KKF6750");                carros[0].set_cor("vermelho");                                  carros[0].set_motor("1.6");                     carros[0].set_tipoCombustivel("Gasolina");                      carros[1].set_placa("KKF5650");                carros[1].set_cor("prata");                                     carros[1].set_motor("2.0");                     carros[1].set_tipoCombustivel("Alcool");                        carros[2].set_placa("KKF3450");                carros[2].set_cor("preto");                                     carros[2].set_motor("1.0");                     carros[2].set_tipoCombustivel("Flex");                  carros[3].set_placa("KKF8950");                carros[3].set_cor("branco");                                    carros[3].set_motor("1.8");                     carros[3].set_tipoCombustivel("Gasolina");                      carros[4].set_placa("KKF1250");                carros[4].set_cor("prata");                                     carros[4].set_motor("2.0");                     carros[4].set_tipoCombustivel("Alcool");                        carros[5].set_placa("KKF4550");                carros[5].set_cor("preto");                                     carros[5].set_motor("1.0");                     carros[5].set_tipoCombustivel("Flex");                  carros[6].set_placa("KKF2350");                carros[6].set_cor("amarelo");                                   carros[6].set_motor("1.6");                     carros[6].set_tipoCombustivel("Gasolina");                      carros[7].set_placa("KKF3250");                carros[7].set_cor("azul");                                      carros[7].set_motor("2.0");                     carros[7].set_tipoCombustivel("Alcool");                        carros[8].set_placa("KKF2750");                carros[8].set_cor("preto");                                     carros[8].set_motor("1.0");                     carros[8].set_tipoCombustivel("Flex");                  carros[9].set_placa("KKF7050");                carros[9].set_cor("prata");                                     carros[9].set_motor("1.0");                     carros[9].set_tipoCombustivel("Gasolina");                                      for (int i=0; i<10; i++) {                         System.out.println("\nCarro "+(i+1)+" :");                         System.out.println("Placa: "+carros[i].get_placa());                            System.out.println("Motor: "+carros[i].get_motor());                         System.out.println("Combustível: "+carros[i].get_tipoCombustivel());                         System.out.println("Cor: " +carros[i].get_cor());                                       }        } } 

9
Programação 1 / Aula 4 - Sobrecarga, static, Math e String
« Online: Abril 01, 2019, 02:02:19 am »
Exercício 1

Citar
Usando a classe String, faça:

Leia do usuário o seu nome e sobrenome, em seguida imprima:

a) O nome do usuário completo (concatenado);
b) Troque todas as ocorrências da primeira vogal do primeiro nome por outra letra;
c) Corte o primeiro nome ao meio e imprima a duas partes;
d) Imprima a string resultante a partir da terceira letra;
e) Verifique se o nome e sobrenome estão iguais.

Código: Java
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
import java.util.Scanner; public class exercicio1 {         public static boolean isVowel(char c) {                  return "AEIOUaeiou".indexOf(c) != -1;                }                public static void main(String[] args) {                Scanner sc = new Scanner(System.in);                            System.out.println("Seu primeiro nome:");            String nome=sc.nextLine();                      System.out.println("Seu sobrenome:");            String sobrenome=sc.nextLine();                         System.out.println("a) Concatenação: "+ nome.concat(" ").concat(sobrenome));                          char letra = 0;             for (int i=0; i<nome.length(); i++) {                letra=nome.charAt(i);                if (isVowel(letra)) break; //quero a primeira vogal                }            char novaLetra = 0;            for (int i=0; i<5; i++) {                novaLetra="aeiou".charAt(i);                if (novaLetra!=letra) break;                 }                        //Aparentemente eu não posso mudar um caractere da string diretamente            char[] myNameChars = nome.toCharArray();                        for (int i=0; i<nome.length(); i++) {                if (nome.charAt(i)==letra) myNameChars[i] = novaLetra;            }                    System.out.println("b) Nome alterado: "+ String.valueOf(myNameChars));                                 int meio=nome.length()/2;            System.out.print("c) Dividindo o nome ao meio: ");             /*Eu ia fazer deste jeito, mas o item d do exercício me sugeriu fazer de outra maneira            System.out.println(nome.substring(0, meio));            System.out.println(nome.substring(meio, nome.length()));            */                        String nomeCortado=(nome.substring(0, meio)).concat(" ").concat(nome.substring(meio, nome.length()));            System.out.println(nomeCortado);                         System.out.println("d) A partir da terceira letra: " + nomeCortado.substring(2, nomeCortado.length()));                        if (nome.contentEquals(sobrenome))                  System.out.println("e) Nome e sobrenome são iguais");            else                  System.out.println("e) Nome e sobrenome são diferentes");                        sc.close();    } } 

10
Estrutura de Dados / Aula 5 - Ponteiros
« Online: Março 29, 2019, 05:26:47 pm »
Exercício 1

Citar
1. Faça um programa que receba do usuário dois vetores, A e B, com 10 números inteiros cada. Crie um novo vetor denominado C calculando C = A - B. Mostre na tela os dados dos vetores A, B e C. OBS: As operações com vetor devem ser feitas utilizando ponteiros e a deve ser criada uma função que realiza a subtração de dois vetores.

Código: C++
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
#include <iostream>#include <sstream>using std::cout;using std::cin;using std::string;using std::stringstream; #include <iomanip> //setwusing std::setw; int receberValor(int pos);void preencherVetor (int *vetor, int tamanho);void subtrairVetores(int *vetA, int *vetB, int *vetResult, int tamanho); int main(){    const int tamVetores =10;    int A[tamVetores];    int B[tamVetores];    int C[tamVetores];     cout << "VETOR A:\n";    preencherVetor(A, tamVetores);     cout << '\n';    cout << "VETOR B:\n";    preencherVetor(B, tamVetores);         subtrairVetores(A, B, C, tamVetores);     cout << '\n';    cout << "Vetor A" << setw(11) << "Vetor B" << setw(19) << "Vetor C (A-B)\n";    cout << '\n';     for (int i=0; i<tamVetores; i++){        cout << A[i] << setw(12) << B[i] << setw(12) << C[i] << '\n';   }   return 0;}  void preencherVetor (int *vetor, int tamanho){    for (int i=0; i<tamanho; i++){        *(vetor+i) = receberValor(i+1);    } } void subtrairVetores(int *vetA, int *vetB, int *vetResult, int tamanho){         for (int i=0; i<tamanho;i++) *(vetResult+i) = *(vetA+i) - *(vetB+i); } int receberValor(int pos){    string temp="";    int num=0;    while (true){        cout << "Valor "<< pos << ": ";        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 »