Przepisanie do Java

0

Witam, postanowiłem przepisać prosty program (quiz) z C++ na Java, jednak natknąłem się na problem którego na moim niskim poziomie nie mogę zrozumieć:
Problem prawdopodobnie wynika z źle przepisanej iteracji po linijkach pliku tekstowego .

działający quiz c++:

#include <iostream>
#include <fstream>
#include <cstdlib>
#include <algorithm>
#include <string>

using namespace std;
string temat, nick;
string tresc[5];
string odpA[5], odpB[5], odpC[5], odpD[5];
string poprawna[5];
string odpowiedz;
int punkty=0;

int main()
{
    int nr_linii=1;
    string linia;
    fstream plik;
    int nr_pytania=0;

    plik.open("quiz.txt", ios::in);               // wczytanie pliku o nazwie ....
    if (plik.good()== false)                    //sprawdzanie czy plik istnieje by moc wczytac dane
    {
        cout<<"plik nie istnieje!";
        exit(0);                               //zamknięcie programu
    }

    while(getline(plik, linia)){                //funkcja getline pobiera cala linie tzn tekst ze spacjami z pliku

        switch (nr_linii) {
        case 1:
            temat= linia;
            break;
        case 2:
            nick = linia;
            break;
        case 3:
            tresc[nr_pytania]= linia;
            break;
        case 4:
            odpA[nr_pytania]= linia;
            break;
        case 5:
            odpB[nr_pytania]= linia;
            break;
        case 6:
            odpC[nr_pytania]= linia;
            break;
        case 7:
            odpD[nr_pytania]= linia;
            break;
        case 8:
            poprawna[nr_pytania]= linia;
            break;
        }

        if (nr_linii==8)
        {
            nr_linii=2;
            nr_pytania++;
        }
        nr_linii++;
    }

    plik.close();

    for (int i=0; i<=4; i++)
    {
        cout<<endl<<tresc[i]<<endl;
        cout<<"A. "<<odpA[i]<<endl;
        cout<<"B. "<<odpB[i]<<endl;
        cout<<"C. "<<odpC[i]<<endl;
        cout<<"D. "<<odpD[i]<<endl;

        cout<<"Twoja odpowiedz: ";
        cin>>odpowiedz;

        transform(odpowiedz.begin(), odpowiedz.end(), odpowiedz.begin(), ::tolower );   // zmiana duzych liter na male gdy ktos uzywa capslocka

        if (odpowiedz==poprawna[i])
        {
            cout<<"Dobrze zdobywasz punkt"<<endl;
            punkty++;
        } else cout<<"Zle !!! Brak punktu , poprawna odpowiedz to: " <<poprawna[i]<<endl;

    }
    cout <<"Koniec quizu, zdobyte punkty to: "<<punkty;

    return 0;
}

java:

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class Main {

    public static void main(String args [])  throws FileNotFoundException {

        int numerLini = 1;
        int numerPytania = 0;
        int punkty = 0;


        String temat;
        String nickGracza;
        String odpowiedzGracza;
        String [] trescPytania = new String[5];
        String [] poprawnaOdpowiedz = new String[5];
        String [] odpA = new String [5];
        String [] odpB = new String [5];
        String [] odpC = new String [5];
        String [] odpD = new String [5];

        File plikZPytaniami = new File("quiz.txt");
        Scanner in = new Scanner (plikZPytaniami);
        String linia = in.nextLine();


        do  {
            switch (numerLini) {

                case 1:
                    temat = linia;
                    break;
                case 2:
                    nickGracza = linia;
                    break;
                case 3:
                    trescPytania[numerPytania] = linia;
                    break;
                case 4:
                    odpA[numerPytania] = linia;
                    break;
                case 5:
                    odpB[numerPytania] = linia;
                    break;
                case 6:
                    odpC[numerPytania] = linia;
                    break;
                case 7:
                    odpD[numerPytania] = linia;
                    break;
                case 8:
                    poprawnaOdpowiedz[numerPytania] = linia;
                    break;
            }
            if (numerLini == 8) {
                numerLini = 2;
                numerPytania++;
            }
                numerLini++;

        } while ((linia != null));


        for (int i=0; i<=4; i++) {

            System.out.println(trescPytania[i]);
            System.out.println("A. "+ odpA[i]);
            System.out.println("B. "+ odpB[i]);
            System.out.println("C. "+ odpC[i]);
            System.out.println("D. "+ odpD[i]);

            Scanner twojaOdpowiedz = new Scanner(System.in);
            odpowiedzGracza= twojaOdpowiedz.nextLine();
            System.out.println(odpowiedzGracza);

            if (odpowiedzGracza== poprawnaOdpowiedz[i]) {

                System.out.println("Dobrze Zodbywasz Punkt !");
                punkty++;

            } else {
                System.out.println("Źle, poprawna odpowiedz to "+ poprawnaOdpowiedz[i] );
            }

            System.out.println("Kniec Quizu zdobyte punkty to :" + punkty);

        }
    }
}


``` java
2

Jaki masz problem, komunikat, którą Jave, czego nie rozumiesz?

1

Imo zapomniałeś przepisać tej linijki

cout<<"Twoja odpowiedz: ";
0

@vpiotr:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5
at Main.main(Main.java:39)

2

Bo jeszcze nie przepisałeś getLine
czyli
linia = in.nextLine();
przed numerLini++;

2

Pobierasz tylko pierwszą linię. Przy czym, jeżeli już ją pobierasz to masz bezsensu warunek, bo linia nie jest i nie będzie NULLEM.
Do sprawdzania czy masz jeszcze jakąś linię do odczytania, użyj metody hasNextLine().

0

@jarekr000000:
po czym mam

Exception in thread "main" java.util.NoSuchElementException: No line found
at java.util.Scanner.nextLine(Scanner.java:1540)
at Main.main(Main.java:61)

@Aisekai:
Jeszcze nie doszedłem do warunku jak coś to go zmienię

1

Zmień na in.hasNextLine() i wtedy możesz nawet zmienić z pętli do-while na pętlę while i dopiero w pętli pobierać linie. Wtedy nie będziesz miał przypadku, że będziesz chciał pobrać nieistniejąca linie.

0

@Aisekai:
jesteś wielki działa lecz mam jeszcze kilka poprawek ale już sobie poradzę

Pozdrawiam

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