Metody warunkowe - blad

Metody warunkowe - blad
Reiko
  • Rejestracja:ponad 19 lat
  • Ostatnio:ponad 4 lata
0

Witam,

pisze sobie kod do wielokrotnego wyboru. Kod przedstawiam ponizej:

Kopiuj
import java.util.*;

public class Main
{
	public static void main(String[] args)
	{
		Scanner wejscie = new Scanner(System.in);
		
		System.out.println("Co chcesz zrobic:");
		System.out.println("1 - zamiana ciagu na male literki");
		System.out.println("2 - zamiana ciagu na DUZE LITERKI");
		System.out.println("---------------------------------");
		System.out.println("0 - zamkniecie programu");
		System.out.print("Wybor: ");
		
		char wybor = wejscie.next().charAt(0);
		
		if (wybor == '1')
		{
			System.out.print("Podaj jakis ciag do zamiany na male literki: ");
			String zdanie = wejscie.nextLine();
			System.out.print("KONTROLA");
			System.out.print(zdanie.toLowerCase());
		}
		else if (wybor == '2')
		{
			System.out.print("Podaj jakis ciag do zamiany na DUZE LITERKI: ");
			String zdanie = wejscie.nextLine();
			System.out.print(zdanie.toUpperCase());
		}
		else if (wybor == '0')
		{
			System.exit(0);
		}
		else if ((wybor != '1') &&
			(wybor != '2') &&
			(wybor != '0'))
			System.out.print("WYBOR SPOZA ZAKRESU!");
	}
}

Program, w zaleznosci jaka opcje wybiore, powinien dzialac nastepujaco:
1 - wpisuje ciag znakow i zamienia go na male literki
2 - wpisuje ciag znakow i zamienia go na duze literki
0 - zamyka program
inny - pokazuje komunikat o nieprawidlowym wyborze.

Problem w tym ze gdy wybiore np opcje nr 1 to program pyta o wprowadzenie ciagu ale jednoczesnie opuszcza linie przeznaczona do wprowadzenia ciagu i wyswietla kontrolny zapis. Co robie zle?

Pozdrawiam!

KA
  • Rejestracja:prawie 7 lat
  • Ostatnio:dzień
  • Lokalizacja:Warszawa
  • Postów:41
0

To mi wygląda na to, że po wpisaniu cyferki wciskasz Enter, więc w buforze zostaje zapisany znak nowej linii. W związku z tym funkcja nextLine widzi nową linię i zwraca "".
Inaczej:

  1. Wpisujesz 1 i wciskasz Enter
  2. W buforze zapisują się znaki 1 i \n
  3. Funkcja next czyta do pierwszego białego znaku, tzn. czyta 1 i przerywa działanie
  4. Funkcja nextLine czyta od miejsca, w którym next przerwała, czyli od znaku \n
  5. \n oznacza koniec linii, więc nextLine kończy od razu, zwracając ""

Spróbuj użyć System.in.read zamiast Scanner#next, ale nie wiem, jak wygląda sprawa z buforowaniem - mogą być problemy. W takim wypadku przenieś definicję zmiennej wejscie tuż nad if (wybor == 1)

edytowany 1x, ostatnio: kamillapinski
Reiko
  • Rejestracja:ponad 19 lat
  • Ostatnio:ponad 4 lata
0

Niestety tak chyba nie jest poniewaz moj poprzedni kod nawiazujacy do metody String replace rowniez mial takie "menu" i dzialal poprawnie:

Kopiuj
import java.util.*;

