# Passwort aus Anfangsbuchstaben



## Chrissicat (21. Mrz 2011)

Hey Leute!

Ich hab da eine dringende Frage (ok, was ist schon dringend  )

der Benutzer tippt einen beliebigen Satz ein, aber auch mit beliebig vielen Leerzeichen zwischen den Wörtern und ausgegeben werden soll dann ein String (oder Array, das ist egal) der Anfangsbuchstaben ausgegeben werden.

zu guterletzt soll das Passwort selbst abwechselnd aus Groß- und Kleinbuchstaben bestehen.

ich habe einen Ansatz, aber ich bitte euch die methode aufzuschreiben, da ich meinen Ansatz nicht realisieren kann..

mein Ansatz:
ich lasse den Satz als String einlesen.
dann gehe ich mit einer for-schleife durch und schau bei jedem (wie heißt das?) achja, charAt  ob ein leerzeichen drin ist und nehme dann das nachkommende char heraus. in einen extra speicher, der schon mein fast fertiges passwort ist. ohne low und uppercase jetzt.

ich würd mich über Lösungen wirklich sehr freuen


----------



## Michael... (21. Mrz 2011)

Den String könnte man mit StringTokenizer bequem auftrennen.
Anschliessend müsste man nur das erste Zeichen der Tokens mit charAt() auslesen und abwechselnd mit den Methoden der Klasse Character (toUpperCase/ toLowerCase) umwandeln.


----------



## Chrissicat (21. Mrz 2011)

mh. gute Idee, nur "weiß" ich sowas noch nicht. das ist in meinem unterricht noch nicht vorkommen. es sollte viel "einfacher" gehen, erstsemestrigmäßig


----------



## SlaterB (21. Mrz 2011)

dann setzte doch deine Idee um, das sind die einfachen Grundbefehle,
alles andere schönere kann nur kompliziert werden


----------



## Chrissicat (21. Mrz 2011)

daran scheitere ich aber im moment...


----------



## SlaterB (21. Mrz 2011)

auch wenn ich nur ein weiteres Post sammle, es muss wohl sein:
ohne Code, Problembeschreibung, Frage (!) wird sich daran hier nichts ändern


----------



## Michael... (21. Mrz 2011)

Chrissicat hat gesagt.:


> daran scheitere ich aber im moment...


Und woran genau, wie sieht der Code aus? Was darf denn verwendet werden? Dürfen die Methoden der Klasse Character nicht verwendet werden?


----------



## Chrissicat (21. Mrz 2011)

den code hab ich nicht auf diesem rechner, kann natürlich im netbeans rot angestrichen sein 
 ???:L
problembeschreibung hab ich schon angegeben
und meine frage ist: wie mach ich das?


```
String satz = "";
satz = IOTools.readString("eingabe: ");

for (int i = 0; i < satz.length; i++){
if (satz.charAt[i] == ' ' ){
 } // das sollte ein leerzeichen sein..
}
```

ah. .. sorry ich muss off, kann nicht zu ende schreiben. später


----------



## Firephoenix (21. Mrz 2011)

Hi,
da das hier wohl eher in den Bereich Hausaufgaben fällt sei wenigstens mal das Zitat genannt:


> Wir machen keine Hausaufgaben, aber wir helfen dabei


.

