Vierkantsvergelijking Oplosser werkt niet

Status
Niet open voor verdere reacties.

tranceftw

Gebruiker
Lid geworden
6 apr 2009
Berichten
149
De klasse Program:

Code:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.JPanel;


public class Program
{
    private JFormattedTextField tekstveld;
    private JFrame frame;
    private JMenuBar menubalk;
    private String text;
    private String uitkomst;
   
public Program()
{
    setFrame();
}

public void setFrame()
{
    frame = new JFrame();
    JPanel p = new JPanel();
 
    JTextField tekstveld = new JTextField(20);
    p.add(tekstveld);
    frame.setContentPane(p);
    frame.setVisible(true);
    
    menubalk = new JMenuBar();
    frame.setJMenuBar(menubalk);
    
    
    JMenuItem berekenen = new JMenuItem("Berekenen VKV!");
    berekenen.addActionListener(new ActionListener()
                                    {
                                        public void actionPerformed(ActionEvent e)
                                        {
                                            BerekenVkv();
                                        }
                                    });
                                       
    menubalk.add(berekenen);
    text = tekstveld.getText();
    
    
}

public void BerekenVkv()
{
    text.trim();
    Vkv_v2 vkv = new Vkv_v2(text);
    uitkomst = vkv.zoekNulpunten();
    System.out.println(text);
}

private String getText()
{
    return text;
}
}

De klasse Vkv_v2

Code:
public class Vkv_v2
{
    private String vergelijking;
    private String[] splittedAvgl;
    private String[] splittedBvgl;
    private String a;
    private String b;
    private String c;
    private int a2;
    private int b2;
    private int c2;
    private String split2;
    private int discriminant;

public Vkv_v2(String geefVergelijking)
{

    vergelijking = geefVergelijking;
    splittedAvgl = new String[10];
    splittedBvgl = new String[10];
    
    splitVkv();
    makeStringInt();
    zoekDiscriminant(); 
    zoekNulpunten();
    
}

public void splitVkv()
{
    String[] splittedAvgl = vergelijking.split("x²");   
    a = splittedAvgl[0];
    split2 = splittedAvgl[1];
    
    String splittedBvgl[] = split2.split("x");
    b = splittedBvgl[0];
    c = splittedBvgl[1];
}

public void makeStringInt()
{
    if(a.length() == 0 || b.length() == 0 || c.length() == 0)
    {
        checkVoorGeenGetal();
    }
    
    if(a.substring(0,1).equals("+") || b.substring(0,1).equals("+") || c.substring(0,1).equals("+"))
    {
        checkVoorPlus();
    }
    
    if(a.substring(0,1).equals("-") || b.substring(0,1).equals("-") || c.substring(0,1).equals("-"))
    {
        checkVoorGeenNegGetal();
    }
    
    if(a.length() == 0 || b.length() == 0 || c.length() == 0)
    {
        checkVoorGeenGetal();
    }

  

    a2 = Integer.parseInt(a);
    b2 = Integer.parseInt(b);
    c2 = Integer.parseInt(c);


}

public void zoekDiscriminant()
{
    int bKwadraat = b2 *  b2;
    discriminant = bKwadraat - (4 * a2 * c2);
}

public String zoekNulpunten()
{
    if(discriminant < 0)
    {
        return "Er is zijn geen nulpunten want de discriminant is negatief(" + discriminant + ")!";
    }
    
    else if(discriminant == 0)
    {
        int x1;
        int x2;
        x1 = (-b2 + discriminant) / (2*a2);
        return "Er is één nulpunt: " + x1 + ".";
    }
    
    else
    {
        double dVierkantswortel = Math.sqrt(discriminant);
        
        double x1;
        double x2;
        
        x1 = (-b2 + dVierkantswortel) / (2*a2);
        x2 = (-b2 - dVierkantswortel) / (2*a2);
    
        return "Er zijn twee nulpunten: " +x1 + " en " + x2 + "!";
}
}
    
public void checkVoorPlus()
{


    if(a.substring(0,1).equals("+"))
    {
        a = a.substring(1);
    }
    if(b.substring(0,1).equals("+"))
    {
        b = b.substring(1);
    }
     if(c.substring(0,1).equals("+"))
    {
        c = c.substring(1);
    }   


}

public void checkVoorGeenGetal()
{
    if(a.length() == 0)
        {
            a = "1";
        }
        
         if(b.length() == 0)
        {
            b = "1";
        }
        
         if(c.length() == 0)
        {
            c = "1";
        }
    }
    
public void checkVoorGeenNegGetal()
{
    if(a.substring(0,1).equals("-"))
    {
        a = "-1";
    }
    if(b.substring(0,1).equals("-"))
    {
        b = "-1";
    }
     if(c.substring(0,1).equals("-"))
    {
        c = "-1";
    }   
    
       

}
}

