Programm mit Eingabe

brypa

Aktives Mitglied
Dieses Programm soll zwei Eingaben addieren:
[CODE lang="java" title="Addition"]

import java.util.Scanner;

class MyClass {
public static void main(String[ ] args) {
Scanner myVar = new Scanner(System.in);
Scanner myVar2 = new Scanner(System.in);
int a= myVar+myVar2;
System.out.println(a);
}
}[/CODE]
Wie geht das richtig?
 
Dieses Programm soll zwei Eingaben addieren:
[CODE lang="java" title="Addition"]

import java.util.Scanner;

class MyClass {
public static void main(String[ ] args) {
Scanner myVar = new Scanner(System.in);
Scanner myVar2 = new Scanner(System.in);
int a= myVar+myVar2;
System.out.println(a);
}
}[/CODE]
Wie geht das richtig?
Bei mir klappt das mit

Java:
myVar = new java.util.Scanner(System.in).nextInt();

Bin aber auch totaler Anfänger und kenne nicht alle Möglichkeiten 😀
 
Wie geht das richtig?
Die Frage ist erstmal, warum ist das falsch?

In den Zeilen 5 und 6 deklarierst Du zwei Variablen (myVar und myVar2) vom Typ Scanner. In Zeile 7 versuchst Du diese beiden Scanner per '+'-Operator zu "addieren". Das geht nicht, weil '+' für den Typ Scanner nicht definiert ist.

Tatsächlich willst Du zwei int-Werte addieren, was ich der Zuweisung an eine Variable a vom Typ int in Zeile 7 entnehme. D. h. Du musst den Scanner verwenden, um erstmal einen int-Wert zu erhalten. Eine Möglichkeit hat Dir @Wuast schon gezeigt. Eigentlich benötigst Du aber nur einen Scanner.

Java:
Scanner sc = new Scanner(System.in); // erzeuge einen Scanner
int wert1 = sc.nextInt(); // lies ersten int-Wert über den Scanner sc und weise das Ergebnis der Variable wert1 zu
int wert2 = sc.nextInt(); // lies zweiten int-Wert über den Scanner sc und weise das Ergebnis der Variable wert2 zu.
int a = wert1 + wert2; // addiere wert1 und wert2 und weise das Ergebnis der Variable a zu.
 
Eclipse Che bietet sehr viel meine ich. Kann man wohl kostenlos bei RedHat nutzen wenn man es nicht slebst histen kann/will (Wovon ich ausgehe, do man nicht durch Zufall ein Kubernetes Cluster zur Hand hat 🙂 ).

 
Ich habe mal eine Frage, die mit diesen Sachen zu tun hat. Ich wollte mal Scanner mit Eclipse versuchen.
Screenshot (20).png
Woran könnte es liegen, dass es nicht funktioniert?
 
Woran könnte es liegen, dass es nicht funktioniert?
Das Programm erstellt ja eine neue Instanz von Scanner um dann die nächste Zeile einzulesen.

Das bedeutet: Das Programm hält an und wartet auf eine Eingabe!

Klick einfach einmal in dieses "Console" Fenster und gibt etwas ein gefolgt von Return. Dann sollte die Eingabe noch einmal ausgegeben werden und das Programm beendet sich.

Sprich: Es funktioniert, aber die Bedienung scheint Dir nicht klar zu sein.
 
Dieses Programm von vorhin funktioniert.

Ich habe eine andere Frage. Angenommen man nimmt.
[CODE lang="java" title="Beispielcode"]Scanner myVar = new Scanner(System.in);
System.out.println(myVar.nextLine());[/CODE]
Warum wird die Art der Variable myVar erst im System.out und nicht schon im Scanner definiert?
 
Die Variable myVar wird in der ersten Zeile deklariert und definiert. Es wird eine neue Instanz von Scanner erstellt und der Variablen zugewiesen.

In der zweiten Zeile wird auf der Variablen nur eine Methode aufgerufen und das, was die Methode zurück gibt, ausgegeben.
Die Variable verändert sich dabei nicht! Die hat vor und nach dem Aufruf den gleichen Inhalt: die Referenz auf die erzeugte Scanner Instanz.
 
