Warnung bei Liste

massengrab

Grünschnabel
Hey Leute

Bin neu hier im Forum und kenne mich bei Java nicht so gut aus. Ich kann etwas C programmieren und wollte ein Programm, das ich in C habe, in Java schreiben.
Das Programm berechnet quadratische Gleichungen der Form ax^2 + bx + c = 0.
Es berechnet und speichert so viele bis man für a = 0 eingibt und speichert alle Eingaben inklusive Ergebnisse und Ergebnistyp (zwei reele Lösungen, imaginäre Lösung, ...) in einer Liste. Ich habe das Programm zwar zum laufen bekommen, aber es wirft immer 2 Warnungen beim kompilieren aus, die ich loswerden will.
Hier die beiden Warnungen. Falls ihr mehr wissen müsst einfach sagen. Wollte euch nicht mit dem ganzen Quellcode belästigen.
Code:
C:\Quadrgl>javac quadrgl.java -Xlint
quadrgl.java:98: warning: [unchecked] unchecked call to add(E) as a member of th
e raw type java.util.List
            list.add(new Speicher (x1, x2, a, b, c, im, re, lsgtyp));
                    ^
quadrgl.java:107: warning: [unchecked] unchecked call to <T>toArray(T[]) as a me
mber of the raw type java.util.List
        speichervar = (Speicher []) list.toArray (new Speicher [0]);
                                                 ^
2 warnings

Für Hilfe und eure Zeit, die ich verschwende, bedanke ich mich jetzt schon

Freundliche Grüße
massengrab
 

Xandro

- Mistkerl -
Moin,

so wie ich das sehe, werden die Warnungen ausgegeben, weil Du keine Generics für Deine Liste verwendest.

Kannst Du mal Code posten?

Gruß,
Xan
 

massengrab

Grünschnabel
Ok dann schick ich mal alles. Hab das ganze in 3 Quelltextdateien gepackt.
Zu erst mal meine Klasse, in der alles gespeichert wird.

Code:
public class Speicher
{
    // private Klassenvariablen
    // sind nur über Methoden zugänglich
    private double x1, x2, a, b, c, im, re;
    private Lsgtyp lsgtyp;
    
    // Konstruktor zum initialisieren der Variablen
    public Speicher (double x1, double x2, double a, double b, double c, double im, double re, Lsgtyp lsgtyp)
    {
        this.x1 = x1;
        this.x2 = x2;
        this.a = a;
        this.b = b;
        this.c = c;
        this.im = im;
        this.re = re;
        this.lsgtyp = lsgtyp;
    }
    
    public void AusgabeLoesungen (Speicher speichervar)
    {
        System.out.println("a = "+speichervar.a+" b = "+speichervar.b+" c = "+speichervar.c);
        switch (speichervar.lsgtyp)
            {
                case reel1:
                    System.out.println("\nEine reelle Loesung");
                    System.out.println("x1 = "+speichervar.x1);
                    break;
                case reel2:
                    System.out.println("\nZwei reelle Loesungen");
                    System.out.println("x1 = "+speichervar.x1+" x2 = "+speichervar.x2);
                    break;
                case imag1:
                    System.out.println("\nKonjugiert komplexe Loesung");
                    System.out.println("x1 = "+speichervar.re+" + "+speichervar.im);
                    System.out.println("x2 = "+speichervar.re+" - "+speichervar.im);
                    break;
                case imag2:
                    System.out.println("\nZwei imaginäre Loesungen");
                    System.out.println("x1 = +"+speichervar.im);
                    System.out.println("x2 = -"+speichervar.im);
                    break;
            }
    }
}

Dann die Definition meines enum-Typs

Code:
public enum Lsgtyp {reel1, reel2, imag1, imag2;}

Und zuletzt die Programmanweisungen

Code:
import java.util.Scanner;
import static java.lang.Math.*;
import java.util.ArrayList;
import java.util.List;


