簡易實現藍橋評測系統

因爲參加藍橋杯,這參賽費本身就不便宜。我還去買你們的vip麼?
但是在練習中有的題目只有vip才能看,才能送到系統評測。
我費了很大的勁研究了一套自己寫的評測系統。Like this:
這裏寫圖片描述

首先,下載所有藍橋評測系統的源碼。
鏈接: https://pan.baidu.com/s/1bpnCQoZ 密碼: xext

關於vip題目,相信你們都可以找到的。
http://blog.csdn.net/rodestillfaraway/article/details/50529597 可以去這裏,我會在自己博客寫下java實現方法。我的速度比較慢,畢竟新手,邊摸索邊寫。

說一下原理:
1.官方原碼命名都是有規律的xx-input-01.txt這樣的。對應路徑自己改下
2.我首先爲了編程思路方便,替換了System的out流,使用的是套在PrintStream裏的ByteArrayOutputStream。會將你程序運行的輸出存在一個字節數組裏面。然後從官方原碼的output文件裏讀取並存入一個字符數組裏,兩者進行比較。
說一下功能:
1.可以比較輸出與原碼是否一致
2.會把錯誤的題目的正確輸出和你的輸出同時顯示在控制檯
3.可以使用printInput(int n)在控制檯顯示原碼的input文件
4.可以給run傳參來只檢測對應的原碼
說一下怎麼使用:
1.我寫的是抽象類,使用時直接創建LT類的對象,構造時傳入你當前要檢測的題目名字
2.使用內部類補足fun方法,fun裏面寫入自己的代碼。還有一個很重要的一點,我的LT類有一個成員的Scanner對象sc,用來從源碼的input文件讀取內容。所以你的方法裏不需要再新建Scanner對象了。直接使用sc調用read方法就好。3.最後要運行LT的run方法。

接下來,放代碼:

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintStream;
import java.util.Scanner;

public abstract class LT {
    Scanner sc;
    String ti;

    public LT(String st) {
        ti = st;
    }

    public void run() {
        for (int i = 1; i <= 30; i++) {
            test(i);
        }
    }

    public void run(int n) {
        test(n);
    }

    public void printIn(int i) {
        try {
            sc = new Scanner(new File("d:/java/算法/測試數據/" + ti + "-input-" + i + ".txt"));
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            System.out.println("不存在此輸入文件");
        }
        while (sc.hasNextLine()) {
            System.out.println(sc.nextLine());
        }
    }

    public abstract void fun();

    public void test(int i) {

        // 設置流
        ByteArrayOutputStream bos2 = new ByteArrayOutputStream();
        PrintStream ps = new PrintStream(bos2);
        PrintStream old = System.out;
        System.setOut(ps);
        FileInputStream fis;
        // 讀入
        try {
            sc = new Scanner(new File("d:/java/算法/測試數據/" + ti + "-input-" + i + ".txt"));

        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            // 若沒有輸入文件可以繼續執行

        } finally {
            try {

                fis = new FileInputStream("d:/java/算法/測試數據/" + ti + "-output-" + i + ".txt");
                // 調用函數

                fun();

                // 讀取,檢測

                ByteArrayOutputStream bos = new ByteArrayOutputStream();
                byte[] buffer = new byte[1024];
                int length = -1;
                while ((length = fis.read(buffer)) != -1) {
                    bos.write(buffer, 0, length);
                }
                bos.close();
                fis.close();
                System.setOut(old);
                String a = bos.toString().replaceAll("\\s", "").replaceAll(" ", "");
                String b = bos2.toString().replaceAll("\\s", "").replaceAll(" ", "");
                System.out.print(i + ":" + a.equalsIgnoreCase(b));


                if (!a.equalsIgnoreCase(b)) {
                    System.out.println("您的輸出:" + bos2.toString());
                    System.out.println("標準輸出:" + bos.toString());
                }
            } catch (FileNotFoundException e2) {
                System.exit(0);
            }catch(IOException e3){
                System.exit(0);
            }
        }

    }

}

使用用例

public class Main11 {

    public static void main(String[] args) {
        LT lt=new LT("字符串對比") {
            @Override
            public void fun() {
                String s1=sc.nextLine();
                String s2=sc.nextLine();
                if(s1.length()!=s2.length()){
                    System.out.println(1);
                }else{
                    if(s1.equals(s2)){
                        System.out.println(2);
                    }else if(s1.equalsIgnoreCase(s2)){
                        System.out.println(3);
                    }else{
                        System.out.println(4);
                    }
                }
            }
        };
        lt.run();
    }

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章