Frage zu einer Aufgabe

Raijin schrieb:
Dann möchte ich dir ans Herz legen, dir einfach mal ein ganz banales Einsteigerbuch zum Programmieren zu besorgen. Unterm Strich ist es bei den Basics vollkommen egal um welche Sprache es sich handelt, weil if, for, while und dergleichen überall gleich funktionieren, aber eben von der Syntax einfach nur etwas anders geschrieben werden. Mal sind es geschweifte Klammern, mal begin und end und manchmal auf if und fi oder sowas. Allen gemein ist, dass du damit die eigentliche Funktionsweise dieser Strukturen lernen kannst. Dann kann dich so eine simple Frage im Bewerbungsgespräch auch nicht mehr schocken.

Es ist übrigens auch gar kein Problem, wenn man bei solchen Gesprächen zB Java-Code vorgesetzt bekommt und dann angibt, dass man ja gar kein Java kann (sofern man es nicht in der Bewerbung zuvor behauptet hat) und die Aufgabe stattdessen zB in C lösen würde - selbst wenn man die Lösung gänzlich ohne Quellcode nur beschreiben würde, wäre das kein Beinbruch.

Wie @error es in #7 schon geschrieben hat, geht es dabei nicht darum ob du schon das Java-Ass bist, weil das durch so einen Test sowieso witzlos wäre. Stattdessen wird dadurch nur rudimentär festgestellt ob du die Fähigkeit hast, grundsätzlich logische Zusammenhänge zu erkennen. Natürlich wäre es aber doof, wenn du in der Bewerbung schreibst "Java: Fortgeschritten" und dann an so einer Aufgabe scheiterst. Das erinnert mich an einen ehemaligen Kollegen, der laut Bewerbung "fortgeschrittene Linuxkenntnisse" hatte und als ich ihn dann an den Server setzte - natürlich terminal-only - fragte er mich entgeistert: "Und wo ist die Maus?"
Ich hab mir die Bücher am Freitag bestellt:

1. Java Programmieren für Einsteiger
2. Java Programmieren für Einsteiger: Der leichte Weg zum Java-Experten
3. Schrödinger Programmiert

Das letzte finde ich "witzig" gemacht, aber furchtbar zum Suchen oder Nachschlagen und irgenwie unstrukturiert.
Hab mir auch das IT-Handbuch für FiSy bestellt und Linux-Grundlagen.

Genau so werde ich es aber auch in der Bewerbung angeben. Denke solange ich transparent und authentisch bin, wird es gut gehen. Ich möchte nicht mit irgenwas werben, was ich am Ende nicht kann.

RalphS schrieb:
Das ist einfach ein bisschen eine “Frechfrage” wo man genau drauf achten muss was da verlangt wird, wie überall bei der Programmierung; denn die ist exakt und nicht “könnte in etwa”.
Konkret Java will für Konstrukte Blöcke haben. Blöcke sind begrenzt durch { }. Optional, wenn es nur einen Befehl aka Statement im Block gibt, kann man den delimiter weglassen (für später: sollte man nicht, wie das Beispiel hier schon zeigt).

“Ausgeschrieben” sieht das code fragment so aus:

Java:
if (a1==true)
{
    if (a2==true)
  {
    System.out.println("Test1");
  }
}
else
{
   System.out.println("Test2");
}

Die Einrückung ist uninteressant- das ist Java, nicht Python, dh diese ist counterintuitive. Daher die Blockklammern. Die sind fester Bestandteil der Syntax und damit eindeutig.
So wird auch für den Programmierer selber deutlich, daß hier “wenn A1 und B1, dann Test1; ansonsten Test2” implementiert ist.

Im Zweifel kann man das auch flink selbst nachbauen, in jeder Sprache der C Familie. Nicht in Python oä.
Danke für die Erklärung. Versuche ich nachzubauen, sobald ich bisschen damit vertraur bin.
 
  • Gefällt mir
Reaktionen: Raijin
RalphS schrieb:
“Ausgeschrieben” sieht das code fragment so aus:

