Java第02次实验(Java基本语法与类库)

1.PTA

1.1 综合小测验

主要代码

要点、注意事项

  • 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)

Q&A

Q:处理输入时遇到什么问题?如何解决?
A:处理输入时如果将nextLine()与其它next方法混用,出现行尾回车换行未处理影响下次输入的情况,在处理输入的时候,尽量只使用Scanner的nextLine()方法接收输入,不要将nextLine()与其它next方法混用

Q:处理输入选项时采用了什么样的方式?为什么?
A:使用了 Switch 而非 if-else ,使代码较为清晰直观,便于理解,降低代码量

Q:sort方法和search方法都要用到同一个数组nums,是如何解决的?
A:将要共享的int数组定义为Main类的类属性

Q:使用nextLine()输入得到的数据如何处理成数组?
A:String[] numStrs = line.split(" ")表示用空格分隔数据,再利用for循环和Integer.parseInt(numStrs[i])逐个将字符串类型转换为int类型存入int数组

Q:如何抽出年月日?
A:利用String.substring(index1,index2 )提取子字符串

1.2 身份证排序

主要代码

要点、注意事项

  • sort1可直接使用Arrays.sort,String的subString。
  • 采用结构化编程方式,针对sort1sort2各写一个方法处理。
  • nextInt()nextLine()混用可能出现行尾回车换行未处理影响下次输入的情况。建议:全部使用Scanner的nextLine()处理输入以免碰到行尾回车换行问题。

Q&A

Q:nextInt()nextLine()混用可能产生的后果?
A:可能出现行尾回车换行未处理影响下次输入的情况。建议:全部使用Scanner的nextLine()处理输入以免碰到行尾回车换行问题。

Q:如何对出生年月日进行排序?
A:String.substring截取出生年月日字符串,存入数组中,再用Arrays.sort()函数进行自动排序

Q:如何将所有身份证按照里面的年月日升序输出?
A:使用了两层for循环,String.substring截取出生年月日字符串,判断是否与排序过的日期相同,若相同则输出,反之不输出

1.3 ArrayList入门

主要代码


Q:本题你使用了哪些关于ArraysList的方法?
A:

方法 描述
add​(int index, E element) 将指定元素插入此列表中的指定位置
add​(E e) 将指定的元素追加到此列表的末尾。
clear() 从此列表中删除所有元素。
contains​(Object o) 如果此列表包含指定的元素,则返回 true 。
get​(int index) 返回此列表中指定位置的元素。
indexOf​(Object o) 返回此列表中第一次出现的指定元素的索引,如果此列表不包含该元素,则返回-1。
isEmpty() 如果此列表不包含任何元素,则返回 true 。
lastIndexOf​(Object o) 返回此列表中指定元素最后一次出现的索引,如果此列表不包含该元素,则返回-1。
remove​(int index) 删除此列表中指定位置的元素。
remove​(Object o) 从该列表中删除指定元素的第一个匹配项(如果存在)。
removeAll​(Collection<?> c) 从此列表中删除指定集合中包含的所有元素。
set​(int index, E element) 用指定的元素替换此列表中指定位置的元素。
size() 返回此列表中的元素数。
Q:ArraysList和普通数组有什么区别?
A:没有固定大小的限制,可以动态修改

Q:你认为使用ArraysList有哪些优缺点?
A:优点

  • 根据下标遍历元素效率较高。
  • 根据下标访问元素效率较高。
  • 在数组的基础上封装了对元素操作的方法。
  • 可以自动扩容。
    缺点:
  • 插入和删除的效率比较低。
  • 根据内容查找元素的效率较低。

1.4 浮点数的精确运算

主要代码

要点、注意事项

  • 浮点数不精确,使用BigDecimal解决。
  • BigDecimal对象的构造(以字符串的方式构造)
  • 熟悉以面向对象的方式进行各种操作(加减乘除)。
  • BigDecimal的不可变性

