第二次实验

题目1 课后操作题(PTA)

1.1. 根据用户输入的整数n,从0开始的n个Fibonacci数字
public class Main {
	public static void main(String[] args) {
		Scanner in=new Scanner(System.in);
		int n=in.nextInt();
		printFibonacci(n);
	}
	public static void printFibonacci(int n){
		 int[] arr = new int[10];
	     arr[0] = 0;
	     arr[1] = 1;
	     for(int i = 0;i < arr.length;i++) {
	    	 if(i > 1) {
	    		 arr[i] = arr[i - 2] + arr[i - 1];
	         }
	         System.out.print(arr[i] + " ");
	     }
	}
}
  • 输入样例

10

  • 输出结果

0 1 1 2 3 5 6 13 21 34

  • 时间复杂度:O(n)
2.下面是一个数组,请使用程序将其中元素排序为由小到大,和由小到大

int[] numbers = {5,4,-3,6,1,-3};

//由小到大排序
import java.util.Arrays;
public class test {
	public static void main(String[] args) {
		Integer[] numbers = {5,4,-3,6,1,-3};
		Arrays.sort(numbers);
		System.out.println(Arrays.toString(numbers));
	}
	
}
//由大到小排序
import java.util.Arrays;
import java.util.Comparator;
public class test {
	public static void main(String[] args) {
		Integer[] numbers = {5,4,-3,6,1,-3};
		Comparator<Integer> cmp = new MyComarator();
		Arrays.sort(numbers,cmp);
		System.out.println(Arrays.toString(numbers));
	}
	
}
class MyComarator implements Comparator<Integer>{//重写比较方法
	@Override
	public int compare(Integer a, Integer b) {
		if (a < b)
			return 1;
		else if (a > b)
			return -1;
		else
			return 0;
	}
}
3.针对numbers数组,编写一个程序可以让用户在数组中寻找指定数字(二分法)
import java.util.Arrays;
public class test {
	public static void main(String[] args) {
		Integer[] numbers = {5,4,-3,6,1,-3};
		Arrays.sort(numbers);//排序
		int index=Arrays.binarySearch(numbers, 6);//二分
		System.out.println(index);
	}
}
4. 程序异常错误

对上面的numbers数组,执行如下代码:

for(int i = 0; i<=numbers.length; i++){
    System.out.printf(%d +,numbers[i]);
}

会提示什么异常(Exception)?请解释产生该错误的原因并改正。

异常:Index 6 out of bounds for length 6 at pta1/pta1.test.main(test.java:8)
原因:数组下标越界;
改正:

for(int i = 0; i<numbers.length; i++){
	System.out.printf("%d +",numbers[i]);
}

题目2:Math类应用

2.1. Math随机数

新建n个大小的数组,往数组中随机填入1-100之间的整数(写成函数形式),然后统计并输出其中大于50与小于等于50的百分比(写成函数形式)。

import java.util.Arrays;
import java.util.Scanner;

public class Main2 {
	public static void main(String[] args) {
		Scanner in=new Scanner(System.in);
		fun(in);
	}

	private static void fun(Scanner in) {
		int n=in.nextInt(),minF=0,maxF=0;
		int[] nums=new int[n];
		for(int i=0;i<nums.length;i++) {
			nums[i]=(int)(1+Math.random()*100);
		}
		System.out.println(Arrays.toString(nums));
		for(int i:nums) {
			if(i>50)minF++;
			else maxF++;
		}
		System.out.println((double)minF/n*100+"% "+(double)maxF/n*100+"%");
	} 
}
  • 输入样例

20

  • 输出样例

[5, 48, 60, 4, 67, 71, 82, 57, 7, 82, 52, 98, 74, 36, 73, 88, 5, 7, 78, 90]
65.0% 35.0%

2.2.使用输入对话框获得字符串

使用输入对话框获得字符串型的参数n,并将n转化为int型,作为后面代码将要创建的数组长度(参见 ‘对话框参考代码.java’)
程序结束阶段,使用信息对话框显示“程序已结束”

