Odczyt z pliku liczb i operatorów

0

Witam,

Mam zadanie by program czytał z pliku tekstowego liczby oraz operator czy to + czy - plik wejściowy jest w formacie takim, że w jednym wierszu jest dokładnie tylko 1 liczba lub operator.
W pliku wynikowym ma być zapisane całe działanie WRAZ Z WYNIKIEM, tyle że to wszystko ma być już w 1 linii. Po wrzuceniu zawartości pliku do Stringa nie wiem za bardzo jak mam zrobić dalszą część zadania. Ogólnie funkcje dodawania, mnożenia itp. mam już zdefiniowane w programie (prosty kalkulator). Co zrobić by liczby były widziane jako liczby, a + czy - jako funkcje które wykonują działania na tych wpisanych liczbach?

torchę kodu, który wyświetla zawartość stringa z pliku wejściowego:

JFileChooser chooser = new JFileChooser();
      
        chooser.setCurrentDirectory(new File ("."));
        int result = chooser.showOpenDialog(jPanel1);
        if (result == JFileChooser.APPROVE_OPTION){
            File file = chooser.getSelectedFile();
            String nazwaPliku=file.getName();
            
            try {
                FileInputStream fis = new FileInputStream(nazwaPliku);
                    bajt = fis.read();
                    
               while(bajt != -1){
                   plikwe+=(char)bajt;
                   bajt=fis.read();
                  
         
                    
                    
                }
                    System.out.print(plikwe);
                    
                    fis.close();
            }
         
            catch (IOException ex){
                System.out.println("Nie udało się odczytać danych: "+ex);
            }
0

Po pierwsze źle czytasz, powinieneś czytać wierszami, np tak:

try
{
     BufferedReader in=new BufferedReader (new FileReader(file));
     while (in.ready())
     {
           String s=in.readLine();
           //tutaj konwersja s na liczbę, jeżeli się nie powiedzie, to zakładamy, że s jest znakiem "+" lub "-"
     }
     in.close();
}
catch(Exception e)
{
      JOptionPane.showMessageDialog(c,e.getMessage(),"",JOptionPane.INFORMATION_MESSAGE);
}

Po drugie, przekazałeś za mało informacji o zawartości pliku:

  • typ liczb (int, double)
  • czy przed każdym wierszem z liczbą jest wiersz ze znakiem,
  • czy może być kilka kolejnych wierszy ze znakiem
  • ....
0

Ja bym radził do tego lepiej użyć klasy Scanner, o wiele wygodniejsza do użycia i sprawdzania jakiego typu jest kolejna wartość na wejściu.
Więcej na :
http://4programmers.net/Java/Podstawy_skanowania_-_klasa_Scanner
oraz http://java.sun.com/j2se/1.5.0/docs/api/java/util/Scanner.html

0

Co do pliku wejściowego ma on wyglądać tak:

1
*
5.3
/
4
=

A plik wytworzony ma wyglądać tak:

1*5.3/4=1.325

Ilość liczb i działań w pliku wejściowy może się zmienić.
Jest to każdy nowy wiersz, bez żadnej dodatkowej spacji. Mają to być zmienne typu Double. Próbowałem wrzucić kolejne wiersze do tablicy stringów, oraz skonwertować string do Doubla z parzystym indeksem. Nieparzysty to ma być znak. Zatrzymałem się w punkcie, jak wykonywać działania. Założyłem, że jedna zmienna to będzie liczba "poprzednia" a druga zmienna to liczba "obecna".

try {
                FileReader fis = new FileReader(nazwaPliku);
                BufferedReader br = new BufferedReader(fis);
                boolean eof=false;
                
                    
                while(!eof){
                    for (int i = 0; i<plikwe.length;i++){
                    
                    plikwe[i]=br.readLine();
                    if(plikwe[i]==null) 
                    eof=true;
                    else 
                    System.out.print(plikwe[i]);
                 
               
                    
                    }     
                    
                }
                  
                
                for( int i = 0;i<plikwe.length;i++){
                    
                    if (i%2 != 1){
                        Double.parseDouble(plikwe[i]);
                    }
                }
                
                
                
                for (int i = 0;i < plikwe.length;i++){
                    if (i%2 == 1){
                        
                        if(plikwe[i]=="+"){
                            przetworzDzialanie2("+"); //tu funkcja która działa poprawnie dla JButtonów i JTextField
                            
                        }
                        if(plikwe[i]=="-"){
                            przetworzDzialanie2("-");
                        }
                        
                        if(plikwe[i]=="*"){
                            przetworzDzialanie2("*");
                        }
                        
                        if(plikwe[i]=="/"){
                            przetworzDzialanie2("/");
                        }
                    }
                    
                    
                    
                }
                
                
                for (int i=0;i<plikwe.length;i++){
                    
                    if(i%2 !=1 ){
                    String a=plikwe[i];
                    double b=Double.parseDouble(a);
                    } 
                }
                    for (int k=2;k<plikwe.length;k++){
                        
                        if(k%2 !=1 ){
                        String c=plikwe[k];
                        double l=Double.parseDouble(c);
                        }
                    }
                
                
                  String a=plikwe[0];
                  double b=Double.parseDouble(a);
                  String c=plikwe[2];
                  double d=Double.parseDouble(c);
        
                  double wynik=b+d;
                  
                System.out.print("\n\n"+wynik); //by sprawdzić czy w ogóle działa
                
                    br.close();
            } 

Czy ktoś ma pomysł jak to rozwiązać?

0
catch (IOException ex){
                System.out.println("Nie udało się odczytać danych: "+ex);
            }

P.S. nie dokleiło się :P

0

Jeżeli działania będą wykonywane tak jak napisałeś (nowaWartość = staraWartość operator odczytanaLiczba), to plik

2
+
3
*
4
=

wygeneruje nieprawdziwy napis

2+3*4=20

Tak ma być?

0

Ja mam u siebie zanotowane, że w pliku wynikowym ma być ostatnie działanie z wynikiem. Więc chyba

3*4=12

Na wszelki wypadek dobrze by było jakby też wszystkie liczby brał pod uwagę.

0

W pliku wynikowym ma być zapisane całe działanie WRAZ Z WYNIKIEM

1
*
5.3
/
4

A plik wytworzony ma wyglądać tak:
1*5.3/4=1.325

A dla

2
+
3
*
4
=

ma być

3*4=12

Ja się poddaję, nie mogę pojąć co ten program ma robić.

0

Mój znajomy mówi inaczej - że niby całe działanie z wynikiem, ja mam zapisane, że ostatnie działanie. Muszę zrobić większy wywiad środowiskowy :)