Java:
if (a1==true)
{
  if (a2==true)
  {
    System.out.println("Test1");
  }
}
else
{
  System.out.println("Test2");
}
Wenn sich diese Aussage auf

Java:
if (a1==true)
    if (a2==true)
        System.out.println("Test1")
    else
        System.out.println("Test2")

bezieht, ist sie falsch. Oder gibt a1=false bei Dir "Test2" aus?

Mit Klammern sieht der Code so aus (den Vergleich habe ich mal rausgenommen, da diese Schreibweise bei Booleans nicht üblich ist):

Java:
if (a1) {
    if (a2) {
        System.out.println("Test1");
    } else {
        System.out.println("Test2");
    }
}
 
  • Gefällt mir
Reaktionen: Arc Angeling
Übrigens eine schöne Aufgabe wo, wie andere schon anmerkten, nicht nur Grundwissen des Programmierens gefordert ist, sondern mit Grundwissen der Informatik (Wahrheitstabelle, Boolsche Logik) kombiniert wird.

Die Klammern wegzulassen ist aber Teufelswerk, oh man. WIESO???

Cpt.H4rl0ck schrieb:
Es wird gefragt, welcher Wert die Variablen a1/a2 annehmen müssen, so dass der Text ausgegeben wird. Kann ich das mit einer einfachen Aussagenlogik beantworten – also if true/true then print… oder ist die Variable eine Zahl 0/1 ?
Stichworte für Selbstrecherche: "Java Boolean" und "Java implicit conversion"
 
  • Gefällt mir
Reaktionen: Cpt.H4rl0ck und Raijin
Dem stimme ich zu. Zwar sind IF-Anweisungen ohne Klammern auch gültig, aber das bezieht sich dann ausschließlich auf den nächsten Befehl, der nicht zwingend auf eine Textzeile begrenzt sein muss. Spätestens wenn man die IF-Anweisung erweitern will, kann das fatale Folgen haben, wenn man nicht dran denkt, dann auch die Klammern zu ergänzen. Sowas sind ganz fiese Fallstricke und man sollte es sich schnell angewöhnen, immer mit Klammern zu arbeiten, egal wie kurz und knackig man coden möchte....
 
  • Gefällt mir
Reaktionen: Cpt.H4rl0ck und Der Lord
Um die Logik hier zu verstehen, kann man das ganze auch umformen:

Vorher:
Code:
if (a1==true)
    if (a2==true)
        System.out.println("Test1");
    else
        System.out.println("Test2");

Anders ausgedrückt:
Code:
if (a1==true && a2==true)
        System.out.println("Test1");

if (a1==true && a2==false)
        System.out.println("Test2");

Schreibt man normalerweise so nicht, aber geht hier ja nur um's Verständnis.

Und finde ich eine gute Entscheidung Bücher zu besorgen (Videos können da nicht mithalten). Meine Empfehlung, gerade für Anfänger, wären die Bücher von Klaus Schmaranz, einem Uniprofessor in Graz. Damit hat man eine solide Basis, auf die man später aufbauen kann. Erst mal geht's weniger darum, welche Programmiersprache man lernt, sondern um das logische Verständnis.
 
Zuletzt bearbeitet: (; vergessen)
  • Gefällt mir
Reaktionen: Cpt.H4rl0ck
Rossie schrieb:

Ich hab's gerade mal ausprobiert (und dabei die Save-Actions in meinem Eclipse deaktiviert), weil ich RalphS' Einwurf auch nicht glauben konnte und du hast natürlich Recht.

@Cpt.H4rl0ck: gewöhn dir direkt an, immer Klammern zu setzen oder lass das deine IDE für dich übernehmen. Klammern ordnen deine Gedanken und andersrum. Außerdem: wenn das nur Pseudo-Code ist und man drüber redet, ist das in Ordnung so, ansonsten fehlen da noch Semikolons nach den beiden printlns.
 
  • Gefällt mir
