Leerzeichen vor Zahlen?
Ich habe folgende Problematik:
Ich muss für Informatik bis nächste Woche eine ganze Liste an Programmier-Aufgaben erledigen. Bis auf die letzte Aufgabe habe ich auch schon alles fertig.
Ich soll nun ein Programm schreiben, welches einem das „Ein-mal-Eins“ wiedergibt. Kein Ding, das habe ich fertig geschrieben. Nun soll aber eine erneute Methode geschrieben werden. Mit dieser (nicht in dieser) soll nun das ganze wiederholt werden, aber diesmal so, dass anschließend vor allen Zahlen kleiner 10 zwei Leerzeichen stehen, bei allen größer gleich 10 nur ein Leerzeichen. Sprich die neue Methode soll diese formatieren. Leider haben wir dazu keine weiteren Informationen. Die ganze Klasse rätselratet, wie das gehen soll, während unser Lehrer erst nächste Woche Donnerstag aus dem Krankenhaus wiederkehrt.
Hier ist mein Ansatz (Eingabe.readInt(); ist ein Befehl aus einem uns vorgegebenen App, welcher das Eingeben des Wertes durch die ausführende Konsole ermöglicht (Abfrage während des Ausführens)). Leider ordnet formatiere() in meinem Programm die Zahlen nicht wie gewünscht.
Und hier die genaue Aufgabe:
6 Antworten
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.
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;
}
}
}
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.
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.
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 = "";
}
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
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
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);
Solche Befehle mag mein Lehrer nur nicht, da a) wir noch gar nicht soweit sind; b) Er sie oftmals selbst nicht kennt.
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