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