Leerzeichen vor Zahlen?

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.

Retera 
Fragesteller
 07.03.2019, 17:29

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
daCypher  08.03.2019, 08:52
@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
Retera 
Fragesteller
 08.03.2019, 12:28
@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 
Fragesteller
 08.03.2019, 13:00
@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

Hier einmal die Quellcodes:

Alter:

public class Ue_Methoden_02 {
	public static String formatiere(int n) {
		
		String l = "" + n;
		if (n < 10) {
			l = " " + n;
		}
		else {
			l = " " + n;
		}
		return l;
	}
	public static void main(String[] args) {
		
		int spalten = Eingabe.readInt("Anzahl Spalten: ");
		int zeilen = Eingabe.readInt("Anzahl Zeilen: ");
		int e = 1;
		
		for (int j = 0; j < zeilen; j++) {
			for (int i = 0; i < spalten; i++) {
				e = (i + 1) * (j + 1);
				System.out.print(e + " ");
			}
			System.out.println();
		}
		for (int k = 0; k <= 32; k++) {
			System.out.print("-");
		}
		System.out.println();

		for (int j = 0; j < zeilen; j++) {
			for (int i = 0; i < spalten; i++) {
				e = (i + 1) * (j + 1);
!ERROR!			formatiere(e)
!ERROR!         System.out.print(e);
                			}
                			System.out.println();
		}
				
	}
	
}

Hier der verbesserte:



public class Ue_Methoden_02 {
	public static String formatiere(int n) {
		
		String l = "" + n;
		if (n < 10) {
			l = "  " + n;
		}
		else {
			l = " " + n;
		}
		return l;
	}
	public static void main(String[] args) {
		
		int spalten = Eingabe.readInt("Anzahl Spalten: ");
		int zeilen = Eingabe.readInt("Anzahl Zeilen: ");
		int e = 1;
		
		for (int j = 0; j < zeilen; j++) {
			for (int i = 0; i < spalten; i++) {
				e = (i + 1) * (j + 1);
				System.out.print(e + " ");
			}
			System.out.println();
		}
		for (int k = 0; k <= 32; k++) {
			System.out.print("-");
		}
		System.out.println();


		for (int j = 0; j < zeilen; j++) {
			for (int i = 0; i < spalten; i++) {
				e = (i + 1) * (j + 1);
				System.out.print(formatiere(e));
			}
			System.out.println();
		}
				
	}
	
}

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 = "";

}

Woher ich das weiß:Hobby – Selbst gelernt
Retera 
Fragesteller
 07.03.2019, 17:29

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

Woher ich das weiß:Berufserfahrung – Software-Entwicklung
Retera 
Fragesteller
 07.03.2019, 17:30

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

Du kannst ganz easy mit Leerzeichen Deine Zahlen auf eine Länge auffüllen, wie Du willst (hier 3):

String s = "          " + zahl;
return s.substring(s.length() - 3);
Retera 
Fragesteller
 08.03.2019, 12:29

Solche Befehle mag mein Lehrer nur nicht, da a) wir noch gar nicht soweit sind; b) Er sie oftmals selbst nicht kennt.

0
Mikkey  08.03.2019, 12:40
@Retera

Dann musst Du wohl die umständliche Variante nehmen.

0
Mikkey  08.03.2019, 13:04
@Retera

Vermutlich darfst Du "formatiere" auch nicht so verkürzen?

{
   return n < 10 ? "  " + l : " " + l;
}
0
Retera 
Fragesteller
 08.03.2019, 13:09
@Mikkey

Bestimmt nicht, aber erklären darfst du mir das.

0
Mikkey  08.03.2019, 13:23
@Retera

Das darfst Du unter "ternärer Operator" nachlesen ;-)

1