• 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 (68,640 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ź 223 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ź 457 wizyt
pytanie zadane 16 września 2017 w Java przez Luryxyt Użytkownik (870 p.)
Porady nie od parady
Komentarze do pytań nie służą do odpowiadania, od tego jest wydzielona sekcja odpowiedzi. Funkcją komentarzy jest natomiast możliwość uzyskania dodatkowych informacji na temat samego posta.Komentarze

64,181 zapytań

110,580 odpowiedzi

231,742 komentarzy

46,956 pasjonatów

Przeglądających: 262
Pasjonatów: 13 Gości: 249

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.

...