import java.util.Arrays;
import javax.swing.*;
public class Main{
	public static void main(String[] args) {
		int flag=0;
		while(true) {
			//输入对话框
			String x = JOptionPane.showInputDialog("请输入变量x的值:");
			System.out.println("x="+x);
			//怎么获得一个int值呢?使用Integer
			int n=Integer.parseInt(x);
			//信息对话框:用来显示消息。
			JOptionPane.showMessageDialog(null, "消息对话框");

			//选择对话框:获得用户的选择结果
			int choice = JOptionPane.showConfirmDialog(null, "确认对话框");
			System.out.println("choice"+choice);
			switch(choice){
			case JOptionPane.YES_OPTION:System.out.println("yes");fun(n);flag=1;break;
			case JOptionPane.NO_OPTION:System.out.println("no");break;
			case JOptionPane.CANCEL_OPTION:System.out.println("cancle");break;
			}
		if(flag==1)break;
		}
		JOptionPane.showMessageDialog(null, "程序结束,谢谢使用");
	}
	private static void fun(int n) {
		int minF=0,maxF=0;
		int[] nums=new int[n];
		for(int i=0;i<nums.length;i++) {
			nums[i]=(int)(1+Math.random()*100);
		}
		System.out.println(Arrays.toString(nums));
		for(int i:nums) {
			if(i>50)minF++;
			else maxF++;
		}
		System.out.println((double)minF/n*100+"% "+(double)maxF/n*100+"%");
	} 
}

2.3编写一个简单密码生成器类SimplePasswordGenerator,内含一个方法:

public static String generate(int length),可以产生length长度的简单密码,该密码由大写字母、小写字母、数字组成。
加分考核点:构造大小为26的char数组,随机生成n个从a-z的字符,最后统计输出每个字符占总生成字符的百分比。

import java.util.Random;
import java.util.Scanner;
public class Main1 {
	public static void main(String[] args) {
		Scanner in=new Scanner(System.in);
		int n=in.nextInt();
		//随机生成密码
		String password=SimplePasswordGenerator.generate(n);
		System.out.println(password);
		//随机生成26个字母并统计出现概率
		SimplePasswordGenerator.CharNum();
		in.close();
	}
}
class SimplePasswordGenerator{
	public static String generate(int length) {
		StringBuilder password = new StringBuilder("");
		String num = "0123456789";
        String english = "abcdefghijkllmnopqrstuvwxyz";
        String English = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        String stringSum = num + english + English;
        int Strlength = stringSum.length();
        for (int i = 0; i < length; i++) {
            Random random = new Random();
            int a = random.nextInt(Strlength + 1);
            char ch = stringSum.charAt(a);
            password.append(ch);
        }
		return password.toString();
	}
	public static void CharNum() {
		char[] nums=new char[26];
		for (int i = 0; i < 26; i++) {
            nums[i] =(char) ('a'+Math.random()*('z'-'a'+1));
        }
		System.out.println(nums);
		for(int i='a';i<='z';i++) {
			int x=0;
			for(int j=0;j<26;j++) {
				if(i==nums[j])x++;
			}
			System.out.println((char)i+" "+(double)x/26*100+"%");
		}
	}	
}

  • 输入样例

10

  • 输出样例

d0VBBVuCsY
yansjkwffvthevqofemyjfxkxq
a 3.8461538461538463%
b 0.0%
c 0.0%
d 0.0%
e 7.6923076923076925%
f 15.384615384615385%
g 0.0%
h 3.8461538461538463%
i 0.0%
j 7.6923076923076925%
k 7.6923076923076925%
l 0.0%
m 3.8461538461538463%
n 3.8461538461538463%
o 3.8461538461538463%
p 0.0%
q 7.6923076923076925%
r 0.0%
s 3.8461538461538463%
t 3.8461538461538463%
u 0.0%
v 7.6923076923076925%
w 3.8461538461538463%
x 7.6923076923076925%
y 7.6923076923076925%
z 0.0%

题目3:String对象的创建、截取和拼接(PTA)

3.1.编写一函数public static String getBirthDate(String id)

