Pętla for wykonuje się mniej razy -

0

Hej, jestem nowy na forum, więc witam wszystkich :3
Robiłem dzisiaj zadanie ze SPOJ'a i w main stworzyłem pętlę for, która na moje oko początkującego powinna wykonywać się n razy, a z jakiejś nieznanej mi przyczyny wykonuje się n-1. Już któryś raz mi się to przytrafiło. W końcu mnie to zaintrygowało i chciałbym się dowiedzieć jaka jest przyczyna takiego problemu.
Chętnie posłucham krytyki w stosunku do mojego kodu - jak wspomniałem jestem początkującym, więc chciałbym nabrać dobrych nawyków :)

import java.util.Scanner;

public class ZliczaczLiter {

    public static void main(String[] args) {

        Scanner s = new Scanner(System.in);
        int n = s.nextInt();
        String tekst;
        char[] male = new char[26];
        char[] duze = new char[26];
        int[] maleLicz = new int[26];
        int[] duzeLicz = new int[26];
        uzupelnianieAlfabetu(male, duze);
        uzupelnianieZerami(maleLicz, duzeLicz);
        for (int i = 0; i < n; i++) { // DOKŁADNIE O TĄ PĘTLĘ CHODZI
            tekst = s.nextLine();
            licz(tekst, male, duze, maleLicz, duzeLicz);
        }
        wyswietl(male, duze, maleLicz, duzeLicz);
        s.close();
    }

    private static void wyswietl(char[] male, char[] duze, int[] maleLicz, int[] duzeLicz) {
        // metoda wyświetlająca ilość wystąpień poszczególnych znaków - alfabetycznie, pierw małe litery
        for(int i=0;i<maleLicz.length;i++) {
            if(maleLicz[i]>0)
                System.out.println(male[i] + " " + maleLicz[i]);
        }
        for(int i=0;i<duzeLicz.length;i++) {
            if(duzeLicz[i]>0)
                System.out.println(duze[i] + " " + duzeLicz[i]);
        }
    }

    private static void licz(String tekst, char[] male, char[] duze, int[] maleLicz, int[] duzeLicz) {
        // metoda zliczająca występowanie znaków
        for(int i=0;i<tekst.length();i++) {
            for(int j=0;j<male.length;j++) {
                if(tekst.charAt(i)==male[j])
                    maleLicz[j]++;
                if(tekst.charAt(i)==duze[j])
                    duzeLicz[j]++;
            }
        }

    }

    public static void uzupelnianieZerami(int[] maleLicz, int[] duzeLicz) {
        // metoda uzupełnia dwie tablice zerami
        for (int i = 0; i < maleLicz.length; i++) {
            maleLicz[i] = 0;
            duzeLicz[i] = 0;
        }

    }

    public static void uzupelnianieAlfabetu(char[] male, char[] duze) {
        // metoda uzupełnia dwie tablicę literami alfabetu od a do z
        char a = 'a';
        char d = 'A';
        for (int i = 0; i < male.length; i++) {
            male[i] = a++;
            duze[i] = d++;
        }
    }
}
1

Cześć. Skąd wniosek, że pętla wykonuje się n-1 razy? Proponuję użyć debuggera albo w prostu sposób dodać licznik do pętli i na końcu wypisać jego wartość.
W Twoim kodzie wygląda na to, że po wczytaniu inta do n gdy wchodzisz do pętli to pierwsze co pobierasz to jakieś zaległości po nim. Dopiero potem n-1 razy wczytujesz wartość.
Wywołaj sobie:
s.nextLine(); po wczytaniu n.

0

Dzięki za odpowiedź. Dodałem```
s.nextLine();


Swoją drogą to jakiś losowy przypadek, że trzeba dopisać ```
s.nextLine();
``` czy tak jest zawsze ?
1

Trzeba dopisać zawsze po nextInt(),(nextDouble()...), a przed nextLine(). Wymienione metody odczytują z bufora klawiatury tylko liczbę - resztę zostawiają. Jakaś reszta jest zawsze (co najmniej Enter).

1

Metody powinieneś nazywać czasownikiem "uzupełniajZerami" a nie "uzupelnienieZerami".

0

Okej dziękuje za odpowiedzi :) Przejrzę swoje małe programiki i posprawdzam swoje metody, żeby dobrze się nazywały :) Pozdrawiam

0

Daj znać, bo sam jestem ciekaw.

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