0

Dowiedziałem się, że ma to być taki wynik jak się wpisuje po kolei. Kolejność działań nie jest ważna. Wynik działania 2 liczb jest tak jakby pamiętany.

2
+
3
*
4
=

ma dać wynik 20 :)

0

Ja bym to zrobił mniej więcej tak (nie sprawdzałem działania):

StringBuffer result=new StringBuffer("");
double wynik=0.0;
int wiersz=1;
char dzialanie='+';
double liczba=0.0;
boolean done=false;
try
{
     BufferedReader in=new BufferedReader (new FileReader(f));
     while (!done && in.ready())
     {
           String s=in.readLine();
           result.append(s);
           if(wiersz%2==1) //wiersz nieparzysty z liczbą
           {
               liczba=Double.parseDouble(s);
               switch(dzialanie)
               {
                   case '+':
                       wynik+=liczba;
                       break;
                   case '-':
                       wynik-=liczba;
                       break;
                   case '*':
                       wynik*=liczba;
                       break;
                   case '/':
                       wynik/=liczba;
                       break;
                   case '=':
                       result.append(""+wynik);
                       done=true;
                       break;
               }
               wiersz++;
           }
           else //wiersz parzysty z operatorem
           {
               dzialanie=s.charAt(0);
           }
     }
     in.close();
}
catch(Exception e)
{
      //jakiś komunikat o błędzie
}
0

Hmm, z tego co zauważyłem, to program daje wynik taki, jaki jest w pierwszym wierszu pliku tekstowego. Jest ona zamieniana na Double np. do pliku wpisałem 5 to w wyniku pojawia mi się 5.0 - nie dokonuje żadnych obliczeń.

0

Już sobie poradziłem :) wiersz++ wystarczyło przenieść za warunek else. Wielkie dzięki bo.

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