Scala编程题

1、输入一个车牌号,判断今天是否限行。(20)

星期一 限行 1,6
星期二 限行 2,7
星期三 限行 3,8
星期四 限行 4,9
星期五 限行 5,0
周六周日不限行
image.png

  1. import java.util.Calendar
  2. import scala.io.StdIn
  3. import scala.util.control.Breaks.{break, breakable}
  4. /**
  5. * @Author laoyan
  6. * @Description TODO
  7. * @Date 2022/5/9 9:27
  8. * @Version 1.0
  9. */
  10. object _01HomeWork {
  11. /**
  12. *
  13. * 星期一 限行 1,6
  14. 星期二 限行 2,7
  15. 星期三 限行 3,8
  16. 星期四 限行 4,9
  17. 星期五 限行 5,0
  18. 周六周日不限行
  19. */
  20. def main(args: Array[String]): Unit = {
  21. println("请输入您的车牌号:")
  22. val chepai: String = StdIn.readLine()
  23. // 豫C5AK09 豫C5A09K
  24. // 先将一个字符串变为char类型的数据
  25. val array: Array[Char] = chepai.toArray
  26. val length = array.length // 数组长度
  27. // 0 -> 48 0 -> 57
  28. var weiHao = -1 ;
  29. // for 循环中的by 是步长的意思,by 2 ,就是下标每次增加2 等同于 i = i + 2
  30. // by -1 等同于 i = i - 1
  31. // 倒着获取最后一个数字,如果拿到就不再循环,典型的break应用
  32. breakable {
  33. for(i <- length-1 to 0 by -1){
  34. var c = array(i);
  35. //println(c+","+c.toInt)
  36. if(c.toInt >= 48 && c.toInt <= 57){
  37. weiHao = c.toInt - 48 ;
  38. break()
  39. }
  40. }
  41. }
  42. println("您的汽车的尾号是:"+weiHao)
  43. val calendar: Calendar = Calendar.getInstance()
  44. // 每周的第几天是从周日开始计算的,周一就是 2
  45. val num: Int = calendar.get(Calendar.DAY_OF_WEEK) - 1
  46. if(num == 0 || num == 6){
  47. println("不限行")
  48. }else{
  49. if(weiHao % 5 == num){
  50. println("限行")
  51. }else{
  52. println("不限行")
  53. }
  54. }
  55. }
  56. }

2、打印平行四边形 (20)

image.png

  1. import scala.io.StdIn
  2. /**
  3. * @Author laoyan
  4. * @Description TODO
  5. * @Date 2022/5/9 10:06
  6. * @Version 1.0
  7. */
  8. object _02HomeWork {
  9. def main(args: Array[String]): Unit = {
  10. println("请输入打印的平行四边形的行数:")
  11. val num: Int = StdIn.readInt() // 8
  12. // 控制换行
  13. for(i <- 1 to num){
  14. //打印空格
  15. for(m <- 1 to num-i){
  16. print(" ")
  17. }
  18. //打印*
  19. for(n <- 1 to num){
  20. print("*")
  21. }
  22. println()
  23. }
  24. }
  25. }

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 。

思路:
一个罗马数字,如果后面的数字比前面的数字小,就是后面的数字+前面的数字,如果后面的数字比前面的数字大,就是后面的减去前面的数字。

  1. /**
  2. * @Author laoyan
  3. * @Description TODO
  4. * @Date 2022/5/9 10:18
  5. * @Version 1.0
  6. */
  7. object _03HomeWork {
  8. // 给一个罗马单个字符,转换为十进制的数字
  9. def singleToInt(c:Char): Int ={
  10. val num:Int = c match {
  11. case 'I' => 1
  12. case 'V' =>5
  13. case 'X' => 10
  14. case 'L' => 50
  15. case 'C' => 100
  16. case 'D' => 500
  17. case 'M' => 1000
  18. }
  19. num
  20. }
  21. // 给定一个罗马数字的字符串,转换为十进制的数字
  22. def luomaToInt(num:String):Int = {
  23. val array: Array[Char] = num.toCharArray
  24. var num01:Int = singleToInt(array(array.length-1));
  25. // res 就是最终的结果(十进制的)
  26. var res = num01;
  27. for(i <- array.length-2 to 0 by -1){
  28. var num02 = singleToInt(array(i));
  29. println("i="+i+",num01="+num01+",num02="+num02+",res="+res)
  30. // IV
  31. // res = V = 5
  32. // res = V - I = 5 -4
  33. // LVIII
  34. if(num02 < num01){
  35. res -= num02
  36. }else{
  37. res += num02
  38. }
  39. // 每次都需要将num01 替换为 后面的那个值
  40. num01 = num02
  41. }
  42. res
  43. }
  44. def main(args: Array[String]): Unit = {
  45. //一个罗马数字,如果后面的数字比前面的数字小,就是后面的数字+前面的数字,
  46. // 如果后面的数字比前面的数字大,就是后面的减去前面的数字。
  47. // 将一个罗马数字拆开,依次从后往前相加或者相减,最终得出的数字就是10位数
  48. println(luomaToInt("IV"))
  49. println(luomaToInt("IX"))
  50. println(luomaToInt("LVIII"))
  51. println(luomaToInt("MCMXCIV"))
  52. }
  53. }

