Deklarations- und Schleifenfehler

neerual

Mitglied
Hallöchen,

ich habe einen (hoffentlich fast) fertigen Code für eine Java Aplikation, bei der ich als Java Anfänger noch ein paar Fehler hab, mit denen ich nicht so richtig fertig zu werden weiß.
(Wahrscheinlich hab ich noch mehr Fehler als ich denke :D )

Hier erstmal mein Code:
Code:
class Uebung04Aufgabe1 {
    public static void main(String[] args) {
//-------------------------------------------------------------------------------------
//Ein int-Wert n wird von der Kommandozeile übernommen. Es wird geprüft, ob n > 1 gilt, wenn nicht wird eine Fehlermeldung ausgegeben und die Applikation beendet.
//-------------------------------------------------------------------------------------
        int n = Integer.parseInt(args[0]);
            if (n < 0) {
                System.out.println("n ist zu klein!");
                System.exit(0);
            } //works!!
//-------------------------------------------------------------------------------------
//Ein int-Feld der Länge n wird erzeugt und mit Zufallszahlen aus dem Bereich 1,...,n gefüllt. Das Feld wird ausgegeben.
//-------------------------------------------------------------------------------------
        int array Length = n;
        int [] x = new int[arrayLength];
        for (int i = 0; i < arrayLength; i++){
        a[i] = (int)(Math.random * arrayLength) +1;
        System.out.println(x[i]);
        }
//-------------------------------------------------------------------------------------
//Das geometrische und das arithmetische Mittel werden berechnet, dabei wird nur eine Schleife verwendet. Arithmetisches und geometrisches Mittel werden ausgegeben.
//-------------------------------------------------------------------------------------
        int a = 0;
        double b = 0;
        double y = 0;
            while (i <= n && x > 0); {
                a = 1/n * (x*i);
                y = Math.pow(x,i);
                b = Math.pow(y,1/n);
            }
//-------------------------------------------------------------------------------------
//Gilt arithmetisches Mittel größer gleich geometrisches Mittel wird "OK", sonst "WIEDERLEGT" ausgegeben.
//-------------------------------------------------------------------------------------
        System.out.println("Das arithmetische Mittel:" + a);
        System.out.println("Das geometrische Mittel:" + b);
        if (a >= b) {
            System.out.println("OK");
        }
        else {
        System.out.println("WIEDERLEGT");
        }
    }
}
Zwischen den Abschnitten steht immer, was der nächste Abschnitt machen soll; (den Kopf betrachte ich nicht als Abschnitt)

nun meine Fragen:
1. ich bin mir ziemlich sicher, dass der zweite Abschnitt, in dem ich das Felf der länge n erstelle und mit Zufallszahlen von 1 bis n fülle, immernoch nicht richtig ist. Aber ich weiß einfach nicht wie ich den Teil reperieren kann, weil ich mir was Syntax und einzelne Befehle angeht immernoch total unsicher bin, aber bis zum Abgabe-Zeitpunkt keine Zeit habe das richtig grundlegend nachzuholen.

2. da mein Feld der Länge n (int [] x) vermutlich immernoch falsch ist, kann wahrscheinlich auch die Schleife in der a und b berechnet werden nicht wirklich funktionieren.

------------
Ich möchte an sich nichts vorgesagt bekommen aber ich habe jetzt seit 4 Tagen jeden Tag an diesem Code rumgebastelt und teilweise kompllete Zeilen wieder verworfen, ich bin langsam echt verzweifelt und das obwohl die Aufgabe wahrscheinlich nicht mal schwer ist. :(:oops:
 

Flamingo

Mitglied
Schöner und noch lesbarer ist es, wenn du den Code als Java-Code formatierst.

Hast du den Code mal versucht zu compilieren?

Als erstes solltest du korrigieren, dass du ein Array x erstellst, aber dann plötzlich in ein (nicht vorhandenes) Array a deine Werte reinschreibst:
Java:
 a[i]= (int)(Math.random * arrayLength) +1;
 

JStein52

Top Contributor
1.)
Code:
        int arrayLength = n;
        int [] x = new int[arrayLength];
        for (int i = 0; i < arrayLength; i++){
        x[i] = (int)(Math.random() * arrayLength) +1;
        System.out.println(x[i]);
        }
 

Javinner

