Neste tutorial, vamos usar todo nosso conhecimento de Programação Orientada a Objetos, e criar um exemplo real de aplicação, uma conta bancária.
Exercício: Conta Bancária
Crie um sistema em que uma conta bancária de usuário é criada, onde ele pode checar seu saldo, depositar e sacar dinheiro, use os conhecimentos de orientação a objetos.
Seu sistema deve iniciar exibindo um menu com essas opções, e permita que o usuário faça essas operações quantas vezes ele quiser, e decida quando fechar o sistema.
A classe: Client.h
O saldo do cliente vai ficar armazenado na variável cash. Ela é inicializada com valor 0, na função construtor, ou seja, o cliente obviamente começa com 0 de dinheiro.
Temos a função menu(), que vai ficar exibindo o menu de opções, ou seja, a tela do caixa eletrônico do sistema bancário. Ela invoca a função action(), que vai chamar cada operação específica.
A primeira operação é a checkBalance(), que vai checar o balanço, o saldo da conta.
Depois tem a função depositCash(), que serve pra adicionar dinheiro na sua conta.
Por fim, a função withdraw(), pra sacar dinheiro.
Nossa classe fica assim:
#ifndef CLIENT_H #define CLIENT_H class Client { public: Client(); void menu(); void action(int); void checkBalance(); void depositCash(); void withdraw(); private: double cash; }; #endif // CLIENT_H
Código-fonte: Client.cpp
Tudo vai começar por onde deve começar, pela função construtor Client().
Ela simplesmente zera seu dinheiro, pois é como se sua conta fosse criada no momento que instanciou o objeto.
A função menu() vai ficar exibindo um menu de opções pro usuário, e pedindo pra ele digitar algum valor. Esse valor é armazenado na variável op e enviado para a função action(), isso é feito dentro de um laço do while, que só terminar se você digitar 0. Ou seja, só sai do menu, se digitar 0 pra sair.
A action() vai tomar uma ação, avaliando o valor op recebido da menu(). Isso é feito num teste condicional switch.
Se for 0, diz que o sistema está encerrando.
Se for 1, invoca a função checkBalance(), que simplesmente vai exibir a variável cash. Nada demais.
Na depositCash(), pedimos um valor ao usuário. Mas temos que testar se esse valor é positivo, pois obviamente não tem como depositar valor negativo. Esse teste é feito num IF ELSE. Se o valor for positivo, simplesmente adicionamos ele ao cash e exibimos o balanço do usuário.
Na função withdraw(), perguntamos o valor que o usuário deseja sacar. Antes de retirar esse valor da variável cash, precisamos avaliar se ele é menor que cash. Afinal, você só pode sacar algo abaixo, ou no máximo igual ao seu saldo. Esse teste é feito com um IF ELSE também.
Veja como fica o código:
#include "Client.h" #include <iostream> using namespace std; Client::Client() { cash = 0; menu(); } void Client::menu() { int op=0; do{ cout<<"0. Sair"<<endl; cout<<"1. Checar saldo"<<endl; cout<<"2. Depositar dinheiro"<<endl; cout<<"3. Sacar dinheiro"<<endl; cin >> op; action(op); }while(op); } void Client::action(int op) { switch(op) { case 0: cout << "Fechando sistema."<<endl; break; case 1: checkBalance(); break; case 2: depositCash(); break; case 3: withdraw(); break; default: cout << "Opção inválida"<<endl; } } void Client::checkBalance() { cout<<"\nSeu saldo atual é: R$" << cash <<endl; } void Client::depositCash() { double val; cout<< "Valor que deseja depositar: "; cin >> val; if(val>0){ cash += val; checkBalance(); } else cout<<"Valor inválido! Tente novamente"<<endl; } void Client::withdraw() { double val; cout<< "Valor que deseja sacar: "; cin >> val; if(val<=cash){ cash -= val; checkBalance(); } else cout<<"Saldo insuficiente"<<endl; }
main.cpp
Nossa main vai simplesmente instanciar um objeto. Automaticamente ele aciona a função construtor, e tudo começa a acontecer:
#include "Client.h" int main() { Client c; return 0; }
Veja como nossa main() é simples, enxuta e direta ao ponto.
Desafio Hacker
Tem uma maneira de burlar esse sistema. De adicionar dinheiro na sua conta de uma maneira 'hacker'. Você consegue descobrir como é? Digite nos comentários.
Para adicionar dinheiro na conta de uma maneira 'hacker', pode-se apenas colocar um valor negativo ao sacar cash, onde este em vez de diminuir, aumenta.
ResponderExcluirPara corrigir deve-se efetuar mais uma condicionalidade na função "withdraw":
if(val<=cash && val > 0)
Muito bom, cheguei a mesma conclusão.
ResponderExcluir