Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

pętla, continue

Ostatnio zmodyfikowano 2018-04-15 18:03
Autor Wiadomość
adrian.paz
Temat założony przez niniejszego użytkownika
» 2018-04-14 18:03:26
Ok zmieniłem break na continue i na początku pętli ustawiłem ponownie isOk na true żeby po break'u nie było false ale wykonuje się nieskończona pętla. Jak wyczyścić bufor? jak dam token.nextToken() to wyskakuje mi błąd "java.util.NoSuchElementException"
P-170675
adrian.paz
Temat założony przez niniejszego użytkownika
» 2018-04-14 18:13:21
Jak wyczyścić bufor klasy Tokenizer? Pętla się wykonuje w nieskończoność mimo że w pętli na początku ustawiłem na false.. Mógłby ktoś poprawić mój kod?
C/C++
package ć w5;

import java.util.Scanner;
import java.util.StringTokenizer;

public class Zad2
{
    String linia;
    static double wyn = 0;
    static boolean isNotOk = false;
   
    static double kalkulator( String linia )
    {
        String errorMessage = "\nWadliwe dane! Spróbuj ponownie!\n";
       
        StringTokenizer token = new StringTokenizer( linia );
        do
        {
            isNotOk = false;
            // token.nextToken();
            if( token.countTokens() != 3 )
            {
                System.err.println( errorMessage + " 1" );
                isNotOk = true;
                continue;
               
            }
           
            String a = token.nextToken(), // pierwsza liczba
            b = token.nextToken(), // znak
            c = token.nextToken(); // druga liczba
           
            int num1 = 0, num2 = 0; // pomocnicze zmienne
           
            try
            {
                num1 = Integer.parseInt( a );
                num2 = Integer.parseInt( c );
            } catch( NumberFormatException e )
            {
                System.err.println( errorMessage + " 2" );
                isNotOk = true;
                continue;
            }
            char znak = b.charAt( 0 );
            if( b.length() != 1 ||( znak == '/' && num2 == 0 ) )
            {
                System.out.println( errorMessage + " 3" );
                isNotOk = true;
                continue;
            }
            switch( znak )
            {
            case '+':
                wyn = num1 + num2;
                break;
            case '-':
                wyn = num1 - num2;
                break;
            case '*':
                wyn = num1 * num2;
                break;
            case '/':
                wyn = num1 / num2;
                break;
            case '%':
                wyn = num1 % num2;
                break;
            default:
                {
                    System.out.println( errorMessage + " 4" );
                    isNotOk = true;
                    continue;
                }
            }
        } while( isNotOk );
       
        return wyn;
       
    }
   
    public static void main( String[] args )
    {
        System.out.println( "Witaj w moim kalkulatorze! Wprowadz jakieś działanie (np. 1 + 2)" );
        Scanner skan = new Scanner( System.in );
        String linia = skan.nextLine();
       
        System.out.println( "Wynik: " + Zad2.kalkulator( linia ) );
       
        skan.close();
    }
   
}
P-170676
jankowalski25
» 2018-04-14 18:51:27
Pętla się wykonuje w nieskończoność mimo że w pętli na początku ustawiłem na false..
No właśnie, na początku. A kiedy jest sprawdzany warunek w pętli? Najlepiej zbuduj prawidłowy warunek kończący pętlę zamiast takiego udziwniania (może się składać z kilku wyrażeń, jeśli to coś uprości). Najlepiej nie używaj
break
 ani
continue
, w większości przypadków tak będzie łatwiej i dzięki temu wszystkie sytuacje przerywające pętlę znajdą się w jej warunku (a nieco mniej typowe sytuacje trafią do
catch
).

wyskakuje mi błąd "java.util.NoSuchElementException"
Słowo "Exception" wyraźnie wskazuje na to, że to jest wyjątek (więc możesz go przechwycić, jeśli tego potrzebujesz, prawda?).

