Lab 2 IntelliJ Home Setup、IDEs、IntList| CS61B-Spring-2018

实验二设置

1. 安装IDEA

2. 安装CS61B插件 settings-plugins

3. 导入项目

注意:import与open不同。最稳妥的办法是import(import能够导入其他平台开发的项目以及具有其他框架或者maven管理的项目)。

  • 当目前已经打开了其他的项目时,应该files-new-project from exiting sources;
  • 当目前已经open了这个项目并老出问题,file-close project,然后选择import project

4. 选择SDK

  • 在导入时可以直接选择:左上角“+”,选择JDK。JDK home path选择JDK被下载到的路径。我的是:D:\javajdk
  • 打开后可以在file-project structure的project和SDKs中设置。

5.获取Java库

将库下载到设定的文件夹后,file-project structure-libraries。点击“+”,选择java,选择所需库所在的文件夹。

6.运行test

run - run -DogTest

7.嵌入式终端

settings- tools -terminal
shell path:“C:\Program Files (x86)\Git\bin\sh.exe” --login -i
(我的Git地址为:D:\Git\bin\sh.exe)
可以在terminal中使用gitbash了。

实验二

1.断点调试

IDEA Debug大全
作者:张凯_9908
链接:https://www.jianshu.com/p/bd6d9bbb3bc5
来源:简书

1、首先说第一组横排按钮,共8个按钮,从左到右依次如下:

  • Show Execution Point (Alt + F10):如果你的光标在其它行或其它页面,点击这个按钮可跳转到当前代码执行的行。

  • Step Over (F8):步过,一行一行地往下走,如果这一行上有方法不会进入方法。

  • Step Into (F7):步入,如果当前行有方法,可以进入方法内部,一般用于进入自定义方法内,不会进入官方类库的方法,如第25行的put方法。

  • Force Step Into (Alt + Shift + F7):强制步入,能进入任何方法,查看底层源码的时候可以用这个进入官方类库的方法。

  • Step Out (Shift + F8):步出,从步入的方法内退出到方法调用处,此时方法已执行完毕,只是还没有完成赋值。

  • Drop Frame (默认无):回退断点,后面章节详细说明。

  • Run to Cursor (Alt + F9):运行到光标处,你可以将光标定位到你需要查看的那一行,然后使用这个功能,代码会运行至光标行,而不需要打断点。

  • Evaluate Expression (Alt + F8):计算表达式。

2、第二组竖排按钮,共7个按钮,从上到下依次如下:

  • Rerun ‘xxxx’:重新运行程序,会关闭服务后重新启动程序。

  • Update ‘tech’ application (Ctrl + F5):更新程序,一般在你的代码有改动后可执行这个功能。而这个功能对应的操作则是在服务配置里。

  • Resume Program (F9):恢复程序,比如,你在第20行和25行有两个断点,当前运行至第20行,按F9,则运行到下一个断点(即第25行),再按F9,则运行完整个流程,因为后面已经没有断点了。

  • Pause Program:暂停程序,启用Debug。目前没发现具体用法。

  • Stop ‘xxx’ (Ctrl + F2):连续按两下,关闭程序。有时候你会发现关闭服务再启动时,报端口被占用,这是因为没完全关闭服务的原因,你就需要查杀所有JVM进程了。

  • View Breakpoints (Ctrl + Shift + F8):查看所有断点,后面章节会涉及到。

  • Mute Breakpoints:哑的断点,选择这个后,所有断点变为灰色,断点失效,按F9则可以直接运行完程序。再次点击,断点变为红色,有效。如果只想使某一个断点失效,可以在断点上右键取消Enabled,如图2.4,则该行断点失效。

3、条件断点
在满足条件时,才停在断点处,否则直接运行。
右键单击红色断点设置断点条件。

2.IntList

迭代与递归实现链表方法:将A链表与B链表连接在一起,A在前B在后。
(1)破坏性的:即直接改变A实现该方法。

迭代:

   public static IntList dcatenate(IntList A, IntList B) {
        if(A==null){
            return B;
        }
        IntList p = A;
        while (p.rest != null) {
            p = p.rest;
        }
        p.rest = B;
        return A;
    }

ps.

  • 其实当A为null时,执行完这个方法无法改变A,A仍然为null。因为传参进来的时候fun-A是null,而之后改动的都是fun-A,main-A一直是null。但是A不为null时则可以改变main-A,因为传参进来的是一个地址,指向一个链表,传参后fun-A和main-A指向的都是这个链表,对该链表进行改变,则main-A指向的内容也会改变。
  • 需要指针p,让指针的位置在迭代中不断改变,而A自始自终都指向A.first这个值。

递归:

public static IntList dcatenateRecursive(IntList A, IntList B) {
    if(A==null){
        return B;
    }
    A.rest = dcatenateRecursive(A.rest,B);
    return A;
}

ps. 递归要先找到一个basecase(即终止条件)

(2)非破坏性的:不改变A实现该方法。

迭代:

public static IntList catenate(IntList A, IntList B) {
    if (A == null) return B;
    IntList ab = new IntList(A.first, null);
    IntList p = ab;
    //让指针的位置在迭代中不断改变,而ab自始自终都指向A.first这个值。
    while (A.rest != null) {
        A = A.rest;
        表面上看是改变了A,但是实际上,
        一开始在传参时main-A与fun-A只是指向的位置相同。
        在这里,也只是改变了fun-A指向的位置,
        而没有改变main-A指向的位置。所以main-A没有改变。
        p.rest = new IntList(A.first, null);
        p = p.rest;
    }
    while (B != null) {
        p.rest = new IntList(B.first, null);
        B = B.rest;
        p = p.rest;
    }
    return ab;
}

递归:

public static IntList catenateRecursive(IntList A, IntList B) {
    if (A == null) {
        return B;
    }
    return new IntList(A.first, catenateRecursive(A.rest, B));
}

你可能感兴趣的:(CS61B)