目录
JAVA模拟题编程大题解析
第一道大题
第二道大题
第三道大题
第四道大题
第五道大题
JAVA模拟题编程大题解析
第一道大题
利用图形界面做一个计算素数的功能,类名为MyFrame。具体要求如下:
界面至少具有一文本输入框(JTextField),用于输入一个数字。
界面有一个按钮(JButton),用于计算输入数字以内的所有素数。
界面具有一个文本区(JTextArea),用于显示计算出来的所有素数。
在main函数中,创建MyFrame的对象frame,设置frame的大小为600X400,显示出frame。
本题主要考察图形界面中的流式布局,ActionListener监听器,以及Swinng中的几个基本组件,还有如何计算素数,list集合基本内容.版本程序不熟练的同学可以复习以上内容
- 代码
package programming; import java.awt.EventQueue; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import java.util.List; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTextArea; import javax.swing.JTextField; public class MyFrameTest { public static void main(String[] args) { MyFrame myFrame=new MyFrame(); myFrame.setVisible(true); } } //新建一个MyFrame类来继承JFrame类 class MyFrame extends JFrame { private static final int DEFAULT_WIDTH = 600;//设置一个常量来表示窗体高度 private static final int DEFAULT_HEIGHT = 400;//设置一个常量来表示窗体宽度 //也可以不用设置常量,直接在setSize()方法中输入高度和宽度 private JPanel panel;//panel是面板 private JTextField input;//一文本输入框(JTextField),用于输入一个数字。 private JButton button;//一个按钮,作用是计算输入数字以内的所有素数 private JTextArea result;//一个文本区(JTextArea),显示计算出来的素数 public MyFrame() {//窗体的构造方法。 setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);//setSize()方法设置窗体的高度和宽度 setVisible(true);//setVisible()方法设置窗体是否可见 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置用户在此窗体上发起close时默认执行的操作,这里EXIT_ON_CLOSE表示隐藏并释放该窗体的资源。 panel = new JPanel();//创建一个JPanel对象,来放组件 add(panel);//将面板panel加入窗体中。 input = new JTextField(10);//创建一个JTextField对象,列数为10,来输入数字 panel.add(input);//将文本输入框放入面板中 button = new JButton("计算");//创建一个按钮,内容为计算 //下面就要在按钮中实现计算素数这个功能,通过ActionListener监听器来实现 button.addActionListener(new ActionListener() {//对按钮实现监听功能 @Override public void actionPerformed(ActionEvent e) { String snumber = input.getText();//输入一个数字,但形式为字符串形式 int n = Integer.parseInt(snumber);//将字符串形式的数字转化为整数形式 int count = 0; List list = new ArrayList();//用list集合来存计算出来的素数 for (int i = 2; i <= n; i++) { boolean flag = true;// 默认一开始都是素数 for (int j = 2; j <= Math.sqrt(i); j++) {// 除了1和本身外如果还能被除就说明不是素数 if (i % j == 0) { flag = false;//说明该数不是素数 } } if (flag) {//flag为true说明该数为素数 list.add(i);//将数加到集合中去 } } result.setText(list.toString());//输入10,显示:[2,3,5,7] } }); panel.add(button);//将按钮加到面板中 result = new JTextArea(1, 10); panel.add(result); } }
第二道大题
-
利用InputStreamReader从键盘读入一批字符,并保存到一个字符数组中cbuf中,然后将这个字符数组转变成一个字符串,并输出该字符串。最后利用Character类的方法来判断数组cbuf中的每一个字符是数字还是字符或者是其他特殊字符,并输出判断的结果。 解析:使用InputStreamReader.read(cbuf);Character类的相关方法 本题主要考察了InputStreamReader转换流的内容,在课本157页,Character类的相关方法在课本12页
- 代码:
package programming; import java.io.IOException; import java.io.InputStreamReader; public class InputStreamReaderTest { public static void main(String[] args) throws IOException { test2(); } public static void test2() throws IOException {//read()和close()方法会抛出异常 char[] cbuf = new char[1024];//设置一个字符数组,将字符流中的字符读入该数组中 InputStreamReader reader = new InputStreamReader(System.in);//将输入的一行字符和数字序列转化为字符流对象。 System.out.println("请使用键盘输入一行字符和数字序列:"); int count = reader.read(cbuf);//将字符流中的字符读入字符数组cbuf中,会抛出异常IOException reader.close();//关闭该流,释放与之关联的所有资源 for (int i = 0; i < count-1; i++) {//这里count-1的原因是count最小值为1,而数组下标是从开始的 if (Character.isDigit(cbuf[i])) {//isDigit()方法判断cbuf[i]是不是数字 System.out.println(cbuf[i] + "是数字"); } else if (Character.isLetter(cbuf[i])) {//isDigit()方法判断cbuf[i]是不是字符 System.out.println(cbuf[i] + "是字符"); } else { System.out.println(cbuf[i] + "是其他特殊字符"); } } } }
第三道大题
-
编写一个EmployeeManage类,具有一个Map类型的成员变量mapEmployee,其中的关键字(key)表示员工编号,值(value)表示员工工资。请完成以下功能: (1)在无参数的构造方法中,将mapEmployee实例化为HashMap; (2)编写public void addEmployee(String employeeID,float wage)方法,用于将员工的编号和工资保存到mapEmployee中。 (3)编写public float sumWage()方法,用于计算mapEmployee中所有员工的工资总额。 (4)编写main方法,在main方法中创建EmployeeManage类的对象employeeManage,然后从键盘读入3个员工的员工编号和工资,并调用employeeManage的addEmployee方法将读入的数据存入mapEmployee中。然后调用employeeManage的sumWage方法计算出所有员工的工资总额,并输出到显示器上。最后利用ObjectOutputStream类将employeeManage保存到文件d:\myemployee.txt中 本题主要考察Map、HashMap的使用和遍历,ObjectOutputStream类,本程序不熟练的同学可复习以上内容。
- 代码
package programming; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectOutputStream; import java.io.Serializable; import java.util.Collection; import java.util.HashMap; import java.util.Map; import java.util.Scanner; public class EmployeeManage implements Serializable { private Map mapEmployee;//一个Map类型的成员变量mapEmployee public EmployeeManage() { mapEmployee = new HashMap();//在无参数的构造方法中,将mapEmployee实例化为HashMap } public void addEmployee(String employeeID, float wage) {//用于将员工的编号和工资保存到mapEmployee中 mapEmployee.put(employeeID, wage); } public float sumWage() {//用于计算mapEmployee中所有员工的工资总额 float sum = 0.0f; Collection values = mapEmployee.values();//将mapEmployee中的wage放入集合values中 for (Float f : values) {//遍历values集合中的wage sum += f;//将values集合中的wage相加 } return sum; } //主程序中 public static void main(String[] args) { EmployeeManage employeeManage = new EmployeeManage();//创建EmployeeManage类的对象employeeManage Scanner sc = new Scanner(System.in); for (int i =0; i < 3; i++) {//从键盘读入3个员工的员工编号和工资 System.out.println("请输入第" + (i + 1) + "个员工的编号:"); String employeeID = sc.next(); System.out.println("请输入第" + (i + 1) + "个员工的工资:"); float wage = sc.nextFloat(); employeeManage.addEmployee(employeeID, wage);//调用employeeManage的addEmployee方法将读入的数据存入mapEmployee } sc.close(); System.out.println(employeeManage.sumWage());//调用employeeManage的sumWage方法计算出所有员工的工资总额,并在显示器上显示 try {//利用ObjectOutputStream类将employeeManage保存到文件d:\myemployee.txt中 ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream("d:\\myemployee.txt")); os.writeObject(employeeManage); } catch (IOException e) { return; } } }
第四道大题
-
从键盘读入20个数字,计算读入的这20个数字的和,并输出,然后基于字节流,将这20个数字写入到文件d:\my.txt文件中,并用字节流读出d:\my.txt文件中的数据并输出到显示器。 本题主要考察Scanner读入键盘数据;FileOutputStream实现将读入的数据写入文件;FileInputStream读取文件中的数据,本程序不熟练的同学可复习以上内容。
- 代码
package programming; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.util.Scanner; public class TestInput { public static void main(String[] args) { int[] iArray = new int[20];//存取从键盘读入的数字 byte[] b = new byte[1024];//用于存取字节流中的字节 int sum = 0, count = 0; Scanner sc = new Scanner(System.in); for (int i = 0; i < 20; i++) {//计算读入的这20个数字的和 iArray[i] = sc.nextInt(); sum = sum + iArray[i]; } sc.close(); System.out.println("sum=" + sum); FileOutputStream fout = null;//文件字节输入流 FileInputStream fin = null;//文件字节输出流 try { //实现将读入的数据写入文件 fout = new FileOutputStream("d:\\my.txt"); for (int i = 0; i < 20; i++) {//将读入的数字写入文件d:\\my.txt中 fout.write((String.valueOf(iArray[i])).getBytes());//valueOf()方法将数字转化为字符串,getBytes()方法用于获取iArray[i]的字节数 } fout.close(); //实现读取文件中的数据并输出到显示器上 fin = new FileInputStream("d:\\my.txt"); while ((count = fin.read(b)) != -1) {// fin.read(b)表示将输入流中的字节数据存到b数组中,此处不用while循环也可以实现预定效果,但read()返回的最大数据是int,如果输入流中的数据一旦过大,超过int范围,不写(count = fin.read(b)) != -1判断语句来判断是否读到文件尾,很容易造成文件内容遗漏 System.out.println(new String(b, 0, count));//打印 } fin.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally {//关闭流的基本格式,背过,多敲几遍即可 if (fout != null) { try { fout.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if (fin != null) { try { fin.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } }
第五道大题
-
(1)编写一个工人Worker类,具有name(名字,String型)、birthday(生日,Date型)、wage(工资,float型)属性,都是私有属性; 编写带有3个参数的构造方法和无参数的构造方法; 编写3个属性对应的get和set方法; 编写print方法,输出自己的name 、birthday和wage属性值;(注意输出birthday时要使用SimpleDateFormat类的format方法将birthday格式化为yyyy-mm-dd的格式) (2)编写一个WorkerManage类,在该类中编写一个方法public float getAverageWage(List集合对象list中。(注意读入的日期数据一般是字符串类型,需要用SimpleDateFormat类的parse方法转化为Date类型) 创建一个新的Worker对象workerTemp,workerTemp的属性数据为:(name:张三,birthday:1996-8-22,wage:3000),将list集合中索引为2的元素替换为workerTemp。 将list集合中的元素倒序排列(提示使用Collections.reverse方法)。 循环遍历list,并输出list中每个元素的name、birthday和wage(可以调用每个Worker对象的print方法,也可以分别输出对象的这三个属性值)。 调用getAverageWage方法来计算该list集合中所有工人的平均工资,并输出平均工资。 本题考察了get、set方法的编写、构造方法的编写、SimpleDateFormat类(稍微了解即可)、list集合的遍历使用、Collections类相关的方法使用,SimpleDateFormat类。
- 代码
package programming; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Scanner; public class WorkerManage { public float getAverageWage(List list) {//该方法的作用是计算list集合中所有工人的平均工资 float averageWage = 0, sumWage = 0;//averageWage之平均工资,sumWage指总工资 for (int i = 0; i < list.size(); i++) sumWage = sumWage + list.get(i).getWage(); averageWage = sumWage / list.size(); return averageWage; } public static void main(String[] args) throws ParseException { List list = new ArrayList();//List集合对象list //用循环语句从键盘读入5个工人的姓名、生日和工资数据,生成5个Worker对象,并把这5个对象保存到一个List集合对象list中 Scanner sc = new Scanner(System.in); SimpleDateFormat format = new SimpleDateFormat("yyyy-mm-dd"); for (int i = 0; i < 3; i++) { String name = sc.next();//读入姓名 String birthday = sc.next();//读入生日 float wage = sc.nextFloat();//读入工资数据 list.add(new Worker(name, format.parse(birthday), wage));//把对象保存到List集合对象list中 } sc.close(); Worker workerTemp = new Worker("张三", format.parse("1996-8-22"), 3000);//创建一个新的Worker对象workerTemp list.set(2, workerTemp);//将list集合中索引为2的元素替换为workerTemp Collections.reverse(list);//将list集合中的元素倒序排列 for (int i = 0; i < list.size(); i++)//循环遍历list,并输出list中每个元素的name、birthday和wage,利用之前写过的print方法 list.get(i).print(); //调用getAverageWage方法来计算该list集合中所有工人的平均工资,并输出平均工资 WorkerManage workerManage = new WorkerManage(); float averageWage = workerManage.getAverageWage(list); System.out.println("averageWage=" + averageWage); } } class Worker {//编写一个工人Worker类,具有name(名字,String型)、birthday(生日,Date型)、wage(工资,float型)属性,都是私有属性 private String name; private Date birthday; private float wage; //编写3个属性对应的get和set方法; public String getName() { return name; } public void setName(String name) { this.name = name; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public float getWage() { return wage; } public void setWage(float wage) { this.wage = wage; } //编写带有3个参数的构造方法和无参数的构造方法 public Worker(String name, Date birthday, float wage) { this.name = name; this.birthday = birthday; this.wage = wage; } public Worker() { this.name =" "; this.birthday = null; this.wage = 0; } //编写print方法,输出自己的name 、birthday和wage属性值;(注意输出birthday时要使用SimpleDateFormat类的format方法将birthday格式化为yyyy-mm-dd的格式) public void print() { SimpleDateFormat format = new SimpleDateFormat("yyyy-mm-dd"); System.out.println("name:" + name + " birthday:" + format.format(birthday) + " wage:" + wage); } }