Reaktionen: Cpt.H4rl0ck
@proserpinus: Danke für die Empfehlung des Buches. Es gibt sehr viele Bücher auf dem Markt, finde es schwer das „richtige“ Buch zu finden. Wobei ich richtig durch sinnvoll ersetzen möchte.

@mental.dIseASe: Merk mir das mit der Semantik! Keine Ahnung wieso ich bei dem Code-Schnipsel direkt an Java gedacht habe - vielleicht wegen dem System.out.println. Das mit dem Pseudo-Code muss ich mir mal genauer anschauen.

Hab gestern mit Eclipse angefangen und zumindest ein „hello world“ produziert ..
 
  • Gefällt mir
Reaktionen: Raijin
Cpt.H4rl0ck schrieb:
@proserpinus: Danke für die Empfehlung des Buches. Es gibt sehr viele Bücher auf dem Markt, finde es schwer das „richtige“ Buch zu finden. Wobei ich richtig durch sinnvoll ersetzen möchte.
Das richtige Buch gibt's auch nicht, sondern nur die richtige Herangehensweise. Selbst schlechte Bücher sind ein Anfang und besser als nix. Vielmehr geht es bei den Büchern darum für sich das richtige zu finden.
Jeder lernt, versteht und liest anders. Du musst schon für dich selber ermitteln, was für dich passend ist.

Vom Schmaranz gibt's die Bücher auch als ebook zu finden. Testweise kannst du ja mal durchstöbern und bei Gefallen ein Exemplar bestellen.

Ansonsten gibt's bei Galileo Bücher als Gratisversionen. Google wird dir bei der Suche dieser Bücher behilflich sein.
Berühmtes Beispiel wäre "Java ist auch eine Insel" -> http://openbook.rheinwerk-verlag.de/javainsel/
 
  • Gefällt mir
Reaktionen: Cpt.H4rl0ck
proserpinus schrieb:
Um die Logik hier zu verstehen, kann man das ganze auch umformen:

Vorher:
Code:
if (a1==true)
    if (a2==true)
        System.out.println("Test1");
    else
        System.out.println("Test2");

Anders ausgedrückt:
Code:
if (a1==true && a2==true)
        System.out.println("Test1");

if (a1==true && a2==false)
        System.out.println("Test2");

Schreibt man normalerweise so nicht, aber geht hier ja nur um's Verständnis.
Guten Morgen,

was ich mir erarbeiten konnte ist Folgendes: in Java gibt es 8 Datentypen. Ein Datentyp ist boolean, der den Wertebereich true/false annehmen kann. Jetzt verstehe ich auch, wieso dort kein anderer Wertebereich stehen kann.

Hätte man am Anfang den Wertebereich nicht deklarieren müssen?

Was ich allerdings noch nicht verstanden habe ist Folgendes:
Es gibt insgesamt doch vier mögliche Zustände?

truetrue
falsefalse
falsetrue
truefalse

Wenn ich mir den Code vor der Umformung anschaue, gilt doch:

(If) Wenn a1 und a2 true ist, dann Ausgabe Test1 – (else) für alle anderen Zustände Test 2:

a1a2Ausgabe
truetrueTest1
falsefalseTest2
truefalseTest2
falsetrueTest2

Wo mache ich hier einen Denkfehler, wenn ich mir die Wahrheitstabelle von Nilson anschaue?
Nilson schrieb:
a1a2Ausgabe
falsefalsekeine
falsetruekeine
truefalseTest2
truetrueTest1

Grüße
 
Zuletzt bearbeitet:
Wenn a1 false ist, gibt es nie eine Ausgabe. Aus diesem Grund sind die Klammern wichtig um nicht den Überblick zu verlieren, wenn man sich schwerer tut.
Nur wenn a1 true ist, geht der Weg in diese Klammer rein.

Bei Betrachtung meiner Umformung sollte es ersichtlich werden.

Setze mal für a1 und a2 (verschiedene) Werte und spiel es gedanklich durch.
 
  • Gefällt mir
Reaktionen: Cpt.H4rl0ck
Cpt.H4rl0ck schrieb:
(If) Wenn a1 und a2 true ist, dann Ausgabe Test1 – (else) für alle anderen Zustände Test 2:
Liegt wohl daran, dass in deinem Code die geschweiften Klammern fehlen. Daher ist das nicht ganz eindeutig
Code:
if (a1==true)
    if (a2==true)
        System.out.println("Test1")
    else
        System.out.println("Test2")
Was anderes ist als
Code:
if (a1==true)
    if (a2==true)
        System.out.println("Test1")
else
    System.out.println("Test2")

bzw. mit klammern geschrieben

Code:
if (a1==true)
{
    if (a2==true){System.out.println("Test1")}
    else         {System.out.println("Test2")}
}
Was anderes ist als
Code:
if (a1==true)
  {if (a2==true){System.out.println("Test1")}}
else
  {System.out.println("Test2")}

einmal ist das else teil des ersten if, einmal teil des zweiten
 
  • Gefällt mir
Reaktionen: Cpt.H4rl0ck und Raijin
Ohne Klammern gilt eben NUR das nächste Statement als Inhalt der IF-Anweisung. Das else wiederum ist kein eigenes Statement, sondern gehört zu 100% zum vorangegangenen IF. Deswegen ist eben auch das zweite IF inkl. ELSE ein zusammenhängender einzelner Befehl und somit ist beides Teil der ersten IF-Anweisung.
 
  • Gefällt mir
Reaktionen: Cpt.H4rl0ck
Ich kenne das auch von anderswo in Kursen, dass man sich an praxisfernen C/C++ Eigenheiten aufhängt in Anfängerkursen, anstatt einfach zu sagen: "Was passiert, wenn keine Klammern gesetzt sind? Ist egal, du machst immer Klammern, wir machen immer Klammern, alles andere ist absoluter Bockmist."
Stattdessen solche "hihihi reingefallen" Aufgaben wo der Anfänger lernt was passiert, wenn so eine völlig bescheuerte Konstruktion gebaut wird und das womöglich dann später auch so 1:1 verwendet wird.
 
proserpinus schrieb:
Wenn a1 false ist, gibt es nie eine Ausgabe. Aus diesem Grund sind die Klammern wichtig um nicht den Überblick zu verlieren, wenn man sich schwerer tut.
Nur wenn a1 true ist, geht der Weg in diese Klammer rein.

Bei Betrachtung meiner Umformung sollte es ersichtlich werden.

Setze mal für a1 und a2 (verschiedene) Werte und spiel es gedanklich durch.
Aha, jetzt macht es Sinn. Der Weg geht in dem Beispiel nur weiter, wenn a1=true ist.
So verstehe ich auch wieso bei deiner Umformung a1=true sein muss und a2=false.
Ich bin echt auf dem Schlauch gestanden – danke für die Geduld!

Nilson schrieb:
Code:
if (a1==true)
    if (a2==true)
        System.out.println("Test1")
else
    System.out.println("Test2")
Jetzt verstehe ich auch die Klammern. Das else im ersten Teil ist durch das Einrücken Teil der If-Abfrage.
Würde es so stehen, wie in deinem Beispiel, ergeben sich andere Zustände..

Danke!
Ergänzung ()

BeBur schrieb:
Ich kenne das auch von anderswo in Kursen, dass man sich an praxisfernen C/C++ Eigenheiten aufhängt in Anfängerkursen, anstatt einfach zu sagen: "Was passiert, wenn keine Klammern gesetzt sind? Ist egal, du machst immer Klammern, wir machen immer Klammern, alles andere ist absoluter Bockmist."
Stattdessen solche "hihihi reingefallen" Aufgaben wo der Anfänger lernt was passiert, wenn so eine völlig bescheuerte Konstruktion gebaut wird und das womöglich dann später auch so 1:1 verwendet wird.

Edit: sy, hab deinen Post von oben nicht merh im Kopf gehabt.

Hier ist nochmal ein Screenshot zum Test:
 

Anhänge

  • Unbenannt.JPG
    Unbenannt.JPG
    94,2 KB · Aufrufe: 222
