Scala编程题
1、输入一个车牌号,判断今天是否限行。(20)
星期一 限行 1,6
星期二 限行 2,7
星期三 限行 3,8
星期四 限行 4,9
星期五 限行 5,0
周六周日不限行
import java.util.Calendar
import scala.io.StdIn
import 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.toArray
val length = array.length // 数组长度
// 0 -> 48 0 -> 57
var 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()
// 每周的第几天是从周日开始计算的,周一就是 2
val num: Int = calendar.get(Calendar.DAY_OF_WEEK) - 1
if(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' => 1
case 'V' =>5
case 'X' => 10
case 'L' => 50
case 'C' => 100
case 'D' => 500
case 'M' => 1000
}
num
}
// 给定一个罗马数字的字符串,转换为十进制的数字
def luomaToInt(num:String):Int = {
val array: Array[Char] = num.toCharArray
var 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
// LVIII
if(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,80
Tom,Algorithm,50
Tom,DataStructure,60
Jim,DataBase,90
Jim,Algorithm,60
Jim,DataStructure,80
Su,DataBase,82
Su,Algorithm,70
Su,DataStructure,90
Su,Python,70
Jack,DataBase,92
Jack,Algorithm,68
Jack,DataStructure,82
Lily,DataBase,88
Lily,Algorithm,52
Lily,DataStructure,66
Lily,Python,68
Lucy,DataBase,92
Lucy,Algorithm,60
Lucy,DataStructure,80
Lucy,Python,72
Mark,DataBase,88
Mark,Algorithm,56
Mark,DataStructure,68
Mark,Python,68
Bill,DataBase,90
Bill,Algorithm,60
Bill,DataStructure,82
Henry,DataBase,86
Henry,Algorithm,78
Henry,DataStructure,88
Gary,DataBase,92
Gary,Algorithm,68
Gary,DataStructure,86
Charles,DataBase,82
Charles,Algorithm,78
Charles,DataStructure,70
Linda,DataBase,90
Linda,Algorithm,88
Linda,DataStructure,88
请根据给定的实验数据,在scala中通过编程来计算以下内容:
(1)该系总共有多少学生;
(2)该系共开设了多少门课程;
(3)Tom同学的总成绩平均分是多少;
(4)求每名同学的选修的课程门数;
(5)该系DataBase课程共有多少人选修;
(6)各门课程的平均分是多少;
import scala.collection.mutable.ListBuffer
import scala.io.Source
import 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,80
val arr: Array[String] = line.split(",")
/**
* 将一行行的数据,封装为集合
* Tom,DataBase,80
Tom,Algorithm,50
Tom,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 = false
breakable{
for(stu <- stuList){
if(stu.sname == name){
isExist = true
stu.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.grade
menNum += 1
}
})
}
}
})
println("tom同学总共考了"+tom_sum+",平均成绩是"+(tom_sum/menNum))
// 求每名同学的选修的课程门数;
stuList.foreach({
stu => {
println(stu.sname +"选修了:"+stu.csList.size+"门课")
}
})
// 该系DataBase课程共有多少人选修;
var count = 0
for(stu <- stuList){
for(cs <- stu.csList){
if(cs.cname == "DataBase"){
count += 1
}
}
}
println("该系DataBase课程共有"+count);
// 各门课程的平均分是多少;
for(kecheng <- set01){
var sum = 0
var count2 = 0
for(stu <- stuList){
stu.csList.foreach({
sc => {
if(kecheng == sc.cname){
sum += sc.grade
count2 += 1
}
}
})
}
println(kecheng + "平均分数是:"+ (sum/count2.toDouble))
}
}
}