Ich komme nicht mehr weiter bei dieser Aufgabe, Java-Anfänger?
Ich sitze schon seit über 6h an den Programmieraufgaben und stehe wieder an. Ich bin schon langsam am Verzweifeln. Könnt ihr mir bei dieser Aufgabe helfen?
Als Ausgabe muss dann z.B. stehen:
abcd hat eine Stärke von 0 switches und eine Passwortst. von 4
Mein Ansatz wäre:
public class Passwort {
public static void main(String[] args) {
static final int anzahl = 8;
int strenght, switches, lenght;
stirng passwords[] = new String[anzahl];
In.open("Passwords.txt");
int switches = 0;
while (In.done()) {
for (int i = 0; i < anzahl; i++) {
if (passwords[i].isUppercase) {
switches++;
}
strenght = passwords[i].lenght * (switches + 1);
}
In.peek();
}
In.close();
}
}
Aber es funktioniert nichts. Was mache ich falsch?
2 Antworten
Hier mal wie ich das machen würde:
Aufgabe1.java
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Scanner;
public class Aufgabe1 {
private static String[] passwords;
public static void main(String[] args) {
loadPasswords("C:\\Users\\Tobih\\Desktop\\passwords.txt");
print();
}
private static void loadPasswords(String path) {
try {
FileInputStream fis = new FileInputStream(path);
Scanner scan = new Scanner(fis);
int amount = Integer.valueOf(scan.nextLine());
passwords = new String[amount];
for (int i = 0; i < amount; i++) {
passwords[i] = scan.nextLine();
}
scan.close();
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
private static int getStrength(String psw) {
int switches = 0;
char prevC = psw.charAt(0);
for (char c : psw.substring(1).toCharArray()) {
if (getCategory(prevC) != getCategory(c)) {
switches++;
}
prevC = c;
}
return psw.length() * (switches + 1);
}
private static Category getCategory(char c) {
int id = (int) c;
if (id > 64 && id < 91) {
return Category.UPPER;
}
if (id > 96 && id < 123) {
return Category.LOWER;
}
if (id > 47 && id < 58) {
return Category.NUMBER;
}
return null;
}
private static void print() {
for (String psw : passwords) {
System.out.println(psw + "\t| " + getStrength(psw));
}
}
}
Category.java
public enum Category {
UPPER, LOWER, NUMBER;
}
Das gibt bei mir sowas aus:
Zuerst einmal solltest du darauf achten, keine Tippfehler einzubauen.
Bei den Bezeichnern strength oder length ist es zwar noch nicht so tragisch (sollte dennoch korrigiert werden), hier allerdings:
stirng passwords[] = new String[anzahl]; // wrong
String passwords[] = new String[anzahl]; // correct
oder hier:
strenght = passwords[i].lenght * (switches+1); // wrong
strength = passwords[i].length * (switches + 1); // correct; + renaming
ist es von mehr Relevanz.
Des Weiteren ist isUppercase eine statische Methode, die so aufgerufen werden müsste:
char letter = // some letter ...
if (Character.isUpperCase(letter)) {
// is uppercase ...
}
Um dein Problem zu lösen, würde ich dir einen wichtigen Rat geben: Teile dir die Aufgabe in mehrere Teilaufgaben auf.
- Datei einlesen
- Länge für das Array ermitteln
- Array anlegen und Passwörter einlesen
- Stärke der Passwörter berechnen
Jede Teilaufgabe wird einzeln / separat abgearbeitet. Bei deinem derzeitigen Code wirkt es noch wie ein durcheinandergewirbeltes Chaos, keine der einzelnen Funktionen ist komplett. Man merkt deutlich, dass du dir vorab nicht viel Gedanken über den Ablauf gemacht hast.
Wenn du Funktionen bereits kennengelernt hast, könntest du für diese Bereiche auch noch einzelne Funktionen anlegen, um noch mehr Ordnung in den Programmcode zu bekommen.
Wie du eine Datei einlesen kannst, weißt du scheinbar schon. Die erste Zeile ist zuerst einmal nur von Interesse, denn dort steht die Arraylänge. Du musst die Zeile einlesen und ihren Wert in eine Zahl konvertieren. Ich weiß nicht, mit welcher Bibliothek ihr arbeitet, doch vielleicht gibt es da schon etwas. Andernfalls hilft parseInt aus der Integer-Klasse.
Erst danach folgt das Lesen weiterer Zeilen. Am besten liest du nur so viele Zeilen, wie in der ersten Zeile angegeben wurde. So hast du keinen Überlauf bei deinem Array, selbst wenn sich der Dateischreiber verzählt haben sollte. Für zukünftige Projekte könntest du dir auch Gedanken machen, wie du den Fall abhandelst, falls es weniger Passwortzeilen geben sollte, als eigentlich angegeben.
Aber zurück zur Aufgabe.
Die Länge eines Passworts zu berechnen, sollte kein Problem darstellen. Dafür hat die Standardbibliothek bereits eine Methode in petto. Die Schwierigkeit bei dieser Aufgabe liegt vielmehr in der Berechnung der Switches (wofür eine eigene Funktion wirklich gut wäre). Aber vielleicht kann uns die ASCII-Tabelle wieder weiterhelfen.
Schau einmal, wo die einzelnen Zeichen liegen:
Zeichen | Zahlenbereich
--------------------------
a-z | 97 - 122
A-Z | 65 - 90
0-9 | 48 - 57
Du siehst: Du kannst für ein beliebiges Zeichen mathematisch prüfen, ob es sich innerhalb eines bestimmten Wertebereichs aufhält. Man kann es sogar noch verkürzen:
wenn Zeichen > 97
kleiner Buchstabe
wenn Zeichen > 65
großer Buchstabe
sonst
Zahl
Nun brauchst du nur noch über die einzelnen Zeichen eines Passworts iterieren und pro Zeichen schauen, ob es sich im Vergleich zu seinem Vorgänger verändert hat. Eine Spezialbehandlung braucht das erste Zeichen, denn es hat ja keinen Vorgänger.
Ein Beispiel dafür, wie man über die Zeichen eines Strings iterieren kann:
String word = "Hello";
char[] letters = word.toCharArray();
for (int index = 0; index < letters.length; ++index) {
System.out.print(letters[index]);
}
Mit jeder Änderung inkrementierst du eine Zählervariable switches, dann hast du am Ende auch deren Anzahl und kannst sie in die Formel einbauen.
Den Rest der Aufgabe erachte ich wieder als sehr einfach. Ich denke, ich brauche nicht weiter darauf eingehen.
PS. (noch ein Rat, um den Code gut lesbar zu halten): Wähle einheitliche Bezeichnernamen, die also keinen internationale Sprachparty veranstalten (anzahl, strength).