2017-09-27 1 views
1

Ich habe das Treppenhaus Problem in Java. Ich habe es geschrieben, aber es hat nicht funktioniert. Ich poste es also, wenn irgendjemand nach meinem Fehler suchen könnte. Vielen Dank.Treppenhaus funktioniert nicht, es gibt Fehler in meinem Code

public static void main(String[] args) { 

     Scanner sc=new Scanner(System.in); 
     int n=sc.nextInt(); 
     int f=n; 
     for(int i=0;i<n;i++) 
     { 
      for(int j=0;i<f;j++) 
      { 
       System.out.print(" "); 
      } 
      for(int k=0;k<=i;k++) 
      { 
       System.out.print("#"); 
      } 
      f=f-1; 
      System.out.println(" "); 
     } 
    } 

Der Eingang war 6

und das Ausgabemuster

 # 
    ## 
    ### 
    #### 
##### 
###### 

sein sollte, aber Mine produziert nichts der Code der Code festgelegt ist

sollte public static

gewesen void main (String [] args) {

 Scanner sc=new Scanner(System.in); 
     int n=sc.nextInt(); 
     int f=n; 
     for(int i=0;i<n;i++) 
     { 
      for(int j=1;j<f;j++) 
      { 
       System.out.print(" "); 
      } 
      for(int k=0;k<=i;k++) 
      { 
       System.out.print("#"); 
      } 
      f=f-1; 
      System.out.println(" "); 
     } 
    } 

Dank für all die Hilfe Jungs ... gesegnet eine Gemeinschaft wie diese zu haben .. :)

+0

Gibt es keine Ausgabe oder ist Ihre Ausgabe eine Menge Leerzeichen? – dave

+0

