Scala语法小练习(银行小程序)

本篇文章主要是自己练习的一个用Scala编写的小程序

一、记录在练习过程中的一些小感受和踩得坑:

1.构造函数用this关键字

2.定义类与定义类方法的参数不需要定义一个新变量一样

Scala中可以用new关键字创建一个新的对象

3.Case的用法

4.Option的用法(可以当一个集合来用,当做返回值时可以返回None)

5.标准输入流 StdIn.readInt()【读取整数的】

6.字符串匹配及列表的元素过滤  filter方法的使用

7.对于函数返回值要好好捉摸一下,在函数内部对传入的参数进行修改,修改的并不是传入的对象本身,而是一个拷贝值,这一点与JAVA不同,要清楚差别(这可能就是函数化编程的特点),如果要改变那个对象,则需要使用this.对象=函数名(对象)的方式实现对对象的修改。【在使用到类和对象的时候一定要注意这一点,不然很有可能你执行了函数,并没有修改你要修改的对象】

二、代码:

1.Account类

class N_Account(val id:String,val name:String,var depo:Double) {//创建类的时候就定义了属性

  def depositmoney(sum:Double):Double={//存钱
    depo+=sum
    depo
  }
  def drawmoney(sum:Double): Double ={//取钱
    depo-=sum
    depo
  }
  override def toString():String={//重写toString方法
    val showaccount:String="账户所有者为:"+name+"; 账户ID为:"+id+"; 余额为:"+depo
    showaccount
  }
}

2.Customer类

import scala.io.StdIn

class N_Customer(val id: String,val pwd: String,val name: String,var accs:List[N_Account]) {

  def get_id():String={//得到客户ID
    id
  }


  def get_name():String={//得到客户姓名
    name
  }


  def get_accs():List[N_Account]={//得到客户的所有账户
    accs
  }

  def draw_money(accs:List[N_Account]):List[N_Account]={//取钱:需要指定取钱账户的ID
    println("请输入要取款账户ID:")
    val acc_id=StdIn.readLine()
    println("请输入要取款的金额:")
    val sum = StdIn.readDouble()
    for (acc:N_Account<-accs){
      if(acc.id.equals(acc_id)){
        acc.depo=acc.drawmoney(sum)
        println("当前账户信息如下:")
        println(acc.toString())
        return  accs
      }
    }
    println("未找到ID为"+acc_id+"的账户!")
    accs
  }


  def deposit_money(accs:List[N_Account]):List[N_Account]={//存钱
    println("请输入要存款账户ID:")
    val acc_id=StdIn.readLine()
    println("请输入要存取的金额:")
    val sum = StdIn.readDouble()
    for (acc:N_Account<-accs){
      if(acc.id.equals(acc_id)){
        acc.depo=acc.depositmoney(sum)
        println("当前账户信息如下:")
        println(acc.toString())
        return accs
      }
    }
    println("未找到ID为"+acc_id+"的账户!")
    accs
  }


  def show():Unit={//输出账户的全部详细信息
    for (acc:N_Account<-accs){
      println(acc.toString())
      }
    }

  def show_acc():Unit={//根据账户ID输出该账户的详细信息
    println("请输入要查找的账户ID:")
    val accid=StdIn.readLine()
    for (acc:N_Account<-accs){
      if(acc.id.equals(accid)){
        println(acc.toString())
        return
      }
    }
    println("未找到ID为"+accid+"的账户!")
  }

  def run():Unit={
    while(true){
      println("=======菜单=======")
      println("1、存钱")
      println("2、取钱")
      println("3、查看全部账户信息")
      println("4、查看指定账户信息")
      println("0、退出")
      println("请输入选项:")

      val inputnum=StdIn.readInt()
      inputnum match{
        case 1 =>
          this.accs=deposit_money(accs)
        case 2 =>
          this.accs=draw_money(accs)
        case 3 => show()
        case 4 => show_acc()
        case 0 => System.exit(0)
        case _ => println("输入错误!")
      }
    }
  }

}

3.Administrator类

import scala.io.StdIn

/*
1.创建账户
2.根据客户姓名或账户ID查找账户账户内容(得到结果不一样)
3.根据某个账户ID删除
4.显示全部账户内容
5.退出
*/
class N_Administor(var custs: List[N_Customer]) { //对于需要变化的元素,我们都设为var,到时候可以直接引用改变它的值

