von 1 - 100 Java

java_ausgabe - (Computer, programmieren, Java)

7 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Von mir noch eine Ergänzung:

Wenn du schon einen festen Zahlenbereich kennst, in dem du arbeiten möchtest, bietet sich auch die for-Schleife an. In dieser gibts du ja Startwert, Endwert sowie die Aktion an, die ausgeführt wird, wenn der Schleifenkörper einmal durchlaufen wurde.

for(int i = 1; i <= 100; i++)   
{
    if(i%3==0 && i%5==0)
        //do
    else if(i%5==0)
        //do
    else if(i%3==0)
        //do
    else
        //do
}

Wie du siehst fehlt hier das i++, also das Inkrementieren des Zählers(+1), im Körper. Dieses findet sich aber im Schleifenkopf wieder. Bei jedem durchlauf wird als i + 1 gerechnet, nachdem alles abgearbeitet wurde. Brauchst dich darum also nicht zu kümmern.

Durch die Verknüpfung der If-Abfragen durch die else-Schlüsselwörter wird immer nur exakt eine Abfrage positiv ausgewertet. Das verhindert hier zB, dass bei der 15 Buzz und FizzBuss ausgegeben bekommst.

Bei sowas hilft es ungemein, wenn man sich einen Zettel und einen Stift nimmt, und die Schleife, die man geschrieben hat, mal per Hand selbst durchgeht. Dann siehst du nämlich genau, was die Schleife tut.

Du überprüfst nacheinander drei Bedingungen per if. Bei jeder zutreffenden Bedingung wird der entsprechende Block ausgeführt, und am Ende noch die Zahl ausgegeben. Das ist aber nicht das, was du willst. Du willst, dass entweder Block 1 oder Block 2 oder Block 3 oder die Zahl ausgegeben wird, abhängig von der Bedingung.

Statt drei if-Anweisungen brauchst du also ein if-else-Konstrukt.

Als zweites musst du dann noch mit der Reihenfolge aufpassen. Würdest du deine jetzige Reihenfolge in einem if-else-Konstrukt umsetzen, würde bei jeder durch 3 oder durch 5 teilbaren Zahl der entsprechende Block ausgeführt und das Konstrukt verlassen, die Prüfung "durch 3 und 5 teilbar" würde nie ausgeführt. Folglich musst du diesen Test als erstes ausführen.

Tutto kompletto:

while (i < 101) {

    // ist die Zahl durch 3 und 5 teilbar?
    if ((i % 3 == 0) && (i % 5 == 0)) {
        // schreibe "FizzBuzz"
        System.out.println("FizzBuzz");
    // SONST: ist sie denn durch 3 teilbar?
    } else if (i % 3 == 0) { 
        // schreibe "Fizz"
        System.out.println("Fizz");
    // SONST: ist sie wenigstens durch 5 teilbar?
    } else if (i % 5 == 0) { 
        // schreibe "Buzz"
        System.out.println("Buzz");
    // SONST:
    } else {
        // schreibe einfach nur die Zahl
        System.out.println(i++);
    }
}
daCypher  11.10.2013, 12:50

Damit baust du dir eine Endlosschleife, weil i++ nur ausgeführt wird, wenn die Zahl weder durch 3 noch durch 5 teilbar ist.

Wahrscheinlich wäre es wirklich am besten, wie Niklas schon gesagt hat, eine For-Schleife daraus zu machen, damit sowas nicht passiert.

1
Niklas434  11.10.2013, 12:53
@daCypher

Das sieht aber irgendwie nach einer schulaufgabe aus :-P

0
dergutekoenig  11.10.2013, 13:02
@daCypher

Stimmt! Die Sysout-Anweisung darf nur i ausgeben und der Inkrement muss nach dem if-else-Konstrukt erfolgen. Danke für die Ergänzung!

0
procoder42  11.10.2013, 15:25

wenn wir wissen wie oft etwas ausgeführt werden soll, DANN NEHMEN WIR EINE FOR-SCHLEIFE