Q&A

Q:为什么直接使用double类型数据进行运算,无法得到精确值?
A:计算机是二进制的,浮点数没有办法是用二进制进行精确表示

Q: BigDecimal对象的构造(以字符串的方式构造)?
A:public BigDecimal(String val)

Q:BigDecimal加减乘除运算?
A:

public BigDecimal add(BigDecimal value);                        //加法

public BigDecimal subtract(BigDecimal value);                   //减法 

public BigDecimal multiply(BigDecimal value);                   //乘法

public BigDecimal divide(BigDecimal value);                     //除法

Q:一般什么时候使用BigDecimal?
A:要求结果精确的时候,比如商业计算

Q:BigDecimal的不可变性如何体现?
A:BigDecimal都是不可变的的,在进行每一步运算时,都会产生一个新的对象

 public static void main(String[] args)
    {
        BigDecimal a = new BigDecimal("4.5");
        BigDecimal b = new BigDecimal("1.5");
        a.add(b);

        System.out.println(a);  //输出4.5. 加减乘除方法会返回一个新的BigDecimal对象,原来的a不变

    }

Math类应用

2.1

import java.math.BigDecimal;
import java.util.Iterator;
import java.util.Scanner;

public class Main 
{
	public static void main(String[] args)
	{
		
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int num[]=getNum(n);
		double percentage =getPer(num);
		System.out.println(percentage*100+"%");
		System.out.println((1-percentage)*100+"%");
		sc.close();
	}
	
	private static int[] getNum(int n)
	{
		int num[]=new int[n];
		for (int i = 0; i < n; i++)
		{
			num[i]=(int)(Math.random()*99)+1;
		}
		return num;
	}
	private static double getPer(int[] num)
	{
		int count=0;
		for (int i = 0; i < num.length; i++) 
		{
			if(num[i]>50)
			{
				count++;
			}
		}
		double percentage = count*1.0/num.length;
		return percentage;
	}
	
}

2.4

import java.math.BigDecimal;
import java.util.Iterator;
import java.util.Scanner;

public class Main 
{
	public static void main(String[] args)
	{
		
		Scanner sc = new Scanner(System.in);
		int length =sc.nextInt();
		System.out.println(generate(length));
		sc.close();
	}
	public static String generate(int length)
	{
		char passWord[]=new char[length];
		for (int i = 0; i < passWord.length; i++) 
		{
			int random = (int)(Math.random()*75);
			while((random>'9'-'0'&&random<'A'-'0')
					||(random>'Z'-'0'&&random<'a'-'0')
					||random=='l'-'0')
			{
				random = (int)(Math.random()*75);
			}
			passWord[i]=(char)('0'+random);
			System.out.println(passWord[i]);
		}
		String p = String.valueOf(passWord);
		return p;
	}
	
	
}

选做

import java.math.BigDecimal;
import java.util.Iterator;
import java.util.Scanner;

public class Main 
{
	public static void main(String[] args)
	{
		
		Scanner sc = new Scanner(System.in);
		int length =sc.nextInt();
		percentage(length);
		sc.close();
	}
	public static void percentage(int length)
	{
		char passWord[]=new char[length];
		int eng[] = new int[length];
		for (int i = 0; i < passWord.length; i++) 
		{
			int random = (int)(Math.random()*26);
			passWord[i]=(char)('a'+random);
			eng[passWord[i]-'a']++;
		}
		double per;
		for (int i = 0; i < eng.length; i++) 
		{
			if(eng[i]!=0)
			{
				per = eng[i]*1.0/eng.length*100;
				char e = (char)('a'+i);
				System.out.println(e+":"+eng[i]+" "+per+"%");
			}
		}
		String p = String.valueOf(passWord);
	}
	
	
}

结果

posted @ 2021-09-23 19:00  黄帅2011  阅读(96)  评论(0编辑  收藏  举报