public class quadrgl
{
    public static void main(String[] args)
    {
        //Variablen für die Eingabe
        double a, b, c;
        //Variablen für Zwischenrechnungen
        double p, q, d, dw;
        //Variablen für Ergebnisse
        double x1=0, x2=0, im=0, re=0;
        Lsgtyp lsgtyp;
        //Liste zum Zwischenspeichern der Werte bis bekannt ist wie groß das Speicherarray sein muss
        List list = new ArrayList ();
        //Speicherarray
        Speicher [] speichervar;
        //Variable zum Einlesen
        Scanner scanner = new Scanner(System.in);
        //Zählvariable
        int i=0;
        
        System.out.println("Dieses Programm loest eine quadratische Gleichungen der Form ax^2+bx+c=0\n");
        System.out.println("Die Berechnungen koennen mit der Eingabe a=0 abgebrochen werden");
        //a einlesen
        System.out.print("\nBitte geben Sie a ein: ");
        a = scanner.nextDouble();
        while (a!=0)
        {
            //b und c einlesen
            System.out.print("Bitte geben Sie b ein: ");
            b = scanner.nextDouble();
            System.out.print("Bitte geben Sie c ein: ");
            c = scanner.nextDouble();
            //Zwischenwerte p, q, d berechnen
            p=b/a;
            q=c/a;
            d=(p/2.0)*(p/2.0)-q;
            
            //Kriterium ob Lösung reel oder imaginär ist
            //d>0 oder d=0 -> reel; d<0 -> imaginär
            if (d>0.0)
            {
                //reelle Lösungen berechnen und Ergebnisse ausgeben
                System.out.println("\nEs gibt zwei reelle Loesungen");
		dw= sqrt(d);
		x1= -p/2.0+ dw;
		x2= +p/2.0- dw;
                lsgtyp = Lsgtyp.reel2;
                System.out.println("a = "+a+" b = "+b+" c = "+c);
                System.out.println("x1 = "+x1+" x2 = "+x2);
            }
            else
            {
                //Kriterium ob es eine reele Lösung gibt
                if (d==0)
                {
                    //reelle Lösung berechnen und ausgeben
                    System.out.println("\nEs gibt eine reele Loesung");
                    x1=-p/2;
                    System.out.println("a = "+a+" b = "+b+" c = "+c);
                    System.out.println("x1 = "+x1);
                    lsgtyp = Lsgtyp.reel1;
                }
                //Kriterium ob komplexe Lösung vorliegt
                else
                {
                    //Kriterium für konjgiert komplexe Lösung
                    if (p!=0)
                    {
                        //Konjugiert komplexe Lösung berechnen und ausgeben
                        System.out.println("\nKonjugiert komplexe Loesung");
                        im=sqrt(-d);
                        re=-p/2.0;
			System.out.println("a = "+a+" b= "+b+ " c = "+c);
			System.out.println("x1 = "+re+" + "+im);
			System.out.println("x2 = "+re+" - "+im);
                        lsgtyp = Lsgtyp.imag1;
                    }
                    //Kriterium für zwei imaginäre Lösungen
                    else
                    {
                        //Imaginäre Lösungen berechnen und ausgeben
                        System.out.println("\nEs gibt zwei imaginaere Loesungen");
                        im=sqrt(-d);
			System.out.println("a = "+a+" b = "+b+" c = "+c);
			System.out.println("x1 = +"+im);
			System.out.println("x2 = -"+im);
                        lsgtyp = Lsgtyp.imag2;
                    }
                }
            }
            //Eingaben und Ergebnisse in Liste zwischenspeichern
            list.add(new Speicher (x1, x2, a, b, c, im, re, lsgtyp));
            //a einlesen
            System.out.print("\nBitte geben Sie a ein: ");
            a = scanner.nextDouble();
            i++;
        }
        //Mit Hilfe der Liste ein genügend großes array für die Eingaben anlegen
        //speichervar = new Speicher [list.size ()];
        //Werte aus der Liste in das array kopieren
        speichervar = (Speicher []) list.toArray (new Speicher [0]);
        /*for (i=0; i<speichervar.length; i++)
        {
            speichervar [i] = (Speicher) list.get(i);
        }*/
        //Ausgabe
        System.out.println("\n\nEs wurden "+i+" Eingaben getaetigt");
        for (i=0; i<speichervar.length; i++)
        {
            System.out.println("\nDie "+(i+1)+". Eingabe lautet:");
            speichervar [i].AusgabeLoesungen (speichervar [i]);
        }
    }
}

Bei der Gelegenheit wollt ich dann noch fragen ob das "guter" Programmierstil ist. Vor allem die Klassendefinition, da das ganz neu für mich ist.
Ob die Berechnungen an sich korrekt sind hab ich noch gar nicht getestet ^^

Vielen Dank für die Hilfe
Grüsse
 
Zuletzt bearbeitet:

Navy

Freiwillige Serverwehr
Initialisier die Liste mal mit
Code:
ArrayList<double> liste = new ArrayList<double>();
.
ArrayList an sich ist nicht typensicher und speichert nur Objekte.

Kann helfen, muss aber nicht. Java liegt schon wieder zu lange hinter mir :)
 

massengrab

Grünschnabel
Vielen Dank für die schnelle Hilfe. Hat geholfen. Habs so gemacht:

Code:
ArrayList<Speicher> list = new ArrayList<Speicher>();

Wenn noch jemand sonstige Verbesserungen hat einfach sagen. Ich bin über jede Hilfe dankbar. Ist es z. B. sinnvoll das ganze in 3 Quelltextdateien zu packen oder soll ich alles in eine packen?

Grüße
 

Xandro

- Mistkerl -
Moin,

zwei Anregungen habe ich noch - die mir grad in's Auge fallen:

1.
Java:
public void AusgabeLoesungen(Speicher speichervar)
Methoden bitte immer mit kleinem Buchstaben beginnen, also:
Java:
public void ausgabeLoesungen(Speicher speichervar)
2.
Deine Speicher-Klasse ist mir etwas suspekt. Dein Konstruktor erwartete jede Menge Parameter, jedoch arbeitest Du gar nicht mit diesen.
Du erzeugst ein neues Objekt von Speicher, um dann in der Methode ausgabeLoesungen widerum mit einem anderen Speicher-Objekt zu arbeiten...
Da Du bereits einen Konstruktor hast, dem alle Kriterien (Paramater) beigefügt werden müssen, würde ich die ausgabeLoesungen ohne Parameter aufrufen und mit den Klassenvariablen arbeiten, vom eigenen Objekt, nicht von einem Neuen.
Kann aber auch sein, dass die Klasse Speicher noch ausgebaut wird und Du das noch brauchen wirst, aber im Moment erschließt sich mir nicht, wieso?
Also ... entweder einen Leerkonstruktor einfügen oder die Methode ohne Parameter aufrufen lassen.

Gruß,
Xan
 

massengrab

Grünschnabel
Erst einmal vielen Dank für die Mühe.
Ich habe mir das so gedacht, dass mit Hilfe des Konstruktors ein neues Objekt eingerichtet wird und die Variavlen initialisiert werden. ausgabeLoesungen überge ich dann die immer ein Teil meines Speicherarrays zur Ausgabe. Die Methode sieht dann nach welcher Lösungstyp vorliegt und entscheidet über den Text der ausgegeben wird. Daher habe ich gedacht, dass ich sie mit Parameter aufrufen muss. Vielleicht habe ich da etwas Grundlegendes nicht verstanden... Ich probiers mal aus wie du es vorgeschlagen hast.

Grüße