第一周:设计一个表示分数的类Fraction

这个类的构造函数是: Fraction(int a, int b) 构造一个a/b的分数。 这个类要提供以下的功能: double toDouble(); 将分数转换为double Fraction plus(Fraction r); 将自己的分数和r的分数相加,产生一个新的Fraction的对象。注意小学四年级学过两个分数如何相加的哈。 Fraction multiply(Fraction r); 将自己的分数和r的分数相乘,产生一个新的Fraction的对象。 void print(); 将自己以“分子/分母”的形式输出到标准输出,并带有回车换行。如果分数是1/1,应该输出1。当分子大于分母时,不需要提出整数部分,即31/30是一个正确的输出。 注意,在创建和做完运算后应该化简分数为最简形式。如2/4应该被化简为1/2。

  1. import java.util.Scanner;
  2. public class Main {
  3. //测试用主函数
  4. public static void main(String[] args) {
  5. Scanner in = new Scanner(System.in);
  6. Fraction a = new Fraction(in.nextInt(), in.nextInt());
  7. Fraction b = new Fraction(in.nextInt(),in.nextInt());
  8. a.print();
  9. b.print();
  10. a.plus(b).print();
  11. a.multiply(b).plus(new Fraction(5,6)).print();
  12. a.print();
  13. b.print();
  14. in.close();
  15. }
  16. }
  17. /*
  18. * 设计一个表示分数的类Fraction。这个类用两个int类型的变量分别表示分子和分母。
  19. 这个类的构造函数是:
  20. Fraction(int a, int b)
  21. 构造一个a/b的分数。
  22. 这个类要提供以下的功能:
  23. double toDouble();
  24. 将分数转换为double
  25. Fraction plus(Fraction r);
  26. 将自己的分数和r的分数相加,产生一个新的Fraction的对象。注意小学四年级学过两个分数如何相加的哈。
  27. Fraction multiply(Fraction r);
  28. 将自己的分数和r的分数相乘,产生一个新的Fraction的对象。
  29. void print();
  30. 将自己以“分子/分母”的形式输出到标准输出,并带有回车换行。
  31. 如果分数是1/1,应该输出1。当分子大于分母时,不需要提出整数部分,即31/30是一个正确的输出。
  32. */
  33. class Fraction{
  34. int num;
  35. int den;
  36. double frac;
  37. Fraction(int num,int den){
  38. this.num = num;
  39. this.den = den;
  40. toDouble();
  41. }
  42. double toDouble(){
  43. frac = (double)num/den;
  44. return frac;
  45. }
  46. void print(){
  47. if((num%den==0)) {
  48. System.out.println(num/den);
  49. }
  50. else {
  51. for(int i=1;i<=num;i++)
  52. {
  53. if(num%i==0 && den%i==0)
  54. {
  55. num = num/i;
  56. den = den/i;
  57. }
  58. }
  59. System.out.println(num+"/"+den);
  60. }
  61. }
  62. Fraction plus(Fraction r){
  63. Fraction r1 = new Fraction(0,0);
  64. r1.num = this.den*r.num + r.den*this.num;
  65. //注意分数的加法算法
  66. r1.den = this.den * r.den;
  67. return r1;
  68. }
  69. Fraction multiply(Fraction r) {
  70. Fraction r1 = new Fraction(0,0);
  71. r1.num = this.num * r.num;
  72. r1.den = this.den * r.den;
  73. return r1;
  74. }
  75. }

第二周:暂无


第三周:Hashmap(学生成绩的数据结构)

如果要写程序表达一个班级的很多个学生的很多门课的成绩,应该如何表达这些数据? 如果我们希望通过学生的姓名,可以找到他的所有的成绩,而每一门课的成绩,是由课程名称和分数构成的。 而如果我们还希望这个程序能找出某一门课的全部学生的成绩应该怎样做呢? 注意,并非所有的学生都参加了所有的课程。

  1. import java.util.HashMap;
  2. /*Hashmap:散列表,存储结构为<键:值>,通过查询键来获取值*/
  3. public class StudentScore {
  4. private HashMap<String,HashMap<String,Integer>> StudentScores = new HashMap<String,HashMap<String,Integer>>();
  5. /*新建一个学生成绩的数据容器StudentScores
  6. 结构:Hashmap<学生名:<课程名:分数>>
  7. <String:<String:Integer>>
  8. 在Hashmap中嵌套一个Hashmap
  9. */
  10. public StudentScore(){
  11. //构造函数
  12. }
  13. //add函数:不返回值,主要录入学生名以及课程成绩
  14. public void add(String stdName,String corName,Integer score){
  15. if (StudentScores.containsKey(stdName)) {
  16. StudentScores.get(stdName).put(corName, score);
  17. }
  18. else {
  19. HashMap<String,Integer> course = new HashMap<String, Integer>();
  20. course.put(corName, score);
  21. StudentScores.put(stdName, course);
  22. }
  23. }
  24. /*通过stdName在学生成绩表StudentScores是否存在记录
  25. 若存在,通过数据容器.get(学生名stdName)获取到课程表的数据容器,并将数据put进去
  26. 若不存在,先新建一个Hashmap容器,将数据put入新建的课程表容器,然后将stdName与课程表数据容器put入学生成绩表StudentScores
  27. */
  28. //getScore函数:通过stdName获得课程与分数,返回String字符串,也可以直接声明返回hashmap
  29. public String getScore(String stdName){
  30. if (StudentScores.containsKey(stdName)){
  31. //查询到StudentScores的key键集合中存在stdName时,初始化返回字符串
  32. String ss=stdName+"成绩单:";
  33. for (String corName: StudentScores.get(stdName).keySet()) {
  34. //for-each循环,变量corName遍历此stdName对应的课程表的key(课程名)集合
  35. Integer score = StudentScores.get(stdName).get(corName);
  36. //新定义对象score,接收此stdName对应的课程集合中每个课程相对应的分数
  37. ss +=corName +":"+score+" ";
  38. //ss字符串加上新接收的课程名与课程成绩
  39. }
  40. return ss;
  41. }
  42. else return "查无此人!";
  43. }
  44. //getCourse_All_Score函数:查询某一课程,全部学生的成绩
  45. public String getCourse_All_Score(String corName){
  46. //初始化返回字符串,方法接收课程名corName,直接使用
  47. String ss = corName+"成绩:";
  48. for (String stdName:StudentScores.keySet()){
  49. //for-each循环,变量stdName遍历StudentScores的key集合
  50. if(StudentScores.get(stdName).containsKey(corName))
  51. //通过stdName获取对应的课程表,再检测此学生课程表中是否存在corName这个key键
  52. //存在,通过课程名将分数查询出来并添加入字符串中
  53. ss +=stdName+":"+StudentScores.get(stdName).get(corName)+" ";
  54. else
  55. //不存在,返回字符串添加当前stdName与暂无成绩
  56. ss +=stdName+":"+"暂无成绩"+" ";
  57. }
  58. return ss;
  59. }
  60. public static void main(String[] args) {
  61. StudentScore s1 = new StudentScore();
  62. s1.add("张三","语文",88);
  63. s1.add("张三","英语",67);
  64. s1.add("张三","地理",90);
  65. s1.add("李莎","语文",99);
  66. s1.add("李莎","英语",67);
  67. s1.add("李莎","物理",45);
  68. s1.add("王智","语文",67);
  69. s1.add("王智","英语",78);
  70. s1.add("王智","数学",89);
  71. s1.add("符文","语文",88);
  72. s1.add("符文","英语",89);
  73. s1.add("符文","数学",39);
  74. s1.add("符文","物理",85);
  75. System.out.println(s1.getScore("张三"));
  76. System.out.println(s1.getCourse_All_Score("数学"));
  77. System.out.println(s1.getCourse_All_Score("英语"));
  78. }
  79. }