# Passwortgenerator Problem



## Slaid (6. Dez 2013)

Hallo,

ich entschuldige mich schon jetzt, falls ich Richtlinien versehentlich nicht beachte :bae:

Ich habe ein Passwortgenerator erstellt der aus einem Satz die jeweils Anfangsbuchstaben von Wörtern nimmt + die Anzahl der Wörter in eine Zahl ausgibt.
Der aber wiederum vor zu kurzen Passwörtern warnt.
Man hat dann die Möglichkeit das Passwort zu bestätigen oder erneut mit der Eingabe Nein ein neues auszuwählen.

Mein Problem befindet sich nun in Zeile 82.

Das Passwort soll, falls ein neues eingegeben wurde mit 


```
System.out.println("Ihr neues Passwort lautet: " + pwdgen(eingabe3));
```

angezeigt werden... 

doch die Eingabe3 wurde zuvor in einer Schleife deklariert...
Ich habe bereits versucht am Anfang der while Schleife die Eingabe3 zu deklarieren trotzdem taucht immer die Fehlermeldung 
eingabe3 cannot be resolved to a variable
auf

Ich hoffe ihr könnt mir helfen.



```
package Aufgabe7;
import java.util.Scanner;
/**
 * 
 * @author Joachim Lipka
 *
 */
public class Passwortgenerator_7_3 
{
	private static final String  = null;

	/**
	 * Das Programm generiert aus einem Merksatz ein Passwort.
	 * @param eingabe generiert den Satz zu den Anfangsbuchstaben der Wörter und die Anzahl als Zahl.
	 * @return Generiert Passwort
	 */
	public static String pwdgen(String eingabe)
	{
		
		String[] satz = eingabe.split(" +");
		String pw = "";
		int zahl = satz.length;

		
		
		
		if (eingabe.length() > 0)
		{
			for (String wort : satz) 
			{ 
				char c = wort.charAt(0); 
				pw += c;
			}
		}
		else
			{
			System.out.println("0");
			}
		
		pw += zahl;
		return pw;
		}
	
	public static void main(String[] args) 
	{
		Scanner in = new Scanner(System.in);
	
		System.out.println("Bitte geben Sie Ihren Merksatz an:");
		String eingabe = in.nextLine(); // Merksatz für das Pw eingeben.
		if (eingabe.startsWith(" "))
		{	
			eingabe = eingabe.substring(1);
		}
		System.out.println("Ihr neues Passwort lautet: " + pwdgen(eingabe)); // neues generiete Pw 
		
		String[] wort = eingabe.split(" +"); // splittet das Pw.
		int zahl = wort.length; // zählt die Länge des Pw.
		
		while (zahl < 6) // sollte das Pw länger als 10 Stellen haben wird die Schleife nicht beachtet.
		{
			
			System.out.println("Ihr Passwort ist nicht sicher. Sie sollten ein längeres Passwort verwenden."
					+ "\nEin sicheres Passwort hat mindestens 6 Stellen.");
			// Das Programm warnt vor zu kurzem Passwort
			
			System.out.println("Möchten Sie das Passwort trotzdem speichern? Bitte mit Ja oder Nein antworten!");
			String eingabe2 = in.nextLine(); // eingabe Ja nein
			
			if (eingabe2.startsWith("nein")) // Falls n für nein startet der Prozess von vorn.
			{
				System.out.println("Bitte geben Sie Ihren Merksatz an:");
				String eingabe3 = in.nextLine(); //neuer Merksatz wrid generiert
				
				System.out.println("Ihr neues Passwort lautet: " + pwdgen(eingabe3)); // neues Passwort von eingabe 3
				wort = eingabe3.split(" +"); // splittet das Pw erneut.
				zahl = wort.length;
				} // zählt die Länge des Pw erneut.
				
				
			else if (eingabe2.startsWith("ja")) // Falls j für Ja
			{ 
				System.out.println("Ihr neues Passwort lautet: " + pwdgen(eingabe3));
				break;  //falls Ja ausgewählt wurde, wird die Schleife beendet.
			}
			else if (eingabe2.startsWith(""))
			{
				System.out.println("Sie müssen mit Ja oder Nein antworten! ");	
			}
		}
		if (zahl > 6) // sollte das neue Pw länger ald 6Ih Ziffern haben wird die Schleife beendet.
		{	
		System.out.println("Ihr Passwort ist sicher und wurde gespeichert!" );
		}
		else
		{
		System.out.println("Ihr Passwort wurde auf Ihren Wunsch übernommen.");
		}
			
	}// bei Ja in der Befragung wird der Satz zur Bestätigung ausgegeben.													
}
```