public class Main
{
	public static void main(String[] args)
	{
		short indeks1, indeks2;
		Scanner wejscie = new Scanner (System.in);
		
		System.out.print("Podaj jakies zdanie: ");
		String zdanie = wejscie.nextLine();
		
		System.out.print("Czy chcesz podac dwa parametry czy 1? (1/2): ");
		char jedenCzyDwa = wejscie.next().charAt(0);
	
		if (jedenCzyDwa == '1')
		{
			System.out.print("Podaj numer indeksu od ktorego skopiowac lancuch: ");
			indeks1 = wejscie.nextShort();
			//wyswietlanie wyniku
			System.out.print(zdanie.substring(indeks1));
		}
		else if (jedenCzyDwa == '2')
		{
			System.out.print("Podaj pierwszy indeks (poczatkowy): ");
			indeks1 = wejscie.nextShort();
			
			System.out.print("Podaj drugi indeks (koncowy): ");
			indeks2 = wejscie.nextShort();
			
			//wyswietlanie wyniku
			System.out.print(zdanie.substring(indeks1, indeks2));
		}
		//jesli podano cos spoza zakresu
		else if ((jedenCzyDwa != '1') && (jedenCzyDwa != '2'))
			System.out.print("NIEPOPRAWNY WYBOR!");
	}
}
Reiko
  • Rejestracja:ponad 19 lat
  • Ostatnio:ponad 4 lata
0

Kurcze a moze i masz racje. Porownalem te dwa kody i w tym problematycznym String pobierany jest po dokonaniu wyboru a w tym drugim (co niby dziala poprawnie) - przed. I gdy pobieranie Stringa przeniose na sam poczatek to wszystko dziala jak nalezy:

Kopiuj
import java.util.*;

public class Main
{
	public static void main(String[] args)
	{
		Scanner wejscie = new Scanner(System.in);
		
		System.out.print("Podaj zdanie wejsciowe: ");
		String zdanie = wejscie.nextLine();

		System.out.println(zdanie);
		System.out.println("Co chcesz zrobic:");
		System.out.println("1 - zamiana ciagu na male literki");
		System.out.println("2 - zamiana ciagu na DUZE LITERKI");
		System.out.println("---------------------------------");
		System.out.println("0 - zamkniecie programu");
		System.out.print("Wybor: ");
			
		char wybor = wejscie.next().charAt(0);
	
		
		
		if (wybor == '1')
		{
			System.out.print(zdanie.toLowerCase());
		}
		else if (wybor == '2')
		{
			System.out.print(zdanie.toUpperCase());
		}
		else if (wybor == '0')
		{
			System.exit(0);
		}
		else if ((wybor != '1') &&
			(wybor != '2') &&
			(wybor != '0'))
			System.out.print("WYBOR SPOZA ZAKRESU!");

	}
}

Ale jak wczytać pojedynczy znak używając System.in.read? Tam można wczytać tylko wartości liczbowe.

edytowany 1x, ostatnio: Reiko
Reiko
Tak czytalem juz o tym ale gdy stosuje taki zapis to otrzymuje blad "The exception 'java.io.IOException' must be caught or declared in the throws clause"
KA
Boże, no to przecież takie rzeczy od razu wklepuje się w Google. Musisz po prostu zrobić public static void main(String[] args) throws java.io.IOException
Reiko
Kamil Ty sie tylko nie denerwuj :) Zrobilem tak. Lecz problem wciaz pozostaje - gdy wpisze zdanie to program go nie wypisuje tak jak powinien.
Reiko
  • Rejestracja:ponad 19 lat
  • Ostatnio:ponad 4 lata
0

Serio, pobieranie znaku to az taki problem w Javie? Bo wierzyć mi się nie chce.

kiyo
  • Rejestracja:około 8 lat
  • Ostatnio:około 2 godziny
  • Postów:155
1

Już bez przesady z tym problemem. Możesz zmienić

Kopiuj
 char wybor = wejscie.next().charAt(0);

na

Kopiuj
 char wybor = wejscie.nextLine().charAt(0);

i powinno działać, albo po prostu pobrać ten znak nowej linii.
Z tego co się orientuję to nie tylko w Javie w C++ też taki problem jest ;)

edytowany 2x, ostatnio: kiyo

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.