java实现控制台考试系统

这个博客详细介绍了如何实现一个基于Java的控制台在线考试系统。系统能够读取items.txt文件中的试题,将试题存储到集合中,并在控制台上展示。用户可以通过键盘输入选择答案,系统会记录答案并计算得分。考试结束后,成绩会被保存到score.txt文件,同时允许用户查看历史成绩。整个系统包括试题类Item和ExamManager类,实现了考试流程的完整模拟。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需求

考试系统
1)读取items.txt文件
2)将所有的试题存入到集合中(按照对象存储)
3)将集合中所有的试题 遍历展示(只展示 标题、选项)
4)开始考试 用户通过Scanner录入指定的字符串,完成如下功能
查看上一题 下一题 选择答案 记录每个题对应答案
查看得分
将本次考试成绩保存到文件
查看上次对应的成绩

1.文件读取到内存中
BufferedReader br=;
List temp=new ArrayList<>();

2.内存中存储所有的试题 List Set Map 集合
List list=new ArrayList<>();

Set<Item> set=new LinkedHashSet<>();
Map<Iteger,Item> map=new HashMap<>();

3.遍历集合,每次输出一道题
prev
next
currentIndex
4.录入用户选项
Scanner scanner=new Scanner(System.in);
记录自己的答案
List list.set(index,String);
数组 array[1]=String;
map map.put(index,String);
5.交卷 比对答案 给出当次成绩
正确答案
自选答案
6.查看历史成绩 成绩文件(追加)

成绩存储到score.txt

试题Items.txt

第1题 Java语言是哪年发明的?
A. 1991
B. 1994
C. 1996
D. 1999
A

第2题 下列关于JDK、JRE和JVM的描述,哪项正确?
A. JDK中包含了JRE,JVM中包含了JRE
B. JDK中包含了JRE,JRE中包含了JVM
C. JRE中包含了JDK,JVM中包含了JRE
D. JRE中包含了JDK,JDK中包含了JVM
B

第3题 用于生成Java文档的JDK工具是?
A. javac
B. jdb
C. javadoc
D. junit
C

第4题 使用JDK工具生成的Java文档的文件格式是?
A. XML格式
B. HTML格式
C. 二进制格式
D. 自定义格式
B

第5题 以下关于支持Java运行平台的叙述,哪项错误?
A. Java可在Solaris平台上运行
B. Java可在Windows平台上运行
C. Java语言与平台无关。Java程序的运行结果与操作系统无关
D. Java语言与平台无关。Java程序的运行结果依赖于操作系统
D

第6题 JVM在执行一个Java类时,大致采用以下过程?
A. 装载类->校验类->执行类中的代码
B. 校验类->装载类->执行类中的代码
C. 装载类->执行类中的代码->校验类
D. 执行类中的代码->装载类->校验类
A

第7题 用于编译Java源文件的JDK工具是?
A. javac
B. jdb
C. java
D. junit
A

第8题 Java程序的跨平台特征是由以下哪项技术实现的?
A. 系统硬件
B. JVM
C. Java编译器
D. 操作系统
B

第9题 下列有关类、对象和实例的叙述,正确的是哪一项?
A. 类就是对象,对象就是类,实例是对象的另一个名称,三者没有差别
B. 类是对象的抽象,对象是类的具体化,实例是对象的另一个名称
C. 对象是类的抽象,类是对象的具体化,实例是对象的另一个名称
D. 类是对象的抽象,对象是类的具体化,实例是类的另一个名称
B

第10题 Java源文件的后缀名是?
A. .class
B. .c
C. .java
D. .txt
C

Item

package com.lanou;

public class Item {
	private String title;
	private String optionA;
	private String optionB;
	private String optionC;
	private String optionD;
	private String answer;
	public Item() {
		super();
	}
	public Item(String title, String optionA, String optionB, String optionC, String optionD, String answer) {
		super();
		this.title = title;
		this.optionA = optionA;
		this.optionB = optionB;
		this.optionC = optionC;
		this.optionD = optionD;
		this.answer = answer;
	}
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public String getOptionA() {
		return optionA;
	}
	public void setOptionA(String optionA) {
		this.optionA = optionA;
	}
	public String getOptionB() {
		return optionB;
	}
	public void setOptionB(String optionB) {
		this.optionB = optionB;
	}
	public String getOptionC() {
		return optionC;
	}
	public void setOptionC(String optionC) {
		this.optionC = optionC;
	}
	public String getOptionD() {
		return optionD;
	}
	public void setOptionD(String optionD) {
		this.optionD = optionD;
	}
	public String getAnswer() {
		return answer;
	}
	public void setAnswer(String answer) {
		this.answer = answer;
	}
	@Override
	public String toString() {
		return "Item [title=" + title + ", optionA=" + optionA + ", optionB=" + optionB + ", optionC=" + optionC
				+ ", optionD=" + optionD + ", answer=" + answer + "]";
	}
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((answer == null) ? 0 : answer.hashCode());
		result = prime * result + ((optionA == null) ? 0 : optionA.hashCode());
		result = prime * result + ((optionB == null) ? 0 : optionB.hashCode());
		result = prime * result + ((optionC == null) ? 0 : optionC.hashCode());
		result = prime * result + ((optionD == null) ? 0 : optionD.hashCode());
		result = prime * result + ((title == null) ? 0 : title.hashCode());
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Item other = (Item) obj;
		if (answer == null) {
			if (other.answer != null)
				return false;
		} else if (!answer.equals(other.answer))
			return false;
		if (optionA == null) {
			if (other.optionA != null)
				return false;
		} else if (!optionA.equals(other.optionA))
			return false;
		if (optionB == null) {
			if (other.optionB != null)
				return false;
		} else if (!optionB.equals(other.optionB))
			return false;
		if (optionC == null) {
			if (other.optionC != null)
				return false;
		} else if (!optionC.equals(other.optionC))
			return false;
		if (optionD == null) {
			if (other.optionD != null)
				return false;
		} else if (!optionD.equals(other.optionD))
			return false;
		if (title == null) {
			if (other.title != null)
				return false;
		} else if (!title.equals(other.title))
			return false;
		return true;
	}
	
}

ExamManager

package com.lanou;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Reader;
import java.io.Writer;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class ExamManager {
	//存储所有试题
	static List<Item> allItem=new ArrayList<>();
	//存储自己的答案
	static String[] myAnswer=null;
	//存储自己的成绩
	static List<String> myScore=new ArrayList<>();
	//临时集合
	static List<String> tempList=new ArrayList<>();
	static {
		try {
			initItem();
			myAnswer=new String[allItem.size()];
//			myScore=new String[allItem.size()];
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	//初始化所有的试题
	public static void initItem() throws IOException {
		readFileToList();
		for(int i=0;i<tempList.size();i+=7) {
			String title=tempList.get(i);
			String optionA=tempList.get(i+1);
			String optionB=tempList.get(i+2);
			String optionC=tempList.get(i+3);
			String optionD=tempList.get(i+4);
			String answer=tempList.get(i+5);
			Item item=new Item(title,optionA,optionB,optionC,optionD,answer);
			allItem.add(item);
		}
		System.out.println();
	}
	
	public static void readFileToList() throws IOException {
		//读取文件内容封装到allItem
		BufferedReader br=new BufferedReader(new FileReader("items.txt"));
		//循环读取文件内容添加到集合
		String str=null;
		while((str=br.readLine())!=null) {
			tempList.add(str);
		}
		br.close();
	}
	//开始考试
	public static void startExam(int index) {
		Item item=allItem.get(index);
		System.out.println(item.getTitle());
		System.out.println(item.getOptionA());
		System.out.println(item.getOptionB());
		System.out.println(item.getOptionC());
		System.out.println(item.getOptionD());
	}
	public static void main(String[] args) throws IOException {
		ExamManager manger=new ExamManager();
		boolean flag=true;
		int index=0;
		Scanner scanner=new Scanner(System.in);
		while(flag) {
			startExam(index);
			System.out.println("请输入你的答案:");
			String answer=scanner.next();
			myAnswer[index]=answer;
			System.out.println("P 上一题,N 下一题,E 交卷");
			String option=scanner.next();
			switch(option) {
			case "P":
				index=index==0 ? index : --index;
				break;
			case "N":
				index=index==allItem.size()-1 ? index : ++index;
				break;
			case "E":
				flag=false;
				break;
			default:
				System.out.println("录入错误!");
			}
		}
		double score=judge();
		System.out.println("score:"+score);
		saveScoreToFile(score);
		selectPrevScore();
		System.out.println("退出系统。。。。。。");
	}
	public static double judge() {
		double score=0;
		//比对两个集合 allItem  myAnswer
		for(int i=0;i<allItem.size();i++) {
			Item item=allItem.get(i);
			if(item.getAnswer().equalsIgnoreCase(myAnswer[i])) {
				score+=10;
			}
		}
		return score;
	}
	public static void saveScoreToFile(Double score) throws IOException {
		Writer writer=new FileWriter("score.txt",true);
		BufferedWriter bw=new BufferedWriter(writer);
		String s=score.toString();
		bw.write(s);
		bw.newLine();
		bw.flush();
		bw.close();
		writer.close();
	}
	public static void selectPrevScore() throws IOException {
		Reader reader=new FileReader("score.txt");
		BufferedReader br=new BufferedReader(reader);
		String score=null;
		while((score=br.readLine())!=null) {
			myScore.add(score);
//			System.out.println(score);
		}
		br.close();
		reader.close();
		System.out.println("是否查看上次成绩?(Y/N)");
		Scanner scanner=new Scanner(System.in);
		String choose=scanner.next();
		switch(choose) {
		case "Y":
			if(myScore.size()>1) {
				String prevScore=myScore.get(myScore.size()-2);
				System.out.println("上次对应的成绩:"+prevScore);
			}else {
				System.out.println("你未参加过考试!");
			}
			break;
		case "N":
			break;
		default:
			System.out.println("输入错误!");
		}
		
	}
}

1给定如下Java程序,编译运行时,将在()出现错误。(选一项) public class Test{ public static void main(String[]args){ int i= 0; //a语句 for(;i5){ String test = “hello”; //c语句 } } System.out.println(test); //d语句 } } A.a B.b C.c D.d(出作用域) 2在Java中,下列代码的运行结果是()。(选一项) public static void main(String[]args){ int a = 1,b=2,c=3; if(a<0){ if(b<0) c=10; else c=20; } System.out.pritnln(c); } A.输出:10 B.输出:20 C.输出:3 D.编译错误 3给定如下Java代码片段,编译运行时的结果是()。(选一项) int i= 2; switch(i) { default: System.out.pritnln(“default”); case 0: System.out.println(“zero”); break; case 1: System.out.pritnln(“one”); break; case 2: System.out.println(“two”); } A输出:default B输出:default C输出:two zero D编译出错,default语句的位置不符合switch结构的语法结构 4在Java中,要向控制台打印输出“Welcome to Space!”并自动换行,可以实现此功能的语句是()。(选一项) a) System.print(“Wecome to Space!”); b) System.out.print(“Wecomr to Space!”); c) System.out.println(“Wecome to Space!”); d) System.println(“Wecome to Space!”); 5分析下面的Java源程序,编译后的运行结果是()。(选一项) import java,util.*; public class Test{ public static void main(String[] args){ int[]numbers = new int[]{2,1,3}; Arrays.sort(numbers); System.out.println(Arrays.binarySearch(numbers,2)); } } A.输出:0 B.输出:1 C.输出:2 D.输出:3 6分析下面的Java程序,编译运行结果是()。(选一项) public class B{ public static void main(String[]args){ String s =”y”; System.out.println(s+1+2); System.out.println(1+2+s); } } A输出:y12 B输出:y12 C输出:y3 D程序编译出错 3y 12y 3y 7分析下面的Java代码片段,编译运行后的输出结果是()。(选一项) for(int i = 0;i<6;i++){ int k = ++i; while(k<5){ System.out.print (i); break; } } A.024 B.02 C.123 D.13 8在Java中,源文件Test.java中包含如下代码段,则程序编译运行结果是( )。(选择一项) public class Test{ public static main (String [ ] args) { system.out.print(“Hello!”); } } A输出:Hello! B编译出错,提示“无法解析system” C运行正常,但没有输出任何内容 D运行时出现异常 9在Java中,给定代码片段如下所示,则编译运行后,输出的结果是()。(选择一项) for (int i = 0; i < 10; i++) { if(i==10-i){ break; } if(i%3!=0){ continue; } System.out.print(i+" ");} A.0 B.0 3 C.0 3 6 D.0 3 6 9 10分析下面JAVA程序段,编译运行后的输出结果是().(选择l项) public class Test{ public void changeString(StringBuffer s){ s.append(“stringbuffer2”); } Public static void main(String[] args){ Test a = new Test(); StringBuffer sb = new StringBuffer(“stringbuffer1”); a.changeString(sb); System.out.println(“sb=”+sb); } } A.sb=stringbuffer2stringbuffer1 B.sb=stringbuffer1 C.sb=stringbuffer2 D.sb=stringbuffer1stringbuffer2 11给定一个Java程序的代码如下所示,则编译运行后,输出结果是()。(选择一项) public class Test { int count=9; public void count(){ System.out.println("count="+count++); } public static void main(String[] args) { new Test().count(); new Test().count(); } } A.count=9 B.count=10 C.count=10 D.count=9 count=9 count=9 count=10 count=10 12在Java语言中,有如下代码: (选择两项) switch(x){ case 100: System.out.println(“One hundred”); break; case 200: System.out.println(“Two hundred”); break; case 300: System.out.println(“Three hundred”); break; } 下列x的定义中,()可能使得上段代码编译通过。 A.double x=100; B.char x=100; C.String x=”100”; D.Int x=100; 13给定如下所示的Java代码,要使这段代码能够编译成功,横线处应该填入( )。(选择一项) Public______count(int i,double d){ return i*d; } A.void B.int C.char D.double 14在java中,源文件Test.java中包含如下代码段,则编译运行结果是(). public class HelloWorld{ public static void main(String[] args){ System.out.print(“Hello World!”); } } A输出:Hello Word! B编译出错,提示“共有类HelloWorld 必须在HelloWorld.java文件中定义”。 C运行正常,但没有输出内容 D运行时出现异常。 15java类的main方法如下所示,当程序启动运行后,用户在控制台输入“你好”,则程序将()。(选择一项) public static void main(String args[]){ Scanner input=new Scanner(System.in); int score=input.nexInt(); System.out.println(score); } A输出“你好” B输出“你“ C程序运行正常,但是不输出任何内容。 D程序出现错误,被中断,提示输入内容不匹配,无法获得整型数值。 16分析如下所示的Java代码,编译运行后的输出结果是( )。 (选择一项) public static void main(String arg [ ] ) { boolean b = true; System.out.print(b); if (b) { System.out.print(“真”); } else { System.out.print(“假”); } } A.true B.true 真 C.tere 假 D.1 17在Java中,Scanner类提供从控制台获取键盘输入的功能,下列语句()能够正确实例化Scanner类的对象,用于获得键盘输入的数据。(选一项) a) Scanner input = new Scanner(System.out); b) Scanner input = new Scanner(System.in); c) Scanner input = new Scanner(System); d) Scanner input = new Scanner(); 18关于Java类中带参数的方法,下列选项中的说法错误的是( )。 (选择一项) A使用带参数的方法分为两步:1.定义带参数的方法:2.调用带参数的方法 B带参数方法的返回值不能为void C带参数方法的参数个数可以为一个或多个 D带参数方法的参数可以是任意的基本类型数据或引用类型数据 19在Java语言的控制结构中,break语句是经常用到的语句。下面一段代码中break语句起到( )的作用。 (选择一项) int pointer=0; while(pointer<=10){ switch(pointer%3){ case 1: pointer+=1; break; case 2: pointer+=2; break; default: pointer+=3; break; } } A结束当次循环,使控制权直接转移到控制循环的条件表达式 B从嵌套循环内部跳出最里面的循环 C终止switch语句的语句序列,提高switch-case语句性能 D退出循环
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值