Schonmal danke

Slaid


----------



## eMmiE (7. Dez 2013)

Du erstellst den String eingabe3 innerhalb einer if-Anweisung, d.h. der String existiert nur für diese Anweisung.
Um das zu ändern musst du vor der Anweisung deine Variable instanzieren, in der Anweisung dann auf einen Wert setzen, sonst kennt der im "else"-Teil die Variable aus dem "if"-Teil nicht

Gruß eMmiE


----------



## Slaid (7. Dez 2013)

Vielen Dank das hat nun geklappt

nun stehe ich vor einem neuen Problem,

Ich wollte nun noch ein EasterEgg einbauen.
d.h. wenn ich "Gib mir ein Rätsel" in der ersten Eingabe eingebe sollte das Programm Zahlenraten starten. 

Methode ist in Zeile
45 - 78

bei  96 - 99 wird die Methode aufgerufen!


```
package Aufgabe7;
import java.util.Scanner;
/**
 * 
 * @author Joachim Lipka
 *
 */
public class Passwortgenerator_7_3 
{
	

	/**
	 * Das Programm generiert aus einem Merksatz ein Passwort.
	 * @param eingabe generiert den Satz zu den Anfangsbuchstaben der Wörter und die Anzahl als Zahl.
	 * @return liefert generiertes Passwort
	 */
	public static String pwdgen(String eingabe)
	{
		
		String[] satz = eingabe.split(" +");
		String pw = "";
		int zahl = satz.length;

		if (eingabe.length() > 0)
		{
			for (String wort : satz) 
			{ 
				char c = wort.charAt(0); 
				pw += c;
			}
		}
		else
			{
			System.out.println("0");
			}
		
		pw += zahl;
		return pw;
		}
	/**
	 * 
	 * @param eingabe4
	 * @return
	 */
	public static int raten(int eingabe4)
	{
		Scanner eingabe = new Scanner(System.in);
		int zahl =(int)( 99 * Math.random() + 1 ); 
	
		System.out.println("Willkommen beim Zahlenraten.");
		System.out.println("Ich denke mir eine Zahl zwischen 1 und 100. Rate diese Zahl!");
		
		int h = 1;
		int z = -1; // -1 negative Zahlen können nicht von "zahl" erreicht werden.
		int zahl1 = -1;
		while (z != zahl && zahl1 != zahl && h <= 5)
		{
			System.out.println("\nDies ist dein " + h++ +  " Versuch: ");
			zahl1 = eingabe.nextInt();
			
			if (zahl1 < zahl)
			{
				System.out.println("Meine Zahl ist groesser! ");
			}
			if (zahl1 > zahl)
			{
				System.out.println("Meine Zahl ist kleiner! ");
			}
			if (zahl1 == zahl)
			{
				System.out.println("Du hast meine Zahl beim " + h++ + ". Versuch erraten!" );
			}
			if (h > 5)
			{
				System.out.println("\nGame Over");
			}
		}
		return zahl;
	}	
	
	
	/**
	 * 
	 * @param args
	 */
	public static void main(String[] args) 
	{
		int eingabe4 = -1;
		String eingabe3 = "";
		int zahl2 = -1;
		Scanner in = new Scanner(System.in);
		
		System.out.println("Bitte geben Sie Ihren Merksatz an:");
		String eingabe = in.nextLine(); // Merksatz für das Pw eingeben.
		
		if (eingabe == "Gib mir ein Rätsel")
		{
				System.out.println(raten(eingabe4));
		}

		if (eingabe.startsWith(" "))
		{	
			eingabe = eingabe.substring(1);
		}
		
		System.out.println("Ihr neues Passwort lautet: " + pwdgen(eingabe)); // neues generiete Pw 
		
		String[] wort = eingabe.split(" +"); // splittet das Pw.
		int zahl = wort.length; // zählt die Länge des Pw.
		
		while (wort.length <= 6 && zahl2 <= 6) // sollte das Pw länger als 10 Stellen haben wird die Schleife nicht beachtet.
		{
			
			System.out.println("Dieses Passwort ist nicht sicher."
			+"\nWir empfehlen daher ein Satz mit mehr als 6 Worten zu wählen."
			+"\nErneut Merksatz eingeben? (Ja/Nein).");
			// Das Programm warnt vor zu kurzem Passwort
			String eingabe2 = in.nextLine(); // eingabe Ja nein
			
			if (eingabe2.equalsIgnoreCase("Ja")) // Falls n für nein startet der Prozess von vorn.
			{
				System.out.println("Bitte geben Sie Ihren Merksatz an:");
				eingabe3 = in.nextLine(); //neuer Merksatz wrid generiert
				
				if (eingabe3.startsWith(" "))
				{	
					eingabe3 = eingabe3.substring(1);
				}
				
				System.out.println("Ihr neues Passwort lautet: " + pwdgen(eingabe3)); // neues Passwort von eingabe 3	
				String[] wort2 = eingabe3.split(" +"); // splittet das Pw.
				zahl2 = wort2.length;
			} 
			else if(eingabe2.equalsIgnoreCase("Nein"))
			{
				if(eingabe2.equalsIgnoreCase("Nein") && zahl2 !=-1)
				{ 
				System.out.println("Ihr Passwort " + pwdgen(eingabe3) + " wurde auf Ihren Wunsch übernommen");
				break;
				 //ausgewählt wurde, wird die Schleife beendet.
				}
				else if (eingabe2.equalsIgnoreCase("Nein") && zahl2 == -1)
				{
					System.out.println("Ihr Passwort " + pwdgen(eingabe) + " wurde auf Ihren Wunsch übernommen");
					break;
				}
			}	
			else
			{
				System.out.println("Sie müssen mit Ja oder Nein antworten");
				
			}
			
		}
		if (zahl > 6 | zahl2 > 6) // sollte das neue Pw mehr als 6 Ziffern haben wird die Schleife beendet.
		{	
			System.out.println("Ihr Passwort ist sicher und wurde gespeichert!" );
			// bei Ja in der Befragung wird der Satz zur Bestätigung ausgegeben.
		}
		
	}													
}
```

