案例1:计算级数
1.1 案例要求
级数计算函数实现较为简单,这里不再赘述,注意返回值直接用变量名返回,无需调用return;
在输入时,使用readInt函数从控制台输入要求的级数,调用函数打印计算结果。
1.2 实现代码
object demo2 {
//计算级数函数
def Series(n:Int) = {
var sum = 0.0
var i = 1.0
while (sum < n) {
sum += (i+1)/i
i += 1
}
//返回值:无需使用return,直接返回
sum
}
def main(args: Array[String]): Unit = {
//读取用户输入
var n = readInt()
var sum = Series(n)
//打印输出:保留6位小数
printf("%.6f",sum)
}
}
案例2:统计学生成绩
1.1 案例要求
1)读取学生成绩:将学生成绩写入TXT文件,通过读取TXT文件将学生成绩放入到数组中;
注意:读取编码格式;
2)求成绩平均值:定义aver函数,实现求平均值;
注意:有现成的最值求值函数,无需自己编写实现;
3)统计学生成绩:将数组当中的各科成绩读取到缓冲数组中,对缓冲数组进行求最值平均的操作;
注意:使用缓冲数组进行操作,因为其为可变数组,便于操作;
1.2 实现代码
object demo3 {
def main(args: Array[String]): Unit = {
var file = readTxt("C:\\score.txt")
static(file)
//对男生和女生成绩做分别统计
var file_males = file.toBuffer
var file_females = file.toBuffer
for(i <- 1 until file.length){
var row = file(i)
if (row.split('\t')(1) != "male"){
file_males -= row
}
if (row.split('\t')(1) != "female"){
file_females -= row
}
}
println("males")
static(file_males.toArray)
println("females")
static(file_females.toArray)
}
def static(file:Array[String])={
//缓冲数组
var course1 = ArrayBuffer[String]()
var row = file(0).split('\t')
for(i <- 2 until row.length){
course1 += row(i)
}
val course = course1.toArray
var data = dim2B(course.length)
for(i <- 1 until file.length){
row = file(i).split('\t')
for(j <- 2 until row.length){
data(j-2) += row(j).toDouble
}
}
//在输出时,使用prinf的%-8s来给每个元素设置固定大小位置,实现数据打印上下对齐
printf("%-8s\t%-8s\t%-8s\t%-8s\n","course","average","min","max")
for(i <- 0 until course.length){
printf("%-8s\t%-8s\t%-8s\t%-8s\n",course(i),aver(data(i).toArray),data(i).toArray.min,data(i).toArray.max)
}
}
//二维数组
def dim2B(rows : Int)={
val d2 = new Array[ArrayBuffer[Double]](rows)
for (k <-0 until rows ) {
d2(k) = new ArrayBuffer[Double]()
}
d2
}
//读取文件
def readTxt(filePath: String) ={
//以指定的UTF-8字符集读取文件,第一个参数可以是字符串或者是java.io.File
val source = Source.fromFile(filePath, "UTF-8")
//将所有行放到数组中
val lines = source.getLines().toArray
source.close()
lines
}
//数组求最大值最小值有现成函数调用,无需编写
def max(a:Array[Double]):Double={
var res = 0.0
for(i <- a){
if (i>res){
res = i
}
}
res.formatted("%.2f").toDouble
}
def min(a:Array[Double]):Double={
var res = 100.0
for(i <- a){
if (i < res){
res = i
}
}
res.formatted("%.2f").toDouble
}
def aver(a:Array[Double]):Double={
var res = 0.0
for(i <- a){
res = res + i
}
(res/a.length).formatted("%.2f").toDouble
}
}
总结
在输出时,使用c语言风格的printf来统一小数位数;以及使用prinf的%-8s来给每个元素设置固定大小位置,实现数据打印上下对齐!使打印结果更加美观!