Leerzeichen vor Zahlen?

 - (PC, Programmieren, Java)

6 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Du hast deinen Code nicht mitgeschickt, aber die formatiere() Funktion müsste etwa so aussehen:

private static String formatiere(int n) {
    if (n < 10) {
        return "  " + n;
    } else {
        return " " + n;
    }
}

Die Funktion ist allerdings ungetestet.

Ich hatte die Methode doch richtig, nur den Sysout falsch:

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

for (int i = 0; I < spalten; i++) {

e = (i + 1) * (j + 1);

formatiere(e);

System.out.println(e);

}

🙄 Ganz dummer Fehler. Ich muss wohl unkonzentriert gewesen sein... xD

0
@Retera

Da sind aber noch mehr Fehler drin.

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

Du initialisierst j als Schleifenvariable, aber zählst dann i hoch. Hier müssen natürlich alle drei Bereiche mit der gleichen Variable gefüllt werden. Außerdem macht es für die spätere Berechnung Sinn, wenn du nicht bei 0, sondern bei 1 anfängst und statt "j" einen "erklärenden" Variablennamen nimmst. Du willst hier natürlich auch nicht die Spalten, sondern die Zeilen zählen. Mein Vorschlag würde so aussehen:

for (int zeile = 1; zeile <= zeilen; zeile++) {

Nächste Zeile:

for (int i = 0; I < spalten; i++) {

Hier gilt das Gleiche. Du benutzt verschiedene Variablennamen, die nicht erklärend sind (da Java case-sensitive ist, sind "i" und "I" verschiedene Variablen) und fängst bei 0 an. Korrigiert:

    for (int spalte = 1; spalte <= spalten; spalte++) {

Nächste Zeile:

e = (i + 1) * (j + 1);

Das kannst du wegfallen lassen, wenn du wie oben erwähnt, bei 1 anfängst zu zählen.

Nächste Zeile:

formatiere(e);

Da die Funktion "formatiere()" einen Wert zurückgibt, läuft der hier einfach nur ins Leere. Du kannst natürlich auch in der Funktion die Variable e ändern lassen, aber das wäre ein schlechter Codestil, den du dir schnell abgewöhnen solltest, weil er später bei größeren Projekten dazu führt, dass die Sache sehr unübersichtlich wird. Du kannst die Funktion am Besten einfach mit der nächsten Zeile kombinieren.

Nächste Zeile:

System.out.println(e);

Hier willst du natürlich nicht pro Wert eine Zeile ausgeben, sondern alle Werte hintereinander schreiben, bis alle Spalten abgearbeitet sind und dann erst in die nächste Zeile wechseln. Zusammen mit den Änderungen von oben sieht die Korrektur so aus:

        System.out.print(formatiere(zeile * spalte));

Bei einem späteren Programmierprojekt würde man wahrscheinlich eher englische Variablennamen benutzen und ich würde statt "spalten" eher "anzahlSpalten" bzw. "colCount" benutzen, damit es eindeutiger ist, für was die Variable benutzt wird, aber die Aufgabenstellung gibt die Namen ja vor. Zusammengefasst würde die ganze Klasse so aussehen:

import java.util.Scanner;

public class MultiplicationTable {
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);


		System.out.print("Bitte Anzahl der Zeilen eingeben: ");
		int zeilen = in.nextInt();


		System.out.print("Bitte Anzahl der Spalten eingeben: ");
		int spalten = in.nextInt();


		in.close();


		for (int zeile = 1; zeile <= zeilen; zeile++) {
			for (int spalte = 1; spalte <= spalten; spalte++) {
				System.out.print(formatiere(zeile * spalte));
			}
			System.out.println();
		}
	}


	private static String formatiere(int n) {
		if (n < 10) {
			return "  " + n;
		} else {
			return " " + n;
		}
	}
}
1
@daCypher

Danke für die Tipps. Die Namen der Variablen als auch das Layout, wie es ausgegeben werden soll, sind leider vorgegeben. Mein Lehrer findet es weniger prickelnd, wenn wir englische Begriffe nutzen, da sein Englisch nicht das Beste ist. Mir ist sowas aber eigentlich lieber, da dadurch die Quelltexte auch international verstanden werden können, bzw später ja auch so gearbeitet wird.

0
@Retera

Ich habe jetzt die Tipps bezüglich der umständlichen Schreibweise angewandt. Jetzt funktioniert das alles. Übrigens sind die falschen Variablenbezeichnungen gestern entstanden, weil ich den Quellcode nochmal aus dem Kopf heraus am Handy geschrieben habe, und teilweise mich wohl versehentlich „j“ statt „i“ geschrieben habe. Ich habe das „i“ und das „j“ aber in „colCount“ und „linCount“ umgeändert und mit einer Notiz zusätzlich erklärt.

Auf jeden Fall vielen Dank für die Anregungen.

1

Wie genau hast du es denn gelöst?

Wenn du einfach alle Leerzeichen aus deinen prints entfernst, und immer formatiere(n) aufrufst, sollte es doch genau das machen?

string line = "";

for(int i = 1; i <= 4; i++){

for(int j = 1; j <= 5; j++){

line += formatiere(i*j);

}

println(line);

line = "";

}

Ich hatte die Methode doch richtig, nur den Sysout falsch:

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

for (int i = 0; I < spalten; i++) {

e = (i + 1) * (j + 1);

formatiere(e);

System.out.println(e);

}

🙄 Ganz dummer Fehler. Ich muss wohl unkonzentriert gewesen sein... xD

0

Es steht doch schon alles in der Aufgabe.

  • wenn n einstellig ( < 10) ist, dann 2 Leerzeichen voranstellen
  • wenn n zweistellig ( >= 10) ist, dann 1 Leerzeichen voranstellen

Überlege Dir doch mal: Wie stellt man 2 Leerzeichen voran und welchen Datentyp sollte die Methode schlauerweise zurückgeben?

Kleiner Tipp:

" " + 5 -> " 5"

LG

Ich hatte die Methode doch richtig, nur den Sysout falsch:

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

for (int i = 0; I < spalten; i++) {

e = (i + 1) * (j + 1);

formatiere(e);

System.out.println(e);

}

🙄 Ganz dummer Fehler. Ich muss wohl unkonzentriert gewesen sein... xD

1

Was möchtest Du wissen?