Ok, allebei de klassen compileren, maar als ik het uitvoert, geef hij een hele reeks foutmeldingen nadat ik de vkv in gegeven heb en op 'Bereken' heb geklikt.

Ik weet dat de code van Vkv_v2 niet zo goed is en dat er een paar dezelfde stukken code in zitten, maar daar nu even niet op letten aub. Kben nog maar een beginnend programmeur en het is de eerste keer dat ik een programma uitvoer zonder Bluej. (Op een paar simpele programmatjes na natuurlijk.)

Het boek waarmee ik leer programmeren is programmeren in Java met Bluej, een boek dat jullie waarschijnlijk wel kennen.

Ik hoop dat jullie mij kunnen helpen zodat het programma wel uitgevoerd kan worden.

Alvast bedankt voor alle hulp die misschien komt.
 
Misschien is het handig om er bij te vermelden welke foutmeldingen waar voorkomen. Dat scheelt ons een hoop zoekwerk ;)
 
Code:
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 1
	at Vkv_v2.splitVkv(Vkv_v2.java:33)
	at Vkv_v2.<init>(Vkv_v2.java:22)
	at Program.BerekenVkv(Program.java:53)
	at Program$1.actionPerformed(Program.java:40)

Wat is een ArrayIndexOutOfBoundsException?
Java API: http://www.j2ee.me/javase/6/docs/api/java/lang/ArrayIndexOutOfBoundsException.html : "Thrown to indicate that an array has been accessed with an illegal index. The index is either negative or greater than or equal to the size of the array."

De exception werd gegooid op lijn 33 in Vkv_v2.java:
Code:
31		String[] splittedAvgl = vergelijking.split("x²");   
32		a = splittedAvgl[0];
33		split2 = splittedAvgl[1];
maw, er is geen element 1 in de array splittedAvgl.
Als je nagaat waarom, zal je zien dat vergelijking leeg is. Vergelijking wordt ingesteld in de constructor, dat is goed. Je zal het dus moeten zoeken bij de waarde die wordt meegegeven vanuit Program:
Code:
Vkv_v2 vkv = new Vkv_v2(text);
Aha, text is hier leeg.

Kijk eens waar text ingesteld wordt? Gebeurt dat wanneer je op de knop klikt? ;)
 
m.a.w. ik moet binnen de inwendige klasse voor hij BerekenVkv() uitvoert, zetten dat

text = tekstveld.getText();

Echter als ik dit probeert zeg hij het volgende:

local variable tekstveld is accessed from withing innier class; needs to be declared final

Hieronder het stuk code waarbij hij dat zegt.

Code:
   JMenuItem berekenen = new JMenuItem("Berekenen VKV!");
    berekenen.addActionListener(new ActionListener()
                                    {
                                        public final void actionPerformed(ActionEvent e)
                                        {
[U]                                            text = tekstveld.getText();[/U]
                                            BerekenVkv();
                                        }
                                    });
 
Code:
public void setFrame()
{
    frame = new JFrame();
    JPanel p = new JPanel();
 
    final JTextField tekstveld = new JTextField(20);
    p.add(tekstveld);
    frame.setContentPane(p);
    frame.setVisible(true);
    
    menubalk = new JMenuBar();
    frame.setJMenuBar(menubalk);
    
    
    JMenuItem berekenen = new JMenuItem("Berekenen VKV!");
    berekenen.addActionListener(new ActionListener()
                                    {
                                        public final void actionPerformed(ActionEvent e)
                                        {
                                            text = tekstveld.getText();
                                            BerekenVkv();
                                        }
                                    });
                                       
    menubalk.add(berekenen);
    
    
}

Ok, ik krijg nu al geen foutmeldingen meer :-) Alleen als ik nu doe: Bereken Vkv dan opent gewoon het terminal window van bluej en print hij de Vkv die ik ingegeven heb.
Ik ga dit even uitzoeken en als het me niet lukt, hoor je het wel.

Alvast bedankt om de vorige vraag op te lossen!
 
Code:
public void BerekenVkv()
{
    text.trim();
    Vkv_v2 vkv = new Vkv_v2(text);
    uitkomst = vkv.zoekNulpunten();
    System.out.println(uitkomst);
}

Ok, dit was wel erg dom van me... Bij System.out.println stond er tussen de haakjes 'text' in plaats van 'uitkomst'.
 
OK, bedankt voor de hulp allemaal!

