Zmagania początkującego

0

Siema.

Jestem na początku nauki w Javie. Przechodząc do sedna chciałem zrobić prosty system weryfikacyjny. Najpierw trzeba podać imię które będzie zgadzać się z bazą danych, następnie rozmiar buta i kolor oczu. Jest problem. Nie wiem jak przypisać do imienia Jacek, rozmiar buta i kolor oczu. Tak żeby po wybraniu jego imienia, a podaniu złego buta Od razu wyskakiwał napis błędu.

Nie mogę także dodać wartości else po dwóch "if" które są w tym głównym "if". W tym głównym mogę na końcu kodu, a jak chce zrobić w tych środkowych to mi podkreśla.

{Scanner pan = new Scanner(System.in);
                        System.out.println("W celu weryfikacji, podaj swoje imie");
                        String a = pan.nextLine();
                        String listaImion [] = {"Jacek", "Przemek", "Wojtek"};
                        int j = listaImion.length;
                        String NumeryButow [] = {"36","37","38","39","40","41","42","43","44","45","46","47"};
                        int k = NumeryButow.length;
                        String KolorOczu [] = {"Zielony", "Niebieski", "Brązwoy"};
                        int l = KolorOczu.length;

                            for (int u = 0; u < listaImion.length; u++)
                                if (a.equalsIgnoreCase(listaImion[u])) {
                                    System.out.println("Teraz podaj swój numer buta ");
                                    String b = pan.nextLine();
                                    
                                    for (int w = 0; w < NumeryButow.length; w++)
                                        if (b.equalsIgnoreCase(NumeryButow[w]));
                                    { System.out.println("Jaki masz kolor oczu? ");
                                        String c = pan.nextLine();
                                        
                                        for (int x = 0; x < KolorOczu.length; x++)
                                            if (c.equalsIgnoreCase(KolorOczu[x])) ;
                                        { System.out.println("\n\n Gratulacje! Pomyślnie przeszedłeś weryfikacje");
                                            
                                    }else System.out.println("Błąd. Próba włamania");


                                    }else System.out.println("Błąd. Próba włamania");


                                }else System.out.println("Błąd. Próba włamania");
0

Lepiej będzie stworzyć klasę i w niej przechowywać imię, numer buta i kolor oczu danej osoby. Później tworzysz tablicę osób (lub listę), przypisujesz wartości.
Tym sposobem kiedy już znajdziesz osobę po imieniu nie będziesz musiał lecieć przez całą tablicę rozmiarów buta bo wystarczy że porównasz wejście z odpowiednim polem klasy. No i przy okazji nauczysz się czegoś nowego :D

Poza tym - jakiego IDE używasz? Bo masz parę nieużywanych zmiennych i powinno Ci ten fakt podkreślić.

0

Najnowszego.

Tak wygląda w kolorach https://scr.hu/39uu/zhd1w

Spróbuje tak jak mówisz nie wiem czy dam rade, ale zobaczę i dam znać :D

//

Jednak nie zrobię tego bo po prostu nie zacząłem jeszcze uczyć się programowania obiektowego. Dzięki za rady jak nauczę się go napiszę tutaj jak to wygląda :D

//

No właśnie tak napisałem xd

0

Spróbuj tak:

private boolean verification()
{
    Scanner pan = new Scanner(System.in);
    String[] listaImion = {"Jacek", "Przemek", "Wojtek"};
    String[] NumeryButow = {"36","37","38","39","40","41","42","43","44","45","46","47"};
    String[] KolorOczu = {"Zielony", "Niebieski", "Brązowy"};
    boolean valid = false;
    System.out.println("W celu weryfikacji, podaj swoje imie");
    String a = pan.nextLine();
    for (int u = 0; u < listaImion.length; u++)
    {
        if (a.equalsIgnoreCase(listaImion[u]))
        {
            valid = true;
        }
    }
    if(!valid)
    {
        return false
    }
    System.out.println("Teraz podaj swój numer buta ");
    valid = false;
    String b = pan.nextLine();
    for (int w = 0; w < NumeryButow.length; w++)
    {
        if (b.equals(NumeryButow[w]))
        {
            valid = true;
        }
    }
    if(!valid)
    {
        return false;
    }
    System.out.println("Jaki masz kolor oczu? ");
    String c = pan.nextLine();
    for (int x = 0; x < KolorOczu.length; x++)
    {
        if (c.equalsIgnoreCase(KolorOczu[x]))
        {
            return true;
        }
    }
    return false;
}
...
if verification()
{ 
    System.out.println("\n\n Gratulacje! Pomyślnie przeszedłeś weryfikacje");
}
else
{
    System.out.println("Błąd. Próba włamania");
}
1

Ja bym zrobił Map<String, PhysicalCharacteristic> gdzie String - imię, a PhysicalCharacteristic to obiekt zawierający zmienne: kolor buta i rozmiar oczu, czy tam na odwrót.

2
Julian_ napisał(a):

Ja bym zrobił Map<String, PhysicalCharacteristic> gdzie String - imię, a PhysicalCharacteristic to obiekt zawierający zmienne: kolor buta i rozmiar oczu, czy tam na odwrót.

A w dobrym języku powinno być jeszcze Map<Imie, PhysicalCharacteristic> gdzie Imie to String, a ten Map<Imie, PsychichalCharacteristic> to np. CharacteristicsData.
Ale w Javie pisząc w ten sposób połamiemy klawiaturę.

1

@jarekr000000 +1, tyle razy mnie już ugryzło w tyłek wrzucanie gdzieś prymitywów i klas standardowych :D Nagle chcemy dodać sobie jakiś parametr a tu klops, bo zamiast własnej klasy mamy jakiegoś Stringa. A już o potworkach w stylu Map<String, Map<String, Map<.... to nie mówie ;]

