سؤال

أحاول قراءة ملف نصي في Java ، في الأساس مجموعة من الأسئلة. مع أربعة خيارات وإجابة واحدة. الهيكل يشبه هذا:

سؤال

الخيار أ

الخيار ب

الخيار ج

الخيار د

إجابه

ليس لدي مشكلة في قراءتها بهذه الطريقة:

public class rar{
public static String[] q=new String[50];
public static String[] a=new String[50];
public static String[] b=new String[50];
public static String[] c=new String[50];
public static String[] d=new String[50];
public static char[] ans=new char[50];
public static Scanner sr= new Scanner(System.in);


public static void main(String args[]){
int score=0;
try {
             FileReader fr;
      fr = new FileReader (new File("F:\\questions.txt"));
      BufferedReader br = new BufferedReader (fr);
int ar=0;
      for(ar=0;ar<2;ar++){
      q[ar]=br.readLine();
      a[ar]=br.readLine();
      b[ar]=br.readLine();
      c[ar]=br.readLine();
      d[ar]=br.readLine();
    String tempo=br.readLine();
    ans[ar]=tempo.charAt(0);






        System.out.println(q[ar]);
        System.out.println(a[ar]);
        System.out.println(b[ar]);
        System.out.println(c[ar]);
        System.out.println(d[ar]);
        System.out.println("Answer: ");
        String strans=sr.nextLine();
char y=strans.charAt(0);
if(y==ans[ar]){
    System.out.println("check!");
score++;
System.out.println("Score:" + score);
}else{
System.out.println("Wrong!");
}

      }
      br.close();
    } catch (Exception e) { e.printStackTrace();}


}




}

الكود أعلاه يمكن التنبؤ به. للحلقة فقط الزيادات. ويعرض الأسئلة بناءً على الطلب.

ما أريد القيام به هو أن أكون قادرًا على تحديد عشوائي من خلال الملف النصي ، ولكن لا يزال الحفاظ على نفس الهيكل. (س ، أ ، ب ، ج ، د ، الجواب). لكن عندما أحاول القيام بذلك:

int ran= random(1,25);
   System.out.println(q[ran]);
        System.out.println(a[ran]);
        System.out.println(b[ran]);
        System.out.println(c[ran]);
        System.out.println(d[ran]);
        System.out.println("Answer: ");
        String strans=sr.nextLine();
char y=strans.charAt(0);
if(y==ans[ran]){
    System.out.println("check!");
score++;
System.out.println("Score:" + score);
}else{
System.out.println("Wrong!");
}

وهذه هي الطريقة التي أستخدمها للتعبير العشوائي:

public static int random(int min, int max){
    int xx;
    xx= (int) ( Math.random() * (max-min + 1))+ min;
    return xx;
    }

هناك احتمال أن أحصل على فارغ. ما الذي يمكن أن توصي به أن أفعل حتى لا أحصل على أي خالية عند محاولة وضع عشوائي للأسئلة؟

هل يمكنك رؤية أي شيء آخر خاطئ في برنامجي؟

هل كانت مفيدة؟

المحلول

يمكنك استخدام كل أنواع الأرقام السحرية, ، الأرقام في الكود الخاص بك لا معنى لها.

public static String[] q=new String[50]; //why make an array to hold 50 questions?

//... 

