WCM Forum

WCM Forum (http://www.wcm.at/forum/index.php)
-   Programmierung (http://www.wcm.at/forum/forumdisplay.php?f=17)
-   -   [java] koordinatenpaare als string einlesen (http://www.wcm.at/forum/showthread.php?t=120410)

poison 02.01.2004 14:12

ok ich habe das ganze mal ein bisschen überarbeitet:

Code:

import eprog.*;

public class Konvneck extends EprogIO
{
    public static void main (String[] args)
    {
        einlesen ();
    }
   
    /////////////////////////
    // Methode zum Einlesen//
    ////////////////////////
   
    private static void einlesen()
    {
        String Eingabe = "";
        char tmp;
        float Zahl = 0;
       
        do
        {Eingabe = readWord();
        char Zeichen[] = Eingabe.toCharArray();
       
        for (int i = 0; i <= Zeichen.length; i++)
        {
            tmp = Zeichen[i];
           
            if ( (Character.isDigit(tmp)) || (tmp == '-') ) // Soll überprüfen ob Zeichen eine Zahl ist
            {
                StringBuffer Zahlen = new StringBuffer(tmp);
                Zahlen.append (tmp);               
                Zahl = Float.parseFloat(Zahlen.toString());
                println (Zahl);
            }
        }
    } while (!(Eingabe.endsWith("=")));
   
    }
}

jetzt gibt es ein paar probleme:
das - darf ich ja nicht in den string speichern weil der dann umgewandelt wird in einen float -> das brauch ich aber weil es ja sonst eine ganz andere zahl ist!

außerdem nimmt er immer nur eine Zahl an -> also wenn ich eine kommazahl eingebe z.b 3.4 dann nimmt er 3 als zahl an und 4 als einzelne zahl an -> wie kann ich das ändern!

ich danke euch schon mal für eure hilfe!

mfg poison

Tarjan 02.01.2004 14:31

mach noch zusätzlich eine abfrage || (tmp == '.'), dann wird . dazu gespeichert

poison 02.01.2004 14:54

leider funktioniert das so nicht -> es tritt das gleiche problem wie beim -

wenn ich z.b. (3.4,5) eingebe macht er folgende fehlermeldung
(3.4,5)
java.lang.NumberFormatException: For input string: "."
at java.lang.NumberFormatException.forInputString(Num berFormatException.java:48)
at java.lang.FloatingDecimal.readJavaFormatString(Flo atingDecimal.java:1207)
at java.lang.Float.parseFloat(Float.java:222)
at Konvneck.einlesen(Konvneck.java:42)
at Konvneck.main(Konvneck.java:15)
Exception in thread "main" 7
3.0


außerdem bin ich gerade draufgekommen kann ich nicht mehr als ein koordinatenpaar einlesen dann macht er folgende fehlermeldung:
eingabe: (3,4) (5,6)

3.0
4.0
java.lang.ArrayIndexOutOfBoundsException: 5
at Konvneck.einlesen(Konvneck.java:35)
at Konvneck.main(Konvneck.java:15)
Exception in thread "main"

was muss ich hier machen?

mfg poison

Tarjan 02.01.2004 17:56

der fehler beim konvertrieren liegt darin, dass du jede char gleich in eine float umwandelst, erst umwandeln, wenn wieder ein anderes zeichen als -,. oder zahl kommt (also die umwandlungsroutine in den else zweig stecken:
Code:

StringBuffer zahlen = new Stringbuffer();
if ( Character.isDigit(tmp) || tmp=='-' || tmp=='.')
{
  zahlen.append (tmp);               
}
else if (zahl.length()!=0)
{
  zahl = Float.parseFloat(zahlen.toString());
  println (Zahl);
}

übergibts du die zweite koordinate als zweiten parameter? dann liegt die zweite koordinate auch in args[1] und nicht mehr in args[0]

ps: java Konvention ist, dass variablennamen klein geschrieben werden, genauso wie methoden und packages, nur klassennamen werden groß geschrieben

pps: den code oben habe ich nicht überprüft, nur so aus dem stegreif geschrieben ;)

jak 02.01.2004 18:54

Mir ist gerade eine andere möglichkeit eingefallen:
Du suchst im String nach "(" und ")", machst
String[] temp=input.substring(klammeraufposition,klammerzup osition).split(",",2);
Damit hast du ein String[] temp
float f;
for (int i=0;i<temp.length;i++){
try{
f=Float.parseFloat(temp[i])
//mach irgendetwas mit f
}
catch (NumberFormatException e){}
}

Durch das parseFloat spart man sich das ganze suchen nach .,-,usw.

Jak

Tarjan 02.01.2004 19:15

das ist mein 2. Vorschlag oben gewesen

jak 02.01.2004 19:42

Sorry, hab ich übersehen.
dein 2.Vorschlag würde wohl etwa so aussehen.
Code:

float xKoord,yKoord;
//Hier muss noch irgendeine Überprüfung her, sonst könnte es eine Endlosschleife werden
while (input.length>1){
 String t=input.substring(input.indexOf('(')+1,input.indexOf(')')-1);
 try{
  xKoord=Float.parseFloat(t.substring(0,t.indexOf(',')-1));
  yKoord=Float.parseFloat(t.substring(t.indexOf(',')+1,t.length));
 }
 catch (NumberFormatException e){
  throw new IllegalArgumentException("Ungueltiges Eingabeformat");
 }
 //irgendwas mit xKoord und yKoord machen
 input=input.substring(input.indexOf(')')+1,input.length);
}

Jak

poison 02.01.2004 20:07

hallo jak!

danke für deinen vorschlag, aber jetzt habe ich mich schon so lange mit tarjans version herumgeschlagen - werd jetzt dabei bleiben

ich glaube es gibt ein kleines problem mit der else if abfrage - das ganze wird zwar jetzt ohne fehler kompiliert aber wenn ich versuche etwas einzugeben macht er gar nichts... :(

Code:

import eprog.*;

public class Konvneck extends EprogIO {
    public static void main(String[] args) {
        einlesen();
    }
   
    /////////////////////////
    // Methode zum Einlesen//
    /////////////////////////
   
    private static void einlesen() {
        String eingabe = "";
        char tmp;
        float zahl = 0;

        do {
            eingabe = readWord();
            char zeichen[] = eingabe.toCharArray();
           
            for (int i = 0; i < zeichen.length; i++)
            {
                tmp = zeichen[i];
                StringBuffer zahlen = new StringBuffer();
               
                if ( (Character.isDigit(tmp)) || (tmp == '-') || (tmp == '.') )
                {
                    zahlen.append(tmp);
                }
               
                else if (zahlen.length()!= 0)
                {
                zahl = Float.parseFloat(zahlen.toString());
                println(zahl);
                }
            }
        } while (!(Eingabe.endsWith("=")));
    }
}

mfg poison

Tarjan 02.01.2004 21:27

habs mir angesehen, die zeile StringBuffer zahlen = new StringBuffer(); gehört vor die for schleife, ansonsten wird der stringbuffer immer wieder neu angelegt, so sollte es funktionieren:
Code:

                        StringBuffer zahlen = new StringBuffer();
                        for (int i = 0; i < zeichen.length; i++)
                        {
                                tmp = zeichen[i];
                               
                               
               
                                if ( (Character.isDigit(tmp)) || (tmp == '-') || (tmp == '.') )
                                {
                                        zahlen.append(tmp);
                                }
               
                                else if (zahlen.length()!=0)
                                {
                                        zahl = Float.parseFloat(zahlen.toString());
                                        System.out.println(zahl);
                                        zahlen = new StringBuffer();
                                }
                        }


Tarjan 02.01.2004 21:40

noch eine zusätzliche frage: welchen editor beutzt du eigentlich zum erstellen der klassen?


Alle Zeitangaben in WEZ +2. Es ist jetzt 13:16 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
© 2009 FSL Verlag