Pytania i odpowiedzi zawarte w List<Objects>

Odpowiedz Nowy wątek
2019-07-16 19:05
0

Mam pytanie odnośnie programu który napisałam w oparciu o Listy... Problem jest przy porównywaniu pobranej odpowiedzi od użytkownika z prawidłowymi odpowiedziami coś jest nie tak (przy porównywaniu dostaje dwa komunikaty tzn z if i else). Nie wiem gdzie popełniam błąd?

public void Start() {
        System.out.println("**********Quiz Przyrodniczy**********");
        System.out.println("Na ekranie bedą wyświetlać się pytania na które trzeba odpowiadać: a, b, c lub d.");
        System.out.println("Odpowiedz jest tylko jedna!");
        System.out.println("Do dzieła -->");
        System.out.println();
    }

    public List<Questions> DownloadQuestion(){
        List<Questions> q = new ArrayList<Questions>();
        q.add(new Questions("1. Ile lat żyje pawian gwinejski?"));
        q.add(new Questions("2. Rekin biały ma bardzo czuły węch. Potrafi wyczuć jedną kroplę krwi w ____ wody."));
        //q.add(new Questions(""));
        //for(int i = 0; i<q.size(); i++) {
        //
        //int i =0;
        //System.out.print(q.get(i).getQuestion());
        //}
        return q;   
    }

    public List<Answers> DownloadAnswer(){
        char newLine = '\n';
        List<Answers> answer = new ArrayList<Answers>();
        answer.add(new Answers("a 30-40", "b 50-60", "c 15-20", "d 10-15"));
        answer.add(new Answers("a 115 l", "b 50 l", "c 100 l", "d 200 l"));
        //for(int i=0; i<answer.size(); i++) {
        //int i = 0;
        //System.out.println(newLine + answer.get(i).getAnswer1() + newLine + answer.get(i).getAnswer2() + newLine + answer.get(i).getAnswer3() + newLine + answer.get(i).getAnswer4());
        //}
        return answer;
    }

    public List<RightAnswers> DownloadRightAnswer(){
        List<RightAnswers> answer = new ArrayList<RightAnswers>();
        answer.add(new RightAnswers("c", "15-20"));
        answer.add(new RightAnswers("a", "115 l"));
        return answer;
    }

    public String MyAnswer() {
        Scanner in = new Scanner(System.in);
        String r;
        r = in.nextLine();
        return r;
    }

    int score = 0;

    public int AddScore( String r, List<RightAnswers> p) {

        for(int i=0; i<p.size(); i++) {
        if(r.equals(p.get(i).getEquivalent())) {
            System.out.print("Odpowiedz jest prawidłowa! Brawo!");
            score++;
        }else
            System.out.println("Twoja odpowiedz nie jest dobra");
            System.out.println();
        }
        return score;
    }

    public void Score(int score) {
        char newLine = '\n';
        System.out.println(newLine + "Twoja liczba punktów: " + score);
    }

    public static void main(String[] args) {
        Quiz1 quiz = new Quiz1();
        quiz.Start();
        List<Questions> questions = quiz.DownloadQuestion();
        List<Answers> answer = quiz.DownloadAnswer();
        List<RightAnswers> rightAnswer = quiz.DownloadRightAnswer();
        String myAnswer;
        int score;

        for(int i=0; i<questions.size(); i++) {
            System.out.println(questions.get(i).getQuestion());
            System.out.println(answer.get(i).getAnswer1()+answer.get(i).getAnswer2()+answer.get(i).getAnswer3()+answer.get(i).getAnswer4());
            myAnswer = quiz.MyAnswer();
            score = quiz.AddScore(myAnswer, rightAnswer);
            quiz.Score(score);
        }

    }

}
edytowany 2x, ostatnio: panna, 2019-07-16 19:10

Pozostało 580 znaków

2019-07-16 19:28
0
panna napisał(a):
  public int AddScore( String r, List<RightAnswers> p) {

      for(int i=0; i<p.size(); i++) {
      if(r.equals(p.get(i).getEquivalent())) {
          System.out.print("Odpowiedz jest prawidłowa! Brawo!");
          score++;
      }else
          System.out.println("Twoja odpowiedz nie jest dobra");
          System.out.println();
      }
      return score;
  }

Coś tu się ewidentnie nie zgadza z klamerkami. Dlaczego po else nie ma otwierającej?

Czy to wystarczy do rozwiązania problemu, nie wiem.

niestety nie... - panna 2019-07-16 19:50

Pozostało 580 znaków

2019-07-16 20:17
1
for(int i=0; i<p.size(); i++) {
        if(r.equals(p.get(i).getEquivalent())) {
            System.out.print("Odpowiedz jest prawidłowa! Brawo!");
            score++;
        }else
            System.out.println("Twoja odpowiedz nie jest dobra");
            System.out.println();
        }