0
  1. Beim if (i%3==0 && i/5==0) musst du logischerweise statt / auch % hinschreiben

  2. Das System.out.println(i++); ist nicht an eine Bedingung geknüpft. Also i darfst du ja nur ausgeben, wenn die Zahl weder durch 3 noch durch 5 teilbar ist. Das i++ musst du dann logischerweise extra hinschreiben, sonst baust du dir ne Endlosschleife.

  3. "Was mach ich damit?" Damit gibst du den aktuellen Wert der Variable i aus und erhöhst 1 gleichzeitig um 1.

daCypher  11.10.2013, 12:46

oh, eine Sache noch: Bei Zahlen, die durch 3 und 5 teilbar sind (Beispiel: 15) gibt dein Programm "Fizz" und "Buzz" aus. Das liegt daran, dass die nächste If-Bedingung geprüft und ausgeführt wird, obwohl die letzte Bedingung auch schon wahr war. Da musst du also mit else arbeiten.

0
teacup3000 
Fragesteller
 11.10.2013, 12:50

Danke für die Antwort. Jetzt funktionierts einwandfrei =)

0

Mein Vorredner hat recht.

Verknüpfe deine If klauslen doch m it else damit jede zahl einmal durchgeprüft wird also so ungefähr:

 int i = 1;

    while (i <= 100) {

        if (i%3==0){ 
            if (i%5==0){
            System.out.println("FizzBuzz");
            }
                else
                {
                 System.out.println("Fizz");
                }
        }
       else
           {
            //blablabla noch mehr krams, denk selbst drüber nach ;) 
           }


           else
           {
            System.out.println(i++); //was mach ich damit?
            }
    }

Edit: Bla, fehlöer drin. egal, hast ja glaub ich selbst schon hinbekommen ;)

Das FizzBuzz (nach dem das hier aussieht) ist ein relativ beliebter Test, um z.B. bei Bewerbungen die Qualität eines Programmierers einschätzen zu können. Die algorithmisch klügste Lösung wäre

for(int i=1;i<=100;i++)
{
  if((i % 3 != 0) && (i % 5 != 0))
  {
     System.out.println(i);
  }
  if(i % 3 == 0) 
    {
    System.out.println("Fizz");
    }
  if(i % 5 == 0)
    {
    System.out.println("Fizz");
    }
}
ceevee  11.10.2013, 13:15

Ah, die dritte Ausgabe ist natürlich "Buzz"

0
procoder42  11.10.2013, 15:20
@ceevee

und sowas fragen die ? omg, bei euch wird wohl jeder genommen der nen pc anschalten kann ?

0
procoder42  11.10.2013, 16:01
@ceevee

die stelen also jeden ein ? ok, ich schmeiß die schule und wird programmierer bei Google und diese schwren interview fragen sind nur eine Erfindung von hollywood

0
ceevee  11.10.2013, 17:18
@procoder42

Nun, die Original-Aufgabe lautet ja eigentlich:

  • bei Zahlen, die durch 3 teilbar sind, gib "Fizz" aus
  • bei Zahlen, die durch 5 teilbar sind, gibt "Buzz" aus
  • bei Zahlen, die durch 3 und durch 5 teilbar sind, gibt "FizzBuzz" aus

Die FizzBuzz-Aufgabe ist erstmal nur ein Einstieg, um beim Bewerbungsgespräch die Zocker von den Programmierern zu trennen, danach kommen noch mehr und schwerere Fragen. Ausserdem ist das eben auch ein kleiner Logiktest, wenn die Ausgabe von "Fizz" und "Buzz" teure Operationen wären, dann würden die Lösungen der anderen hier sich in der Laufzeit von meiner unterscheiden. Du musst auch bedenken, dass man im Gespräch nicht soviel Zeit hat und deswegen kleine Fragen stellen muss. Hier sind übrigens auch ein paar Fragen aus dem Microsoft-Bewerbungsgespräch, du interessierst dich ja für sowas.

1
procoder42  11.10.2013, 17:29
@ceevee

die ersten fragen sind aber ein scherz oder ? (warum nehmen so viele java bei den ms interviews ?)
oh, moment. mit linked lists hab ich mich noch nicht befasst

0
procoder42  11.10.2013, 17:32
@procoder42

die 9er ist recht bekannt.
ich hab mal ne abgewandelte gelöst (einen string überprüfen)

0
procoder42  11.10.2013, 15:24

außerdem nur bedingt richtig.
FizzBuzz soll auf EINER zeile ausgegeben werden

0