0

Jeszcze koledzy nie doszedłem do tego poziomu. Odłożyłem ten projekt na za 2 tygodnie, bo prawdopodobnie wtedy dojdę do programowania obiektowego. Zastosuję się do udzielonych rad :D

Aktualnie jestem przy nauce tablic wielowymiarowych. Napisałem sobie taki fajny kodzik tylko jest jeden problem. Jak chce wypełnić tablice którą stworzę podając dowolne liczby to mi wyskakuje zawsze 0 dla np. tab[1][2]. Wydaję mi się ze poprawnie napisałem, ale nie mogę podać więcej niż jedną liczbę do zapełnienia, która i tak się nie wyswietla. Z użyciem pętli while.

Z użyciem pętli for (2 kod), mogę podać tylko 1 liczbę, która będzie w 1 kolumnie 1 wierszu.

       {  System.out.println("Podaj wymiary tablicy: ");
                    Scanner wymiar = new Scanner(System.in);
                    Scanner wymiar2 = new Scanner(System.in);
                    Scanner wymiar3 = new Scanner(System.in);
                    int tablica [][] = new int[wymiar.nextInt()][wymiar2.nextInt()];
                    int wymiar4 = wymiar3.nextInt();

                    for(int i=0; i<tablica.length; i++)
                        for(int j=0; j<tablica[i].length; j++)
                            while (wymiar4==tablica.length)
                            tablica [i][j] = wymiar4;{
                        for(int i=0; i< tablica.length; i++)
                            for(int j=0; j< tablica[i].length; j++)
                                System.out.printf("tablica[%d][%d]=%d \n", i, j, tablica[i][j]);}





                    }

{  System.out.println("Podaj wymiary tablicy: ");
                    Scanner wymiar = new Scanner(System.in);
                    Scanner wymiar2 = new Scanner(System.in);
                    Scanner wymiar3 = new Scanner(System.in);
                    int tablica [][] = new int[wymiar.nextInt()][wymiar2.nextInt()];
                    int wymiar4 = wymiar3.nextint;
                    for(int i=0; i<tablica.length; i++)
                        for(int j=0; j<tablica[i].length; j++)
                            for(int k=0; k==i+j; k++ ){
                            tablica [i][j] = wymiar4; }

                        for(int i=0; i< tablica.length; i++)
                            for(int j=0; j< tablica[i].length; j++)
                                System.out.printf("tablica[%d][%d]=%d \n", i, j, tablica[i][j]);





                    }
> 

1

Rada może zbyt ogólnikowa, ale... Używania nowych rzeczy ucz się na jeszcze mniejszych zadaniach. Np. zanim spróbujesz używać Scannera i wczytywania danych do wyznaczania wymiarów tablicy oraz zapisywania do niej wartości, spróbuj napisać wczytywanie jednej liczby i jej wyświetlanie, potem wczytywanie wielu liczb do tablicy o zdefiniowanej wielkości itd.
W Twoim programie odczytywanie wartości ze Scannera powinno się dziać w pętli, nie poza nią (w końcu chcesz to zrobić więcej niż jeden raz). Nie potrzebujesz też więcej niż jednego obiektu Scannera - doczytaj więcej o ich działaniu.

0

Dzięki wielkie koffeina. Zmęczony i nie zauważyłem tego. Poniżej daję kod jak jest poprawnie. Zrobiłem tak na samym początku tylko dałem jakoś źle nawias i szukałem innego pomysłu. Dzięki za rade, ale zauważyłem że na mnie działa najlepiej jak wyznaczę sobie trudny przykład (szczególnie że używanie Scannera wcześniej opanowałem) i próbuje go rozwiązać. Tak żeby połączyć parę lekcji. Wtedy przerabiam wszystko po kolei, chociaż czasem męczę się po 2h, a jak juz totalnie nie wiem to pytam Was, dużo bardziej doświadczonych.