Iterujesz po wszystkich elementach tablicy. Jak ktoś da odpowiedź b to wypisze się dwa razy że odpowiedź nie jest dobra bo dla pierwszego pytania odpowiedz to c a dla drugiego a. Jeżeli użytkownik odpowie a to wypisze się że nie jest dobra a potem przy drugiej iteracji że jest dobra. Ten for jest w ogole nie potrzebny.

Pozostało 580 znaków

2019-07-17 09:32
public int AddScore( String r, List<RightAnswers> p) {
  // iterujesz po wszystkich elementach kolekcji "p" - czyli prawidłowych odpowiedziach, 
  // tj. dla każdego pytania weryfikujesz zgodność z podanej odpowiedzi w stosunku do wszystkich pytań
  // a powinnaś porównać odpowiedź z prawidłową odpowiedzią tylko dla tego konkretnego pytania
  for(int i=0; i<p.size(); i++) {
    if(r.equals(p.get(i).getEquivalent())) {
      System.out.print("Odpowiedz jest prawidłowa! Brawo!");
      score++;
    } else {
      System.out.println("Twoja odpowiedz nie jest dobra");
      System.out.println();
    }
  }
  return score;
}

Załóżmy, że masz 5 pytań. RightAnswers to kolejno {a, b, a, d, b}.
Dla kodu powyżej, użytkownik na pytanie nr 1 odpowiada b
Twoja aplikacja wówczas robi coś takiego:

Nr iteracji r p.get(i).getEquivalent() r.equals(p.get(i).getEquivalent()) else
1 b a false true (wypisz "Odpowiedź nieprawidłowa...")
2 b b true (wypisz "Odpowiedź prawidłowa...", score++) false
3 b a false true (wypisz "Odpowiedź nieprawidłowa...")
4 b d false true (wypisz "Odpowiedź nieprawidłowa...")
5 b b true (wypisz "Odpowiedź prawidłowa...", score++) false

Po takim sprawdzeniu odpowiedzi, już po pierwszym pytaniu, użytkownik zdobył 2 punkty i został zalany masą nieprawidłowych komunikatów.

Z Twojej listy prawidłowych odpowiedzi powinnaś pobierać tylko jedno prawidłowe pytanie do porównania z odpowiedzią.

    public static void main(String[] args) {
        Quiz1 quiz = new Quiz1();
        quiz.Start();
        List<Questions> questions = quiz.DownloadQuestion();
        List<Answers> answer = quiz.DownloadAnswer();
        List<RightAnswers> rightAnswer = quiz.DownloadRightAnswer();
        String myAnswer;
        int score;

        for(int i=0; i<questions.size(); i++) {
            System.out.println(questions.get(i).getQuestion());
            System.out.println(answer.get(i).getAnswer1()+answer.get(i).getAnswer2()+answer.get(i).getAnswer3()+answer.get(i).getAnswer4());
            myAnswer = quiz.MyAnswer();
            score = quiz.AddScore(myAnswer, rightAnswer); // o tu, powinno być porównanie tylko z wartością "rightAnswer.get(i)", bo to powinna być odpowiedź na pytanie nr "i"
            quiz.Score(score);
        }

    }

Btw. mógłbym pewnie udzielić Ci kilku podpowiedzi odnośnie stylu kodu. jakichś zasad OOP itp., ale podejrzewam, że dopiero zaczynasz programować i na ten moment, może to nie jest najistotniejsze.
Na ten moment, możesz zmienić nazwy metod, by zaczynały się od małej litery. W Javie przyjęło się, że piszemy camelCase, a czy widziałaś kiedyś wielbłąda, który zaczyna się od garbu? :)
A.. I jeszcze nazwy zmiennych mogłyby mówić nieco więcej / dokładniej o tym, do czego służą, np.:

  1. dla kolekcji prawidłowych zamiast rightAnswer -> rightAnswers (liczba mnoga, bo ta lista ma wiele odpowiedzi).
  2. w metodzie addScore(String r, List<RightAnswer> p) również wypadałoby zmienić na np. addScore(String userAnswer, List<RightAnswer> rightAnswers).
edytowany 7x, ostatnio: catom, 2019-07-17 23:58
Analogicznie: List<question> a nie List<questions>. - wyebani 2019-07-17 09:42
Tak, tak, to tylko przykłady - dlatego użyłem skrótu "np." :) . Tych uwag mogłoby być dużo więcej, tylko to teraz nie jest najistotniejsze, a odpowiednie nazywanie zmiennych może by jednak pomogło OPce z analizą problemu. - catom 2019-07-17 09:59

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0