# Java Ein mal Eins Tabelle



## Jimmy (4. Sep 2009)

Hallo Community,

Bin gerade vollkommen am verzweifeln... und mir fällt irgendwie nicht mehr ein wie ich überhaupt meine anfangs-Scripte verwirklichen kann. Habe dann mal nach einem Java Forum gesucht und Google sei dank, hier bin ich gelandet. Sieht ja schonmal viel versprechend aus, also hoffe ich das mir irgendwer helfen kann.

Und zwar möchte ich eine Tabelle machen ( per Console die Ausgabe ), welche mir nach der Abfrage von Größe und welcher Ein mal Eins Tabelle diese ausgibt.

Sprich ich sage Tabelle soll 3 x 3 groß sein und die Tabelle der Zahl 2 zeigen. Soll als Ergebniss dann so aussehen:

* 2 3 4
2 4 6 8
3 6 9 12
4 8 12 16

Habe dann das hier angefangen und schon minds. 100 mal abgeändert aber es kam nicht das raus was ich wollte. Denn die Tabelle ist a) verschoben, also unten links ist eine Zahl alleine stehend und die ganze Multiplikationen stimmen nicht...
Eventuell hat einer einen Rat. Wäre auch für Erklärungen sehr dankbar.


```
import AlgoTools.IO;


public class EinXEinsTabelle {

	public static void main(String[] args) {
		macheTabelle();
	}
	public static void macheTabelle() {
		int x, c, d, e;
		c = IO.readInt("Welche Tabelle möchtest du sehen?");
		x = IO.readInt("Welche Größe soll die Tabelle haben? ");
		IO.print("*",7);
		d = 1;
		e = 1;
		
		for(int a = 0; a <= x; a++) {
			for(int b = 1; b <= x; b++) {
				IO.print(+ c*d,7);
				d++;
			}
			IO.println("",7);
			e++;
			d = d;
			IO.print(+ e,7);
		}
	}
}
```

Danke sehr schonmal.


----------



## ARadauer (4. Sep 2009)

was ist IO? das ist keine Klasse der Java api


----------



## Ariol (4. Sep 2009)

Hab mir mal selbst eine IO-Klasse gebastelt:


```
import AlgoTools.IO;
 
 
public class EinXEinsTabelle {
 
    public static void main(String[] args) {
        macheTabelle();
    }
    public static void macheTabelle() {
        int c = IO.readInt("Welche Tabelle möchtest du sehen?");
        int x = IO.readInt("Welche Größe soll die Tabelle haben? ");
        
        x+=1;
        
        for(int i = 1; i <=x; i++)
        {
        	for(int j = 1; j <=x; j++)
        	{
        		if(i==j && j==1)
        			IO.print('*',7);
        		else
        			IO.print(i*j,7);
        	}
        	IO.println();
        }
    }
}
```


Meine IO

```
package AlgoTools;

import java.util.Scanner;

public class IO
{

	public static int readInt(String text)
	{
		System.out.print(text);
		return new Scanner(System.in).nextInt();
	}

	public static void print(Object o, int i)
	{
		String s = o.toString();
		for(int c = s.length(); c < i; c++)
			s+=' ';
		System.out.print(s);
	}
	public static void println()
	{
		System.out.println();
	}

}
```

@ARadauer: Wir hatten bei uns auf der FH auch so eine Klasse -> für Anfänger.
Hab ich nie benutzt. Ich fand's schwieriger die Jar einzubinden als die Abfrage selbst zu schreiben -_-


----------



## Landei (4. Sep 2009)

Hier bietet sich die Verwendung von System.out.printf an, weil man damit Zahlen rechtsbündig ausgeben kann, z.B. druckt System.out.printf("%3d",23) rechtsbündig auf 3 Stellen. Wenn du das blöde IO benutzen musst, schreibe dir selbst eine Funktion, mit der du Zahlen vorher ausrichten kannst:


```
//nicht die performanteste Variante, aber einfach zu verstehen
private String pad(int number, int length) {
  String s = "" + number;
  while(s.length() < length) {
     s = " " + s;
  }
  return s;
}
```


----------



## Jimmy (5. Sep 2009)

Ohh danke schonmal für die Hilfe...

Müssen tu ich das nicht, habe ich genommen weil das ein Paket aus der Uni war, so kann man ohne das System.out...... Kram gedönse einfach schreiben IO.print("",int);

Hier kann man auch Stellen angeben, wo die Ziffer stehen soll.  Ich werd das ganze mal ausprobieren. Danke schonmal.
Allerdings macht dieses Script doch nur eine Tabelle oder? Dort fehlen mir die Ein mal Eins reihen. Soll ja irgendwo nützlich sein, sprich die 2er Reihe, die 3er Reihe,..., die 42 Reihe anzeigen.

Also; 2,4,6,8,10,12,14,16,...
3,6,9,12,15,18,....

das halt in einer Tabelle.


/edit
Okay ich hatte die i Variable übersehen...

Danke sehr  Hat mir wirklich weitergeholfen.


----------



## 0x7F800000 (5. Sep 2009)

Jimmy hat gesagt.:


> Müssen tu ich das nicht, habe ich genommen weil das ein Paket aus der Uni war, so kann man ohne das System.out...... Kram gedönse einfach schreiben IO.print("",int);




```
PrintStream IO=System.out;
IO.printf("%d",224)
```
ist auch nicht länger (wobei ich kA habe, was dieser [c]print("",int);[/c] bedeuten soll, java-syntax wäre das nicht)



> Habe aber noch eine Frage und zwar wofür steht das;
> x+=1;


für dasselbe wie x++


> Reicht nicht x=1; ?!


ne?

Hab hier eine multiplikationstabelle für den Körper F_37 gebastelt... Die Tabellenklasse ist auch recht gut geeignet, um überhaupt alle möglichen Tabellen auszugeben. Dünnbesetzte tabellen und Tabellen mit sortierbaren einträgen werden korrekt behandelt. Aber achtung bei tabellen mit gemischten Typen! Wenn beispielsweise Objekte der X klasse lediglich von Object erben, der erste eintrag aber zufälligerweise Comparable Integer ist, kann durchaus eine castException fliegen. Folgende workarounds sind möglich:

[c]X extends Comparable,Y extends Comparable[/c] fordern.
auf zeichenkettenebene sortieren
dazu bin ich grad aber zu faul... Also vorsicht: ist eigentlich echt böser code! :exclaim:


```
import java.util.*;
import static java.lang.Math.*;

public class Table<X,Y,Z>{
	
	private Map<X,Map<Y,Z>> map;
	
	public Table(){
		map=new HashMap<X,Map<Y,Z>>();
	}
	
	public void put(X x, Y y, Z z){
		Map<Y,Z> xMap;
		if((xMap=map.get(x))==null){
			xMap=new HashMap<Y,Z>();
			map.put(x,xMap);
		}
		xMap.put(y,z);
	}
	
	public Z get(X x, Y y){
		Map<Y,Z> xMap;
		if((xMap=map.get(x))==null){
			return null;
		}
		return xMap.get(y);
	}
	
	@Override
	public String toString(){
		return map.toString();
	}
	
	@SuppressWarnings("unchecked")
	public String toMultilineString(){
		
		Collection<Y> yHeads=new HashSet<Y>();
		for(Map<Y,Z> m:map.values()) yHeads.addAll(m.keySet());
		
		if(yHeads.size()==0 || map.isEmpty()) return "";
		
		List<Y> yHeadsAsList=new ArrayList<Y>(yHeads);
		List<X> xHeadsAsList=new ArrayList<X>(map.keySet());
		
		if(yHeadsAsList.iterator().next() instanceof Comparable<?>){
			Collections.sort((ArrayList<? extends Comparable>)yHeadsAsList);
		}
		
		if(xHeadsAsList.iterator().next() instanceof Comparable<?>){
			Collections.sort((ArrayList<? extends Comparable>)xHeadsAsList);
		}
		
		int height=map.size()+1;
		int width=yHeads.size()+1;
		
		String[][] strings = new String[width][height];
		strings[0][0]="";
		int i=1;
		for(Y y:yHeadsAsList) strings[i++][0]=y.toString();
		
		int j=1; 
		for(X x:xHeadsAsList){
			strings[0][j]=x.toString();
			i=1;
			for(Y y:yHeadsAsList){
				Z z=null;
				Map<Y,Z> yMap;
				if((yMap=map.get(x))!=null){
					z=yMap.get(y);
				}
				strings[i++][j] = z==null?"":z.toString();
			}
			j++;
		}
		
		return writeAsTable(strings);
	}
	
	public static String writeAsTable(String[][] strings){
		int[] columnWidths=new int[strings.length];
		int i=0;
		for(String[] column: strings){
			for(String entry:column){
				columnWidths[i]=max(columnWidths[i],entry.length());
			}
			i++;
		}         
		StringBuilder builder=new StringBuilder();
		Formatter formatter=new Formatter(builder);
		
		//first line
		for(int col=0; col<strings.length; col++){
			formatter.format("%"+columnWidths[col]+"s",strings[col][0]);
			if(col==0){
				builder.append(" | ");
			}else{
				builder.append(" ");
			}
		}
		
		builder.append("\n");
		
		//separation line
		for(int col=0; col<strings.length; col++){
			for(int k=0; k<columnWidths[col]; k++){
				builder.append("-");
			}
			if(col==0){
				builder.append("-+-");
			}else{
				builder.append("-");
			}
		}
		
		builder.append("\n");
		
		//other lines
		for(int row=1; row<strings[0].length; row++){
			for(int col=0; col<strings.length; col++){
				formatter.format("%"+columnWidths[col]+"s",strings[col][row]);
				if(col==0){
					builder.append(" | ");
				}else{
					builder.append(" ");
				}
			}
			builder.append("\n");
		}
		
		
		
		return builder.toString();
	}
	
	public static void main(String..._){
		Table<Integer, Integer, Integer> t=new Table<Integer, Integer, Integer>();
		
		final int P=37;
		for(int x=0; x<P; x++){
			for(int y=0; y<P; y++){
				if(x*y<P){
					//that's easy, don't put anything (...to demonstrate that empty cells are handled correctly)
				}else{
					t.put(x, y,(x*y)%P);
				}
				
			}
		}
		
		System.out.println(t.toMultilineString());
	}
}
```


----------



## Jimmy (5. Sep 2009)

Jimmy hat gesagt.:


> IO.print("",int);
> 
> Hier kann man auch Stellen angeben, wo die Ziffer stehen soll.



Das int bedeutet halt an welcher Stelle die Ziffer steht, sodass eine Tabelle sortiert ist und alle Zahlen untereinander stehen.

Also z.B.
...5
..12
.112
...5
..23

Nur anstelle des Punktes halt ein Leerzeichen


----------



## 0x7F800000 (5. Sep 2009)

dazu gibt's eben printf, wüsste jetzt nicht, wozu man das in unbekannteren methoden mit derselben funktionalität verpacken sollte. Langeweile evtl... ???:L


----------



## Ariol (6. Sep 2009)

0x7F800000 hat gesagt.:


> dazu gibt's eben printf, wüsste jetzt nicht, wozu man das in unbekannteren methoden mit derselben funktionalität verpacken sollte. Langeweile evtl... ???:L



Die hatten mal ihre "Berechtigungen".
Vor Java 1.5 war es relativ kompliziert Werte (v.a. Zahlen) einzulesen, da es noch keine Scanner-Klasse gab.

Für einfache Übungen (z.B.: aus dem 1. Semester) ist/war es darum einfacher für die Studenten, wenn es eine Klasse gab, die einem das alles schon abnimmt (Abfangen unerwünschter Eingaben u.ä.).

Über Sinn und Unsinn kann man sich jetzt streiten....


----------



## 0x7F800000 (6. Sep 2009)

Ariol hat gesagt.:


> Die hatten mal ihre "Berechtigungen".
> Vor Java 1.5 war es relativ kompliziert Werte (v.a. Zahlen) einzulesen, da es noch keine Scanner-Klasse gab.


kA, nie benutzt, wozu gibt's BufferedReader? Den gibt's schon ab 1.1 
Wozu gibt's gui's?...


> Für einfache Übungen (z.B.: aus dem 1. Semester) ist/war es darum einfacher für die Studenten, wenn es eine Klasse gab, die einem das alles schon abnimmt (Abfangen unerwünschter Eingaben u.ä.).


Wenn die sowas wollen, dann sollen die das doch selbst schreiben, freiwillig in der 0. Übung, zum aufwärmen... Ich bin eh der Ansicht, dass man 70% von dem, was man im 1. Semester macht, in die frühkindliche Erziehung (oder zumindest in die 7. Klasse) verschieben könnte. Dass es selbst an der Uni Leute gibt, die mit den eingaben von der tastatur schon überfordert sind, finde ich traurig. Genauso finde ich traurig, dass ich voraussichtlich nicht vor dem 25. Lebensjahr gitarre spielen lerne, obwohl man mancherorts schon mit 4 zur musikalischen Früherziehung kann^^ :autsch: Was will man machen, das Leben verläuft doch immer suboptimal... :bahnhof:


> Über Sinn und Unsinn kann man sich jetzt streiten....


So ein Unsinn... Welchen Sinn soll die Streiterei denn haben^^


----------



## Soul1982 (4. Feb 2011)

[Java]for (i=startzeile; i <= endzeile; i++)
			{	
				if (i < 10)
				{
					System.out.print("   ");
				}	
				else 
					if (i < 100)
					{	System.out.print("  ");
					}
					else 
						if (i < 1000)
						{ System.out.print(" ");	
						}[/Java]

So kannst du das auch machen x)


----------



## Soul1982 (4. Feb 2011)

Doppelpost bitte löschen...


----------