Hoffe ihr könnt mir da noch helfen


----------



## eMmiE (8. Dez 2013)

@Problem:
Du solltest eine if-else-Abfrage machen...
Wenn eingabe = "Zahlenraten" o.Ä. rufst du die Methode Zahlenraten auf, sonst die andere Methode.
Somit "kastest" du das Programm und machst es so übersichtlicher.

Die nächste Stufe davon wäre, dass du das dann mit einer switch-Anweisung machst, sodass du verschiedene Funktionen aufrufen kannst...

Zum Code in Zeile 96-99:
Wie stellst du dir eigentlich ein Passwort vor?
Mit deinem 
	
	
	
	





```
.split(" +")
```
 teilst du ja dein Passwort immer auf, wenn die Zahlenkette " +" enthält, wobei dieses rausgeschnitten wird

Bsp.:

```
String str = "xyz +&%$ +lolol +öäöäöä + +";
String split[] = str.split(" +");
```

...führt zu:
["xyz"]
["&%$"]
["lolol"]
["öäöäöä"]
[""]
[""]

Ist das so gedacht?

Ausserdem würde ich:

```
if (eingabe.startsWith(" ")) {
  eingabe = eingabe.substring(1);
}
```

ersetzen durch:

```
while(eingabe.startsWith(" ")) {
  eingabe = eingabe.substring(1);
}
```

...nur meine Sicht der Dinge

Gruß eMmiE


----------



## Slaid (8. Dez 2013)

Vielen Dank für deine Hilfe!!

Auch mit dem Tipp


```
while(eingabe.startsWith(" ")) {
  eingabe = eingabe.substring(1);
}
```



Zu deiner Frage: 



> Zum Code in Zeile 96-99:
> Wie stellst du dir eigentlich ein Passwort vor?
> Mit deinem .split(" +") teilst du ja dein Passwort immer auf, wenn die Zahlenkette " +" enthält, wobei dieses rausgeschnitten wird



Z.B. wenn man eingibt :

Dies ist mein Passwort.

Wird das Passwort zu DimP4  generiert .

Außerdem war der Befehl 
String split[] = str.split(" +"); 
in der Aufgabe vorgegeben.

Ich habe noch mal mit dem Befehl /** alles kommentiert ... Bin noch nicht ganz vertraut damit könntest du noch kurz ein Blick rüber werfen ? 

Falls alles okay ist, ist mein Programm abgabebereit .

Slaid


----------