for(ar=0;ar<2;ar++){ //why read 2 questions?

//...

int ran= random(1,25); //why take one of 25 questions?
System.out.println(q[ran]);

يجب أن يكون كل هذا هو نفس الرقم ، أليس كذلك؟ إذا كان لدينا 25 سؤالًا ، فيجب أن يكون لدينا مساحة لمدة 25 ، وقراءة 25 واستخدام 25.

كيف يمكن اصلاح هذا:

1 اجعل ثابتًا

public final static int NUMBER_OF_QUESTIONS = 25;

ثم استخدم ذلك عند صنع المصفوفة ، وقراءة الأسئلة وعند أخذ واحدة عشوائية:

public static String[] q=new String[NUMBER_OF_QUESTIONS];

for(ar=0;ar<NUMBER_OF_QUESTIONS;ar++){

int ran= random(1,NUMBER_OF_QUESTIONS);

2 استخدم Q.Length

public static String[] q=new String[NUMBER_OF_QUESTIONS];

for(ar=0;ar<q.length;ar++){

int ran= random(1,q.length);

3 استخدم قائمة / مجموعة

public static List<String> q=new List<String>();

for(ar=0;ar<q.size();ar++){

int ran= random(1,q.size());

سيكون الخيار 3 هو الخيار الأفضل ، وهذا هو Java Afterall. انظر إجابة مايك لمزيد من التفاصيل في جعل هذا جافا أكثر.

نصائح أخرى

أعتقد أن القليل من التغييرات الهيكلية سوف تساعد كثيرًا وتسهيل هذا الأمر بالنسبة لك. تحديد فصول جديدة: Question و Answer. يترك Question لديك الخيارات و Answer داخلها. هذا هو تكوين الكائن.

انظر إلى جمع API. مع مجموعة من الأسئلة ، يمكنك استخدام طريقة خلط ورق اللعب لإضفاء الطابع عشوائي عليها في سطر واحد. دع جافا تقوم بالعمل من أجلك.

لذلك قد يكون لديك:

Collection<Question> questions = new ArrayList<Question>();

questions.add(...);
questions.add(...);
questions.add(...);

questions.shuffle();

لتزيين المزيد حول سبب رغبتك في القيام بذلك لماذا ... تريد فصل مخاوف أفضل ما تستطيع. الأسئلة والإجابات والخيارات كلها مخاوف مختلفة. استجابة المستخدم هي مصدر قلق. العشوائية للأسئلة هي مصدر قلق. الاستجابة لاستجابة المستخدم هي مصدر قلق.

كونك مطور برامج جيد ، فأنت تريد تقسيم كل هذه الأشياء. بنية جافا لإنجاز هذا هو الفصل. يمكنك تطوير أفكارك بشكل مستقل نسبيًا داخل فصلهم. عندما تكون راضيًا عن فصولك ، كل ما عليك فعله هو توصيلها. تحديدهم واجهات, كيف يتحدثون مع بعضهم البعض. أحب تحديد الواجهات أولاً ، لكن عندما بدأت ، وجدت أنه من الأسهل قليلاً القلق بشأن ذلك لاحقًا.

قد يبدو الكثير من العمل ، مع كل هذه الفصول والواجهات وما لا. سوف يستغرق الأمر جزءًا صغيرًا من الوقت للقيام بذلك بهذه الطريقة عندما تحصل على الخير. ومكافأتك هي قابلية إعادة الاستخدام.

لقد اقترح أشخاص آخرون (مايك ، إريك) بالفعل طرقًا أفضل لهذه المشكلة من خلال إنشاء جديد Question الفصل ، إضافة أسئلة إلى مجموعة ، واستخدام shuffle طريقة لإضفاء الطابع عشوائي عليهم.

بخصوص سبب "الحصول على خالية" في التعليمات البرمجية الخاصة بك: بقدر ما أستطيع أن أرى في رمز المثال الخاص بك ، فأنت تقرأ فقط سؤالين من الملف:

for (ar=0;ar<2;ar++) {
    [...]
}

هذا يعني أن المواضع 0 و 1 في المصفوفات الخاصة بك سيكون لها بيانات صالحة ، في حين أن المواضع من 2 إلى 49 ستحتوي null.

في وقت لاحق عندما تحاول عشوائي أسئلة تسميك random طريقة مثل هذه:

int ran = random(1,25);

هذا يعيد قيمة بين 1 و 25 ، والتي تستخدمها بعد ذلك كفهرس صفيف.

إذا كان هذا الفهرس "1" ستكون على ما يرام. لجميع الحالات الأخرى (من 2 إلى 25) ستصل إلى null القيم في المصفوفات الخاصة بك ، والحصول على استثناءات عند محاولة اللعب بهذه القيم.

قم بإنشاء فئة لعقد سؤال وقراءة الملف في مجموعة من هذه الكائنات.

اقسم المشكلة إلى ثلاث خطوات. الخطوة الأولى هي القراءة في ملف البيانات وتخزين جميع البيانات في الكائنات. والخطوة الثانية هي وضع عشوائي ترتيب تلك الكائنات. الخطوة الأخيرة هي طباعتها.

ArrayList questions = new ArrayList();
for(ar=0;ar<2;ar++){
  q=br.readLine();
  a=br.readLine();
  b=br.readLine();
  c=br.readLine();
  d=br.readLine();
  String tempo=br.readLine();
  ans=tempo.charAt(0);

  questions.add(new Question(q, a, b, c, d, ans));
}

قم بعشوائية الصفيف مثل هذا:

Collections.shuffle(questions);

ثم مجرد حلقة من خلال الأسئلة وإخراجها.

for (Question q: questions) {
  q.write();
  System.out.println(); // space between questions
}

قم بإنشاء فئة أسئلة مثل هذا للاحتفاظ ببياناتك:

public class Question {
  private String question;
  private String option1;
  private String option2;
  private String option3;
  private String option4;
  private String answer;

  public Question(String question, String option1, String option2, String option3,
                  String option4, String answer) {
    this.question = question;
    this.option1 = option1;
    this.option2 = option2;
    this.option3 = option3;
    this.option4 = option4;
    this.answer = answer;
  }

  public void write() {
    System.out.println(this.question);
    System.out.println(this.option1);
    System.out.println(this.option2);
    System.out.println(this.option3);
    System.out.println(this.option4);
    System.out.println("Answer: "+this.answer);
  }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top