• 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

Object Storage Arubacloud
0 głosów
523 wizyt
pytanie zadane 5 maja 2018 w Java przez Piotr Brodziak Początkujący (390 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,200 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 (390 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,200 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 Szeryf (79,280 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 (390 p.)
Bardzo dziękuję za pomoc. Bardzo mi to pomoże ! :)

Podobne pytania

0 głosów
2 odpowiedzi 429 wizyt
pytanie zadane 29 sierpnia 2019 w Java przez manager96 Bywalec (2,050 p.)
0 głosów
1 odpowiedź 831 wizyt
pytanie zadane 16 października 2017 w Java przez zygmunt Początkujący (310 p.)
0 głosów
2 odpowiedzi 127 wizyt
pytanie zadane 21 lipca 2017 w Java przez LukasHardwares Początkujący (490 p.)

92,551 zapytań

141,393 odpowiedzi

319,523 komentarzy

61,936 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...