CS61B project0实验记录

proj0 指导讲义

遇到的问题

  • copy一个行星构造函数不会写
    讲义最后有专门的讲解,但是现在还没有理解。
    2.常数用 static final 修饰比较好
    3.java支持科学记数法,例如 1.03e-7;
    4.foreach循环的使用 for( type name : arrayname);
    5.写一个从文件读进数据的函数,结果因为所给未见后面还有一段说明文字,导致我的程序出错。

Exception in thread “main” java.util.InputMismatchException
at java.util.Scanner.throwFor(Scanner.java:864)
at java.util.Scanner.next(Scanner.java:1485)
at java.util.Scanner.nextDouble(Scanner.java:2413)
at In.readDouble(In.java:270)
at NBody.readPlanets(NBody.java:28)
at TestReadPlanets.checkReadPlanets(TestReadPlanets.java:17)
at TestReadPlanets.main(TestReadPlanets.java:89)

 while (!in.isEmpty()) {

            double xxPos = in.readDouble();
            double yyPos = in.readDouble();
            double xxVel = in.readDouble();
            double yyVel = in.readDouble();
            double mass = in.readDouble();
            String imgItem = in.readString();

            planets[i] = new Planet(xxPos,yyPos,xxVel,yyVel,mass,imgItem);
            i++;

        }

把最后的那段字符串当作double类型读进当然会出错啦!!!

6.how to convert the Strings to doubles!

7.快要崩溃了,本应该出现太阳系行星静态的画面,但是老是说我什么类重复…,而代码本身又是没有错的。
应该是包下的examples文件夹和我的代码中的In,StdOut和StdDraw等类重复了。我的做法就是直接删掉examples文件夹,昨天还不行,今早居然成功了。但是这也太丑了吧
但是想按照讲义在命令行运行还是出现错误。

我大概知道怎么回事了
首先,如果完全按照指导的来做,是没有任何问题的。只有我进入Intellij Idea调试时才会出现类重复这种情况,至于这是什么原因我也不太清楚。
而为什么我按照指导来做最后出现了什么错误: 找不到或无法加载主类 NBody的错误呢? 原因在于:我在写Planet.java文件,以及不含Main()的NBody文件时,以上步骤都是正确的。但是当引入了stdDraw库之后,每次编译都会出现

“.\StdDraw.java:299: 错误: 编码GBK的不可映射字符
You save your image to a file using the File 鈫? Save menu option. ^
.\StdDraw.java:433: 错误: 编码GBK的不可映射字* from (0.5, 鈥?∞) to (0.5, ∞) may not be visible even in the
^
.\StdDraw.java:1190: 错误: 编码GBK的不可映射字符
* (xn鈥?1, yn鈥?1
). ^
.\StdDraw.java:1190: 错误: 编码GBK的不可映射字符
* (xn鈥?1, yn鈥?1
). ^
.\StdDraw.java:1219: 错误: 编码GBK的不可映射字符
* (xn鈥?1, yn鈥?1
). ^
.\StdDraw.java:1219: 错误: 编码GBK的不可映射字符
* (xn鈥?1, yn鈥?1
). ^
6 个错误"

它这里明显提示了6个错误,但是我却以为这只是简单的编码出错,不影响结果。这时候我接着运行 java NBody。就会显示错误:

错误: 在类 NBody 中找不到 main 方法, 请将 main 方法定义为:
public static void main(String[] args)
否则 JavaFX 应用程序类必须扩展javafx.application.Application

原因在于我后来写的main()并没有编译成功。

解决方法: javac -encoding UTF-8 NBody.java,这样才能成功编译!!!

最后就可以运行成功了。

反思:

  • 为什么错误明明就写在了眼前,我却完全没有考虑到。
  • 一个project里的多个文件是可以含有多个main()函数的。但是运行的时候只会找到一个进入。javac filename.java 编译出class文件。java filename运行这个文件中包含的main()函数。
  • 呃,我居然在这里花了至少三天。

8.模拟思想:To create our simulation, we will discretize time (please do not mention this to Stephen Hawking). The idea is that at every discrete interval, we will be doing our calculations and once we have done our calculations for that time step, we will then update the values of our Planets and then redraw the universe.

9.我来到倒数第二步了,模拟动画,结果…呃气死我了。别人的这么好看,我的,完全看不见行星的!!!(明天再来解决吧!)
并不是第二天来解决的,而是第N天,该死的拖延症。
对着别人的代码改了一下(很多),
发现如果不把

    StdDraw.picture(0, 0, "images/starfield.jpg");

这句代码放进里面就会得出一个美丽的错误…
Beautiful error
10.一个错误
我的代码始终无法运行的部分在于下面这个函数:

public double calcNetForceExertedByX(Planet[] ps){
        double netforceX = 0;
        for(Planet p : ps){
            if(p.equals(this))
                continue;
            netforceX += this.calcForceExertedByX(p);
        }
        return netforceX;
    }

我是这样调用的:

for(Planet planet : p){
                xForces[i] = planet.calcForceExertedByX(p);
                yForces[i] = planet.calcForceExertedBy(p);
                i++;
            }

报错:

错误: 不兼容的类型: Planet[]无法转换为Planet
xForces[i] = planet.calcForceExertedByX§;
^
NBody.java:75: 错误: 不兼容的类型: Planet[]无法转换为Planet
yForces[i] = planet.calcForceExertedBy§;
^

没有问题的写法:


        for (int i = 0; i < p.length; i++) {
            xForces[i] = p[i].calcNetForceExertedByX(p);
            yForces[i] = p[i].calcNetForceExertedByY(p);
        }

呃不太懂问题出在哪里

在这里插入图片描述

11.打印信息。

StdOut.printf("%d\n", planets.length);
StdOut.printf("%.2e\n", radius);
for (int i = 0; i < planets.length; i++) {
    StdOut.printf("%11.4e %11.4e %11.4e %11.4e %11.4e %12s\n",
                  planets[i].xxPos, planets[i].yyPos, planets[i].xxVel,
                  planets[i].yyVel, planets[i].mass, planets[i].imgFileName);   
}

但是运行之后只看到动画,不知道打印到哪里去了。

总的来说,这次实验做得很糟糕。有点沮丧,不过,虽然这个实验比较简单,但是我觉得从他这个工程的做法可以学到很多。有机会要多复习。

彩蛋:指导材料还提供了宇宙其他的情况。甚至还可以配音!

一点总结

What is a constructor? How do I write one?
constructor 即构造函数。
A constructor is a block of code that runs when a class is instantiated with the new keyword.Constructors serve the purpose of initializing a new object’s fields.

我的Proj0 Github链接

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值