Jak wyczyścić bufor klasy Tokenizer?
Tak samo, jak w C++ można wyczyścić strumień, czyli wystarczy wczytać wszystkie dane. Jeśli wczytasz za dużo, to w Javie dostaniesz wcześniej wspomniany wyjątek, więc możesz albo sprawdzić, ile tego jest, albo czytać tak długo, aż złapiesz wyjątek.
P-170678
adrian.paz
Temat założony przez niniejszego użytkownika
» 2018-04-14 19:11:20
Nie sądziłem, że taki warunek to wydziwianie. Myślałem, że to będzie coś prostego: powtarzaj pętle tak długo dopóki coś będzie się chrzanić czyli jeżeli isNotOk==true... Złe takie myślenie?
P-170679
pekfos
» 2018-04-14 19:20:14
C/C++
try
{
    num1 = Integer.parseInt( a );
    num2 = Integer.parseInt( c );
} catch( NumberFormatException e )
{
    System.err.println( errorMessage + " 2" );
    isNotOk = true;
    continue;
}
Wyczuwam objawy kopiowania kodu bez rozumienia, co robi. Po co łapiesz wyjątek tak szybko jak tylko się da i potem kombinujesz pod górę, jak z obsługi wyjątku wyjść z pętli..? Niech to jest za pętlą, jak będzie wyjątek to automatycznie z niej wyjdziesz.
P-170680
adrian.paz
Temat założony przez niniejszego użytkownika
» 2018-04-15 12:39:31
Czyli w catch'u zarówno continue jak i isNotOk=tru jest zbędne?
P-170686
adrian.paz
Temat założony przez niniejszego użytkownika
» 2018-04-15 13:16:56
Wkurzała mnie ta pętla więc zrobiłem to inaczej. Po prostu wywołałem nowo napisana metodę setLine() w każdym z wyjątków :) Czy tak można robić? Nawet bardziej czytelnie jest tylko śmiesznie, że w main jest tylko jedna linijka :) Linijka wywołująca metodę setLine() :D
EDIT: Teraz proszę już bez zagadek bo zwariuje! Wszystko jest ok w programie tylko problem jest taki, że po wyłapaniu wyjątku i wywołaniu metody setLine() potem jak już dobrze wszystko wpisze to wyrzuca mi NoSuchElementException... W którym miejscu jest błąd? :((
C/C++
package ć w5;

import java.util.Scanner;
import java.util.StringTokenizer;

public class Zad2
{
    String linia;
    static double wyn = 0;
    static double kalkulator( String linia )
    {
        String errorMessage = "\nWadliwe dane! Spróbuj ponownie!\n";
       
        StringTokenizer token = new StringTokenizer( linia );
        if( token.countTokens() != 3 )
        {
            System.err.println( errorMessage + " 1" );
            Zad2.setLine();
        }
       
        String a = token.nextToken(), // pierwsza liczba
        b = token.nextToken(), // znak
        c = token.nextToken(); // druga liczba
       
        int num1 = 0, num2 = 0; // pomocnicze zmienne
       
        try
        {
            num1 = Integer.parseInt( a );
            num2 = Integer.parseInt( c );
        } catch( NumberFormatException e )
        {
            System.err.println( errorMessage + " 2" );
            Zad2.setLine();
        }
        char znak = b.charAt( 0 );
        if( b.length() != 1 ||( znak == '/' && num2 == 0 ) )
        {
            System.err.println( errorMessage + " 3" );
            Zad2.setLine();
        }
        switch( znak )
        {
        case '+':
            wyn = num1 + num2;
            break;
        case '-':
            wyn = num1 - num2;
            break;
        case '*':
            wyn = num1 * num2;
            break;
        case '/':
            wyn = num1 / num2;
            break;
        case '%':
            wyn = num1 % num2;
            break;
        default:
            {
                System.out.println( errorMessage + " 4" );
                Zad2.setLine();
            }
        }
       
        return wyn;
       
    }
   
    static void setLine()
    {
        System.out.println( "Witaj w moim kalkulatorze! Wprowadz jakieś działanie (np. 1 + 2)" );
        Scanner skan = new Scanner( System.in );
        String linia = skan.nextLine();
       
        double wynik = Zad2.kalkulator( linia );
        System.out.println( "Wynik: " + wynik );
        skan.close();
    }
   
    public static void main( String[] args )
    {
        Zad2.setLine();
    }
   
}
P-170688
pekfos
» 2018-04-15 13:20:25
Zastępowanie pętli rekurencją nie jest poprawne.

Czyli w catch'u zarówno continue jak i isNotOk=tru jest zbędne?
Złe pytanie.
P-170689
1 « 2 » 3 4
Poprzednia strona Strona 2 z 4 Następna strona