Zuletzt bearbeitet: (Bild konnte nicht angezeigt werden.)
Cpt.H4rl0ck schrieb:
Jetzt verstehe ich auch die Klammern. Das else im ersten Teil ist durch das Einrücken Teil der If-Abfrage.
Würde es so stehen, wie in deinem Beispiel, ergeben sich andere Zustände..

Danke!
Nein, das ist nicht korrekt, da ist @Nilson etwas ungenau geworden.
Die Einrückung hat keinerlei Bedeutung in Java & Co. Die Ausgabe ist identisch.
Würde man es so schreiben, wäre das noch viel verwirrender, da es suggeriert das else gehört zum ersten if, was aber nicht der Fall ist.
Man muss halt einmal lernen, wie sich ein if ohne Klammern verhält und dann weiß man ganz schnell, dass man genau wegen solcher Dinge klammern setzt, sobald mehr als eine Zeile im if steht.

Bei sowas finde ich es ohne Klammern ok, da verstehe ich den Hass hier im Thread nicht so ganz. Sobald es mehr wird, fügt man halt Klammern an.
Java:
int n;
if (...)
    n = 10;
else
    n = 4;
 
Cpt.H4rl0ck schrieb:
Das else im ersten Teil ist durch das Einrücken Teil der If-Abfrage.
Nein. else hängt stets mit dem vorangegangenen if zusammen. Es spielt bei Java und den meisten anderen gängigen Programmiersprachen keine Rolle wie das eingerückt ist. Die Einrückung dient lediglich der Übersichtlichkeit, um zusammenhängende Blöcke auf den ersten Blick zu erkennen.

Bei python ist das anders, weil es da keine geschweiften Klammern gibt, sondern die Blöcke eben gerade durch die Einrückung definiert werden.


Schau doch mal bei diesem Online Java Compiler vorbei, füge deinen Code ein und führe ihn aus. So kannst du ein bischen ausprobieren was Änderungen bewirken, zum Beispiel die Einrückung, die Klammern oder ein weiteres else am Ende. Kann sicherlich nicht schaden, etwas damit zu üben, um ggfs auf weitere (Fang)Fragen vorbereitet zu sein.
Ergänzung ()

Enurian schrieb:
Bei sowas finde ich es ohne Klammern ok, da verstehe ich den Hass hier im Thread nicht so ganz. Sobald es mehr wird, fügt man halt Klammern an.
Gerade das ist das Problem. Wenn man sich von vornherein angewöhnt, IMMER Klammern zu setzen, sind spätere Erweiterungen vollkommen unkritisch. Lässt man sie bei kurzen Statements weg und erweitert sie dann, muss man aktiv daran denken, auch die Klammern zu ergänzen, weil man sonst den Programmablauf komplett über den Haufen wirft.

Jetzt wirst du vermutlich durchaus zu recht entgegnen "Dann muss man eben sorgfältig arbeiten", aber grundsätzlich immer Klammern zu setzen, vermeidet solche Fehler komplett, nachhaltig und für immer. Fehlervermeidung ist besser als Fehlersuche...
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: mental.dIseASe, Cpt.H4rl0ck, BeBur und eine weitere Person
Yep, dem kann ich nur beipflichten. Es ist halt für viele Gewohnheit den Code "abzukürzen" wo es nur geht.
Sofern auch andere den Code lesen (müssen), schadet es sicherlich nie Übersicht zu bewahren, durch Klammern, Einrückungen, Kommentare, nicht zu lange Zeilen, passende Namen für Variablen und Funktionen usw.

Andererseits kann man aber auch an Übersicht gewinnen durch Kürzungen, sodass sich Code fast wie normaler Text lesen lässt. Es kommt eben immer darauf an. Geht hier jetzt aber wohl zu weit.

Wichtig ist, dass der TE mal anfängt damit und verstehen lernt. Wenn er auf den Geschmack kommt, gibt's wieder einen Programmierer mehr. Ist ja nicht gerade so, dass die guten Programmierer in Hülle und Fülle vorhanden sind ;)

