Java第02次实验..

# Java第02次实验

1. 掌握Git的基本概念与基本操作。
2. 进一步熟悉Scanner的使用。
3. 熟练掌握Eclipse常用快捷键
4. 掌握常用类(String、Integer、StringBuilder等)及JDK文档的基本使用
5. 掌握数组与ArrayList

**试验任务书及相关材料**
[Java第2次实验文件.zip](http://files.cnblogs.com/files/zhrb/Java第2次实验文件.zip)

# 1. 熟悉Git(可选)

## 目标

- 使用Git管理自己的Java课程学习代码
- 学会使用git进行源代码管理
- 学会使用命令行操作git

## 1.1 使用网页版的操作代码仓库

- 申请账号、登录并创建自己的**仓库(远程)**并规划好目录结构(比如按章节分,用英文)

![远程仓库](C:\Users\HUAWEI\AppData\Roaming\Typora\typora-user-images\1632303835123.png)

注:目录结构规划暂时还不会,等后期有需要再整理。

- 通过网页版将文件提交到远程仓库中,并查看

![Eclipse提交远程Git](C:\Users\HUAWEI\AppData\Roaming\Typora\typora-user-images\1632303766190.png)

中间步骤省略,简述就是右击项目,选择team->share project->commit.

第一次提交项目后,后期如果需要更新代码,需要将项目pull下来,检查合并之后再commit->push.

- 使用**命令行**配置、将**远程仓库**克隆**本地仓库**、提交代码

  ![命令行配置](C:\Users\HUAWEI\AppData\Roaming\Typora\typora-user-images\1632304515362.png)

- 在远程仓库修改或新建文件,通过命令行将远程仓库的变动拉到本地仓库

![远程仓库修改或新建文件](C:\Users\HUAWEI\AppData\Roaming\Typora\typora-user-im

ages\1632304047430.png)

![pull远程仓库](C:\Users\HUAWEI\AppData\Roaming\Typora\typora-user-images\1632309559089.png)

![远程仓库新建文件夹](C:\Users\HUAWEI\AppData\Roaming\Typora\typora-user-images\1632309684406.png)

- 可选:根据老师提供的链接或者二维码加入团队,然后修改昵称。
- fork老师提供的代码库项目。

**参考链接:**

> [教程-Git与码云(gitee)入门-如何在实验室和宿舍同步你的代码(1)](https://www.cnblogs.com/zhrb/p/6286615.html)

## 1.3 使用Git克隆(clone)项目到你的Eclipse项目中(可选)

见以下参考资料"使用Eclipse Egit与码云管理你的代码"中的`4 从码云将项目clone到你的电脑`

![clone](C:\Users\HUAWEI\AppData\Roaming\Typora\typora-user-images\1632309836972.png)

**重要提示:**
使用Git来管理你的代码以后,当你在本地项目中开始编写新的代码之前,一定首先要将远程仓库的最新代码`pull`到本地仓库,这可以降低冲突发生的可能。

**参考资料:**

> [使用Eclipse Egit与码云管理你的代码](http://www.cnblogs.com/zhrb/p/6476718.html)

# 2. PTA

题集jmu-Java-02-Java基本语法

## 2.1 综合小测验(重点讲)

对于控制台输入的处理,nextLine()方法与其他nextXXX方法混用会产生吞回车问题。建议全部使用`Scanner.nextLine()`处理输入以免碰到行尾回车换行问题。
**注意**

- Eclipse自动生成快捷键解`Alt+\`,如**switch、for、while、sysout、main**。
- 使用Eclipse快速创建程序框架(利用Eclipse的quick fix功能快速创建方法)。
- 不要重复创建Scanner对象。
- 缩进, `Tab、Shift+Tab`。运行, `ctrl+F11`。

- 如果JDK为1.6版本(最新版PTA已支持1.8),switch不支持字符串。需先将字将String转化为int(早期的PTA 中使用的open jdk6)
- 使用Eclipse的`quick fix`功能快速创建函数`int choice2Int(String choice)`

**关键代码**

```java

    private static void searched(Scanner sc, int[] numList) {
        int goal = Integer.valueOf(sc.nextLine());
        int index = 0;
        index = Arrays.binarySearch(numList, goal);
        if (index < 0) {
            System.out.println(-1);
        } else {
            System.out.println(index);
        }
    }

    private static void sorted(Scanner sc) {
        String[] str = sc.nextLine().split(" ");// 将字符串利用空格分割成字符串数组
        numList = new int[str.length];// 申请整型数组空间
        for (int i = 0; i < str.length; i++) {
            numList[i] = Integer.valueOf(str[i]);// 将字符串元素转换成整型存入整型数组
        }
        Arrays.sort(numList);// 利用array方法排序
        System.out.println(Arrays.toString(numList));
    }

    private static void getbirthed(Scanner sc) {
        int count = Integer.parseInt(sc.nextLine());
        for (int i = 0; i < count; i++) {
            String id = sc.nextLine();
            String year = id.substring(6, 10);
            String month = id.substring(10, 12);
            String date = id.substring(12, 14);
            System.out.println(year + "-" + month + "-" + date);
        }
    }


    private static void fibed(Scanner sc) {
        int fibs = 0;
        String numbers = sc.nextLine();
        int n = Integer.parseInt(numbers);
        for (int i = 1; i <= n; i++) {
            fibs = Fib(i);
            if (i == n) {
                System.out.println(fibs);
                break;
            } else {
                System.out.print(fibs + " ");
            }
        }
    }


    private static int Fib(int n) {
        if (n == 1 || n == 2) {
            return 1;
        } else {
            return Fib(n - 1) + Fib(n - 2);
        }
    }

```

**问题**

一开始是在暑假的时候写的代码,按照面对过程的思想编写,也没有采用函数,即Java中的方法,显得冗长。所以这次博客全部将代码重新按照OO(object-oriented)的思想编写,遇到的问题如下:

1. 如何将已经写好的面对过程代码转化成方法
2. 怎么在方法里面调用类里面的公共属性
3. 怎么将字符串转换成整型类型
4. 怎么将具有指定格式的字符串分割装入数组
5. 数组元素下标的查找

**收获**

1.如何将已经写好的面对过程代码转化成方法

Eclipse采用快捷键 

![快捷键](C:\Users\HUAWEI\AppData\Roaming\Typora\typora-user-images\1632296088802.png)

2. 怎么在方法里面调用类里面的公共属性

   > 将将同一个类里面的公共属性添加修饰符

![修饰符](C:\Users\HUAWEI\AppData\Roaming\Typora\typora-user-images\1632296269472.png)

3. 怎么将字符串转换成整型类型

   > 使用相关方法

   ![字符串转数字](C:\Users\HUAWEI\AppData\Roaming\Typora\typora-user-images\1632296453240.png)

4. 怎么将具有指定格式的字符串分割装入数组

![字符串分割返回数组](C:\Users\HUAWEI\AppData\Roaming\Typora\typora-user-images\1632296640752.png)

5. 数组元素下标的查找

![下标查找](C:\Users\HUAWEI\AppData\Roaming\Typora\typora-user-images\1632296714110.png)

## 2.2 身份证排序(略讲)

- **主要讲:sort1可直接使用`Arrays.sort`,String的subString**。
- 采用结构化编程方式,针对`sort1`、`sort2`各写一个方法处理。
- 其他:nextInt()与nextLine()混用可能产生的后果。建议:全部使用`Scanner的nextLine()`处理输入以免碰到行尾回车换行问题。

**关键代码**

```java
    private static void sorted(int n, String[] id, String[] birth) {
        for(int i=0;i<n;i++) {
            birth[i]=id[i].substring(6, 10)+id[i].substring(10, 12)+id[i].substring(12, 14);
            //System.out.println(birth[i]);
        }
        Arrays.sort(birth);//先对生日进行升序排列
        for(int i=0;i<n;i++) {
            for(int j=0;j<n;j++) {//再利用双重循环的有序性,输出所有的有序生日,避免漏掉重复。
                if(id[j].contains(birth[i])){
                    System.out.println(id[j]);
                    break;
                }
            }
        }
    }

    private static void formated(int n, String[] id, String[] birth) {
        for(int i=0;i<n;i++) {
            birth[i]=id[i].substring(6, 10)+'-'+id[i].substring(10, 12)+'-'+id[i].substring(12, 14);//注意这里拼接采用字符因为字符串的每一个元素是字符
        }
        Arrays.sort(birth);
        for(int i=0;i<n;i++) {
            System.out.println(birth[i]);
        }
    }
```

**问题**

1. 字符串截取位数

利用String对象的substring方法,截取相应下标长度的字符串,这里有个小技巧,如果已知起止位置下标,结束下标就等于起止下标加上字符串长度。

2. 如何对所有身份证按照里面的年月日(对字符串内的指定位数排序)进行升序输出。

![排序](C:\Users\HUAWEI\AppData\Roaming\Typora\typora-user-images\1632299951148.png)

 将要排序的字符串片段先进行排序,外层对字符串数组遍历,内层同样长度遍历过程中,如果包含有序字符串片段数组的外层下标,就将其输出。

## 2.3 StringBuilder(自行完成)

**关键代码**

```java
    private static void added(Scanner sc) {
        while(sc.hasNextInt()) {
            int n = sc.nextInt();
            int begin=sc.nextInt();
            int end= sc.nextInt();
            StringBuilder str = new StringBuilder();//创建一个对象
            for(int i=0;i<n;i++) {
                str.append(i);//拼接数字
            }
            String str1=str.substring(begin, end);//使用截取字符串方法
            System.out.println(str1);
        }
    }
```

**问题**

使用`+`进行字符串拼接的弊端

**收获**

使用`+`进行字符串拼接的弊端

>  String是一个不可变类,一旦初始化之后就不可以修改.  创建字符串常量时,JVM会首先检查在字符串常量池,如果在字符串常量池中存在了该字符串 “Hello ming”,此时就会将该字符串对象的地址值赋值给引用 s(s存放在栈中) .如果字符串不在常量池中,就会在常量池中创建字符串,然后将字符串对象的地址值交给s. 

> 所谓字符串拼接就是生成一个新的字符串.任何对字符串的修改都是新建实例 

>   **StringBuilder/StringBuffer就是用来做高效率的字符串连接.** 

## 2.4 动态数组(自行完成)

动态生成不规则大小的数组。定义数组时数组第一维需事先确定大小,第二维大小可在程序运行中动态确定。

**关键代码**

```java
private static void multiplied(Scanner sc) {
        while(sc.hasNextInt()) {
            int n=sc.nextInt();
            String [][]numTable = new String[n][];//创建一个二维数组,只定义了一维数组的大小
            for(int i=1;i<=n;i++) {
                numTable[i-1]=new String[i];//记得申请空间
                for(int j=1;j<=i;j++) {
                    String equality = i+"*"+j+"="+i*j;//定义一个字符串变量接受等式
                    numTable[i-1][j-1]=equality;//将字符串变量存进二维数组
                    if(i==j) {//换行处条件为行数等于列数
                        System.out.println(equality);
                    }
                    else {
                        System.out.printf("%-7s",equality);
                    }
                }
                
            }
                System.out.println(Arrays.deepToString(numTable));
        }
    }
```

**问题**

- 如何控制输出格式
- 如何以格式化的方式打印二维数组

**收获**

打印二维数组可以采用Arrays的deepToString方法。

> 如何控制输出格式

> > ①float、Float、double和 Double
> > %f、%e ( %E)、%g (%G)和%a(%A)格式符可格式化float、Float
> > double和 Double,
> > 详细说明如下:
> > %f:将值格式化为十进制浮点数,小数保留6位。
> > %e (%E):将值格式化为科学记数法的十进制的浮点数(%E在格式化时将其中的指数符号大写,例如5E10)。

> > ②修饰符
> > **加号修饰符“+”**:格式化正数时,强制添加上正号,例如,%+f 将 123.78格式化为"+123.78",%+E将123.78格式化为"+1.2378E+2"。
> > **逗号修饰符“,”**:格式化浮点数时,将整数部分按“千”分组,例如,对于
> > String s=String.format("整数部分按千分组:%+,f",1235678
> > 9876);
> > 字符串s就是
> > 整数部分按千分组:+1,235,678.987600

> > ③限制小数位数与数据的“宽度”
> > **“%.nf”可以限制小数的位数**,其中的n是保留的小数位数,例如%.3f将6.1256格式化为"6.126"(保留3位小数)。
> > **规定宽度的一般格式为:"%mf"**,在数字的左面增加空格;或"%-md",在数字的右面增加空格。例如,将数字59.88格式化为宽度为11的字符串:String s-String.format("号11f",59.88);
> > 字符串s就是"59.880000",其长度(s.length())为11,即s在59.880000左面添加了两个空格字符。

> > 对于String s=String.format("号-11",59.88);
> > String对象s的字符序列就是"59.880000 ",其长度(s.length())为11,即在59.880000右面添加了两个空格字符。

> > **在指定宽度的同时也可以限制小数位数( %m.nf)**,对于String s=String.format("%11.2f",59.88);
> > String 对象s的字符序列就是"59.88",即在59.88左面添加了6个空格字符。

> > **可以在宽度的前面增加前缀0,表示用数字0(不用空格)来填充宽度左面的富余部分**,例如:
> > String s=String.format("%011f",59.88);
> > String对象s的字符序列就是"0059.880000",其长度(s.length())为11,即在59.880000的左面添加了2个数字0。
> > 注:如果实际数字的宽度大于格式中指定的宽度,就按数字的实际宽度进行格式化。
> >

## 2.5 ArrayList入门(讲)

略讲:ArrayList的常用方法add(e)、add(index, e)等
使用ArrayList可以代替数组,见如下代码,ArrayList用法请参考JDK文档。

```
import java.util.ArrayList;
import java.util.List;

public class ArrayListDemo {

    public static void main(String[] args) {
        //泛型,Integer
        List<Integer> integerList = new ArrayList<>();
        integerList.add(1);
        integerList.add(new Integer(1));//和上句效果一样
        for (Integer e : integerList) {
            System.out.println(e);
        }
        //泛型,String 
        List<String> strList = new ArrayList<String>();
        strList.add(1+"");
        strList.add("abc");
        strList.set(0, "def");//随机存取,设置0号位置的元素
        for (int i = 0; i < strList.size(); i++) {
            System.out.println(strList.get(i));
        }
    }
}
```

**关键代码**

```java
package chpt01;

import java.util.Scanner;
import java.util.Arrays;
import java.util.ArrayList;
public class Test05 {
    public static void main(String[] args) {
        
        Scanner sc = new Scanner(System.in);
        ArrayList<String> strList = new ArrayList<>();
        String s;
        boolean flag = true;
        while(flag) {
             s = sc.next();
             if(s.equals("!!end!!")) {
                 break;
             }
             else {
                 strList.add(s);
             }
        }
        //为strList添加begin
        strList.add(0,"begin");
        //strList添加end
        strList.add("end");
        //输出strList列表
        System.out.println(strList);
        
        //读入字符串str
        String str = sc.next();
        //返回是否存在str字符串
        System.out.println(strList.contains(str));
        //返回str所在下标,不存在返回-1
        System.out.println(strList.indexOf(str));
        
        //在strList中从后往前找。返回其下标,找不到返回-1。
        System.out.println(strList.lastIndexOf(str));
        //输出第一个下标为0的元素
        System.out.println(strList.get(0));
        //移除第一个下标为0的元素
        strList.remove(0);
        //输出列表元素
        System.out.println(strList);
        
        //读入字符串str1
        String str1 = sc.next();
        //替换原始的第二个位置元素
        strList.set(1, str1);
        //输出列表
        System.out.println(strList);
        
        //读入字符串str2
        String str2 = sc.next();
        //创建一个新的列表strList1
        ArrayList<String>strList1 = new ArrayList<>();
        
        //遍历strList的每一个对象,如果对象中含有str2就加入到新的列表
        for(String each:strList) {
            if(each.contains(str2)) {
                strList1.add(each);
            }
        }
        //输出新列表元素
        System.out.println(strList1);
        //移除strList中第一个和str2相等的元素
        for(String each:strList) {
            if(each.equals(str2)){
                strList.remove(each);
                break;
            }
        }
        //输出strList列表元素
        System.out.println(strList);
        //使用clear方法清空strList列表
        strList.clear();
        System.out.println(strList+","+strList.size()+","+strList.isEmpty());
        
        sc.close();
    }
}


```

## 2.5 浮点数的精确运算(略讲)

**关键代码**

```java
    private static void sumAndFactor(Scanner sc) {
        while(sc.hasNextDouble()) {
            String a = sc.next();
            String b=sc.next();
            BigDecimal num1 = new BigDecimal(a);
            BigDecimal num2 = new BigDecimal(b);
            BigDecimal sum = num1.add(num2);
            BigDecimal product = num1.multiply(num2);
            System.out.println(sum.toString());
            System.out.println(product.toString());
        }
    }
```

**问题**

浮点数不精确,怎么办?

**收获**

使用BigDecimal解决。

- **BigDecimal对象的构造(以字符串的方式构造)**

输入字符串,创建一个BigDecimal实例。

- 熟悉以**面向对象的方式**进行各种操作(加减乘除)。

采用'.'查找对应方法。(英文)

- BigDecimal的**不可变性**,如何体现?

BigDecimal都是不可变的(immutable)的, 在进行每一次四则运算时,都会产生一个新的对象 ,所以在做加减乘除运算时要记得要保存操作后的值。

# 3. 加分题

实验任务书中的题目2(Math类应用)
特别加分:6(一个实用的身份证信息查询程序)、8(作业随机分配)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值