Willkommen bei Stack Overflow! Es sieht so aus, als müssten Sie lernen, einen Debugger zu verwenden. Bitte helfen Sie sich selbst [https://ericlippert.com/2014/03/05/how-to-debug-small-programs/]. Wenn Sie danach noch Probleme haben, können Sie gerne eine spezifischere Frage stellen. –

Antwort

2

Diese Zeile falsch ist

  for(int j=0;i<f;j++) 
      { 
       System.out.print(" "); 
      } 

Sollte

sein
 for(int j=0;j<f;j++) 
     { 
      System.out.print(" "); 
     } 

Sie switched i und j so Ihre nie verlassen, dass für die Schleife

+0

Ihr Code hat diesen Testfall nicht bestanden. Eingang (stdin) Ihr Output (stdout) # ## ### #### ##### ###### Erwartete Ausgabe # ## # ## #### ##### ###### Compiler Nachricht Falsche Antwort – Fiore

+0

können Sie ein besseres Format finden? Es ist schwer, den Unterschied zu erkennen. Ein Problem könnte sein, dass Sie mit System.out.println ("") ein zusätzliches Leerzeichen hinzufügen. Am Ende. Vielleicht ändern Sie das zu System.out.println ("") – Legman

+0

lassen Sie mich wissen, wenn das letzte Bit hilft – Legman

2

Lassen Sie uns was jeden Teil Ihres brechen Code tut, und sehen, ob die Antwort wird klar:

int n=sc.nextInt(); 
    int f=n; 

So lesen wir in einer Reihe (in diesem Fall 6), und stellt sowohl n und f dieser Wert zu sein.

for(int i=0;i<n;i++) 
    { 

Hier werden wir den folgenden Block 6-mal wiederholen, mit i gleich 0 ist, dann 1, dann 2, 3, 4 und 5. Wir halten werden, wenn i nicht mehr weniger als n, die in diesem Fall 6 ist.

So starten wir die Schleife, und i ist 0. n und f sind beide noch 6, weil wir sie nicht geändert haben.

 for(int j=0;i<f;j++) 
     { 

Eine weitere Schleife, diesmal wir mit j bei 0 fangen, und bis i weiterhin nicht mehr weniger als f. Was waren wieder i und f? i ist 0 (wir sind auf dem ersten Mal durch diese äußere Schleife) und f ist immer noch 6. 0 ist weniger als 6, also starten wir diese Schleife.

  System.out.print(" "); 
     } 

Wir drucken einen Raum, und das Ende der Schleife finden, so gehen wir zurück um auf die for(int j=0... Schleife, Erhöhen j (weil wir gesagt j++ in Anfang dieser Schleife).

Also, jetzt sind die Werte, die wir haben: j = 1, und f = 6. Wir überprüfen die Loop-Bedingung - i<f - und 0 ist immer noch weniger als 6, also wiederholen wir die Schleife erneut, und drucken Sie ein anderes Leerzeichen, und wiederholen Sie die oben genannten.

Nichts innerhalb dieser Schleife verändert sich immer die Werte von i oder f, so die Bedingung für die Schleife (i<f) ist immer wahr, und wir nur immer in einer Endlos-Schleife, Druckräume enden. j erhöht sich bei jeder Iteration, also geht es bis zu 1, 2, 3 usw., aber da Sie sich nie wieder darauf beziehen, ist das irrelevant.

Das Problem besteht also darin, dass Sie die Schleifenbedingung ändern müssen, damit Sie die Schleife beenden und zu den anderen Teilen Ihres Programms wechseln können.

Vorausgesetzt, dass Ihre Schleife über j iteriert, und Sie erhöhen das, wie Sie gehen, meine Vermutung ist, dass Sie verwenden möchten, um zu bestimmen, ob die Schleife zu beenden - also, Sie wahrscheinlich machen möchten es die Bedingung j<f statt i<f, das heißt:

 for(int j=0;j<f;j++) 
     { 
      System.out.print(" "); 
     } 

ich bin nicht sicher, ob das Ihr Programm perfekt machen, oder wenn Sie ein ähnliches Problem betroffen, aber hoffentlich, indem er sie wie diese Sie brechen kann die Art von Gedankenprozess sehen, den Sie durchlaufen müssen, um das zu lösen, was auch immer das nächste Problem ist, auf das Sie stoßen. Im Grunde müssen Sie so tun, als ob Sie der Computer wären, und jede Zeile einzeln bearbeiten, indem Sie den Wert jeder Variablen bei jeder Änderung aufschreiben. Es ist nicht schwer, aber es ist zeitaufwendig und nervig - willkommen zu programmieren!

0

Ich denke, das ist ganz einfach und könnte mit ein paar Zeilen gemacht werden. Alles, was Sie brauchen, sind nur zwei Zähler (einer für Zeilen und ein anderer zum Teilen empty Teil und # Teil).

int rows = 6; 
for (int i = rows; i > 0; i--) { 
    for (int j = rows; j > 0; j--) 
     System.out.print((rows - j + 1) < i ? ' ' : '#'); 
    System.out.println(); 
} 
+0

Antworten sind besser, wenn Sie eine Erklärung veröffentlichen können, damit jemand von dem, was Sie vorgeschlagen haben, lernen, anstatt nur den Arbeitscode.Außerdem hat das OP eindeutig gesagt, dass er die Sprache lernt. Daher ist es unwahrscheinlich, dass die Reduzierung des Codes auf komplexe, einzeilige Anweisungen ihnen hilft, zu lernen. Es stellt auch ein schreckliches Beispiel dar, wenn sie Pläne haben, ein professioneller Softwareentwickler zu werden - wenn ich in echtem Code auf so etwas stoßen würde, würde ich es sofort umschreiben, um seine Absicht klar zu machen, anstatt "clever" zu sein obskur. – DaveyDaveDave

+0

@DaveyDaveDave Ich habe dem Beitrag Kommentare hinzugefügt –

0

Mit Java 8 Streams, String.format Sie das Problem in einer prägnanten Art und Weise lösen könnten:

int limit = 6; 
IntStream.rangeClosed(1, limit) 
    .forEach(i -> System.out.printf("%" + limit + "s%n", String.join("", Collections.nCopies(i, "#")))); 

Dies ist, wie die "#" wiederholt wird:

String.join("", Collections.nCopies(i, "#") 

Mit System.out.printf mit "%" + digit + "s" richtet rechts eine Zeichenfolge aus.

Verwandte Themen