• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Problem z naliczaniem licznika w wewnętrznej metodzie JAVA

0 głosów
67 wizyt
pytanie zadane 5 maja 2018 w Java przez Piotr Brodziak Początkujący (350 p.)

Witam. Mam problem: Robię mały program, coś jakby "fiszki". Napisałem dwie metody testStudent i checkWords. Metoda checkWords działa wewnątrz metody testStudent. W tej klasie są też liczniki numberOfTries i goodAnswers. Licznik mówiący o tym ile razy użytkownik odpowiedział dobrze(czyli ten w wewnętrznej metodzie nie nalicza się i cały czas jest zero) Dlaczego? Co mam zrobić, żeby się naliczał. Wiem, że kod nie jest łatwy do odczytu, ale jestem początkujący proszę też o wskazówki co innego mogę poprawić żeby kod był bardziej przejrzysty. Z góry dziękuję za pomoc!

PS czy pisanie takiej metody wewnętrznej jest prawidłowe? zalecane? czy powinienem rozbić to na więcej klas? jeżeli tak to jakich np?

import java.util.Random;
import java.util.Scanner;

public class Word
{
    private String wPol;
    private String wEng;
    private int goodAnswers=0;
    private int numberOfTries=0;
    boolean good = false;
    public Word ()
    {

    }
    public Word(String wPol, String wEng)
    {
        this.wPol = wPol;
        this.wEng = wEng;
    }

    public String getwPol() {
        return wPol;
    }

    public String getwEng() {
        return wEng;
    }

    public void setwPol(String wPol)
    {
        this.wPol = wPol;
    }

    public void setwEng(String wEng)
    {
        this.wEng = wEng;
    }
    private int randomIndex(Word[] words)
    {
        Random random = new Random();
        int i = random.nextInt(words.length);
        return i;
    }
    public void testStudent(Word [] words)
    {

        System.out.println("Czy chcesz zaczac nauke?");
        String command;
        String[] lastWords = new String[3];
        for (String element: lastWords)
        {
            element = "";
        }
        int counter = 0;
        Scanner input = new Scanner(System.in);
        command = input.nextLine();

        if (command.equals("tak"))
        {
            while (!command.equals("nie"))
            {
                int index = randomIndex(words);
                boolean isOccour = false;
                for(int i = 0; i < lastWords.length; i++){
                if(words[index].getwPol().equals(lastWords[i])){
                    isOccour = true;
                }
            }
                if (isOccour == false)
                {
                    words[index].checkWord();

                    lastWords[counter] = words[index].getwPol();
                    if (good == true)
                    {

                    }
                    counter++;
                        if (counter == 3)
                            {
                                counter=0;
                            }
                }
                if(isOccour==false)
                {
                    System.out.println("Kontynuowac?");
                    command = input.nextLine();
                }
                numberOfTries++;
            }
            System.out.println("Numbers of tries: "+numberOfTries);
            System.out.println("Numbers of good answers: "+goodAnswers);
        }
        input.close();
    }
    public  void checkWord()
    {
        System.out.println(wPol);
        System.out.println("Podaj słowo: ");
        String answer;
        Scanner input = new Scanner(System.in); 
        answer = input.nextLine();

        if(answer.equals(wEng))
        {
            System.out.println("Good answer!");
            goodAnswers++;
        }
        else
        {
            System.out.println("bad answer!");
            System.out.println("good answer is: "+wEng);

        }

    }
    @Override
    public String toString()
    {
        return "Implementation.Word{" +
                "wPol='" + wPol + '\'' +
                ", wEng='" + wEng + '\'' +
                '}';
    }
}

 

2 odpowiedzi

0 głosów
odpowiedź 6 maja 2018 przez adas94 Nałogowiec (29,160 p.)
wybrane 6 maja 2018 przez Piotr Brodziak
 
Najlepsza

Metoda checkWords działa wewnątrz metody testStudent

No właśnie w tym rzecz, że nie działa. Nie widzę w testStudent() nigdzie wywołania metody checkWord();

komentarz 6 maja 2018 przez Piotr Brodziak Początkujący (350 p.)

71 linia kodu. Metoda CheckWord() działa sprawdza słowa, ale nie działa licznik goodAnswers.

