Erste Schritte Hilfe bei Uebung

kuschipe

Mitglied
Guten Tag,
ich studiere Hörtechnik und in der heutigen Informatik Übung bin ich etwas aufgeschmissen. Es ist erst das zweite Mal, dass wir mit Java arbeiten.

Die Aufgabe lautet wie folgt:

Schreiben Sie ein Programm „Rechteck“, das zunächst eine Zahl
hoehe einliest, die größer als 1 ist, dann eine Zahl breite einliest, die
größer als 1 und kleiner als 10 ist, und anschließend ein „Rechteck“
mit der Höhe hoehe und der Breite breite in folgender Gestalt auf
den Bildschirm ausgibt:

Beispiel:
$ java Rechteck
Hoehe eingeben:
4 <CR>
Breite eingeben:
5 <CR>
+---+
| |
| |
+---+

(Die Senkrecht-Striche sollen natürlich jeweils den Rand bilden)
Ich habe mich bereits daran versucht, jedoch macht das alles nicht das was ich will und ich bin etwas überfordert :D

Java:
import java.io.*;

public class Rechteck
{
    public static void main(String[] args) throws IOException
    {
        System.out.println("$ java Rechteck");
      
        BufferedReader hoehe1 = new BufferedReader(new InputStreamReader(System.in));
        System.out.println("Hoehe eingeben: ");
      
        Integer hoehe = new Integer(hoehe1.readLine());
      
        BufferedReader breite1 = new BufferedReader(new InputStreamReader(System.in));
        System.out.println("Breite eingeben: ");
      
        Integer breite = new Integer(breite1.readLine());
      
        {
            for (int i = 0; hoehe > 1; i++)
            {
                for (int j = 0; breite < 10; j++)
                {
                    if(i > 1)
                    {
                        System.out.print("|");
                    }
                    else if(j < 10)
                    {
                        System.out.print("-");
                    }
                    else
                    {
                        System.out.print("+");
                    }
                }
                System.out.println();
            }
        }
    }
}

Kann jemand helfen? Danke vielmals!
 
Zuletzt bearbeitet:

Tarrew

Top Contributor
Bei so welchen Ausgaben sind die for-Schleifen typischerweise so aufgebaut:
Java:
        for (int i = 0; i < hoehe; i++) {
            for (int j = 0; j < breite; j++) {
                System.out.print("+");
            }
            System.out.println();
        }

In der äußeren über die Zeilen iterieren.
In der inneren wird dann die aktuelle Zeile gefüllt.

Das Programm gibt jetzt als Beispiel ein Rechteck aus, dass nur aus "+" besteht.
Wenn du jetzt deine if-Bedingungen nochmal überarbeitest, solltest du an dein gewünschtes Ergebnis kommen ;)

Vergiss nicht, for den for-Schleifen die Eingaben zu prüfen. Also ob höhe > 1 und breite [2, 10[ ist.
 

kuschipe

Mitglied
Hallo, danke für die Hilfe!
Ich habe jetzt ein paar Stunden daran gesessen und folgendes ist dabei herausgekommen:
Java:
import java.io.*;

public class Rechteck
{
    public static void main(String[] args) throws IOException
    {
        System.out.println("$ java Rechteck");
       
        BufferedReader hoehe1 = new BufferedReader(new InputStreamReader(System.in));
        System.out.println("Hoehe eingeben: ");
       
        Integer hoehe = new Integer(hoehe1.readLine());
       
        BufferedReader breite1 = new BufferedReader(new InputStreamReader(System.in));
        System.out.println("Breite eingeben: ");
       
        Integer breite = new Integer(breite1.readLine());
       
        {
            if (hoehe > 1 && breite > 1 && breite < 10)
            {
                for (int i = 0; i < hoehe; i++)
                {
                    for (int j = 0; j < breite; j++)
                    {
                        if ((i > 0 && i < hoehe - 1) && (j == 0 || j == breite - 1))
                        {
                            System.out.print("|");
                        }
                        else if ((i == 0 || i == hoehe - 1) && (j > 0 && j < breite -1))
                        {
                            System.out.print("-");
                        }
                        else if ((i == 0 || i == hoehe - 1) && (j == 0 || j == breite -1))
                        {
                            System.out.print("+");
                        }
                        else
                        {
                            System.out.print(" ");
                        }
                    }
                    System.out.println();
                }
            }
            else
            {
                System.out.print("Fehlerhafte Eingabe");
            }
        }
    }
}

Scheint zu funktionieren und ich bin ganz froh :) Keine Ahnung ob es eine elegante Lösung ist, aber für Verbesserungsvorschläge bin ich immer offen!
 

Flown

Administrator
Mitarbeiter
Hier mal meine Verbesserungsvorschläge:
- Führe Klassen ein und mach nicht alles in der main-Methode
- Nutze eine(!) Eingabe, am besten einen Scanner, der dir die Eingabe parst und validiert
- Kapsle Funktionalität in Methoden. Das erhöht die Übersicht und Lesbarkeit
- Nutze die toString Methode um dein Objekt zu visualisieren
Java:
import java.util.Collections;
import java.util.Scanner;

public class Test {
 
  public static void main(String... args) {
    System.out.println("$ java Rectangle");
   
    Scanner scanner = new Scanner(System.in);
    System.out.print("Hoehe eingeben: ");
    int height = scanner.nextInt();
    System.out.print("Breite eingeben: ");
    int width = scanner.nextInt();
   
    Rectangle rectangle = new Rectangle(width, height);
    System.out.println(rectangle);
  }
}

class Rectangle {
  private final int width;
  private final int height;
 
  public Rectangle(int width, int height) {
    if (height <= 1) {
      throw new IllegalArgumentException("Height must be > 1");
    }
    if (width <= 1 || 10 <= width) {
      throw new IllegalArgumentException("Width must be in bounds ]1, 10[");
    }
    this.width = width;
    this.height = height;
  }
 
  @Override
  public String toString() {
    String horizontalLine = generateHorizontalLine();
    return String.join(System.lineSeparator(), horizontalLine, generateVerticalLines(), horizontalLine);
  }
 
  private String generateVerticalLines() {
    return String.join(System.lineSeparator(), Collections.nCopies(height - 2, createVerticalLine()));
  }
 
  private String createVerticalLine() {
    return generateLine('|', ' ');
  }
 
  private String generateHorizontalLine() {
    return generateLine('+', '-');
  }
 
  private String generateLine(char corner, char line) {
    String betweenCorners = String.join("", Collections.nCopies(width - 2, String.valueOf(line)));
    return corner + betweenCorners + corner;
  }
}
 

Neue Themen


Oben