Pytania i odpowiedzi zawarte w List<Objects>

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);
		}
		
	}

}
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.

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.

3
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).

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