Also, weitermachen @Cpt.H4rl0ck ^^
 
  • Gefällt mir
Reaktionen: Raijin und Cpt.H4rl0ck
@Cpt.H4rl0ck : Gib bei dem in #36 verlinkten Online Compiler einfach mal folgenden Code ein (komplett ersetzen):

Java:
public class HelloWorld{

    public static void main(String []args)
    {
        boolean a1 = false;
        boolean a2 = false;

        ohneKlammern(a1, a2);
        mitKlammern1(a1, a2);
        mitKlammern2(a1, a2);
    }
    
    public static void ohneKlammern(boolean a1, boolean a2)
    {
        System.out.println(String.format("ohneKlammern (a1 = %s, a2 = %s)", a1, a2));

        if (a1==true)
        if (a2==true)
            System.out.println("Test1");
        else
            System.out.println("Test2");
    }
     
    public static void mitKlammern1(boolean a1, boolean a2)
    {
        System.out.println(String.format("mitKlammern1 (a1 = %s, a2 = %s)", a1, a2));

        if (a1==true)
        {
            if (a2==true)
            {
                System.out.println("Test1");
            }
            else
            {
                System.out.println("Test2");
            }
        }
     }
     
    public static void mitKlammern2(boolean a1, boolean a2)
    {
        System.out.println(String.format("mitKlammern2 (a1 = %s, a2 = %s)", a1, a2));

        if (a1==true)
        {
            if (a2==true)
            {
                System.out.println("Test1");
            }
        }
        else
        {
            System.out.println("Test2");
        }
     }
}

Da kannst du durch Ändern von a1 und a2 in der main genau sehen wie sich die drei Varianten verhalten. Du wirst feststellen, dass ohneKlammern und mitKlammern1 denselben Output haben, während mitKlammern2 andere Ergebnisse liefert, weil das else dort durch die Klammerung an das 1. if geknüpft ist.
 
  • Gefällt mir
Reaktionen: Cpt.H4rl0ck
Raijin schrieb:
@Cpt.H4rl0ck : Gib bei dem in #36 verlinkten Online Compiler einfach mal folgenden Code ein (komplett ersetzen):

Java:
public class HelloWorld{

    public static void main(String []args)
    {
        boolean a1 = false;
        boolean a2 = false;

        ohneKlammern(a1, a2);
        mitKlammern1(a1, a2);
        mitKlammern2(a1, a2);
    }
   
    public static void ohneKlammern(boolean a1, boolean a2)
    {
        System.out.println(String.format("ohneKlammern (a1 = %s, a2 = %s)", a1, a2));

        if (a1==true)
        if (a2==true)
            System.out.println("Test1");
        else
            System.out.println("Test2");
    }
    
    public static void mitKlammern1(boolean a1, boolean a2)
    {
        System.out.println(String.format("mitKlammern1 (a1 = %s, a2 = %s)", a1, a2));

        if (a1==true)
        {
            if (a2==true)
            {
                System.out.println("Test1");
            }
            else
            {
                System.out.println("Test2");
            }
        }
     }
    
    public static void mitKlammern2(boolean a1, boolean a2)
    {
        System.out.println(String.format("mitKlammern2 (a1 = %s, a2 = %s)", a1, a2));

        if (a1==true)
        {
            if (a2==true)
            {
                System.out.println("Test1");
            }
        }
        else
        {
            System.out.println("Test2");
        }
     }
}

Da kannst du durch Ändern von a1 und a2 in der main genau sehen wie sich die drei Varianten verhalten. Du wirst feststellen, dass ohneKlammern und mitKlammern1 denselben Output haben, während mitKlammern2 andere Ergebnisse liefert, weil das else dort durch die Klammerung an das 1. if geknüpft ist.
Danke für den Code - hab jetzt die letzte Stunde versucht einen Code zu schreiben, der mir einen Wert ausgibt.. ;-)
 
  • Gefällt mir
Reaktionen: Raijin
Zurück
Oben