Also ist die Art der Variable von MyVar ein Scanner-Typ? Statt .nextLine könnte da auch. nextInt stehen. Würde das die Variable nicht in ein Integer umwandeln? Also was bedeutet dieses nextLine oder nextInt? Ich habe in einer App folgende Beschreibung :
You can now read in different kinds of input data that the user enters.
Here are some methods that are available through the Scanner class:
Read a byte - nextByte()
Read a short - nextShort()
Read an int - nextInt()
Read a long - nextLong()
Read a float - nextFloat()
Read a double - nextDouble()
Read a boolean - nextBoolean()
Read a complete line - nextLine()
Read a word - next()
 
Also ist die Art der Variable von MyVar ein Scanner-Typ?
Ja, die Variable MyVar ist vom Typ Scanner.

Statt .nextLine könnte da auch. nextInt stehen. Würde das die Variable nicht in ein Integer umwandeln?
Der Rückgabewert der nextInt()-Methode ist vom Typ int. Am Typ der Variablen MyVar ändert sich dadurch natürlich nichts.

Also was bedeutet dieses nextLine oder nextInt? Ich habe in einer App folgende Beschreibung :
Die definitive Quelle für Fragen dieser Art: https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Scanner.html
 
Nur zu Deiner Vorstellung: Du arbeitest mit Objekten. Und Variablen sind dann sowas wie Zettel, die entweder einfache Werte beinhalten (Dann steht auf dem Zettel eine Zahl oder so) oder es sind Referenzen.

Du hast dann einen Zettel (Variable) auf der steht die Adresse eines Hauses (Referenz auf eine Instanz der Klasse Haus). Und der Zettel hat noch die Beschriftung "meinHaus" (Das ist dann der Name der Variablen: meinHaus).

Nun kannst Du bei dem Haus:
- einen Kasten Bier in den Keller stellen oder dort heraus nehmen
- Zimmer anstreichen
- Fenster öffnen
- Haustür aufschließen, abschliessen, ....
Das sind dann sowas wie Methoden.
Also sowas wie meinHaus.zimmerAnstreichen("Schlafzimmer", "weiss");