Even voor de geïnteresseerden: Dit is wat de code uiteindelijk geworden is:
(aan de klasse vkv ga ik nog wat werken want die is allesbehalve netjes en in de klasse Program ga ik wat extra methodes maken zodat er niet teveel in één methode staat.

Program:

Code:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.JPanel;


public class Program
{
    private JFrame frame;
    private JMenuBar menubalk;
    private String text;
    private String finaluitkomst;
   

public static void main (String[] args)
{
    Program program = new Program();
    program.setFrame();
}

public void setFrame()
{
    frame = new JFrame();
    
    JPanel p = new JPanel();

    JLabel welkom = new JLabel("Welkom in deze Vierkantsvergelijkingsoplosser!");
    p.add(welkom);
    
    final JTextField tekstveld = new JTextField(20);
    p.add(tekstveld);
    frame.setContentPane(p);

    
    menubalk = new JMenuBar();
    frame.setJMenuBar(menubalk);
    
    JMenuItem afsluiten = new JMenuItem("Afsluiten");
    afsluiten.addActionListener(new ActionListener()
                                {
                                    public void actionPerformed(ActionEvent e)
                                    {
                                        afsluiten();
                                    }
                                });
    menubalk.add(afsluiten);
    
    final JLabel uitkomst = new JLabel("U heeft nog geen Vkv laten oplossen!");
    p.add(uitkomst);
    
    
    JMenuItem berekenen = new JMenuItem("Berekenen VKV!");
    berekenen.addActionListener(new ActionListener()
                                    {
                                        public final void actionPerformed(ActionEvent e)
                                        {
                                            
                                            text = tekstveld.getText();
                                            int indexTextXX = text.indexOf("x²");
                                            int indexTextX = text.indexOf("x");
                                            
                                            if(text.length() == 0)
                                            {
                                                uitkomst.setText("U heeft geen vkv ingegeven!");
                                                            }
                                                            
                                            else if(indexTextXX != -1 || indexTextX != -1)
                                            {
                                                BerekenVkv();
                                                uitkomst.setText(finaluitkomst);
                                            }
                                   
                                            else
                                            {
                                                uitkomst.setText("<html>Uw Vkv is van de verkeerde vorm of is helemaal geen Vkv." 
                                                                    + "<br />Uw vkv moet van de vorm ax²+bx+c zijn!</html>");

                                         
                                        }
                                        }
                                    });
                                       
    menubalk.add(berekenen);
    frame.setSize(400,200);
    frame.setVisible(true);

    
    
    
}

public void BerekenVkv()
{
    text.trim();
    Vkv_v2 vkv = new Vkv_v2(text);
    finaluitkomst = vkv.zoekNulpunten();
    // System.out.println(uitkomst);
    
}

private String getText()
{
    return text;
}

public void afsluiten()
{
    System.exit(0);
}
}


Vkv_v2

Code:
public class Vkv_v2
{
    private String vergelijking;
    private String[] splittedAvgl;
    private String[] splittedBvgl;
    private String a;
    private String b;
    private String c;
    private int a2;
    private int b2;
    private int c2;
    private String split2;
    private int discriminant;

public Vkv_v2(String geefVergelijking)
{

    vergelijking = geefVergelijking;
    splittedAvgl = new String[10];
    splittedBvgl = new String[10];
    
    splitVkv();
    makeStringInt();
    zoekDiscriminant(); 
    zoekNulpunten();
    
}

public void splitVkv()
{
    String[] splittedAvgl = vergelijking.split("x²");   
    a = splittedAvgl[0];
    split2 = splittedAvgl[1];
    
    String splittedBvgl[] = split2.split("x");
    b = splittedBvgl[0];
    c = splittedBvgl[1];
}

public void makeStringInt()
{
    if(a.length() == 0 || b.length() == 0 || c.length() == 0)
    {
        checkVoorGeenGetal();
    }
    
    if(a.substring(0,1).equals("+") || b.substring(0,1).equals("+") || c.substring(0,1).equals("+"))
    {
        checkVoorPlus();
    }
    
    if(a.substring(0,1).equals("-") || b.substring(0,1).equals("-") || c.substring(0,1).equals("-"))
    {
        checkVoorGeenNegGetal();
    }
    
    if(a.length() == 0 || b.length() == 0 || c.length() == 0)
    {
        checkVoorGeenGetal();
    }

  

    a2 = Integer.parseInt(a);
    b2 = Integer.parseInt(b);
    c2 = Integer.parseInt(c);


}

public void zoekDiscriminant()
{
    int bKwadraat = b2 *  b2;
    discriminant = bKwadraat - (4 * a2 * c2);
}

public String zoekNulpunten()
{
    if(discriminant < 0)
    {
        return "Er is zijn geen nulpunten want de discriminant is negatief(" + discriminant + ")!";
    }
    
    else if(discriminant == 0)
    {
        int x1;
        int x2;
        x1 = (-b2 + discriminant) / (2*a2);
        return "Er is één nulpunt: " + x1 + ".";
    }
    
    else
    {
        double dVierkantswortel = Math.sqrt(discriminant);
        
        double x1;
        double x2;
        
        x1 = (-b2 + dVierkantswortel) / (2*a2);
        x2 = (-b2 - dVierkantswortel) / (2*a2);
    
        return "Er zijn twee nulpunten: " +x1 + " en " + x2 + "!";
}
}
    
public void checkVoorPlus()
{


    if(a.substring(0,1).equals("+"))
    {
        a = a.substring(1);
    }
    if(b.substring(0,1).equals("+"))
    {
        b = b.substring(1);
    }
     if(c.substring(0,1).equals("+"))
    {
        c = c.substring(1);
    }   


}

public void checkVoorGeenGetal()
{
    if(a.length() == 0)
        {
            a = "1";
        }
        
         if(b.length() == 0)
        {
            b = "1";
        }
        
         if(c.length() == 0)
        {
            c = "1";
        }
    }
    
public void checkVoorGeenNegGetal()
{
    if(a.substring(0,1).equals("-"))
    {
        a = "-1";
    }
    if(b.substring(0,1).equals("-"))
    {
        b = "-1";
    }
     if(c.substring(0,1).equals("-"))
    {
        c = "-1";
    }   
    
       

}
}

Bedankt voor jullie hulp
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan