"We are back" « oc.at

Java Tabelle

SeVen 24.10.2015 - 22:57 7355 27
Posts

SeVen

Little Overclocker
Registered: Apr 2006
Location: Germany
Posts: 96
Hey,
ich bin totaler Anfänger und möchte gerne in Java eine Tabelle programmieren.
Input wäre eine ganze Zahl von 1 - 15. Nun möchte ich bei einer Eingabe von 5, 5 Zeilen und Spalten haben. Die einzelnen Zahlen sollen dann durch Modulo (%) dividiert werden und das Ergebnis soll jeweils in der Tabelle erscheinen.
Ich habe es soweit hinbekommen nur leider wird alles in 5 Tabellen angezeigt (Eingabe 5). Ich bekomme es leider nicht hin es in einer einzigen Tabelle anzeigen zu lassen. Vielleicht kann mir jemand netterweise helfen.
programm_208165.png (downloaded 28x)
ergebnis_208166.png (downloaded 32x)

Hansmaulwurf

u wot m8?
Avatar
Registered: Apr 2005
Location: VBG
Posts: 5639
Wenn du hier den Code-tag verwendest, können wir dir das direkt zeigen ;)

Im Endeffekt müssen beide Schleifendefinitionen direkt nacheinander sein, wenn ich das Problem richtig verstanden habe, also :
for (int x ..) {
for (int y, .. {
IO..
IO..
IO..
}
IO.println
}

So wie du es jetzt machst, druckst du 5 Mal hintereinander einzelne Tables (=Spalten, definiert durch deine y-Schleife, die einfach 5 Zeilen erzeugt). Du müsstest aber einmal alle Spalten drucken, und dann in die nächste Zeile gehen, und dort wieder alle Spalten drucken.

edit:
Ich versteh aber nicht welchen modulo du machen willst. Input%Spaltennummer? Was haben die Zahlen im Table dann für eine Relation zum Input?
Bearbeitet von Hansmaulwurf am 24.10.2015, 23:22

SeVen

Little Overclocker
Registered: Apr 2006
Location: Germany
Posts: 96
Ahh das könnte das Problem sein. Ich teste es mal aus. Ich möchte quasi eine Tabelle: Eingabe 5 -> Zahlen 1-5 untereinander und oben nochmal nebeneinander. Dann sollen die Zahlen jeweils dividiert werden mit Modulo und das Ergebnis angezeigt werden. Also bei 1 % 1 = 0, darunter 2 % 1 = 0... bis 5 % 1 = 0 (untereinander), und nebeneinander 1 % 2 = 1, usw.
So ungefähr:

| 1 2 3 4 5
--+-----------
1 | 0 1
2 | 0 0
3 | 0 1 <------- Ergebnis 3 % 2
4 | 0 0
5 | 0 1

Leider wird hier beim posten die obere Zeile etwas nach links verschoben!

Was ist der Code-Tag?

Vielen Dank schonmal!:)
Bearbeitet von SeVen am 25.10.2015, 02:04

Denne

Here to stay
Avatar
Registered: Jan 2005
Location: Germany
Posts: 2801
Code: JAVA
int x = 5; // Eingelesene Zahl
		
// Erste Zeile können wir außerhalb der Schleifen machen
System.out.print("    "); // Platz schaffen
for (int i = 1; i <= x; i++) {
	System.out.print(i + " ");
}
		
System.out.println(); // Zeilenumbruch

for (int i = 0; i <= x; i++) {
	for (int j = 0; j <= x; j++) {
		if (i == 0 && j == 0) {
			System.out.print("    ");
		} else if (j == 0 && i != 0) {
			System.out.print(i + " | ");
		} else if (i == 0 && j != 0) {
			System.out.print("--");
		} else {
			System.out.print(i % j + " ");
		}
	}
	System.out.println(); // Zeilenumbruch
}

Output ist:

Code:
    1 2 3 4 5 
    ----------
1 | 0 1 1 1 1 
2 | 0 0 2 2 2 
3 | 0 1 0 3 3 
4 | 0 0 1 0 4 
5 | 0 1 2 1 0 

Bei Zahlen ab 10 verschiebt sich die Tabelle etwas, da die Zahlen zweistellig sind. Aber das kannst du ja mal alleine versuchen zu fixen und dich hier notfalls noch einmal melden :)

SeVen

Little Overclocker
Registered: Apr 2006
Location: Germany
Posts: 96
Vielen Dank für die ausfürliche Antowort!
Gibt es denn keine Möglichkeit das nur mit 2 for-Schleifen hintereinander zu machen ohne if und else?
Bei meinem Versuch im ersten Post klappt es ja fast, nur nicht in einer Tabelle. Bin gerade am rumprobieren, so wie es Hansmaulwurf geschrieben hat, leider klappt es nicht.
Ich weiß nicht so genau was ich in die einzelnen Zeilen bei println reinhauen soll. Der Unterschied zwischen print und println ist nur das bei println ein Zeilenumbruch stattfindet oder?

Denne

Here to stay
Avatar
Registered: Jan 2005
Location: Germany
Posts: 2801
if und else dienen hier nur der Formatierung. Das Problem ist, dass wenn Sachen auf der Konsole ausgegeben werden, es der Reihe nach von links nach rechts gemacht wird, da führt kein Weg dran vorbei. Möchten wir es also hübsch ausgeben, müssen wir es "direkt" so ausgeben. Die Werte im Nachhinein in eine vordefinierte Tabelle eintragen geht leider nicht auf diese Art und Weise.
Da dadurch nicht jeder Eintrag identisch von der Formatierung ist (Am Anfang jeder Zeile schreiben wir z.B. einmalig den Zeilenkopf) müssen wir die Einträge unterscheiden, hierfür if und else.

Fang vielleicht so an:
1) Als erstes einfach die Werte ohne jegliche Formatierung auf die Konsole ausgeben.
2) Etwas Platz zwischen den einzelnen Einträgen machen, damit es hübscher aussieht.
3) Nun noch Zeilenumbrüche an den richtigen Stellen, damit nicht alles in einer Zeile steht. An diesem Punkt hast du eine Tabelle mit den Werten, jedoch fehlt das "außenrum".

Nun musst du dich um den Zeilen- und Spaltenköpfe kümmern, was das schwierigste ist. Aber mit etwas probieren merkt man relativ fix, wie der Hase laufen muss :)
Dass man (ohne große Erfahrung) nicht direkt meinen obigen Code hinschreibt ist klar, aber mit langsam herantasten wird es mit der Zeit immer besser.

zu print und println: Ja, println ist print + Zeilenumbruch.

SeVen

Little Overclocker
Registered: Apr 2006
Location: Germany
Posts: 96
Danke! Ich werde es probieren und dann berichten.:)

Denne

Here to stay
Avatar
Registered: Jan 2005
Location: Germany
Posts: 2801
Keine Ursache, viel Erfolg dabei :)

SeVen

Little Overclocker
Registered: Apr 2006
Location: Germany
Posts: 96
Nun passt es fast. Leider bekomme ich die erste Zeile nicht hin.
ich weiß wie ich den Abstand zwischen den Zahlen der ersten Reihe veränder, aber wie kann ich nur vor der ersten Zahl, also der 1 den Abstand verstellen ohne den Abstand zwischen den anderen Zahlen auch zu verändern?

Denne

Here to stay
Avatar
Registered: Jan 2005
Location: Germany
Posts: 2801
Dieser Abstand darf pro Zeile nur einmalig gesetzt werden. Das würdest du mit einer if-Abfrage hinbekommen, wo abgefragt wird, ob es sich um die erste Spalte handelt. Dort wäre dann dementsprechend die print-Anweisung etwas modifiziert, indem noch vor der Zahl ein Abstand "eingebaut" wird. So etwas bekommst du ohne if-Abfragen leider nicht hin und genau deswegen werden sie hier benötigt :)
In dem Beispiel oben kannst dich inspirieren lassen, das Prinzip der if-Abfragen ist dort identisch.

SeVen

Little Overclocker
Registered: Apr 2006
Location: Germany
Posts: 96
Ahh super. Recht herzlichen Dank! Hat alles funktioniert!:D

Denne

Here to stay
Avatar
Registered: Jan 2005
Location: Germany
Posts: 2801
Gerne, Ergebnis schaut gut aus :)

SeVen

Little Overclocker
Registered: Apr 2006
Location: Germany
Posts: 96
jap, danke nochmal für die schnellen Antworten! Ich wünsche noch einen schönen Restsonntag!

SeVen

Little Overclocker
Registered: Apr 2006
Location: Germany
Posts: 96
Habe mich noch an einer Aufgabe versucht: Ich möchte bei einer Eingabe bis 10999 die Zahlen auf Englisch ausgeschrieben haben. Vorgabe mit Switch Case.
Kann ich mehre Switch Case Befehele miteinander verknüpfen?
Möchte mit if und else quasi befehlen, wenn nicht case 1 -19 dann mache mit dem nächsten switch weiter.
Bearbeitet von SeVen am 25.10.2015, 15:55

Blaues U-boot

blupp, blupp
Avatar
Registered: Aug 2005
Location: Graz
Posts: 1542
nur mit switches alleine ist diese schöne hausübungsaufgabe nicht elegant zu lösen. außer man will beinhart 10999 cases machen ;)
die sonderfälle 10-19, die zahlen 1-9 und die sonderwörter für die dekaden und 10er-potenzen muss man mit switches auscoden. den rest kann man schön mit einer funktion und einer schleife abkürzen, nach meiner ersten überlegung.
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz