# Buchstaben addieren



## nano91 (11. Jan 2011)

Hallo, 
ich habe wieder einmal ein Problem und Google spuckt auch keine guten und brauchbaren Ergebnisse aus.

Folgendes:
Ich habe 3 JTextAreas und 1 JButton; Wenn der Button gedrückt wird, sollen die Buchstaben aus Area 1 und 2 "addiert" werden und in der 3. Area ausgegeben werden.
Sprich wenn in ta1 drin steht: ABC und in ta2: GEF, dann soll das A mit dem G addiert werden, wobei A den wert 1 haben soll und G den Wert 7. --> 8 --> H
Und das geschieht halt mit den restlichen Buchstaben auch und wird in ta3 geschrieben.

Also: ABC + GEF = HGI

Ich habe es zwar schon mit Arrays versucht, aber leider komme ich da nicht weiter.
Wisst ihr bessere Lösungsvorschläge?
PS: Wenn der addierte Wert über 26 ist, dann muss wieder bei 1 begonnen werden (also einfach /26)


----------



## SlaterB (11. Jan 2011)

fange an die beiden Strings an irgendeine Stelle in Variablen zu erhalten und z.B. auszugeben,
der nächste Schritt ist dann mit toCharArray() tatsächlich Arrays draus zu machen

damit das ganze übersichtlicher wird und die irrelevanten GUI-Anteile herausfallen hier ein gekürztes neues Programm soweit zu diesem Thema:

```
public class Test
{
    public static void main(String[] args)
    {
        String s = "ABC";
        String t = "GEF";
        char[] a = s.toCharArray();
        char[] b = t.toCharArray();

    }
}
```
keine Idee nun wie es weiter geht? mit Schleife Elemente von a und b zusammenrechnen?


----------



## nano91 (11. Jan 2011)

ja, danke ich habs jetzt...
hier nochmal die lösung:

```
char[] c1 = ta1.getText().toCharArray();
          char[] c2 = ta2.getText().toCharArray();
          char help;
          String erg = "";

          for (int i=0; i<upper1.length(); i++) {
              help = (char)( (c1[i] + c2[i])-64);
              erg+=help;
              
          }
```


----------



## SlaterB (11. Jan 2011)

der Überlauf dann doch


----------



## Andi_CH (11. Jan 2011)

und - 64 ist sicher auch nicht immer richtig - modul ist dein Freund!

So - viel Spass beim reparieren - das ist ja eigentlich schon mehr als eine Starthilfe ....


```
public class Test {
	private static String text1 = new String("AAZZ");
	private static String text2 = new String("ABYZ");

	public static boolean valid(String str) {
		char c = 0;
		for(int i=0; i<str.length(); i++)
			c = Character.toUpperCase(str.charAt(i));
		if (!((c >= 'A') && (c <= 'Z')))
			return false;
		return true;
	}

	/**
	 * Hier drin geht logischerweise noch etwas schief, aber das weisst du ja selbst
	 * Der Wert in res[i] kann zu gross werden
	 * Tipp: du musst den Modulo 26 rechnen - na ja vielleicht vor dem Rechnen noch etwas
	 * abzählen danach wieder dazu - sysout oder der Debugger helfen dir dabei ....
	 */
	public static String add(String str1, String str2) {
		char[] res = new char[text1.length()];
		for(int i=0; i<Math.max(text1.length(), text2.length()); i++) {
			res[i] = (char)(text1.charAt(i) + text2.charAt(i));
		}
		return new String(res);
	}

	public static void main(String[] args) {
		if (!valid(text1)) {
			System.out.println(text1 + " enthält ungültige Buchstaben");
			return;
		}
		if (!valid(text2)) {
			System.out.println(text2 + " enthält ungültige Buchstaben");
			return;
		}
		if (text1.length()!=text2.length()) {
			System.out.println("Strings sind nicht gleich lang");
			return;
		}
		System.out.println(text1);
		System.out.println("+");
		System.out.println(text2);
		System.out.println("-------------");
		System.out.println(add(text1, text2));
	}
}
```

Erwartete Ausgabe:

```
AAZZ
+
ABYZ
-------------
BCYZ
```


----------



## nano91 (11. Jan 2011)

vielen dank für die mühe
aber aus irgendeinem grund, kam bei mir irgendwas raus... nachdem ich ein bisschen mit meinem vorherigen ansatz gespielt hab, hast so funktioniert:


```
char[] c1 = ta1.toCharArray();
          char[] c2 = ta2.toCharArray();
          for (int i=0; i<ta1.length(); i++) {
              if(c2.length>i){
	        	  calc = (char)((c1[i]+c2[i])-64);
	              if (calc>90) calc = (char)(calc-26);
	              erg+=calc;
              } else erg+=c1[i];
          }//Ende for
          ta3.setText(erg);
```

ich versteh zwar nicht wieso ich -64 und dann noch -26 machen muss, aber bis jetzt haben alle ergebnisse gestimmt


----------



## SlaterB (11. Jan 2011)

ASCII-Tabelle


----------



## nano91 (11. Jan 2011)

danke, aber mir ist schon klar, dass A in der ASCII Tabelle bei 65 anfängt und das Alphabet 26 Buchstaben hat... 
Ich verstehe nur nicht, wieso ich beides machen muss.


----------



## SlaterB (11. Jan 2011)

dann hoffe weiter dass du in deinem Leben nie in eine Situation kommen wirst, in der du nachdenken musst..

ersten Buchstaben zu einer ordentlichen Zahl umwandeln = c1 - 64,  (Beispiel 'B' -> 2) 
zweiten Buchstaben zu einer ordentlichen Zahl umwandeln = c2 - 64, (Beispiel 'C' -> 3) 
addierte Zahlen zu einem Buchstaben umwandeln = (x + y) + 64 (Beispiel 5 -> 'E')

(c1 - 64) + (c2 - 64) + 64 = c1 + c2 - 64


----------



## nano91 (11. Jan 2011)

sry, ich hab was vergessen: das mit der -64 hab ich bewusst gemacht und weiss auch wieso... die ascii tabelle kenne ich ja, aber die -26 hab ich nicht verstanden... mit ist aber gerade eingefallen, wieso^^


----------



## Andi_CH (12. Jan 2011)

Na ja: mee too: "dann hoffe weiter dass du in deinem Leben nie in eine Situation kommen wirst, in der du nachdenken musst.."

Viel Besser 'A' anstelle von 64 nehmen - ist VIEL lesbarer. Also
c1 - 'A' + 1 -> so wird aus A eine 1

Dann addieren (wobei der Überlauf stattfindet)
Dann modulo ( guckst du mal nach % ) 26 (kannst aber auch 'Z' - 'A' + a nehmen)
Dann aber schön brav wieder 'A' addieren, damit aus der 0 wieder ein 'A' wird

Trotzdem einen guten Tag.


----------

