Zmagania początkującego

Zmagania początkującego
B9
  • Rejestracja:ponad 7 lat
  • Ostatnio:około 7 godzin
  • Postów:65
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.

Kopiuj
{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");
atmal
  • Rejestracja:około 8 lat
  • Ostatnio:13 dni
  • Postów:913
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ć.


Failure of one test is a tragedy, failure of fifty is a statistic.
B9
  • Rejestracja:ponad 7 lat
  • Ostatnio:około 7 godzin
  • Postów:65
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

edytowany 2x, ostatnio: brus97
atmal
Jak chcesz, chociaż IMO łatwiej byłoby teraz ogarnąć podstawy obiektówki niż męczyć się z tym przykładem ;)
bogdans
Moderator
  • Rejestracja:prawie 17 lat
  • Ostatnio:prawie 5 lat
0

Spróbuj tak:

Kopiuj
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");
}

To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
edytowany 1x, ostatnio: bogdans
shagrin
NumeryButow, KolorOczu :O idz pan!
Julian_
  • Rejestracja:około 8 lat
  • Ostatnio:ponad 4 lata
  • Postów:1703
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.

edytowany 1x, ostatnio: Julian_
jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 3 godziny
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4709
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ę.


jeden i pół terabajta powinno wystarczyć każdemu
Shalom
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
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 ;]


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
Zobacz pozostałe 2 komentarze
Interpod
A może by tak... napisać wrappery w lombok-style?
jarekr000000
@Interpod: Lombok - jakiez to głupie od kiedy masz kotlina. Naprawdę nie rozumiem. Skoro i tak musisz się nauczyć języka (!)- to weź taki co ma ładną składnię (a robi prawie dokładnie to samo).
vpiotr
Nie ma to jak stary poczciwy Pascal... http://www.gnu-pascal.de/gpc/type.html
Interpod
Szukam wolnej chwili żeby sie tym pobawić, ale jak Kraków duży i szeroki to jeszcze nie natknąłem sie na żadną sensowną oferte pracy jako Kotlin Dev. Poza tym ładna składania za mieszkanie nie zapłaci :D #pazerność
B9
  • Rejestracja:ponad 7 lat
  • Ostatnio:około 7 godzin
  • Postów:65
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.

Kopiuj
       {  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]);}





                    }

Kopiuj
{  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]);





                    }
> 

koffeina
  • Rejestracja:około 8 lat
  • Ostatnio:prawie 5 lat
  • Postów:40
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.

edytowany 4x, ostatnio: koffeina
B9
  • Rejestracja:ponad 7 lat
  • Ostatnio:około 7 godzin
  • Postów:65
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.

Kopiuj
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

Kopiuj
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]);

edytowany 1x, ostatnio: brus97
koffeina
  • Rejestracja:około 8 lat
  • Ostatnio:prawie 5 lat
  • Postów:40
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ć.

edytowany 2x, ostatnio: koffeina
B9
Ok, źle zrozumiałem. Dzięki wielkie za radę z tym Scannerem. Oczywiście już widzę gdzie popełniałem błąd i będę miał na przyszłość. To mój 5 dzień programowania i coraz lepiej się nim bawię. Poprawiony kod umieszczam na górze edytując.
B9
  • Rejestracja:ponad 7 lat
  • Ostatnio:około 7 godzin
  • Postów:65
0

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

Kopiuj
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?

Julian_
  • Rejestracja:około 8 lat
  • Ostatnio:ponad 4 lata
  • Postów:1703
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.

edytowany 3x, ostatnio: Julian_
B9
Troszkę dalej nie czaje. Mam jakieś zaćmienie umysłu. Czyli i daję tablicy [2][3] wartość 6 i wtedy jak damy j<tablica[i].lenght, to będziemy mieli 6 kolumn odpowiednio dla 2 wierszy, bo j zasięgnie informacji od pierwszej pętli jak wielka jest tablica?
Julian_
rozpisz se na prostym przykładzie na 1 pętli np.: for(int i = 0; i < 10; i++){System.out.println(i);} Potem dostaw sobie zamiast 10 tablica[i].length i obczajaj jak to działa.
B9
Bawię się i wszystko się zgadza, oprócz tego jednego. Skoro mam tablice int [3][4] i dam że i<tablica.lenght i w drugim for to j<tablica[i], to skoro pierwsza pętla odlicza do tych 3 wierszy czyli 0,1,2 to kolumn nie mam też do 3, a w sumie do 2 skoro j ma być mniejsze od tablicy[i], tylko jest do [4] jak druga cyfra przy podanych wymiarach tablicy 3x4
B9
Dobra zrozumiałem. Zobaczyłem sobie filmik jak autor zamiast int tablica [][]=new int [2][3] dał int tablica[][]= i tu stworzył tabele w {}. Porównałem sobie z moimi wnioskami i wszystko sie już zgadza.
B9
  • Rejestracja:ponad 7 lat
  • Ostatnio:około 7 godzin
  • Postów:65
0

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

Kopiuj
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?

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.