  def createAccount(custs: List[N_Customer]):List[N_Customer]={//根据顾客ID和账号创建新账户
    println("请输入要创建客户ID")
    val id=StdIn.readLine()
    var flag=0
    for(cust<-custs){

      if(cust.id.equals(id)){
        flag=1
        val name=cust.name
        println("请输入新账户id:")
        val accid=StdIn.readLine()
        println("请输入开户存款金额:")
        val depos=StdIn.readDouble()
        val newAccount=new N_Account(accid,name,depos)
        cust.accs=cust.accs:+newAccount
        //println(cust.accs.size)
      }
    }
    if(flag==0){
      println("查无此人!")
    }
    custs
  }

  def find_Cust(custs: List[N_Customer]):Unit={//根据客户ID找客户的账户信息
    println("请输入要查找客户ID")
    val id=StdIn.readLine()
    var flag=0
    for(cust:N_Customer<-custs){
      if(cust.get_id().equals(id)){
        flag=1
        val accs=cust.get_accs()
        for(acc:N_Account<-accs){
          println(acc.toString())
        }
        return
      }
    }
    if(flag==0){
      println("查无此人!")
    }
  }

  def del_Cust(custs: List[N_Customer]):List[N_Customer]={
    println("请输入要删除客户ID")
    val id=StdIn.readLine()
    //filter函数返回一个使所有元素都满足括号内条件的集合
    val selfcusts = custs.filter(!_.get_id().equals(id))
    selfcusts
  }

  def show_All():Unit={//把所有客户的所有信息全都打印出来
    for(cust:N_Customer<-custs){
        val accs=cust.get_accs()
        for(acc:N_Account<-accs){
          println(acc.toString())
        }
    }
  }

  def add_customer(custs: List[N_Customer]):List[N_Customer]={
    println("请输入要创建的客户ID:")
    //id: String,pwd: String,name: String,accs:List[N_Account]
    val id=StdIn.readLine()
    println("请输入密码:")
    val pwd=StdIn.readLine()
    println("请输入姓名:")
    val name=StdIn.readLine()
    println("请输入新账户id:")
    val accid=StdIn.readLine()
    println("请输入开户存款金额:")
    val depo=StdIn.readDouble()
    val newAccount=new N_Account(accid,name,depo)//这个在添加客户lucy的测试的时候id和name反了,现在改正以后正确
    val acclist=List(newAccount)
    val newCustomer=new N_Customer(id,pwd,name,acclist)
    custs:+newCustomer
  }

  def run():Unit={
    while(true){
      println("=======菜单=======")
      println("1、根据已有客户创建账户")
      println("2、查找客户账户信息")
      println("3、删除某客户")
      println("4、显示全部客户全部账户信息")
      println("5、新增客户")
      println("0、退出")
      println("请输入选项:")

      val inputnum = StdIn.readInt()
      inputnum match{
        case 1 => this.custs=createAccount(custs)
        case 2 => find_Cust(custs)
        case 3 => this.custs=del_Cust(custs)
        case 4 => show_All()
        case 5 => this.custs=add_customer(custs)
        case 0 => System.exit(0)
        case _ => println("输入错误!")
      }
    }

  }
}

4.Bank类(含main方法)

object N_Mybank {
  //测试用例
  val a1=new N_Account("a1","Nelson",100)
  val a2=new N_Account("a2","Nelson",200)
  val a3=new N_Account("a3","Nelson",300)
  val b1=new N_Account("b1","Bythly",100)
  val c1=new N_Account("c1","zmy",375.5)
  var alist=List(a1,a2,a3)
  var blist=List(b1)
  var clist=List(c1)
  val cust1=new N_Customer("2019001","123","Nelson",alist)
  val cust2=new N_Customer("2019002","123","Bythly",blist)
  val cust3=new N_Customer("2019003","123","zmy",clist)
  val custs=List(cust1,cust2,cust3)
  var admin=new N_Administor(custs)

  /*def addlist(admin:N_Administor):N_Administor={//错误思想,留作警示
    this.admin.custs.apply(1)accs=admin.custs.apply(1).accs:+a1
    this.admin
  }*/
  def main(args: Array[String]): Unit = {
    println("欢迎来到Nelson_Bank")
    //this.blist=blist:+a1 //当值发生改变的时候,地址会发生改变,而以前的值保留在原地址
    //admin.run()//测试administrator类
    cust1.run()//单独测试customer类
  }
}

三、测试:

1.测试administrator的操作:

2.测试客户功能:

初始账户信息

 

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值