以“年-月-日”的格式抽取出给定id(身份证号码)的出生年月日信息.
考核:使用StringBuilder进行字符串的拼接。

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner in=new Scanner(System.in);
		String id=in.next();
		String result=getBirthDate(id);
		System.out.println(result);
		in.close();
	}
	public  static String getBirthDate(String id) {
		String year=id.substring(6,10);
		String month=id.substring(10,12);
		String day=id.substring(12,14);
		return year+"-"+month+"-"+day;
	}
}
  • 输入样例

350102199902131018

  • 输出样例

1999-02-13

3.2.出生年月日排序

进一步的,如给定若干身份证号(放到数组中),抽取这些身份证号的出生年月日信息,按从小到大的顺寻或者从大到小的顺序排列输出抽取出的出生年月日。(PTA)
•特别加分:如何对整串身份证号码按照出生年月进行排序?注意:不是将其中的出生年月日抽出来进行排序,而是对整个身份证号按照其中的年月日进行排序。

public class Main {
	public static void main(String ars[]) {
		Scanner in=new Scanner(System.in);
		String s=in.nextLine();
		int n=Integer.parseInt(s);
		String[] numbers=new String[n];
		String[] birth=new String[n];
		for(int i=0;i<n;i++) {
			numbers[i]=in.nextLine();
			birth[i]=numbers[i].substring(6,10)+"-"+numbers[i].substring(10,12)+"-"+numbers[i].substring(12,14);
		}
		sort1(birth);
	}
	private static void sort1(String[] birth) {
		Arrays.sort(birth);
		for(int i=0;i<birth.length;i++) {
			System.out.println(birth[i]);
		}
	}
}
  • 输入数据

6
410425198309308225
320203197206115011
431227196108033146
330226196605054190
34080019810819327X
320111197112301539

  • 输出数据

1961-08-03
1966-05-05
1971-12-30
1972-06-11
1981-08-19
1983-09-30

3.3. 编写一函数public static StringBuilder compareLastString(String str1,String str2)

功能:分别对str1与str2从后往前截取两个字符串的最后部分内容,如果有相同的子串,则返回该子串(全都小写),否则返回””。(比较时不区分大小写)。

import java.util.Scanner;
public class Main {
	public static void main(String[] args) {
		Scanner in=new Scanner(System.in);
		String str1=in.nextLine();
		String str2=in.nextLine();
		StringBuilder ret=compareLastString(str1,str2);
		System.out.println(ret.reverse());
		in.close();
	}
	public static StringBuilder compareLastString(String str1,String str2) {
		String[] s1,s2;
		StringBuilder str = new StringBuilder("");
		int flag=0,i,j;
		s1=str1.toLowerCase().split("");
		s2=str2.toLowerCase().split("");
		for(i=s1.length-1,j=s2.length-1;i>=0&&j>=0;i--,j--) {
			if(s1[i].equals(s2[j])) {
				str.append(s1[i]);
				flag=1;
			}
		}
		if(flag==0)str.append("\"\"");
		return str;
	}
}
  • 输入样例

abcdefG
edefg

  • 输出样例

defg

题目4:数组(PTA)

演示:新建数组(基本类型数组,引用类型数组),输出数组,forEach循环

4.1.动态生成一个存储二维String数组的乘法口诀表

public static String[][] getDynamicMatrix(int rows) //根据制定rows动态生成数组

public static String[][] getDynamicMatrix(int rows){
		String[][] arr=new String[rows][];
		return arr;
	}
4.2.使用普通for循环、forEach循环打印该二维数组

public static void printDynamicMatrix(String[][] matrix)
提示:可以使用String.format格式化字符串。
实验如下图所示:
在这里插入图片描述

import java.util.Scanner;
public class Main1 {
	public static void main(String[] args) {
		Scanner in=new Scanner(System.in);
		String[][] matrix=new String[9][];
		printDynamicMatrix(matrix);
		in.close();
	}
	public static void printDynamicMatrix(String[][] matrix) {
		for(int i=0;i<9;i++) {
			matrix[i]=new String [i+1];
			for(int j=0;j<i+1;j++) {
				matrix[i][j]=(i+1)+"*"+(j+1)+"="+(i+1)*(j+1);
				if(j<i)System.out.printf("%-7s",matrix[i][j]);
				else if(j==i)System.out.printf("%s",matrix[i][j]);
			}
			System.out.println();
		}
	}
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wang.yy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值