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 21:52

@tarjan

ich benütze netbeans

jetzt gibt er wieder etwas aus nur das problem ist dabei, dass er wenn ich z.b. (3,4) eingebe er mir folgendes ausgibt
3.0
34.0

danke auf jeden fall für deine hilfe bisher! :)

mfg poison

Tarjan 02.01.2004 22:00

hmm, seltsam, ich habe deine lesemethode jetzt nachgebildet, und bei mir kommt der 1 nicht vor. schon mal das programm debugt? ich fragte eben wegen der möglichkeit des debuggens, da sehe ich meist solche fehler wie zb. das mit dem stringbuffer.

poison 03.01.2004 19:52

ok ich habe mich jetzt ein wenig gespielt mit dem ganzen und jetzt funktioniert auch das einlesen eines koordinatenpaares -> nur bei mehreren gibt es probleme

wenn ich z.b. eingebe (3,4) (4,5)= gibt er folgende fehlermeldung aus:
java.lang.StringIndexOutOfBoundsException: String index out of range: -1
at java.lang.String.substring(String.java:1444)
at Konvneck.einlesen(Konvneck.java:31)
at Konvneck.main(Konvneck.java:15)
Exception in thread "main"

das erscheint für mich auch klar weil ein substring ja bei einem leerzeichen endet -> nur wie kann ich dem jetzt entgegen wirken?

außerdem wie kann ich die ganzen gewonnen zahlen speichern um mit ihnen weiterzuarbeiten... ein array geht ja mal nicht weil es ja eine vorgegebene größe haben muss -> die weiß ich ja aber nicht!

Code:

import eprog.*;

public class Konvneck extends EprogIO
{
    public static void main(String[] args)
    {
        einlesen();
    }
   
    /////////////////////////
    // Methode zum Einlesen//
    /////////////////////////
   
    private static void einlesen()
    {
        float xKoord, yKoord;
        String input = ""; // dieser String enthält die Eingabe
        int counter = 0; // zum Zählen der Koordinatenpaare
       
        do
        {
            input = readWord();
            String teil = input.substring(input.indexOf('(')+1, input.indexOf(')'));
           
            try
            {
                xKoord=Float.parseFloat(teil.substring(0, teil.indexOf(',')));
                yKoord=Float.parseFloat(teil.substring(teil.indexOf(',')+1, teil.length()));
                println (xKoord);
                println (yKoord);
                counter++;
                println (counter);
            }
           
            catch (NumberFormatException e)
            {
                throw new IllegalArgumentException("FALSCHE EINGABE");
            }
           
            if ( (xKoord < -100) || (xKoord > 100) || (yKoord < -100) || (yKoord > 100) )
            {
                println ("FALSCHE EINGABE");
            }

        } while (!(input.endsWith("=")));
       
        if ( (counter < 3) || (counter > 15) )
        {
            println ("FALSCHE EINGABE");
        }
    }
}

mfg poison

jak 03.01.2004 20:32

@ 1.Problem:
Befrage deinen debugger. Breakpoints sind meistens hilfreich.
@2.
Möglichkeit 1:
Array, befor du etwas reinschreibst schaust du ob es voll ist, wenn es voll ist kopierst du das alte Array in ein doppelt so großes
Möglichkeit 2:
Hashtable
Möglichkeit 3:
LinkedList
...

Jak

poison 03.01.2004 21:08

ich habe schon versucht das problem mit dem debugger zu beheben leider finde ich trotzdem den fehler nicht... :(

mfg poison

Tarjan 04.01.2004 01:32

ArrayList ist das naheliegendes, arbeitet wie ein Array, nur ist variabel.

Der Fehler tritt beim Substring auf, da anscheinend indexOf -1 zurückliefert, d.h. er findet den gesuchten char nicht mehr im String -> Lösung: indexOf vorher feststellen, und danach erst substring mit if bedingung:


Code:

int index1 = input.indexOf('(');
int index2 = input.indexOf(')');
if (index1 != -1 && index2 > index 1)
  String teil = input.substring(index1+1, index2);

ps: obejktorientierter ist es, eine ethode zu haben, die aus einen (x,y) ein koordinatenpaar extrahiert, und diese wird von einer anderen methode benutzt

poison 04.01.2004 22:43

danke für deine hilfe! :)

also das mit dem einlesen ist nun kein problem mehr -> dafür kann ich das ganze nicht zu einer methode mit rückgabewert machen (was in diesem fall wohl sinnvoll wäre)

mein rückgabewert sollte der Punkt mit x- und y-Koordinate sein

was ist daran falsch?

Code:

    private static Point2D.Float einlesen()
    {
        float xKoord, yKoord;
        String input = ""; // dieser String enthält die Eingabe
        int counter = 0; // zum Zählen der Koordinatenpaare
       
        do
        {
            input = readWord();
           
            int index1 = input.indexOf('(');
            int index2 = input.indexOf(')');
           
            if ( (index1 != -1) && (index2 > index1))
            {
                String teil = input.substring(index1+1, index2);
               
                try
                {
                    xKoord=Float.parseFloat(teil.substring(0, teil.indexOf(',')));
                    yKoord=Float.parseFloat(teil.substring(teil.indexOf(',')+1, teil.length()));
                    Point2D.Float punkt = new Point2D.Float(xKoord, yKoord);
               
                    if ( (xKoord < -100) || (xKoord > 100) || (yKoord < -100) || (yKoord > 100) )
                    {
                        println ("FALSCHE EINGABE");
                    }
                   
                    counter++;
                   
                    if ( (counter < 3) || (counter > 15) )
                    {
                        println ("FALSCHE EINGABE");
                    }
                }
           
                catch (NumberFormatException e)
                {
                    throw new IllegalArgumentException("FALSCHE EINGABE");
                }
            }
        } while (!(input.endsWith("=")));
       
        return Point2D.Float;
    }

die fehlermeldung:
Konvneck.java [67:1] variable xKoord might not have been initialized
return new Point2D.Float(xKoord,yKoord);
^
Konvneck.java [67:1] variable yKoord might not have been initialized
return new Point2D.Float(xKoord,yKoord);
^
2 errors
Errors compiling Konvneck.

ich verstehe schon, dass er die variablen nicht kennt -> sie existieren ja nur im try-catch-block
nur weiß ich nicht wie ich das beheben könnte

mfg poison

Tarjan 04.01.2004 23:29

indem du die variable ausserhalb definierst
zb. vor der while schleife mit
Point2D.Float punkt = null;

und dann nur mehr innerhalb des try catch blocks
punkt = new Point2D.Float(xKoord, yKoord);

ps: gib die variable zurück, nicht die Klasse:
return punkt;

poison 04.01.2004 23:38

ok so weit so gut...

nun kann ich z.b. eine neue methode schreiben wo ich diesen punkt verwende oder?

z.b. private static void punkt
{print (punkt);}

das müsste doch funktionieren oder?
bei mir geht das nämlich wieder einmal nicht :(

mfg poison

Tarjan 04.01.2004 23:45

jo, das müsste funktionieren

]
Code:

public void neueMethode()
{
 Point2D.Float p = einlesen();

 ... arbeite weiter mit p...
}

ps: was ist das eigentlich für eine aufgabe, da gibs nämlich jemander der für genau das gleiche beispiel eine lösung sucht ;)


Alle Zeitangaben in WEZ +2. Es ist jetzt 06:19 Uhr.

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