Das Haus hat auch einen Status: Es sind 3 Kisten Bier im Keller, das Schlafzimmer ist hellblau gestrichen, ....
(Das wären dann die Felder / Instanzvariablen. Also sowas wie int anzahlKistenBierInKeller😉

Und nun die alles entscheidende Frage:
Ändert sich an dem Zettel "meinHaus" mit der Adresse irgendwas, wenn ich die Haustüre aufschließe? Oder eine Kiste Bier aus dem Keller hole?
Der Zettel bleibt doch gleich!

Diesbezüglich ist die Entwicklung wirklich 1:1. Die Variable mit der Referenz ändert sich in keiner Weise, nur weil Du mit der Instanz, auf die die Referenz verweist, irgendwas machst. Der Zustand der Instanz kann sich ändern, aber die Referenz bleibt unverändert.
 
Was ist hier der Fehler?
[CODE lang="java" title="if Addition"]package package1;

import java.util.Scanner;

public class input3 {

public static void main(String[] args) {

Scanner sc = new Scanner(System.in); // erzeuge einen Scanner
System.out.println("Wie viel ergibt 10+10");
int wert1 = sc.nextInt(); // lies ersten int-Wert über den Scanner sc und weise das Ergebnis der Variable wert1 zu
int a=20;
if (a = wert1) {System.out.println("richtig");}
//System.out.println(a);

}

}
[/CODE]
 
In java ist:
- Das = eine Zuweisung
- das == der Vergleich

Im if brauchst du den Vergleich und nicht die Zuweisung.
 
Ich lese gerade gailer.net durch und bei diesem Programm kriege ich eine Fehlermeldung
[CODE lang="java" title="Gailer"]package Package1.app.src.main.java;


import java.util.Scanner;

public class Gailersteuer {

public static void main(String[] args) {
final double STEUERSATZ = 0.05;
Scanner scan = new Scanner( System.in );
double preis;
double steuer;

System.out.println("Geben Sie den Preis ein:");
preis = scan.nextDouble();

if ( preis >= 100 )
steuer = preis * STEUERSATZ;
else
steuer = 0;

System.out.println("Artikelpreis: " + preis +
" Steuer: " + steuer + " Gesamt: " + (preis + steuer) );



}

}
[/CODE]
Woran könnte es liegen?
 
Vielleicht sagst du uns auch, was für eine Fehlermeldung du bekommst?

Das Package ist schon recht ungewöhnlich aber wenn es in den entsprechenden Pfaden liegt, wäre es ok.
 
IMG_20211009_185256.jpg
Ich habe das Problem, dass meine Java N-IDE App gar keine Programme mehr ausführt.
 
Zuletzt bearbeitet:
Also erst einmal ist die Einordnung wichtig. Du zeigst uns eine Warnung, aber es soll 3 Fehler und 8 Warnungen geben. Warnungen verhindern das Ausführen nicht. Daher solltest Du Dich auf die Fehler konzentrieren! Und wenn Du Hilfe von uns willst, dann bring die komplette Ausgabe!

Was die Warnung mit dem Scanner angeht: Mach den Scanner einfach als statische Variable in der Klasse. Das sollte die Warnung entfernen. Also etwas wie:
Java:
public class Main {
    public static Scanner scan = new Scanner(System.in);
    
    public static void main(String[] args) {
        // ....
    }
}

Damit erschaffst Du Dir eine Scanner Instanz die so lange gültig ist, wie das Programm läuft.
 
Nur zu Deiner Vorstellung: Du arbeitest mit Objekten. Und Variablen sind dann sowas wie Zettel, die entweder einfache Werte beinhalten (Dann steht auf dem Zettel eine Zahl oder so) oder es sind Referenzen.

Du hast dann einen Zettel (Variable) auf der steht die Adresse eines Hauses (Referenz auf eine Instanz der Klasse Haus). Und der Zettel hat noch die Beschriftung "meinHaus" (Das ist dann der Name der Variablen: meinHaus).

Nun kannst Du bei dem Haus:
- einen Kasten Bier in den Keller stellen oder dort heraus nehmen
- Zimmer anstreichen
- Fenster öffnen
- Haustür aufschließen, abschliessen, ....
Das sind dann sowas wie Methoden.
Also sowas wie meinHaus.zimmerAnstreichen("Schlafzimmer", "weiss");

Das Haus hat auch einen Status: Es sind 3 Kisten Bier im Keller, das Schlafzimmer ist hellblau gestrichen, ....
(Das wären dann die Felder / Instanzvariablen. Also sowas wie int anzahlKistenBierInKeller😉

Und nun die alles entscheidende Frage:
Ändert sich an dem Zettel "meinHaus" mit der Adresse irgendwas, wenn ich die Haustüre aufschließe? Oder eine Kiste Bier aus dem Keller hole?
Der Zettel bleibt doch gleich!

Diesbezüglich ist die Entwicklung wirklich 1:1. Die Variable mit der Referenz ändert sich in keiner Weise, nur weil Du mit der Instanz, auf die die Referenz verweist, irgendwas machst. Der Zustand der Instanz kann sich ändern, aber die Referenz bleibt unverändert.
Ich bin beeindruckt von dieser Zusammenfassung und Stelle mit entsetzen fest, wir haben 20Uhr und ich hab vergessen Bier zu kaufen .
 
Das Problem scheint an der Java N-IDE App zu liegen. Da kommt bei mir bei jedem Programm eine Fehlermeldung ("compilation failed, see Error messages.").
Bei mir hat es auch mit replit.com funktioniert. Kann man bei replit.com auch speichern?
 
Zuletzt bearbeitet:
Wie wäre es, wenn du dann mal nach den Fehlermeldungen schaust und wenn Dir diese nichts sagen: uns die Meldungen gibst?

Dann könnte man ggf. bei den Problemen weiter helfen und diese evtl. lösen.

Denn auch mit Java N-IDE läuft der Code problemlos! Es kommt lediglich eine Qarnung - so wie halt bei Replit auch.

Daher unabhängig wo du was wie nutzt: wenn du Fehlermeldungen nicht weiter gibst, dann kann Dir niemand helfen!
 
OK, danke. Ich habe ein Programm aus der Solo Learn App, das ich nicht verstehe. Ich dachte, ihr könnt mir das vielleicht erklären.
[CODE lang="java" title="Arrays"]public class Program {
public static void main(String[] args) {
int [ ] myArr = {6, 42, 3, 7};
int sum=0;
for(int x=0; x<myArr.length; x++) {
sum += myArr[x];
}
System.out.println(sum);
}
}[/CODE]
Wie oft wird die for-Schleife ausgeführt und warum?
 
Viermal, weil die Größe des Arrays myArr 4 ist und x von 0 bis 3 zählt, bis für x == 4 die Schleifenbedingung nicht mehr erfüllt ist.
 
Und sowas kannst Du Dir auch selbst beantworten. Füge z.B. etwas in die Schleife ein wie:
System.out.println("Schleifendurchlauf x := " + x);

Dann siehst Du in der Ausgabe genau, was da ausgeführt wird:
Schleifendurchlauf x:= 0
Schleifendurchlauf x:= 1
Schleifendurchlauf x:= 2
Schleifendurchlauf x:= 3
 
Und sowas kannst Du Dir auch selbst beantworten. Füge z.B. etwas in die Schleife ein wie:
Oder vor der Schleife:
System.out.println("Länge des Arrays: " + myArr.length);

Das Ergebnis sollte "Länge des Arrays: 4" sein. Damit steht dann in der Schleife faktisch folgendes:

for(int x = 0; x < 4; x++) {

Es ist immer hilfreich, sich Teile, die man nicht versteht "herauszuziehen" und einmal separat ausgeben zu lassen, um zu verstehen, was passiert.
 
Ich verstehe diesen Teil nicht :
Java:
sum += myArr[x];
Was bedeutet dieses "+=". Ich könnte eher ein sum + myArr[x] verstehen. Also für was das Gleichheitszeichen?
 
Der += Operator wird meines Wissens in der JLS nicht explizit benannt. Man findet aber oft im Englischen "addition assignment operator". Auf Deutsch sind das Kombinierte Zuweisungsoperatoren bzw bei += dann eine "Additions-Zuweisung".

Das wären so Begriffe, die ich kenne.

Increment und Decrement Operatoren sind das ++ und das -- und diese können als pre ("vor") oder post ("nach") Increment / Decrement verwendet werden. Post Increment wäre also etwas wie i++;
 
Ich verwende die Solo Learn und da kam das vor, ohne spezielle Erklärung. Ist das etwas Wichtiges, was man immer wieder braucht oder nicht? Wie findest du die Sololearn App, um Java zu lernen? Ich stoße immer wieder auf Sachen, die nicht ausführlich erklärt werden.
 
Ich verwende die Solo Learn und da kam das vor, ohne spezielle Erklärung. Ist das etwas Wichtiges, was man immer wieder braucht oder nicht? Wie findest du die Sololearn App, um Java zu lernen? Ich stoße immer wieder auf Sachen, die nicht ausführlich erklärt werden.
Ich befinde mich auch noch im Lernprozess und nutze neben diversen Lektüren, noch dieses Forum hier sowie Sololearn. Ich nutze Sololearn einfach um vielleicht bereits gelerntes noch mal in Übungen abzufragen. Ich finde die App super und denke sowieso nicht, dass es die eine Quelle für das lernen von Java gibt. Du wirst immer in diesem Buch was lesen was du woanders dann vertiefen musst.
 
Die ausführliche Lösung, wie oben gezeigt, funktioniert völlig identisch, also kannst du es machen, wie es dir besser gefällt. Bei Code, den du dir anschaust, wirst du dem aber öfter begegnen
Kennst du eigentlich eine Seite, die genau diese Sache erklärt? Habe übrigens auch selbst so eine Seite gefunden Seite
 
[CODE lang="java" title="Programm"]final int GRUNDPREIS = 20000; // Basispreis in Dollar
final int ZIERLEISTENPREIS = 250; // Preis der Zierleisten
final int ABS_PREIS = 800; // Preis für ABS[/CODE]
Was bedeutet dieses "final"?
 
Der Wert der Variablen kann nach der Initialisierung nicht mehr verändert werden.

Du kannst diesen Variablen also nichts mehr zu weisen.
 
Ich habe das gelesen
In komplizierteren Ausdrücken könnte ein Operand eines bestimmten Operators ein Unterausdruck sein. Aber die Regel gilt auch hier: wenn einer oder beide Operanden ein Gleitpunkt ist, dann ist die Operation eine Gleitpunktoperation. In dem Folgenden ist jede / Operation eine Gleitpunktoperation:

(12.0 * 31) / 12(a - 2.0) / b56.0 * x / 3
In diesem letzten Beispiel ist 56.0 * x ein Gleitpunkt-Unterausdruck, der selbst einer der Operanden für den Divisionsoperator ist. (Da * und / die gleiche Präzedenz haben erfolgt die Auswertung von links nach rechts.)
Jetzt verstehe ich nicht, was ein Unterausdruck ist.
 

Zurück
Oben