ケース 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-styleのprintfを使って小数点以下の桁数を統一し、prinfの%-8sを使って要素ごとに固定サイズの位置を設定することでデータの上下揃えを実現します!印刷結果をより美しく!