System.out.println("Podaj wymiary tablicy: ");
                           Scanner wymiar = new Scanner(System.in);
                           Scanner wymiar2 = new Scanner(System.in);
                           Scanner wymiar3 = new Scanner(System.in);
                           int tablica [][] = new int[wymiar.nextInt()][wymiar2.nextInt()];
                           for(int i=0; i<tablica.length; i++)
                               for(int j=0; j<tablica[i].length; j++)
                                   tablica [i][j] = wymiar3.nextInt();
                           for(int i=0; i< tablica.length; i++)
                               for(int j=0; j< tablica[i].length; j++)
                                   System.out.printf("tablica[%d][%d]=%d \n", i, j, tablica[i][j]);

@@ EDIT KRÓTSZY KOD

System.out.println("Podaj wymiary tablicy: ");
                            Scanner wymiar3 = new Scanner(System.in);
                            int tablica [][] = new int[wymiar3.nextInt()][wymiar3.nextInt()];
                            for(int i=0; i<tablica.length; i++)
                                for(int j=0; j<tablica[i].length; j++)
                                    tablica [i][j] = wymiar3.nextInt();
                            for(int i=0; i< tablica.length; i++)
                                for(int j=0; j< tablica[i].length; j++)
                                    System.out.printf("tablica[%d][%d]=%d \n", i, j, tablica[i][j]);

1

Nie mówię, że masz rezygnować z tych bardziej rozbudowanych zadań, tylko nie pisać i uruchamiać ich całych od razu, zamiast tego rozbudowywać krok po kroku, testując po drodze czy działa. Nadal masz niepotrzebnie stworzone 4obiekty Scannera, wystarczyłby jeden - przeanalizuj proste przykłady użycia z tutoriali :) to się może wydawać pierdołą, skoro program działa, ale warto uczyć się od początku porządnie pisać.

0

Siemka ponownie. Chciałem o coś zapytać bo ciężko mi pojąć.

int tablica[][] = new int [3][4];
            int zmienna=1;
            for(int i=0; i<tablica.length; i++)
            for(int j=0; j<tablica[i].length; j++)
                tablica[i][j] = zmienna++;
            for(int i=0; i<tablica.length; i++)
                for(int j=0; j<tablica[i].length; j++)

            System.out.println("\n tab["+i+","+j+"} = "+tablica[i][j]);

Jeżeli tak kod jest zapisany to wszystko jest ok. Pojawiają się 3 wiersze po 4 kolumny. Tylko dlaczego musimy dawać to "j<tablica[i].lenght. Bez tego pojawią się 3 wiersze po 3 kolumny. Mógłby ktoś to ładnie wytłumaczyć? Ja staram sobie to wytłumaczyć że jeżeli nie damy tego [i] to drugie for też czyta liczbę wierszy czyli int [3], a nie to [4]. Tworzymy tablice, ale czytając tylko jej pierwszą wartość dwukrotnie (wiersze), a liczba kolumn nie zostaje wykorzystana. Czy to jest prawidłowe wytłumaczenie? Czy dzięki temu [i] przeskakujemy na czytanie [4] czyli j? Analogicznie byłoby z tablica trójwymiarową "new int [3][4][5]", jeżeli nie dalibyśmy k<tablica[i][j].lenght, a samo [i] to korzystalibyśmy wtedy z 3 wierszy i 2 razy z 4 kolumn?

1

j<tablica[i].lenght jest po to by pętla wiedziała, gdzie się zatrzymać (kiedy skończyć iterować). Tutaj przy każdym wywołaniu pętli sprawdzany jest warunek czy wartość j jest mniejsza od ilości elementów w tablicy. Jeśli tak to pętla się wykonuje, jeśli nie to kończy pętle i idzie dalej.

ps.:
przyjęło się używać i wewnątrz (inner), a j na zewnątrz... im bardziej na zewnątrz tym wcześniejsze litery alfabetu.
Uważam też, że klamry { należy zawsze dodawać, bo wtedy kod jest czytelniejszy.

0

Chciałem się jeszcze tylko spytać czy to jest poprawny zapis?

int tablica[][] = new int [3][4];
            int zmienna=1;
            for(int i=0; i<tablica.length; i++)
            for(int j=0; j<tablica[i].length; j++){
                tablica[i][j] = zmienna++;
         

            System.out.println("\n tab["+i+","+j+"} = "+tablica[i][j]);}

W rozwiązaniu zadania jest tak jak wyżej w poście moim podałem, ale przecież wystarczy dodać klamrę zamiast przepisywać 2 linijek kodu. Chyba że to może powodować jakiś błąd w przyszłości?

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