4、分析数据data.txt,该数据集包含了某大学计算机系的成绩,数据格式如下所示:(40分)

  1. Tom,DataBase,80
  2. Tom,Algorithm,50
  3. Tom,DataStructure,60
  4. Jim,DataBase,90
  5. Jim,Algorithm,60
  6. Jim,DataStructure,80
  7. Su,DataBase,82
  8. Su,Algorithm,70
  9. Su,DataStructure,90
  10. Su,Python,70
  11. Jack,DataBase,92
  12. Jack,Algorithm,68
  13. Jack,DataStructure,82
  14. Lily,DataBase,88
  15. Lily,Algorithm,52
  16. Lily,DataStructure,66
  17. Lily,Python,68
  18. Lucy,DataBase,92
  19. Lucy,Algorithm,60
  20. Lucy,DataStructure,80
  21. Lucy,Python,72
  22. Mark,DataBase,88
  23. Mark,Algorithm,56
  24. Mark,DataStructure,68
  25. Mark,Python,68
  26. Bill,DataBase,90
  27. Bill,Algorithm,60
  28. Bill,DataStructure,82
  29. Henry,DataBase,86
  30. Henry,Algorithm,78
  31. Henry,DataStructure,88
  32. Gary,DataBase,92
  33. Gary,Algorithm,68
  34. Gary,DataStructure,86
  35. Charles,DataBase,82
  36. Charles,Algorithm,78
  37. Charles,DataStructure,70
  38. Linda,DataBase,90
  39. Linda,Algorithm,88
  40. Linda,DataStructure,88

请根据给定的实验数据,在scala中通过编程来计算以下内容:
(1)该系总共有多少学生;
(2)该系共开设了多少门课程;
(3)Tom同学的总成绩平均分是多少;
(4)求每名同学的选修的课程门数;
(5)该系DataBase课程共有多少人选修;
(6)各门课程的平均分是多少;

  1. import scala.collection.mutable.ListBuffer
  2. import scala.io.Source
  3. import scala.util.control.Breaks.{break, breakable}
  4. /**
  5. * @Author laoyan
  6. * @Description TODO
  7. * @Date 2022/5/9 11:05
  8. * @Version 1.0
  9. */
  10. case class Cs(cname:String,grade:Int)
  11. case class Stu(sname:String,var csList:ListBuffer[Cs])
  12. object _04HomeWork {
  13. def main(args: Array[String]): Unit = {
  14. val lines: Iterator[String] = Source.fromFile("data.txt").getLines()
  15. val stuList = ListBuffer[Stu]();//此处存储所有的data.txt的数据
  16. // 通过循环,我们将所有的数据全部放入到了stuList中去了
  17. while(lines.hasNext){
  18. val line: String = lines.next()
  19. // Tom,DataBase,80
  20. val arr: Array[String] = line.split(",")
  21. /**
  22. * 将一行行的数据,封装为集合
  23. * Tom,DataBase,80
  24. Tom,Algorithm,50
  25. Tom,DataStructure,60
  26. */
  27. val name = arr(0);
  28. val xueKe = arr(1);
  29. val chengji = arr(2);
  30. // 封装为一个成绩
  31. val cs = Cs(xueKe,chengji.toInt);
  32. // 拿到一个学生的名字,这个学生有可能在list集合中,也有可能不存在
  33. // 如果存在,在他的成绩list集合中,追加一个新的成绩
  34. // 如果不存在,就创建一个新的stu即可
  35. var isExist = false
  36. breakable{
  37. for(stu <- stuList){
  38. if(stu.sname == name){
  39. isExist = true
  40. stu.csList += cs;
  41. break()
  42. }
  43. }
  44. }
  45. // 如果之前没有这个学生的信息
  46. if(!isExist){
  47. var scoreList = ListBuffer(cs);
  48. stuList += Stu(name,scoreList)
  49. }
  50. }
  51. // 学生总数:
  52. println("学生总数有:"+stuList.size)
  53. // 统计总共开设了多少门课程
  54. var set01 = Set[String]();
  55. stuList.foreach({
  56. stu => {
  57. stu.csList.foreach({
  58. cs => {
  59. set01 += cs.cname
  60. }
  61. })
  62. }
  63. })
  64. println("总共有学科数:"+set01.size)
  65. // Tom的平均分,总成绩
  66. var tom_sum = 0;
  67. var menNum = 0;
  68. stuList.foreach({
  69. stu => {
  70. if(stu.sname == "Tom"){
  71. stu.csList.foreach({
  72. cs => {
  73. tom_sum += cs.grade
  74. menNum += 1
  75. }
  76. })
  77. }
  78. }
  79. })
  80. println("tom同学总共考了"+tom_sum+",平均成绩是"+(tom_sum/menNum))
  81. // 求每名同学的选修的课程门数;
  82. stuList.foreach({
  83. stu => {
  84. println(stu.sname +"选修了:"+stu.csList.size+"门课")
  85. }
  86. })
  87. // 该系DataBase课程共有多少人选修;
  88. var count = 0
  89. for(stu <- stuList){
  90. for(cs <- stu.csList){
  91. if(cs.cname == "DataBase"){
  92. count += 1
  93. }
  94. }
  95. }
  96. println("该系DataBase课程共有"+count);
  97. // 各门课程的平均分是多少;
  98. for(kecheng <- set01){
  99. var sum = 0
  100. var count2 = 0
  101. for(stu <- stuList){
  102. stu.csList.foreach({
  103. sc => {
  104. if(kecheng == sc.cname){
  105. sum += sc.grade
  106. count2 += 1
  107. }
  108. }
  109. })
  110. }
  111. println(kecheng + "平均分数是:"+ (sum/count2.toDouble))
  112. }
  113. }
  114. }