Skip to content

Instantly share code, notes, and snippets.

@lrlucena
Last active December 19, 2015 12:59
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save lrlucena/5958782 to your computer and use it in GitHub Desktop.
Save lrlucena/5958782 to your computer and use it in GitHub Desktop.
package banco
class Banco() {
val taxaJuros: Double = 0.11
var contas: List[Conta] = Nil;
var proximoNumero: Int = 1;
def abrirContaEspecial(quantia: Double): Option[Conta] = {
if (quantia > 0) {
val c = new ContaEspecial(proximoNumero.toString, quantia, 500);
proximoNumero += 1
contas = c :: contas
Some(c)
} else None
}
def abrirContaCorrente(quantia: Double) = {
if (quantia > 0) {
val c = new ContaCorrente(proximoNumero.toString, quantia);
proximoNumero += 1;
contas = c :: contas;
Some(c);
} else None;
}
def getConta(numero: String): Option[Conta] = {
for (c <- contas) {
if (c.numero == numero) {
return Some(c)
}
}
None
}
def fecharConta(numero: String) = {
val conta = getConta(numero);
conta match {
case Some(c) if c.saldo == 0 =>
contas.filter(conta == _)
true
case _ => false
}
}
def sacar(numero: String, quantia: Double) = {
val c = getConta(numero);
c match {
case Some(c) => c.sacar(quantia)
case None => false
}
}
def depositar(numero: String, quantia: Double) = {
val conta = getConta(numero);
conta match {
case Some(c) if quantia > 0 =>
val quantia2 = quantia +
(if (c.saldo < 0) c.saldo * taxaJuros else 0)
c.depositar(quantia2)
true
case _ => false
}
}
}
trait Conta {
val numero: String
def saldo: Double
def sacar(valor: Double): Boolean
def depositar(valor: Double): Boolean
override def toString = s"Conta no $numero"
}
class ContaCorrente(val numero: String, private var _saldo: Double) extends Conta {
def saldo = _saldo
def disponivel = saldo
def depositar(valor: Double) = {
if (valor >= 0) {
_saldo += valor
true
} else
false
}
def sacar(valor: Double) = {
if (valor >= 0 && disponivel >= valor) {
_saldo -= valor
true
} else
false
}
override def toString = s"Conta no. $numero"
}
class ContaEspecial(numero: String, _saldo: Double, limite: Double) extends ContaCorrente(numero, _saldo) {
override def disponivel = saldo + limite
override def toString = s"${super.toString}. Limite R$$ $limite"
}
object Main extends App {
val banco = new Banco();
println("**** BEM-VINDO AO BANCO ****");
main
println("*** Aplicativo banco encerrado ***");
def main {
println("1 - Abrir conta corrente");
println("2 - Abrir conta especial");
println("3 - Fechar conta");
println("4 - Realizar saque");
println("5 - Realizar dep�sito");
println("6 - Ver saldo");
println("0 - Sair");
val opcao = readInt;
if(opcao == 1 || opcao == 2){
System.out.print("Quantia inicial: ");
val quantia = readDouble();
var c: Option[Conta] = None;
if(opcao == 1){
c = banco.abrirContaCorrente(quantia);
}
else{//2
c = banco.abrirContaEspecial(quantia);
}
if(c != null){
println("Conta criada com o numero " + c.get.numero);
}
else{
println("A operacao falhou!");
}
}
else if(opcao == 3){
System.out.print("Numero da conta: ");
val numero = readLine;
val ok = banco.fecharConta(numero);
if(ok){
println("Conta fechada com sucesso.");
}
else{
println("A operacao falhou!");
}
}
else if(opcao == 4){
System.out.print("Numero da conta: ");
val numero = readLine;
System.out.print("Quantia: ");
val quantia = readDouble;
val ok = banco.sacar(numero, quantia);
if(ok){
println("Saque realizado com sucesso!");
}
else{
println("A opera��o falhou. Verifique se o saldo ou limite � suficiente.");
}
}
else if(opcao == 5){
System.out.print("Numero da conta: ");
val numero = readLine;
System.out.print("Quantia: ");
val quantia = readDouble;
val ok = banco.depositar(numero, quantia);
if(ok){
println("Dep�sito realizado com sucesso!");
}
else{
println("A opera��o falhou!");
}
}
else if(opcao == 6){
System.out.print("Numero da conta: ");
val numero = readLine;
val c = banco.getConta(numero);
if(c != None){
println("Saldo: " + c.get.saldo);
}
else{
println("Conta nao encontrada!.");
}
}
if (opcao!=0) main
}
};
object Main2 extends App {
val banco = new Banco();
println("**** BEM-VINDO AO BANCO SCALA****")
main
println("*** Aplicativo banco encerrado ***")
def main {
println(
"""1 - Abrir conta corrente
|2 - Abrir conta especial
|3 - Fechar conta
|4 - Realizar saque
|5 - Realizar deposito
|6 - Ver saldo
|0 - Sair""".stripMargin)
val opcao = readInt;
if (opcao == 1 || opcao == 2) {
print("Quantia inicial: ")
val quantia = readDouble
val c = if (opcao == 1) {
banco.abrirContaCorrente(quantia);
} else { //2
banco.abrirContaEspecial(quantia);
}
c match {
case Some(conta) => println(s"Conta criada com o numero ${conta.numero}")
case None => println("A operacao falhou!")
}
} else if (opcao == 3) {
print("Numero da conta: ")
val numero = readLine;
val ok = banco.fecharConta(numero);
if (ok) {
println("Conta fechada com sucesso.");
} else {
println("A operacao falhou!");
}
} else if (opcao == 4) {
print("Numero da conta: ");
val numero = readLine;
print("Quantia: ");
val quantia = readDouble;
val ok = banco.sacar(numero, quantia);
if (ok) {
println("Saque realizado com sucesso!");
} else {
println("A operacao falhou. Verifique se o saldo ou limite é suficiente.");
}
} else if (opcao == 5) {
print("Numero da conta: ");
val numero = readLine;
print("Quantia: ");
val quantia = readDouble;
val ok = banco.depositar(numero, quantia);
if (ok) {
println("Deposito realizado com sucesso!");
} else {
println("A operacao falhou!");
}
} else if (opcao == 6) {
print("Numero da conta: ");
val numero = readLine;
val c = banco.getConta(numero);
c match {
case Some(conta) => println(s"Saldo: ${conta.saldo}")
case None => println("Conta nao encontrada!.")
}
}
if (opcao != 0) main
}
}
object Main2 extends App {
val banco = new Banco();
println("**** BEM-VINDO AO BANCO SCALA****")
main
println("*** Aplicativo banco encerrado ***")
def main {
println(
"""1 - Abrir conta corrente
|2 - Abrir conta especial
|3 - Fechar conta
|4 - Realizar saque
|5 - Realizar deposito
|6 - Ver saldo
|0 - Sair""".stripMargin)
val opcao = readInt;
opcao match {
case 1 => abrirConta(false)
case 2 => abrirConta(true)
case 3 => fecharConta
case 4 => sacar
case 5 => depositar
case 6 => verSaldo
case _ => Unit
}
if (opcao != 0) main
}
def abrirConta(especial: Boolean = false) {
print("Quantia inicial: ")
val quantia = readDouble
val c = if (especial) {
banco.abrirContaEspecial(quantia);
} else {
banco.abrirContaCorrente(quantia);
}
c match {
case Some(conta) => println(s"Conta criada com o numero ${conta.numero}")
case None => println("A operacao falhou!")
}
}
def fecharConta {
print("Numero da conta: ")
val numero = readLine;
val ok = banco.fecharConta(numero);
if (ok) {
println("Conta fechada com sucesso.");
} else {
println("A operacao falhou!");
}
}
def sacar {
print("Numero da conta: ");
val numero = readLine;
print("Quantia: ");
val quantia = readDouble;
val ok = banco.sacar(numero, quantia);
if (ok) {
println("Saque realizado com sucesso!");
} else {
println("A operacao falhou. Verifique se o saldo ou limite é suficiente.");
}
}
def depositar {
print("Numero da conta: ");
val numero = readLine;
print("Quantia: ");
val quantia = readDouble;
val ok = banco.depositar(numero, quantia);
if (ok) {
println("Deposito realizado com sucesso!");
} else {
println("A operacao falhou!");
}
}
def verSaldo {
print("Numero da conta: ");
val numero = readLine;
val c = banco.getConta(numero);
c match {
case Some(conta) => println(s"Saldo: ${conta.saldo}")
case None => println("Conta nao encontrada!.")
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment