2012-03-09 2 views
0

현재 사용자가 GUI에서 사용자 정의 값을 입력 할 수있는 프로젝트를 진행 중입니다. 그런 다음 해당 값이 .class 파일로 변환되어 런타임시 프로그램이 시작될 때 읽을 수 있습니다. .txt 파일을 작성하는 것이 훨씬 쉽다는 것을 알지만, 그렇게하고 싶지는 않습니다. 새로운 .class 파일은 "Problem"이라는 추상 클래스에서 확장 될 것입니다. 누군가 앞서 언급 한 파일을 작성하기 위해 올바른 방향으로 나를 가리킬 수 있습니까? 도우미 들께 미리 감사드립니다! 그건 그렇고, 그 .java 파일을 만들어야 만 어떻게 든 컴파일 할 수 있습니다. 해결책이 될 수도 있습니다. 하지만 여전히, 내가하는 방법을 모르는 :/.class 파일 쓰기?

더 코드 :

package resources; 

import java.awt.Image; 
import java.io.File; 
import java.io.Serializable; 

public abstract class Problem implements Comparable<Problem>, Serializable{ 

    private static final long serialVersionUID = 42L; 
    private File locatedAt; 
    public static final int EASY = 0; 
    public static final int MEDIUM = 1; 
    public static final int HARD = 2; 

    public abstract String getTitle(); 
    public abstract String getQuestion(); 
    public abstract Image getQuestionImage(); 
    public abstract int getDifficulty(); 
    public abstract Topic getTopic(); 
    public abstract String getAuthor(); 
    public abstract boolean isCorrect(String answer); 

    public final int compareTo(Problem p){ 
     return this.getTitle().compareTo(p.getTitle()); 
    } 

    public final String toString(){ 
     return getTitle(); 
    } 

    public final void setLocatedAt(File file){ 
     locatedAt = file; 
    } 
} 


package resources; 

import java.util.StringTokenizer; 

public abstract class NumericProblem extends Problem{ 

    /** 
    * You must specify the number of significant digits the answer should contain. 
    * If you don't want to check for significant digits, simply return 0 
    * 
    * @return the number of significant digits the answer should have 
    * 
    * @since V 1.0 
    */ 
    public abstract boolean checkSigfigs(); 

    /** 
    * You must specify the amount of error from the answer the user can be within 
    * to remain correct. Your number should be represented as X% and not the decimal 
    * format. 
    * 
    * @return the amount of error the submitted answer can deviate from the specified answer 
    * 
    * @since V 1.0 
    */ 
    public abstract double getErrorPercentage(); 

    /** 
    * You must specify the type of units the problem should contain. 
    * If the answer doesn't have any units return "". Also if the units shouldn't 
    * be checked, return null. 
    * 
    * @return the unit type the answer should contain 
    * 
    * @since V 1.0 
    */ 
    public abstract String getUnits(); 

    /** 
    * You must specify the answer for the problem being asked. The number is 
    * represented as a String because of significant digits. 
    * 
    * @return the answer for the given problem 
    * 
    * @since V 1.0 
    */ 
    public abstract String getAnswer(); 


    public final boolean isCorrect(String userAnswer){ 

     String answer = getAnswer().trim(); 

     userAnswer = userAnswer.trim(); 

     StringTokenizer tokener = new StringTokenizer(userAnswer, " "); 
     if(tokener.countTokens() != 2){ 
      System.err.println("Failed at formatting"); 
      return false; 
     } 

     userAnswer = tokener.nextToken(); 
     String userUnits = tokener.nextToken(); 

     System.out.println(sigfigsIn(answer)); 
     System.out.println(sigfigsIn(userAnswer)); 

     // Checks sigificant digits 
     if(checkSigfigs()){ 
      if(!(sigfigsIn(userAnswer) == sigfigsIn(answer))){ 
       System.err.println("Failed at sig figs"); 
       return false; 
      } 
     } 

     // Checks numeric 
     if(!checkNumeric(userAnswer, answer)){ 
      System.err.println("Failed at numeric"); 
      return false; 
     } 

     //Checks units 
     if(getUnits() != null){ 
      if(!userUnits.equals(getUnits())){ 
       System.err.println("Failed at units"); 
       return false; 
      } 
     } 

     System.out.println("Passed!"); 
     return true; 
    } 

    private int sigfigsIn(String aNumber){ 

     // Removes all unnecessary zeroes before answer 
     boolean done = false; 
     boolean periodHappened = false; 

     while(!done) 
     { 
      if(aNumber.charAt(0) == '0'){ 
       aNumber = aNumber.replaceFirst("0", ""); 
      }else if (aNumber.charAt(0) == '.'){ 
       aNumber = aNumber.replaceFirst(".", ""); 
       periodHappened = true; 
      }else{ 
       done = true; 
      } 
     } 

     // If it's a number like 300 with only one sig fig, do dis 
     if(!periodHappened){ 
      if(!aNumber.contains(".")){ 
       done = false; 
       while(!done){ 
        if(aNumber.charAt(aNumber.length() - 1) == '0'){ 
         aNumber = aNumber.substring(0, aNumber.length() - 1); 
        }else{ 
         done = true; 
        } 
       } 
      } 
     } 

     return aNumber.replaceAll("\\.", "").length(); 

    } 

    private boolean checkNumeric(String Answer, String UserAnswer){ 

     double answer = Double.parseDouble(Answer); 
     double userAnswer = Double.parseDouble(UserAnswer); 
     double ep = getErrorPercentage()/100; 

     if((answer * (1+ep) >= userAnswer) && (userAnswer >= answer * (1-ep))) 
      return true; 

     return false; 

    } 



package problems; 

import java.awt.Image; 
import resources.NumericProblem; 
import resources.Problem; 
import resources.Topic; 
import resources.Formula; 

public class ANumericProblem extends NumericProblem{ 

    private final Formula formula; 

    public ANumericProblem(){ 
     formula = Formula.createRandomFormula(); 
    } 

    @Override 
    public boolean checkSigfigs() { 
     return true; 
    } 

    @Override 
    public double getErrorPercentage() { 
     return 200; 
    } 

    @Override 
    public String getUnits() { 
     return "mols"; 
    } 

    @Override 
    public String getAnswer() { 
     return Formula.getMols(); 
    } 

    @Override 
    public String getTitle() { 
     return "Formula"; 
    } 

    @Override 
    public String getQuestion() { 
     return "How many moles are in 4.9g of " + formula.getFormula(); 
    } 

    @Override 
    public Image getQuestionImage() { 
     return null; 
    } 

    @Override 
    public int getDifficulty() { 
     return Problem.EASY; 
    } 

    @Override 
    public Topic getTopic() { 
     return new Topic("Grams to Moles"); 
    } 

    @Override 
    public String getAuthor() { 
     return "Shawn"; 
    } 

} 


    } 
+0

왜이 디자인을 사용하려고합니까? 창조적 인 것처럼 보이지만, 나에게 조금 이상하고 아마도이 문제를 해결하는 최선의 방법은 아닐 것입니다. –

+2

설정 파일을'.class' 파일이 아닌 설정 파일로 사용하십시오. INI 형식은 좋지만 XML은보다 복잡한 설정에 적합합니다. – Blender

+0

XML을 강력히 권장합니다. JAXB를 사용하면 저장된 데이터에서 바로 수업을 만들 수 있습니다. –

답변

1

그것은 당신이 무엇을 요구 정말 아니지만, 당신이 무리와 함께 객체를 구축하려는처럼이 문제가 소리 나중에 값을 저장하십시오. 이 경우 object serialization에 관심이있을 것입니다. 기본적으로 개체를 바이트 스트림으로 저장 한 다음 나중에 개체를로드 할 수 있습니다.

+0

@HovercraftFullOfEels 정의 된 serialVersionUID로 시작하는 한 직렬화는 실제로는 다소 어렵습니다. 객체 직렬화 스펙의 Object Versioning 섹션을 참조하십시오. – EJP

+1

@EJP :'serialVersionUID'는 객체가 같은'serialVersionUID'를 가진 클래스 버전의 인스턴스로만 deserialize되도록 보장합니다. 이것은 개발자가 명시 적으로'serialVersionUID'를 갱신 할 것을 요구합니다. 이것은 클래스에 대한 모든 업데이트가'serialVersionUID'를 변경시키지 않아야하기 때문에 본질적으로 오류가 발생하기 쉽습니다. 그리고'serialVersionUID'가 바뀌면 오래된 객체를 새로운 클래스 버전으로 deserialize하는 직접적인 지원은 없습니다. XML을 사용하여 더 높은 수준에서 작업하므로 직렬화를 쉽게 사용자 정의 (de) 할 수 있습니다. 이상적으로는'serialVersionUID'를 완전히 사용하지 않는 것이 좋습니다. –