Ich löse gerne solche Probleme (hab nen totales Faible für Uni/Schulaufgaben aller Art, hauptsache kreatives Programmieren :rtfm, aber es ist doch viel schöner, wenn man sieht, dass jemand auch etwas dabei lernt.

Grundsätzlich kann man solche Aufgaben auch immer nach dem gleichem Schema lösen:
*1. Problem verstehen und auf dem Papier lösen*
Du Kriegst etwas Richtung "Hello World,      how are you today?"
und hättest daraus gerne so etwas: "HwHaYt".
Wie macht man das?
-Wörter einzeln aufschreiben
-Anfangsbuchstaben raussuchen
-Anfangsbuchstaben abwechselnd groß/kleinschreiben
-Alles wieder zusammenhängen

*2. Sich Codeteile suchen (und dabei nich copy/paste sondern verstehen was der Code macht)*
Hier hast du ja schon Hilfe bekommen, aber ich will dir auch nochmal ein paar Ansätze geben:
in der Klasse String:
-.trim() : entfernt alle Leerstellen am Anfang und Ende des Strings
-.split(regex) : splittet einen String an allen vorkommenden Ausdrücken des übergebenen Regex und liefert als Ergebnis ein String Array.
bsp:
split("[a]") auf cdefagaagcdab würde das array ergeben: [0]:cdef [1]: g [2]:gcd [3]: b
Der Reguläre Ausdruck für eine beliebige Anzahl Leerstellen wäre "\\s+" (s für Leerzeichen, + für mindestens eine)
Wie man Chars in groß/klein umwandelt wurde oben ja schon geschrieben:
Character.toUpperCase('c') -> 'C'
äquivalent dazu toLowerCase.
Dann gibt es noch so etwas wie StringBuilder. Ein StringBuilder kann benutzt werden um Zeichen an Strings zu hängen.
Dazu erzeugt man sich ein Objekt der Klasse StringBuilder und kann damit mit
.append('c') z.B. den Character 'c' anhängen.
Die Zeichen werden dabei an das Ende gehängt.
Ist man fertig kann man den gespeicherten String auslesen indem man auf dem StringBuilder-Objekt toString() aufruft.

*3. Das ganze Implementieren*
Wenn du weißt wie du das ganze auf dem Papier lösen würdest und die richtigen werkzeuge kennst kannst du anfangen daraus ein Programm zu machen (und nein man muss sich hier nicht für komischen Code schämen, dann hat man wenigstens etwas womit man arbeiten kann - und ja wir haben hier alle schon gruseligen Code gesehen und jeder von uns hat am Anfang bestimmt einmal lustigen Code fabriziert )
Überleg dir also was du mit deinem String machen musst und versuche das in einen Programmablauf zu packen.
Dannach das Ergebnis hier hochladen damit man was zum anschauen (und bei bedarf zum korrigieren) hat.

Als letztes (was auch gerne vergessen/übersprungen wird)
*4. Testen*
Entweder einfach über Testeingaben (und dann mit System.out.println() ausgeben)
oder über andere Testverfahren wie JUnit einfach mal eingaben in die Methode packen und dabei davon ausgehen, dass man nicht weiß was die Methode macht.
Kommt wirklich bei allen Eingaben auch das raus was du erwartest oder crasht im schlimmsten Fall das Programm? Dann ab zu Schritt 3.

Gruß


----------



## SlaterB (21. Mrz 2011)

@Chrissicat
diese Problembeschreibung reicht zumindest zur Verschiebung nach 'Hausaufgaben', neutral gewertet,

ein Tipp von mir: Variablen außerhalb der Schleife merken Zustände, z.B. speichern ob das aktuelle Zeichen ein Leerzeichen ist 
und diese Information dann im nächsten Schleifendurchlauf verwenden,
man kann aber natürlich auch satz.charAt(i) und satz.charAt(i-1)  gleichzeitig anschauen in einem Durchlauf

probieren geht über studieren, nicht erwarten direkt die Lösung hinzuschreiben, sondern nacheinander alles mögliche testen

------

gleich noch ein Standard-Tipp dazu: auf die nervige Eingabe verzichten, wer will schon bei 100 Tests jedesmal alles eintippen (wenn man denn solche Tests macht)

schreibe
String satz = "Dies wird mein Testsatz für heute und morgen.";


----------



## WarumÄrgern (21. Mrz 2011)

So ist es relativ kurz:


```
String str = "Morgenstund hat Gold im Mund";
        StringBuilder buil = new StringBuilder();

        for (String s : str.split("\\W+")) {
            buil.append(s.charAt(0));
        }

        System.out.println(buil);
```

Nimmt man "\\W+" statt das vorgeschlagene "\\s+", bekommt man auch keine unerwünschten Zeichen als PW. Natürlich kann man groß- und kleinbuchstaben noch mit Character.toXXX() invertieren.


----------



## Firephoenix (21. Mrz 2011)

Hi,
ob man jetzt Sonderzeichen mit entfernt oder nicht dürfte eher an der Aufgabenstellung liegen.
Die Upper/Lowercase funktionieren auch auf Sonderzeichen ohne Fehler (ändern dann halt auch nichts) und im allgemeinen sind Sonderzeichen in Passwörtern ja eher erwünscht als unerwüscht 

Für die Unterscheidung upper/lower bzw diesen wechsel kann man übrigens auch etwas anders vorgehen:
tauscht man nämlich die foreach durch eine normale for-schleife, kann man eine fallunterscheidung auf zähler mod 2 machen und so jedes 2. zeichen anders behandeln.
Bsp (dann äquivalent dazu die Arraylänge und das konvertieren der Chars einfügen):

```
for(int i = 0; i < 11; i++){
			if(i%2 == 0)
				System.out.println("Ping");
			else
				System.out.println("Pong");
		}
```
Ausgabe:


> Ping
> Pong
> Ping
> Pong
> ...


So kann man entweder abwechselnd PingPong in die Konsole schreiben oder auch abwechselnd Chars konvertieren.
Man könnte auch immer abwechselnd Exceptions produzieren oder.... :idea:
Gruß


----------



## Chrissicat (21. Mrz 2011)

...jaja genau, mit modulo 2 habs dann mit nem "selbsterzeugten" w


wow!
danke an alle erstmal!

es war übrigens ein prüfungsbsp 

werds gleich ausprobieren. aber ich merk schon, ich bin grad wieder schlauer geworden. oder weniger dumm, wie man's sieht ort einfach so gemacht. lower und upper mein ich


----------