Top Contributor
Es wird geprüft, ob n > 1 gilt, wenn nicht wird eine Fehlermeldung
if (n < 0) { ob n > 1
int array Length = n;
int arrayLenght
https://de.wikibooks.org/wiki/Java_Standard:_Variablen_und_Bezeichner
int [] x = new int[arrayLength];
a = ...
int a = 0;
double b = 0;
double y = 0;
while (i <= n && x > 0); {
Variable i kommt doch garnicht vor, oder übersehe ich etwas?
Semikolon ;
Ich möchte an sich nichts vorgesagt bekommen aber ich habe jetzt seit 4 Tagen jeden Tag an diesem Code rumgebastelt und teilweise kompllete Zeilen wieder verworfen, ich bin langsam echt verzweifelt und das obwohl die Aufgabe wahrscheinlich nicht mal schwer ist
Ich empfehle dir, wenn den dein Interesse geweckt ist und du gewillt bist, Java seriös zu erlernen,
sich passende Fachliteratur zu kaufen und es von Beginn an zu lernen. So wird es eher nichts.
 

neerual

Mitglied
Vielen Dank, schonmal!

if (n < 0) { ob n > 1
Aber, wenn n > 1 ist, soll er ja einfach weiter machen und nicht die Fehlermeldung ausgeben.

Ich empfehle dir, wenn den dein Interesse geweckt ist und du gewillt bist, Java seriös zu erlernen,
sich passende Fachliteratur zu kaufen und es von Beginn an zu lernen. So wird es eher nichts.[/I]

Ich hab schon überlegt "Java ist auch eine Insel" zu kaufen, aber unser Prof hat uns davon abgeraten.

Mein Problem ist auch nicht, dass ichs schnell durch ziehen will - sondern, dass ich Anfang des Semesters 2 Wochen komplett flach lag und jetzt total hinterer hänge in mehreren Modulen.
Also ich würde gerne jede Zeile genau auseinander nehmen, aber wenn ich das mache, dann schaffe ich es nicht wöchentlich meine Aufgaben fertig zu bekommen. Deshalb bleibt mir wohl nur lerning by doing.
 

neerual

Mitglied
Ich versuche mir wirklich schon so viel hilfe zu holen wie Möglich und habe echt das Gefühl (auch dank dieses Forums) wirklich Fortschritte zu machen! Ich entscheide mich ja auch bewusst dagegen einfach meine Aufgabenstellungen zu posten und nach Lösungen zu fragen, gerade weil ich lernen und verstehen will. Deshalb poste ich auch immer, dass was ich mir bis jetzt zu der Aufgabenstellung gedacht bzw. geschrieben habe.

Deshalb danke an alle die mir hier Antworten!
 

neerual

Mitglied
Toller Prof. :confused:
Aber ehrlich, dass bleibt dir doch überlassen :)

Erstmal solltest du alle Antworten durch gehen und nach und nach die Fehler beheben.
Sein Grund war aber doch plausibel: er meinte, dass Buch wäre so dick, das würden die meisten von uns eh nie anrühren. Und dann war die Aussage, dass wir alles was wir für die Aufgaben brauchen im Skript bekommen.

Aber als nichts-könner hab ich damit ein paar Problemchen.
 

neerual

Mitglied
Also gut, ich habe mich jetzt der Fehler angenommen und mein Code sieht nun so aus:
Code:
class Uebung04Aufgabe1 {
    public static void main(String[] args) {
//-------------------------------------------------------------------------------------
//Ein int-Wert n wird von der Kommandozeile übernommen. Es wird geprüft, ob n > 1 gilt, wenn nicht wird eine Fehlermeldung ausgegeben und die Applikation beendet.
//-------------------------------------------------------------------------------------
        int n = Integer.parseInt(args[0]);
            if (n < 0) {
                System.out.println("n ist zu klein!");
                System.exit(0);
            } //works!!
//-------------------------------------------------------------------------------------
//Ein int-Feld der Länge n wird erzeugt und mit Zufallszahlen aus dem Bereich 1,...,n gefüllt. Das Feld wird ausgegeben.
//-------------------------------------------------------------------------------------
        int i = 1;
        int arrayLength = n;
        int [] x = new int[arrayLength];
            for (int i = 0; i < arrayLength; i++){
            x[i] = (int)(Math.random() * arrayLength) +1;
            System.out.println(x[i]);
            }
//-------------------------------------------------------------------------------------
//Das geometrische und das arithmetische Mittel werden berechnet, dabei wird nur eine Schleife verwendet. Arithmetisches und geometrisches Mittel werden ausgegeben.
//-------------------------------------------------------------------------------------       
        int a = 0;
        double b = 0;
        double y = 0;
            while (i <= n && x > 0); {
                a = 1/n * (x*i);
                y = Math.pow(x,i);
                b = Math.pow(y,1/n);
            }
//-------------------------------------------------------------------------------------
//Gilt arithmetisches Mittel größer gleich geometrisches Mittel wird "OK", sonst "WIEDERLEGT" ausgegeben.
//-------------------------------------------------------------------------------------
        System.out.println("Das arithmetische Mittel:" + a);
        System.out.println("Das geometrische Mittel:" + b);
            if (a >= b) {
            System.out.println("OK");
            }
            else {
            System.out.println("WIEDERLEGT");
            }
    }
}

i ist nun im 2ten Abschnitt deklariert, aber wenn ich das ganze nun compile, dann bekomme ich folgende Error:

-----------------------------------------------------------------
Uebung04Aufgabe1.java:17: error: variable i is already defined in method main(String[])
for (int i = 0; i < arrayLength; i++){
^
Uebung04Aufgabe1.java:27: error: bad operand types for binary operator '>'
while (i <= n && x > 0); {
^
first type: int[]
second type: int
Uebung04Aufgabe1.java:28: error: bad operand types for binary operator '*'
a = 1/n * (x*i);
^
first type: int[]
second type: int
Uebung04Aufgabe1.java:29: error: incompatible types: int[] cannot be converted to double
y = Math.pow(x,i);
^
Note: Some messages have been simplified; recompile with -Xdiags:verbose to get full output
4 errors
---------------------------------------------------------------
i is already defined?
ist dem so?
 

Javinner

Top Contributor
Sein Grund war aber doch plausibel: er meinte, dass Buch wäre so dick, das würden die meisten von uns eh nie anrühren. Und dann war die Aussage, dass wir alles was wir für die Aufgaben brauchen im Skript bekommen.
Aber als nichts-könner hab ich damit ein paar Problemchen.
Ist aber auch wirklich ein Schnitzel ;) Seine Aussage beruht sicherlich auf seiner Erfahrung und ich kann ihn irgendwo verstehen. Alles soll schnell und zum überfliegen einfach sein und so richtig pauken und reinknien wird eh überschätzt. Ich würde es mir jedoch holen und es wie @truesoul es angemerkt hat, als Nachschlagewerk benutzen. Ganz neben bei, eine neue Auflage ist seit Anfang November verfügbar, die 50€ sind hier gut investiert, wenn man den daran interessiert ist, Java kennenzulernen.
https://www.rheinwerk-verlag.de/java-ist-auch-eine-insel_4468/
 

neerual

Mitglied
Ist aber auch wirklich ein Schnitzel ;) Seine Aussage beruht sicherlich auf seiner Erfahrung und ich kann ihn irgendwo verstehen. Alles soll schnell und zum überfliegen einfach sein und so richtig pauken und reinknien wird eh überschätzt. Ich würde es mir jedoch holen und es wie @truesoul es angemerkt hat, als Nachschlagewerk benutzen. Ganz neben bei, eine neue Auflage ist seit Anfang November verfügbar, die 50€ sind hier gut investiert, wenn man den daran interessiert ist, Java kennenzulernen.
https://www.rheinwerk-verlag.de/java-ist-auch-eine-insel_4468/
vielleicht ist das eine Idee für ein Weihnachtsgeschenk :D
 

Flamingo

Mitglied
Du willst ja auf die einzelnen Einträge in x zugreifen. Also musst du wie beim Setzen wieder auf x(i) zugreifen.
Achtung: i sollte wieder bei 0 beginnen und in der while-Schleife auch immer um eins erhöht werden (i++) ansonsten gibt es eine Endlosschleife.
 

neerual

Mitglied
Du willst ja auf die einzelnen Einträge in x zugreifen. Also musst du wie beim Setzen wieder auf x(i) zugreifen.
Achtung: i sollte wieder bei 0 beginnen und in der while-Schleife auch immer um eins erhöht werden (i++) ansonsten gibt es eine Endlosschleife.
Hat funktioniert :p
Mein Rumpf sieht nun wie folgt aus:
Code:
//-------------------------------------------------------------------------------------
//Ein int-Feld der Länge n wird erzeugt und mit Zufallszahlen aus dem Bereich 1,...,n gefüllt. Das Feld wird ausgegeben.
//-------------------------------------------------------------------------------------
       
        int arrayLength = n;
        int [] x = new int[arrayLength];
            for (int i = 0; i < arrayLength; i++){
            x[i] = (int)(Math.random() * arrayLength) +1;
            System.out.println(x[i]);
            }
//-------------------------------------------------------------------------------------
//Das geometrische und das arithmetische Mittel werden berechnet, dabei wird nur eine Schleife verwendet. Arithmetisches und geometrisches Mittel werden ausgegeben.
//-------------------------------------------------------------------------------------       
        int i = 0;
        int a = 0;
        double b = 0;
        double y = 0;
            while (i <= n && x[i] > 0); {
                a = 1/n * (x*i);
                y = Math.pow(x,i);
                b = Math.pow(y,1/n);
            }
als Fehler gibt er mir nun aber noch folgendes aus:
Uebung04Aufgabe1.java:29: error: bad operand types for binary operator '*'
a = 1/n * (x*i);
^
first type: int[]
second type: int
Uebung04Aufgabe1.java:30: error: incompatible types: int[] cannot be converted to double
y = Math.pow(x,i);
^
Note: Some messages have been simplified; recompile with -Xdiags:verbose to get full output
2 errors

den ersten error verstehe ich nicht, warum kann ich denn da kein mal rechnen?

beim zweiten beschwert er sich ja, dass x kein double wert ist, right?
 

Flamingo

Mitglied
Das ist der gleiche Fehler wie gerade auch. x ist ein Array und Array mal Zahl geht nicht. Also wieder x(i)*i...
Der zweite Fehler ist das gleiche. x ist ein Array und damit auch kein double. Also wieder x(i).

Du willst ja immer auf den Eintrag am Index i zugreifen und damit rechnen und eigentlich nie mit dem ganzen Array etwas machen.
 

neerual

Mitglied
So, es ist fertig und funktioniert; ein großer fehler war auch noch, dass ich ein völlig falsch platziertes ; hatte, wodurch er in einer endlosschleife stecke!

Wenn ihr möchtet, poste ich den fertigen code nochmal.

Ansonsten viel, vielen dank für eure ganzen Tipps und Hilfen.
 

Javinner

Top Contributor
neerual hat gesagt.:
Wenn ihr möchtet, poste ich den fertigen code nochmal.
Das liegt in deinem Interesse. Gerade als Anfänger lege ich dir ans Herz, das Endergebnis schön ordentlich zu posten, den eins ist sicher: am Anfang gibt es viel zu verbessern! Ist keine Schande ;)
 

neerual

Mitglied
Das liegt in deinem Interesse. Gerade als Anfänger lege ich dir ans Herz, das Endergebnis schön ordentlich zu posten, den eins ist sicher: am Anfang gibt es viel zu verbessern! Ist keine Schande ;)
Code:
class Uebung04Aufgabe1 {
    public static void main(String[] args) {
//-------------------------------------------------------------------------------------
//Ein int-Wert n wird von der Kommandozeile übernommen. Es wird geprüft, ob n > 1 gilt, wenn nicht wird eine Fehlermeldung ausgegeben und die Applikation beendet.
//-------------------------------------------------------------------------------------
        int n = Integer.parseInt(args[0]);
            if (n < 0) {
                System.out.println("n ist zu klein!");
                System.exit(0);
            } //works!!
//-------------------------------------------------------------------------------------
//Ein int-Feld der Länge n wird erzeugt und mit Zufallszahlen aus dem Bereich 1,...,n gefüllt. Das Feld wird ausgegeben.
//-------------------------------------------------------------------------------------
        int i = 1;
        int arrayLength = n;
        int [] x = new int[arrayLength];
            for (int i = 0; i < arrayLength; i++){
            x[i] = (int)(Math.random() * arrayLength) +1;
            System.out.println(x[i]);
            }
//-------------------------------------------------------------------------------------
//Das geometrische und das arithmetische Mittel werden berechnet, dabei wird nur eine Schleife verwendet. Arithmetisches und geometrisches Mittel werden ausgegeben.
//-------------------------------------------------------------------------------------       
        double a = 0;
        double b = 0;
        double y = 0;
            while (i <= n && x > 0) {
                a = 1.0/n * (x*i);
                y = Math.pow(x,i);
                b = Math.pow(y,1/n);
            }
//-------------------------------------------------------------------------------------
//Gilt arithmetisches Mittel größer gleich geometrisches Mittel wird "OK", sonst "WIEDERLEGT" ausgegeben.
//-------------------------------------------------------------------------------------
        System.out.println("Das arithmetische Mittel:" + a);
        System.out.println("Das geometrische Mittel:" + b);
            if (a >= b) {
            System.out.println("OK");
            }
            else {
            System.out.println("WIEDERLEGT");
            }
    }
}

Hier nochmal ganz viel lieben dank für all eure Hilfe!
 

Flamingo

Mitglied
Sicher, dass das der richtige Code ist? Sieht mir eher aus wie der aus Post #11. Hier ist wieder der Fehler mit x>0 etc. drin. Das dürfte nicht kompilieren.
 

neerual

Mitglied
Also ich hab 8 Punkte (von 10) drauf bekommen, aber eigentlich sollten da alle Fehler behoben sein :/ Meinte zumindest mein Tutor..
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Schleifenfehler? Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben