A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李鑫246 中级黑马   /  2016-9-26 22:00  /  2042 人查看  /  13 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

这道题自己写了近200行代码才实现,然后发现算法太......,耗时太长,不知道怎么能优化下算法,不想在点招的时候碰见这样的题还做不出来。
学到线程(第一天),希望各位大神帮忙!非常感谢。
注:重点是判卷给分那块
业务需求:实现学员成绩自动判卷。
        1、学员提交以自己姓名命名的TXT文档,将学员答案放到指定文件夹。
        2、学员文档内容格式要求, 题号 = 答案
          例如:
        1 = abc
        2 = EDDF
        3、正确答案保存到 answer.properties 保存格式为 题号 = 答案选项 ,
        例如:
        1 = BDDF
        2 = Ace
       
        4、每题对应分数保存到 score.properties,保存格式为 题号 = 分值 例如
        1 = 20
        2 = 10
        3 = 5
       
        5、运行程序,读取存放学员成绩的文件夹,给每个学员判卷,最后输出一个记录全部学员成绩的TXT文本。
        6、总成绩格式要求:
        曹操 = 55.0
        刘备 = 60.0
        孙权 = 100.0
        袁绍 = 30.0
        诸葛 = 100.0
       
        7、判卷要求:根据答案匹配度给分,例如:第一题 10分,答案是 ABC,如果学员答案是 abd,则答对2项,分值 = 10 / 3 * 2。

13 个回复

倒序浏览
李鑫246 来自手机 中级黑马 2016-9-28 17:32:45
沙发
大神们在吗??
回复 使用道具 举报
你这题目,最后判分那一块可能比较难,而且,你这个判分没有写完整不,判分情况比较多,万一我都写ABCD,那你怎么判分呢?题目不难,就是不断的读写文件的操作,就是你这个判分标准没有写完
回复 使用道具 举报
你这题目,最后判分那一块可能比较难,而且,你这个判分没有写完整不,判分情况比较多,万一我都写ABCD,那你怎么判分呢?题目不难,就是不断的读写文件的操作,就是你这个判分标准没有写完
回复 使用道具 举报
Daveweil 发表于 2016-10-3 13:03
你这题目,最后判分那一块可能比较难,而且,你这个判分没有写完整不,判分情况比较多,万一我都写ABCD,那 ...

好吧,谢谢回复,我再仔细想想
回复 使用道具 举报
感觉就是平时考试时老师打分的程序
回复 使用道具 举报
小泥人 发表于 2016-10-3 21:12
感觉就是平时考试时老师打分的程序

哈哈,这是一道题,老师们要用的肯定比这复杂多了,再说现在已经没有选择题了
回复 使用道具 举报
本帖最后由 水月灬清影 于 2016-10-4 00:10 编辑

各部分代码功能见注释。
[Java] 纯文本查看 复制代码
package exercise;
import java.io.File;
import java.io.FileReader;
import java.io.PrintWriter;
import java.util.Properties;
import java.util.Scanner;

public class Demo {
		public static void main(String[] args) throws Exception {
			//手动输入题目总数(本例因不能自动识别行数而需要手动输入题数总数,所以不太灵活)
			System.out.println("请输入总题数");
			Scanner sc = new Scanner(System.in);
			int num=sc.nextInt();
			//标准答案文件的加载
			Properties ansProp = new Properties();
			FileReader fr0 = new FileReader("C:\\Users\\pc\\Desktop\\rule\\answer.properties");
			ansProp.load(fr0);
			//分数文件的加载
			Properties scoreProp = new Properties();
			FileReader fr1 = new FileReader("C:\\Users\\pc\\Desktop\\rule\\score.properties");
			scoreProp.load(fr1);
			
			PrintWriter pw = new PrintWriter("成绩.txt");
			//指向全部学生所做答案文件所在的文件夹
			Properties stuProp = new Properties();
			File dir = new File("C:\\Users\\pc\\Desktop\\ans");
			File[] allScores = dir.listFiles();
			for (File file : allScores) {
				//获取学生姓名,要求:保存学生所做答案的文件,要命名为姓名.properties
				String sName=file.getName().substring(0, file.getName().length()-11);
				FileReader fr = new FileReader(file);
				stuProp.load(fr);
				//定义总分变量
				double sum=0;
				for(int i = 1;i<=num;i++){
					String stuAns = stuProp.getProperty(""+i);  //读取学生第i题答案
					String ans=ansProp.getProperty(""+i);   //读取第i题标准答案
					String scoreStr=scoreProp.getProperty(""+i);   //读取第i题分数
					int score=Integer.parseInt(scoreStr);
					//我的得分规则: 完全正确:全分; 少选:半分; 选错:无分    !!!要求答案有序不重复!!!
					if(stuAns.equals(ans)){
						sum+=score;
					}else if(ans.contains(stuAns)){
						sum+=score/2;
					}else{
						sum+=0;
					}
				}
				pw.println(sName+"="+sum);
			}
			pw.close();
		}
}

回复 使用道具 举报
package judgescore;

import java.io.IOException;
import java.util.Random;

public class Student {
        private String name;

        Student(String name) {
                this.name = name;
        }

        @Override
        public String toString() {
                return "Student [name=" + name + "]";
        }

        Answer ans = new Answer();

        void answer2question(int m, String path) {
                Random random = new Random();
                for (int i = 0; i < m; i++)
                        ans.writeAnswer(i, new Integer(random.nextInt(5) + 97).toString());
                // 创建学生名的文件
                try {
                        ans.writeOut(path + "\\" + name+".txt");
                } catch (IOException e) {
                        // TODO 自动生成的 catch 块
                        e.printStackTrace();
                }
        }
}

package judgescore;

import java.io.FileWriter;
import java.io.IOException;
import java.util.HashMap;

public class Answer {
        HashMap<Integer, String> hm = new HashMap<Integer, String>();

        void writeAnswer(int i, String answer) {
                hm.put(i, answer);
        }

        void writeOut(String path) throws IOException {
                FileWriter fw = new FileWriter(path);
                String s = hm.toString();
                fw.write(s.substring(1, s.length() - 1).replace(",", "\r\n"));
                fw.close();
        }

}

package judgescore;

import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Properties;
import java.util.Random;

public class RightAnswer extends Answer {
        ArrayList<String> list = new ArrayList<String>();
        void writeOut(String path, int m) throws IOException {
                Properties pro = new Properties();
                for (int i = 0; i < m; i++)
                        pro.setProperty(new Integer(i).toString(), list.get(i));
                FileWriter fw = new FileWriter(path + "\\" + "answer.properties");
                pro.store(fw, "---");
                fw.close();
        }

        void setAnswer(int m,String path) {
                Random random = new Random();
                for (int i = 0; i < m; i++)
                        list.add(i, new Integer(random.nextInt(5) + 97).toString());
                try {
                        writeOut(path,m);
                } catch (IOException e) {
                        // TODO 自动生成的 catch 块
                        e.printStackTrace();
                }
        }

}

package judgescore;

import java.io.FileWriter;
import java.io.IOException;
import java.util.Properties;
import java.util.Random;

public class ScoreOne extends RightAnswer{
       
        void setScore(String path, int m) throws IOException {
                Properties pro = new Properties();
                for (int i = 0; i < m; i++)
                        pro.setProperty(new Integer(i).toString(), new Integer(new Random().nextInt(30)).toString());
                FileWriter fw = new FileWriter(path + "\\" + "score.properties");
                pro.store(fw, "---");
                fw.close();
        }
       

}

package judgescore;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Properties;
import java.util.TreeMap;

public class Count {
        static String path = "E:\\test";
        static int m = 100;

        public static void main(String[] args) {
                // TODO 自动生成的方法存根
                new Student("张飞").answer2question(m, path);
                new Student("关羽").answer2question(m, path);
                new Student("刘备").answer2question(m, path);
                new Student("孙权").answer2question(m, path);
                new Student("曹操").answer2question(m, path);
                new Student("诸葛亮").answer2question(m, path);
                new Student("袁绍").answer2question(m, path);
                new Student("吕布").answer2question(m, path);
                new RightAnswer().setAnswer(m, path);
                // 把每道题的分数奥文件中
                try {
                        new ScoreOne().setScore(path, m);
                } catch (IOException e) {
                        // TODO 自动生成的 catch 块
                        e.printStackTrace();
                }
                // 读取每个人的文件,然后一一与正确答案比较,并统计出正确数量,按照名字——分数统计出来写出文件
                TreeMap<String, Integer> map = new TreeMap<String, Integer>();
                try {
                        gaizuoye(map);
                        BufferedWriter bw = new BufferedWriter(new FileWriter(new File(path + "\\" + "score.txt")));
                        bw.write(map.toString());
                        bw.close();
                } catch (NumberFormatException e) {
                        // TODO 自动生成的 catch 块
                        e.printStackTrace();
                } catch (IOException e) {
                        // TODO 自动生成的 catch 块
                        e.printStackTrace();
                }

        }

        private static void gaizuoye(TreeMap map) throws NumberFormatException, IOException {
                // 获取正确答案和分数
                Properties pro1 = new Properties();
                BufferedReader answer = new BufferedReader(new FileReader(path + "\\" + "answer.properties"));
                pro1.load(answer);
                BufferedReader score = new BufferedReader(new FileReader(path + "\\" + "score.properties"));
                Properties pro2 = new Properties();
                pro2.load(score);
                // 遍历学生成绩文件
                File file = new File(path);
                File[] files = file.listFiles();
                for (int i = 0; i < files.length; i++)
                        if (!files[i].getName().contains(".properties")&&!files[i].getName().contains("score.txt")) {
                                BufferedReader br = new BufferedReader(new FileReader(files[i]));
                                String s = null;
                                int j = 0;
                                int sum = 0;
                                while ((s = br.readLine()) != null) {
                                        if (s.substring(s.lastIndexOf("=") + 1)
                                                        .equals(pro1.getProperty(new Integer(j).toString()).toString())) {
                                                sum += Integer.parseInt(pro2.getProperty(new Integer(j).toString()));
                                                System.out.println(s.substring(s.lastIndexOf("=") + 1) + "=="
                                                                + pro1.getProperty(new Integer(j).toString()));
                                                j++;
                                        }
                                        map.put(files[i].getName().substring(0, files[i].getName().lastIndexOf(".")), sum);
                                }
                                System.out.println();
                                br.close();
                        }

        }

}
写的比较散,貌似有点长了。
回复 使用道具 举报
哦,想起来了,getLineNumber() 可以获取行号也就是题目总数,但是你要加入判断是否空行,还要求每题答案在一行上.
你目前手动输入总题数也还好,以后再想全自动化吧
回复 使用道具 举报
有意思,可以自己尝试做做
回复 使用道具 举报
yu244934256 发表于 2016-10-4 00:39
有意思,可以自己尝试做做

嗯嗯,挺有意思的
回复 使用道具 举报
水月灬清影 发表于 2016-10-4 00:06
各部分代码功能见注释。
[mw_shl_code=java,true]package exercise;
import java.io.File;

非常感谢,已学习!{:2_32:}
回复 使用道具 举报
13902480061 发表于 2016-10-4 00:28
package judgescore;

import java.io.IOException;

非常感谢!能做出来就比较厉害了,我还是抱大腿中{:2_36:}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马