Ich komme nicht mehr weiter bei dieser Aufgabe, Java-Anfänger?

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:

Bild zum Beitrag

 - (programmieren, Java)

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.

  1. Datei einlesen
  2. Länge für das Array ermitteln
  3. Array anlegen und Passwörter einlesen
  4. 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.


regex9  16.11.2020, 01:58

PS. (noch ein Rat, um den Code gut lesbar zu halten): Wähle einheitliche Bezeichnernamen, die also keinen internationale Sprachparty veranstalten (anzahl, strength).

0