public class TesterWord
{
    public static void main(String [] args)
    {

         Word[] words = new Word[5];
        words[0] = new Word("Polska","Poland");
        words[1] = new Word("koniec","finish");
        words[2] = new Word("niebieski","blue");
        words[3] = new Word("wiosna","spring");
        words[4] = new Word("pies","dog");
        words[5] = new Word("piłka","ball");
        
        Word word = new Word();
        word.testStudent(words);
        
    }
}

to moja klasa testująca. Wszystko działa, ale licznik się nie nalicza

komentarz 6 maja 2018 przez adas94 Nałogowiec (29,160 p.)
edycja 6 maja 2018 przez adas94
Problem polega na tym, że niemiłosiernie mieszasz ze sobą klasy. Klasa Word ma być zarówno pojedynczą kombinacją słów polskie-angielskie jak i pełnić funkcję odpowiadającą za logikę całej aplikacji.

Dokładnie w twoim kodzie dzieje się to.

words[0] - obiekt typu Word (1)

Word word = new Word() - obiekt typu Word (2)

W (2) wywołujesz metodę testStudent(), która przy checkWord()(nie wywołujesz checkWord (2) tylko (1)) sprawdza czy (1) się zgadza. Jeśli tak to przypisuje do obiektu (1) +1 w goodAnswers. A potem sprawdzasz ile (2) ma goodAnswers (Zawsze będzie 0, bo inkrementujesz wynik nie tego obiektu).

Twoje +1 znajduje się w words[0].goodAnswers i później w każdym kolejnym obiekcie, który spełnia warunki.
0 głosów
odpowiedź 6 maja 2018 przez mbabane Maniak (69,900 p.)

Nie działa dlatego, żę wywołujesz to na rzecz innego obiektu. Chodzi o to, że robiąc coś takiego:

words[index].checkWord();

Ty wywołujesz dla każdego słowa osobny licznik.

Trzeba zrobić np. tak: globalny obiekt, który będzie przechowywał bazę słów i licznik poprawnych odpowiedzi. Dla uproszczenia, możesz od razu w tej klasie zrobić obsługę użytkownika:

public class Tester
{
    private Word[] words;

    private int goodAnswers = 0;
    
    public Tester(Word[] words)
    {
        this.words = words;
    }
     
    public void startTest()
    {
        /*mniej więcej to co w metodzie testStudent
            tylko slowa bierzesz ze zmiennej klasowej words
         */
    }
    
    private void checkWord()
    {
        /*
            sprawdzanie odpowiedzi i naliczanie goodAnswers
         */
    }
}

Klasa Word niech zawiera tylko same dane:

public class Word
{
    private String pol;
    private String eng;

    public Word(String pol, String eng)
    {
        this.pol = pol;
        this.eng = eng;
    }

    public String getPol()
    {
        return pol;
    }

    public String getEng()
    {
        return eng;
    }
}

Przykładowe użycie:

public class TesterWord
{
    public static void main(String [] args)
    {

        Word[] words = new Word[3];
        words[0] = new Word("pies", "dog");
        words[1] = new Word("kot", "cat");
        words[2] = new Word("koniec", "finish");

        Tester tester = new Tester(words);

        tester.startTest();
    }
}

 

komentarz 6 maja 2018 przez Piotr Brodziak Początkujący (350 p.)
Bardzo dziękuję za pomoc. Bardzo mi to pomoże ! :)

Podobne pytania

0 głosów
1 odpowiedź 224 wizyt
pytanie zadane 16 października 2017 w Java przez zygmunt Początkujący (310 p.)
0 głosów
2 odpowiedzi 67 wizyt
pytanie zadane 21 lipca 2017 w Java przez LukasHardwares Początkujący (490 p.)
0 głosów
1 odpowiedź 484 wizyt
pytanie zadane 16 września 2017 w Java przez Luryxyt Użytkownik (870 p.)
Porady nie od parady
Odznacz odpowiedź zieloną fajką, jeśli uważasz, że jest ona najlepsza ze wszystkich i umożliwiła ci rozwiązanie problemu.Najlepsza odpowiedź

64,798 zapytań

111,258 odpowiedzi

233,984 komentarzy

46,695 pasjonatów

Przeglądających: 261
Pasjonatów: 14 Gości: 247

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...