Cäser Chiffre mit Arrays

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Cäser Chiffre mit Arrays

    Hallo

    Ich habe die Aufgabe ein Programm zu schreiben das mit Hilfe der Cäser Chiffre einen Text verschlüsselt
    Das hab ich schonmal:

    Java-Quellcode

    1. import java.util.*;
    2. public class Mainaaa {
    3. public static void main(String[] args){
    4. Scanner sc = new Scanner(System.in);
    5. String abc;
    6. String[] Klartext = {"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"};
    7. String[] Geheimtext = {"C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","A";"B"};
    8. abc = sc.nextLine();
    9. for(int i=0; i<abc.length; i++){
    10. char b = abc.charAt(i);
    11. }
    12. for(int a=0; a<Klartext.length; a++){
    13. if(b == Klartext){
    14. System.out.println(Geheimtext(b));
    15. }
    16. }
    17. }
    18. }
    Alles anzeigen



    Ich bekomme aber immer eine Fehlermeldung ka woran es liegt Hilfe plz :(

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Kad0r ()

  • wir können leider nicht sehen was du für eine fehlermeldung bekommst.

    aber hier ist schon mal falsch

    Quellcode

    1. if(b == Klartext){
    2. System.out.println(Geheimtext(b));
    3. }

    b ist vom typ char und klartext ist ein stringarray, passt nicht :)
    ausser dem in der zweiten schleife kennt er das b nicht, da du b nut in der 1 schleife deklariert hast.
    und so weiter :whistling:
    MfG ShureG

    There are 10 kinds of people. Those who understand binary notation, and those who do not.
  • guten morgen,

    wie schon gesagt sind da ne paar sachen nicht ganz richtig!
    aber mir sind noch zwei dinge aufgefallen. auch wenn du char b außerhalb der schleife anlegst wird das ganze so nicht funktionieren. denn so wie es jetzt ist bekommst du immer nur den letzten buchstaben einer zeile in die zweite schleife! wenn du es mit den zwei arrays machen willst, dann müsstest du die beiden schleifen verschachteln!

    wobei dir aber ein array reichen würde... in dem legst du dein alphabet ab und durchsuchst es nach einem treffer. wenn du den buchstaben gefunden hast, verschiebstu du den index einfach weiter.

    bsp.:

    Quellcode

    1. String strLine = "";
    2. Scanner oScanner = new Scanner(System.in);
    3. String[] arrAlphabet = {"A", "B", "C", "D", "E", "F",...};
    4. strLine = oScanner.nextLine();
    5. for(int i = 0; i < strLine.length; i++)
    6. {
    7. for(int a = 0; a < arrAlphabet.length; a++)
    8. {
    9. if (strLine.charAt(i) == arrAlphabet[a])
    10. {
    11. System.out.println(arrAlphabet[a+3]);
    12. }
    13. }
    14. }
    Alles anzeigen



    ich würde es mit einer hashtabel bzw. mit einem dictionary machen... als key den "echten" buchstaben und als value den "geheimen" buchstaben.
    dann brauchst du auch nur eine foreach schleife und das ganze geht noch flotter!

    kannst du trotzdem mal die fehlermeldung posten? evtl haben wir ja was übersehen!


    thx, truespin


    edit: ach ja, keine garantie auf richtigkeit! ich hab das absolut nicht getestet sondern mir nur schnell überlegt wie ich ran gehen würde! außerdem sind meine java kenntnisse sehr beschrenkt ;)
  • Hallo kad0r,
    also das Erste was mein Eclipse bemängelt, ist ein kleiner Tippfehler, der sich in dein Geheimtext-Array eingeschlichen hat: ... "Z","A" ; "B"};
    Benutzt Du eine IDE ? Macht die Fehlersuche sehr viel einfacher.

    truespin : wenn du es mit den zwei arrays machen willst, dann müsstest du die beiden schleifen verschachteln!

    Sehe ich auch so.


    truespin : wobei dir aber ein array reichen würde.
    System.out.println(arrAlphabet[a+3]);

    Mit der Methode würde man ab "X" über den ArrayIndex hinausschiessen.
    Das kann man aber einfach mit nem switch abfangen..


    Ich habe jetzt einfach mal Deinen Ansatz mit den 2 Arrays als Grundlage genommen, wie man das am sinnvollsten macht,
    weiss ich nicht, vielleicht hat jemand eine elegantere Lösung.

    Quellcode

    1. import java.util.*;
    2. public class Mainaaa {
    3. public static void main(String[] args){
    4. String[] Klartext = {"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"};
    5. String[] Geheimtext = {"C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","A","B"};
    6. String klar="";
    7. String geheim="";
    8. Scanner sc = new Scanner(System.in);
    9. klar = sc.nextLine().toString().toUpperCase(); //Alles in Großbuchstaben umwandeln
    10. //Falls Zahlen oder andere Zeichen vorkommen werden diese später ignoriert..
    11. System.out.println("KlarLänge: "+klar.length());
    12. if(klar.length()!=0) {
    13. int klarIndex=klar.length(); // bei einem String ist "length()" eine Methode, beim Array ist "length" eine Eigenschaft
    14. for(int i=0;i<klarIndex;i++) {
    15. System.out.println("ErsteSchleife: "+i);
    16. char b = klar.charAt(i);
    17. System.out.println("char: "+b);
    18. for(int j=0;j<Klartext.length;j++) {
    19. if(Character.toString(b).equals(Klartext[j])) { //da man nicht einfach zwischen String und char casten darf
    20. // und "equals" weil "==" bei String-Objekten nicht hinhaut
    21. geheim+=Geheimtext[j];
    22. break; // Treffer! Rest können wir uns sparen
    23. }
    24. }
    25. }
    26. System.out.println("Klartext: "+klar);
    27. System.out.println("Verschlüsselt: "+geheim);
    28. }
    29. else {
    30. System.out.println("Bitte zu verschlüsselden Text eingeben!");
    31. System.out.println("Programm beendet!");
    32. }
    33. }
    Alles anzeigen

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von Commander Perkins ()

  • hallo,


    Mit der Methode würde man ab "X" über den ArrayIndex hinausschiessen.
    Das kann man aber einfach mit nem switch abfangen..


    stimmt! da hab ich wohl zu schnell geschossen ;) wobei man das recht leicht abfangen kann und hald dann wieder von vorn das zählen anfangen muss...

    meiner meinung nach ist immer noch das dictionary<char, char> die besste lösung! als key das jeweils den buchstaben des alphabets und als value das "verschobene" alphabet.
    dann durch iterieren bis man den richtigen key gefunden hat und das value raus schreiben. braucht man nur eine schleife für und ist schneller + übersichtlicher.

    thx, truespin
  • truespin : meiner meinung nach ist immer noch das dictionary<char, char> die besste lösung!
    als key das jeweils den buchstaben des alphabets und als value das "verschobene" alphabet.

    Ich habe mal versucht, etwas damit zu bauen, bin aber irgendwann nicht mehr weitergekommen:

    Quellcode

    1. import java.util.HashMap;
    2. import java.util.Map;
    3. import java.util.Scanner;
    4. public class Mainaaa {
    5. public static void main(String[] args){
    6. Map<Object, String> mp = new HashMap<Object, String>();
    7. String[] Klartext = {"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"};
    8. String klar;
    9. String geheim="";
    10. for(int i=1;i<Klartext.length+1;i++) { // Map mit Keys und Values füllen
    11. mp.put(new Integer(i), Klartext[i-1]);
    12. }
    13. .............weiss jemand weiter?
    Alles anzeigen


    Aber dann ist mir eine andere Methode ganz ohne Array eingefallen.
    Ziemlich schmutzig, aber bei mir um den Faktor 50 (einmal das komplette Buchstabet) schneller als die Methode mit den 2 Arrays:

    Quellcode

    1. .....
    2. int klarIndex=klar.length();
    3. for(int i=0;i<klarIndex;i++) {
    4. char b = klar.charAt(i);
    5. int value=(int)b+2<90?((int)b)+2:((int)b)-23;
    6. geheim+=(char)value;
    7. }
    8. .....

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Commander Perkins ()

  • truespin schrieb:

    stimmt! da hab ich wohl zu schnell geschossen ;) wobei man das recht leicht abfangen kann und hald dann wieder von vorn das zählen anfangen muss...

    das geht noch viel einfacher ;)

    Quellcode

    1. arrAlphabet[(a+2)%26]


    Commander Perkins schrieb:


    Ziemlich schmutzig, aber bei mir um den Faktor 50 (einmal das komplette Buchstabet) schneller als die Methode mit den 2 Arrays:

    Also zum Thema schmutzig kann ich auch noch was Beitragen :D
    Eine Funktion, die das in einer Zeile und nur einer Anweisung macht:

    Quellcode

    1. String c(String a,int i){return i<a.length()?(char)((a.charAt(i++)+2-65)%26+65)+c(a,i):"";}

    muss nur immer mit zweitem Parameter 0 aufgerufen werden, also z.B. c("ChiffreTest",0);

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Rondrer () aus folgendem Grund: kleinen Fehler beseitigt, Funktion hat für Y und Z nicht funktioniert.

  • Eine Funktion, die das in einer Zeile und nur einer Anweisung macht

    String c(String a,int i){return i<a.length()?(char)((a.charAt(i++)+2-65)%26+65)+c(a,i):"";}


    muss nur immer mit zweitem Parameter 0 aufgerufen werden, also z.B. c("ChiffreTest",0);

    Ab hier OffTopic:
    nice!!
    Also vorweg :unseres beides funzt nur mit Großbuchstaben...
    Das weckt den Spieltrieb in mir.
    O.K. deins ist "schmutziger", aber ich behaupte meins ist perfomanter!
    Meine Messung hat ergeben, dass ab einer Stringlänge von 1400, meins 20% schneller läuft!
    "Wer misst, misst viel Mist" Zitat mein PhysikLehrer.. also ohne Gewähr..
    Wenn ich dann noch den ErgebnisString als StringBuffer mache, brauche ich nur noch 10% der vorherigen Zeit..
  • Performance mäßig ist meins Mist, das ist klar ;) Durch die Rekursion muss er sehr viele Dinge auf den Stack legen und das kostet halt Zeit. Würde mich auch nicht wundern, wenn es bei zu langen Strings irgendwann nen Stackoverflow Error gibt ;)
    Ging wirklich nur darum dass mit so wenig Code wie möglich zu machen (wobei ich mir sicher bin, dass man das auch mit noch weniger hin bekommt...)

    Dein Programm wäre bestimmt auch noch schneller, wenn du die int-Casts weglässt und auch die Zwischenvariable als Char deklariest. Man kann nämlich mit Chars genauso rechnen wie mit Integern, da Chars im Grunde nur Integer mit geringerer Bitbreite sind.

    Groß-/Kleinschreibung hab ich auch noch eingebaut:

    Quellcode

    1. String c(String a,int i){return i<a.length()?(char)(((a.charAt(i++)&~32)-11)%26+65)+c(a,i):"";}


    Hier aber vielleicht mal als Hinweis: Ich schreib solche Funktionen nur aus Spaß, so was sollte NIEMALS in nem größeren Programm auftauchen, und als Übungsaufgabe oder in ner Prüfung würde (bzw. sollte) das 0 Punkte geben.