本篇文章主要是自己练习的一个用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.测试客户功能:
初始账户信息