czytanie z klawiatury przy pomocy java.util.Scanner

0

Witam,

Mam następujące pytanie:

Piszę program, który wczytuje kolejne element z wejścia. Jest pętla, w której wczytuje najpierw liczbe, a potem jakis znak:

xxx.nextDouble()
xxx.next().charAt(0)

W pewnym miejscu tej pętli mam potrzebę pobrania kolejnej wartosci z wejscia. Mogę to zrobić przez xxx.nextDouble() ale wtedy przesune się w moim wejsciu. Czy istnieje funkcja, ktora:

a) dziala tak jak .nextDouble tyle, ze nie przesuwa sie dalej (patrzy tylko na nastepna wartosc i zapisuje do zmiennej)
b) używamy .nextDouble, a nastepnie jakiejs magicznej funkcji, ktora cofnie nas do miejsca zanim wczytalismy

Z gory dzieki za pomoc!

0

ze scannera mozna tylko czytac, nie da sie wepchnac wartosci z powrotem. mozesz uzyc metod hasXXX do sprawdzenia jakiego typu jest nastepny token.

0

O co w ogóle chodzi: prosty kalkulatorek z dzialaniami +, -, *, / , dajemy mu 2 + 3 * 3 2 - 8 = i sobie liczy...

import java.util.*;
import java.util.Scanner;

class StosZnakow {
   private List<Character> stos_znakow = new ArrayList<Character>();
   public void push(char zn) {     // wrzucanie na stos
       stos_znakow.add(zn);
   }
   public char pop() {                // zdejmowanie ze stosu
   char s = stos_znakow.get(stos_znakow.size()-1);
       stos_znakow.remove(stos_znakow.size()-1);
   return s;
   }
}

class StosLiczb {
   private List<Double> stos_liczb = new ArrayList<Double>();
    public void push(double zn) {     // wrzucanie na stos
       stos_liczb.add(zn);
   }
   public double pop() {                 // zdejmowanie ze stosu
   double s = stos_liczb.get(stos_liczb.size()-1);
       stos_liczb.remove(stos_liczb.size()-1);
   return s;
   }
}

public class Kalkulator {

    public static void main(String[] args) throws Exception {
        System.out.println("Podaj formule: ");

        StosZnakow sz = new StosZnakow();
        StosLiczb sl = new StosLiczb();

        sz.push('+');
        sl.push(0);
        Scanner xxx = new Scanner(System.in);// nie ruszac!
        int flaga = 0;                                    // czy wczytano znak '='
        int ile_dzialan = 0;
        while(flaga == 0) {                           // mielimy do '='

            sl.push(xxx.nextDouble());             // liczba na stos
            char znak = xxx.next().charAt(0);    // czytam znak
            
            if (znak == '+' || znak == '-' || znak == '=') {// plusy i minusy

                if (ile_dzialan != 0) {     // zwijamy stos
                    for (int i=0; i<ile_dzialan; i++) {
                        double tmp_2 = sl.pop();  // ta byla pozniej w rownaniu
                        double tmp_1 = sl.pop();  // ta byla wczesniej w rowananiu
                        char jaki_znak = sz.pop(); // mnozenie / dzielenie
                        if (jaki_znak == '*') sl.push(tmp_2 * tmp_1);
                        if (jaki_znak == '/') sl.push(tmp_1 / tmp_2);
                    }
                ile_dzialan = 0;
                }

                char tmp_znak = sz.pop();
                double liczba_2 = sl.pop();      // ta byla pozniej w rownaniu
                double liczba_1 = sl.pop();      // ta byla wczesniej w rowananiu
                
                if(tmp_znak == '+') {sl.push(liczba_2 + liczba_1);}
                if(tmp_znak == '-') {sl.push(liczba_1 - liczba_2);}
                sz.push(znak);
                
            }

            if (znak == '*' || znak == '/') {      // mnozenie i dzielenie
                ile_dzialan++;                        // zwiekszamy ilosc dzialan [* , /]
                sz.push(znak);

            }


            if (znak == '^') { 
  // tutaj potrzebujemy wczytac kolejna liczbe zeby miec wykladnik
  // chcemy ja tylko zapisac gdzies do zmiennej i nie isc dalej w rownaniu na wejsciu
            }
            
            if (znak == '=') {flaga = 1;}
        } // while - flaga

    double wynik = sl.pop();
    System.out.println(wynik);

    } // main
} // kalkulator

W takim razie nic się nie da z tym już zrobić?

Może w innej klasie jest metoda, która tylko "podpatruje" następny element?

0

Moze po prostu wczytaj sobie wszystko do jakiejs kolekcji (wektor np) i sam zrob to, na czym Ci zalezy ?

0

Oczywiście, ze tak można, jednak wolałbym takie podejście, że lecimy przez całą linie wejścia i zapisujemy tylko to co jest konieczne. Znalazłem w dokumentacji w BufferedReader

http://download.oracle.com/javase/6/docs/api/

mark(int) i reset()

oraz skip(long)

I teraz tak, w jaki sposob moge zamarkowac zeby potem resetem wrocic w to miejsce (o ile w ogole dobrze rozumiem idee dzialania tych metod)

Ewentualnie czy w skip moge podac argument ujemny? skip(-1) czy wtedy wrocimi o jedna pozycje w lewo?

Dzieki

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