JAVA Pętla z Scannerem

0

Witam, chciałbym zrobić pętle z wprowadzaniem tekstu.
Wprowadzam tekst Scannerem, i chciałbym zrobić taką pętle:
Wprowadzam jakis wyraz i przechodzi on przez pętle wykonująć instrukcje, gdy je wykona to znów wprowadzam wyraz i tak dalej, lecz jesli wpisze wyraz STOP to pętla sie zakończy.
Próbowałem z do while, ale coś mi nie działa, nie wazne co wpisze ciagle konczy program bez petli.

import java.util.*;

public class io 
{



public static void main (String[] args)
 {
 
        String wyraz;
		Scanner odczyt = new Scanner(System.in);
		
		do
		{
	
		System.out.println("Wprowadz wyraz: "); 
        wyraz = odczyt.nextLine();

		for (int i = 0;i < wyraz.length(); i++)
		
		 {
		if ( wyraz.charAt(i) == 'a' || wyraz.charAt(i) == 'A'){
          System.out.println("Alpha");}
		if ( wyraz.charAt(i) == 'b' || wyraz.charAt(i) == 'B'){
          System.out.println("Bravo");}
		if ( wyraz.charAt(i) == 's' || wyraz.charAt(i) == 'S'){
          System.out.println("Sierra");}
		 }

         }
     while ( wyraz == "STOP");
	 System.out.println("Koniec programu");
	  
 
 }
 }
1
while ( wyraz == "STOP");

Napisy w Javie porównujemy za pomocą metody equals(). Dodatkowo, Twoja pętla ma wykonywać się dopóki użytkownik nie wpisze "STOP", więc idąc Twoim złym sposobem powinno być wyraz != "STOP", a idąc moim dobrym - !wyraz.equals("STOP").

Dla usprawnienia kodowania po wyraz = odczyt.nextLine() możesz dać wyraz = wyraz.toLowerCase(), a wtedy nie będziesz musiał uwzględniać drugiego przypadku dla dużych znaków; pozwala Ci to wtedy sprawnie użyć switcha.

0

Wielkie dzięki :) wszystko działa teraz :) ale mam jeszcze pytanie takie, gdy wpisze STOP to wyswietla mi sie jeszcze to co mam pod S czyli Sierra, jak zrobic zeby sie nie wyswietlało ? To jest pewnie przez pętle bo do while najpierw sprawdza petle a pozniej dopiero warunek. Lepiej to zrobic przez ifa ?

0

Użyj pętli

while(warunek) {

} 

zamiast do while.

1

Dodatkowa zmienna rozwiąże problem:

public static void main (String[] args)
{
    String wyraz;
    Scanner odczyt = new Scanner(System.in);
    boolean koniec = false;
    
    do {
        System.out.println("Wprowadz wyraz: "); 
        wyraz = odczyt.nextLine();
        wyraz = wyraz.toLowerCase();

        if (wyraz.equals("stop"))
            koniec = true;
            
        else {
            for (int i = 0;i < wyraz.length(); i++) {
                char znak = wyraz.charAt(i);
                
                if (znak== 'a')
                    System.out.println("Alpha");
                
                else if (znak== 'b')
                    System.out.println("Bravo");
                    
                else if (znak) == 's')
                    System.out.println("Sierra");
            }        
        }
    }
    while (!koniec);
    
    System.out.println("Koniec programu");
}

Zauważ kilka zmian w kodzie:

  1. To co wcześniej, toLowerCase i ograniczamy ilość warunków
  2. Trzy razy wywołujesz metodę charAt(i), więc dla efektywności można to zrobić raz i zapisać do zmiennej
  3. Trzykrotnie sprawdzasz czy znak wynosi a/b/s. Jeżeli wynosi on a, to niepotrzebnie sprawdzasz czy też jest b lub s. Dlatego konstrukcja na else-ifach pozwala wyeliminować sprawdzanie dalej jeżeli rozpoznało już jakiś znak
  4. Jeżeli pod ifem jest tylko 1 linijka która ma być wykonana przy spełnieniu warunku, to można pominąć klamry. Normalnie byłyby one po if oraz przed else.
0

Dzięki jeszcze raz :) teraz wszystko działa jak należy :)

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