Scala编程题
1、输入一个车牌号,判断今天是否限行。(20)
星期一 限行 1,6
星期二 限行 2,7
星期三 限行 3,8
星期四 限行 4,9
星期五 限行 5,0
周六周日不限行
import java.util.Calendarimport scala.io.StdInimport scala.util.control.Breaks.{break, breakable}/*** @Author laoyan* @Description TODO* @Date 2022/5/9 9:27* @Version 1.0*/object _01HomeWork {/**** 星期一 限行 1,6星期二 限行 2,7星期三 限行 3,8星期四 限行 4,9星期五 限行 5,0周六周日不限行*/def main(args: Array[String]): Unit = {println("请输入您的车牌号:")val chepai: String = StdIn.readLine()// 豫C5AK09 豫C5A09K// 先将一个字符串变为char类型的数据val array: Array[Char] = chepai.toArrayval length = array.length // 数组长度// 0 -> 48 0 -> 57var weiHao = -1 ;// for 循环中的by 是步长的意思,by 2 ,就是下标每次增加2 等同于 i = i + 2// by -1 等同于 i = i - 1// 倒着获取最后一个数字,如果拿到就不再循环,典型的break应用breakable {for(i <- length-1 to 0 by -1){var c = array(i);//println(c+","+c.toInt)if(c.toInt >= 48 && c.toInt <= 57){weiHao = c.toInt - 48 ;break()}}}println("您的汽车的尾号是:"+weiHao)val calendar: Calendar = Calendar.getInstance()// 每周的第几天是从周日开始计算的,周一就是 2val num: Int = calendar.get(Calendar.DAY_OF_WEEK) - 1if(num == 0 || num == 6){println("不限行")}else{if(weiHao % 5 == num){println("限行")}else{println("不限行")}}}}
2、打印平行四边形 (20)

import scala.io.StdIn/*** @Author laoyan* @Description TODO* @Date 2022/5/9 10:06* @Version 1.0*/object _02HomeWork {def main(args: Array[String]): Unit = {println("请输入打印的平行四边形的行数:")val num: Int = StdIn.readInt() // 8// 控制换行for(i <- 1 to num){//打印空格for(m <- 1 to num-i){print(" ")}//打印*for(n <- 1 to num){print("*")}println()}}}
3、罗马数字转整数 (20)
罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。
字符 数值
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
例如, 罗马数字 2 写做 II ,即为两个并列的 1 。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。
通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:
I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。
C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。
给定一个罗马数字,将其转换成整数。
示例 1:
输入: s = “III”
输出: 3
示例 2:
输入: s = “IV”
输出: 4
示例 3:
输入: s = “IX”
输出: 9
示例 4:
输入: s = “LVIII”
输出: 58
解释: L = 50, V= 5, III = 3.
示例 5:
输入: s = “MCMXCIV”
输出: 1994
解释: M = 1000, CM = 900, XC = 90, IV = 4.
提示:
1 <= s.length <= 15
s 仅含字符 (‘I’, ‘V’, ‘X’, ‘L’, ‘C’, ‘D’, ‘M’)
题目数据保证 s 是一个有效的罗马数字,且表示整数在范围 [1, 3999] 内
题目所给测试用例皆符合罗马数字书写规则,不会出现跨位等情况。
IL 和 IM 这样的例子并不符合题目要求,49 应该写作 XLIX,999 应该写作 CMXCIX 。
关于罗马数字的详尽书写规则,可以参考 罗马数字 - Mathematics 。
思路:
一个罗马数字,如果后面的数字比前面的数字小,就是后面的数字+前面的数字,如果后面的数字比前面的数字大,就是后面的减去前面的数字。
/*** @Author laoyan* @Description TODO* @Date 2022/5/9 10:18* @Version 1.0*/object _03HomeWork {// 给一个罗马单个字符,转换为十进制的数字def singleToInt(c:Char): Int ={val num:Int = c match {case 'I' => 1case 'V' =>5case 'X' => 10case 'L' => 50case 'C' => 100case 'D' => 500case 'M' => 1000}num}// 给定一个罗马数字的字符串,转换为十进制的数字def luomaToInt(num:String):Int = {val array: Array[Char] = num.toCharArrayvar num01:Int = singleToInt(array(array.length-1));// res 就是最终的结果(十进制的)var res = num01;for(i <- array.length-2 to 0 by -1){var num02 = singleToInt(array(i));println("i="+i+",num01="+num01+",num02="+num02+",res="+res)// IV// res = V = 5// res = V - I = 5 -4// LVIIIif(num02 < num01){res -= num02}else{res += num02}// 每次都需要将num01 替换为 后面的那个值num01 = num02}res}def main(args: Array[String]): Unit = {//一个罗马数字,如果后面的数字比前面的数字小,就是后面的数字+前面的数字,// 如果后面的数字比前面的数字大,就是后面的减去前面的数字。// 将一个罗马数字拆开,依次从后往前相加或者相减,最终得出的数字就是10位数println(luomaToInt("IV"))println(luomaToInt("IX"))println(luomaToInt("LVIII"))println(luomaToInt("MCMXCIV"))}}
4、分析数据data.txt,该数据集包含了某大学计算机系的成绩,数据格式如下所示:(40分)
Tom,DataBase,80Tom,Algorithm,50Tom,DataStructure,60Jim,DataBase,90Jim,Algorithm,60Jim,DataStructure,80Su,DataBase,82Su,Algorithm,70Su,DataStructure,90Su,Python,70Jack,DataBase,92Jack,Algorithm,68Jack,DataStructure,82Lily,DataBase,88Lily,Algorithm,52Lily,DataStructure,66Lily,Python,68Lucy,DataBase,92Lucy,Algorithm,60Lucy,DataStructure,80Lucy,Python,72Mark,DataBase,88Mark,Algorithm,56Mark,DataStructure,68Mark,Python,68Bill,DataBase,90Bill,Algorithm,60Bill,DataStructure,82Henry,DataBase,86Henry,Algorithm,78Henry,DataStructure,88Gary,DataBase,92Gary,Algorithm,68Gary,DataStructure,86Charles,DataBase,82Charles,Algorithm,78Charles,DataStructure,70Linda,DataBase,90Linda,Algorithm,88Linda,DataStructure,88
请根据给定的实验数据,在scala中通过编程来计算以下内容:
(1)该系总共有多少学生;
(2)该系共开设了多少门课程;
(3)Tom同学的总成绩平均分是多少;
(4)求每名同学的选修的课程门数;
(5)该系DataBase课程共有多少人选修;
(6)各门课程的平均分是多少;
import scala.collection.mutable.ListBufferimport scala.io.Sourceimport scala.util.control.Breaks.{break, breakable}/*** @Author laoyan* @Description TODO* @Date 2022/5/9 11:05* @Version 1.0*/case class Cs(cname:String,grade:Int)case class Stu(sname:String,var csList:ListBuffer[Cs])object _04HomeWork {def main(args: Array[String]): Unit = {val lines: Iterator[String] = Source.fromFile("data.txt").getLines()val stuList = ListBuffer[Stu]();//此处存储所有的data.txt的数据// 通过循环,我们将所有的数据全部放入到了stuList中去了while(lines.hasNext){val line: String = lines.next()// Tom,DataBase,80val arr: Array[String] = line.split(",")/*** 将一行行的数据,封装为集合* Tom,DataBase,80Tom,Algorithm,50Tom,DataStructure,60*/val name = arr(0);val xueKe = arr(1);val chengji = arr(2);// 封装为一个成绩val cs = Cs(xueKe,chengji.toInt);// 拿到一个学生的名字,这个学生有可能在list集合中,也有可能不存在// 如果存在,在他的成绩list集合中,追加一个新的成绩// 如果不存在,就创建一个新的stu即可var isExist = falsebreakable{for(stu <- stuList){if(stu.sname == name){isExist = truestu.csList += cs;break()}}}// 如果之前没有这个学生的信息if(!isExist){var scoreList = ListBuffer(cs);stuList += Stu(name,scoreList)}}// 学生总数:println("学生总数有:"+stuList.size)// 统计总共开设了多少门课程var set01 = Set[String]();stuList.foreach({stu => {stu.csList.foreach({cs => {set01 += cs.cname}})}})println("总共有学科数:"+set01.size)// Tom的平均分,总成绩var tom_sum = 0;var menNum = 0;stuList.foreach({stu => {if(stu.sname == "Tom"){stu.csList.foreach({cs => {tom_sum += cs.grademenNum += 1}})}}})println("tom同学总共考了"+tom_sum+",平均成绩是"+(tom_sum/menNum))// 求每名同学的选修的课程门数;stuList.foreach({stu => {println(stu.sname +"选修了:"+stu.csList.size+"门课")}})// 该系DataBase课程共有多少人选修;var count = 0for(stu <- stuList){for(cs <- stu.csList){if(cs.cname == "DataBase"){count += 1}}}println("该系DataBase课程共有"+count);// 各门课程的平均分是多少;for(kecheng <- set01){var sum = 0var count2 = 0for(stu <- stuList){stu.csList.foreach({sc => {if(kecheng == sc.cname){sum += sc.gradecount2 += 1}}})}println(kecheng + "平均分数是:"+ (sum/count2.toDouble))}}}
