Übungsaufgabe

  • Themenstarter Themenstarter Heyoka955
  • Beginndatum Beginndatum
H

Heyoka955

Gast
Hallo Leute ich hätte eine Frage, wir haben eine Aufgabe aufbekommen in der wir eine Mthde schreiben müssen wo ein Integer übergeben wird und einen String verschlüsseln soll.
Zbs man hat als String HALLO und al sint wert 7 dann soll man jeden einzelnen Buchstaben nach 7 stellen verschieben.
Meine Frage wäre wie man das lösen kann.
Ich hatte überlegt den String als Char Array zu speichern und dann eine ein zweites Char Array zu machen von a bis z und dann iterativ abzufragen aber das würde viel aufeand bringen, gibt es eine eifnachere lösung?
 
1. Da weißt Du aber was anderes, als die Sprachspezifikation, die hierzu sogar einen eigenen Abschnitt hat: "An Array of Characters is Not a String" (https://docs.oracle.com/javase/specs/jls/se7/html/jls-10.html#jls-10.9)
2. Du solltest Dir die Definition von char und nicht die eines Arrays ansehen

char ist ein ganzzahliger Datentyp, genauer eine 16-Bit breite, vorzeichenlose Ganzzahl. Die Werte von char liegen im Bereich von 0 bis 65535. Mit char kann man rechnen...
 
J
1. Da weißt Du aber was anderes, als die Sprachspezifikation, die hierzu sogar einen eigenen Abschnitt hat: "An Array of Characters is Not a String" (https://docs.oracle.com/javase/specs/jls/se7/html/jls-10.html#jls-10.9)
2. Du solltest Dir die Definition von char und nicht die eines Arrays ansehen

char ist ein ganzzahliger Datentyp, genauer eine 16-Bit breite, vorzeichenlose Ganzzahl. Die Werte von char liegen im Bereich von 0 bis 65535. Mit char kann man rechnen...
o aber wie sollte ich die Schritte Plänen für die Aufgabe?
Schritt für Schrott
 
Für Kleinbuchstaben ergibt sich also:
Java:
int delta = 7;
char src='x';
char dst = (char)('a' + (src - 'a' + delta) % 26);
 
Ja. Die Zeichen des Alphabets befinden sich in Unicode hintereinander und das sowohl für Klein- als auch Großbuchstaben.
 
Ja. Die Zeichen des Alphabets befinden sich in Unicode hintereinander und das sowohl für Klein- als auch Großbuchstaben.
habe mit der aufgabe gestern weitergemacht, das ist meine lösung, ich weiß nicht ob es richtig ist. wenn du willst poste ich die tests
Code:
public class Caesar {
    int offset;
   
    public Caesar(int offset){
        this.offset = offset;
       
        if(this.offset < -26 || this.offset > 26)
            this.offset = 0;
       
       
    }
   
    public String encrypt( String klartext ){
        String s = "";
        klartext = klartext.toUpperCase();
        char c;
       
        for(int i = 0; i < klartext.length(); i++){
            c = klartext.charAt(i);
            c = (char)('A' + (c - 'A' + offset) % 26);
            s += c;
        }
   
       
       
        return s;
       
    }
   
    public String derypt( String geheimtext ){
       
        String s = "";
        geheimtext = geheimtext.toUpperCase();
        char c;
       
        for(int i = 0; i < geheimtext.length(); i++){
            c = geheimtext.charAt(i);
            c = (char)('A' + (c - 'A' - offset) % 26);
            s += c;
        }
   
       
       
       
        return s;
    }

}
 
das ist der test
Code:
import org.junit.Test;
import static org.junit.Assert.*;

public class CaesarTest {

    @Test
    public void encrypt() {
        Caesar c = new Caesar(7);
       
        assertEquals("ALZA", c.encrypt("TEST"));
        assertEquals("HIJKLMN", c.encrypt("ABCDEFG"));
        assertEquals("JHLZHY", c.encrypt("CAESAR"));
        assertEquals("PUMV", c.encrypt("INFO"));
        assertEquals("RSHBZBYGBSHZZBUN", c.encrypt("KLAUSURZULASSUNG"));
        assertEquals("test", c.encrypt("test"));
        assertEquals("Oallo", c.encrypt("Hallo"));
       
        c = new Caesar(-7);
       
        assertEquals("MXLM", c.encrypt("TEST"));
        assertEquals("TUVWXYZ", c.encrypt("ABCDEFG"));
        assertEquals("VTXLTK", c.encrypt("CAESAR"));
        assertEquals("BGYH", c.encrypt("INFO"));
        assertEquals("DETNLNKSNETLLNGZ", c.encrypt("KLAUSURZULASSUNG"));
        assertEquals("test", c.encrypt("test"));
        assertEquals("Aallo", c.encrypt("Hallo"));
       
        c = new Caesar(19);
       
        assertEquals("MXLM", c.encrypt("TEST"));
        assertEquals("TUVWXYZ", c.encrypt("ABCDEFG"));
        assertEquals("VTXLTK", c.encrypt("CAESAR"));
        assertEquals("BGYH", c.encrypt("INFO"));
        assertEquals("DETNLNKSNETLLNGZ", c.encrypt("KLAUSURZULASSUNG"));
        assertEquals("test", c.encrypt("test"));
        assertEquals("Aallo", c.encrypt("Hallo"));
       
        c = new Caesar(0);
       
        assertEquals("TEST", c.encrypt("TEST"));
        assertEquals("ABCDEFG", c.encrypt("ABCDEFG"));
        assertEquals("CAESAR", c.encrypt("CAESAR"));
        assertEquals("INFO", c.encrypt("INFO"));
        assertEquals("KLAUSURZULASSUNG", c.encrypt("KLAUSURZULASSUNG"));
        assertEquals("test", c.encrypt("test"));
        assertEquals("Hallo", c.encrypt("Hallo"));
       
        c = new Caesar(35);
       
        assertEquals("TEST", c.encrypt("TEST"));
        assertEquals("ABCDEFG", c.encrypt("ABCDEFG"));
        assertEquals("CAESAR", c.encrypt("CAESAR"));
        assertEquals("INFO", c.encrypt("INFO"));
        assertEquals("KLAUSURZULASSUNG", c.encrypt("KLAUSURZULASSUNG"));
        assertEquals("test", c.encrypt("test"));
        assertEquals("Hallo", c.encrypt("Hallo"));
    }
   
    @Test
    public void decrypt() {
        Caesar c = new Caesar(7);
       
        assertEquals("TEST", c.decrypt("ALZA"));
        assertEquals("ABCDEFG", c.decrypt("HIJKLMN"));
        assertEquals("CAESAR", c.decrypt("JHLZHY"));
        assertEquals("INFO", c.decrypt("PUMV"));
        assertEquals("KLAUSURZULASSUNG", c.decrypt("RSHBZBYGBSHZZBUN"));
        assertEquals("test", c.decrypt("test"));
        assertEquals("Hallo", c.decrypt("Oallo"));
       
        c = new Caesar(-7);
       
        assertEquals("TEST", c.decrypt("MXLM"));
        assertEquals("ABCDEFG", c.decrypt("TUVWXYZ"));
        assertEquals("CAESAR", c.decrypt("VTXLTK"));
        assertEquals("INFO", c.decrypt("BGYH"));
        assertEquals("KLAUSURZULASSUNG", c.decrypt("DETNLNKSNETLLNGZ"));
        assertEquals("test", c.decrypt("test"));
        assertEquals("Hallo", c.decrypt("Aallo"));
       
        c = new Caesar(19);
       
        assertEquals("TEST", c.decrypt("MXLM"));
        assertEquals("ABCDEFG", c.decrypt("TUVWXYZ"));
        assertEquals("CAESAR", c.decrypt("VTXLTK"));
        assertEquals("INFO", c.decrypt("BGYH"));
        assertEquals("KLAUSURZULASSUNG", c.decrypt("DETNLNKSNETLLNGZ"));
        assertEquals("test", c.decrypt("test"));
        assertEquals("Hallo", c.decrypt("Aallo"));
       
        c = new Caesar(0);
       
        assertEquals("TEST", c.decrypt("TEST"));
        assertEquals("ABCDEFG", c.decrypt("ABCDEFG"));
        assertEquals("CAESAR", c.decrypt("CAESAR"));
        assertEquals("INFO", c.decrypt("INFO"));
        assertEquals("KLAUSURZULASSUNG", c.decrypt("KLAUSURZULASSUNG"));
        assertEquals("test", c.decrypt("test"));
        assertEquals("Hallo", c.decrypt("Hallo"));
       
        c = new Caesar(35);
       
        assertEquals("TEST", c.decrypt("TEST"));
        assertEquals("ABCDEFG", c.decrypt("ABCDEFG"));
        assertEquals("CAESAR", c.decrypt("CAESAR"));
        assertEquals("INFO", c.decrypt("INFO"));
        assertEquals("KLAUSURZULASSUNG", c.decrypt("KLAUSURZULASSUNG"));
        assertEquals("test", c.decrypt("test"));
        assertEquals("Hallo", c.decrypt("Hallo"));
    }
}
 
ich weiß nicht ob es richtig ist.
Nein. Negative Verschiebungen sind bislang nicht berücksichtigt.

Trennen wir das ganze doch mal auf, dann wird es verständlicher:
Java:
char c = 'A'; // das zu verschlüsselnde Zeichen
int pos = c - 'A'; // Position im Alphabet - wir zählen ab 0
pos += offset; // Verschiebung
// jetzt kann pos < 0 oder pos > 25 gelten, das muss behandelt werden
if (pos < 0) {
    pos += 26;
} else if (pos > 25) {
    pos -= 26;
}
char nc = (char)('A' + pos); // neues Zeichen
Das lässt sich, wenn man will, auch etwas kürzer schreiben. Aber lassen wir das besser. decrypt() kannst Du dagegen einfacher haben:
Java:
public String derypt( String geheimtext ){
    return new Caeser(-offset).encrypt(geheimtext);
}
 
Nein. Negative Verschiebungen sind bislang nicht berücksichtigt.

Trennen wir das ganze doch mal auf, dann wird es verständlicher:
Java:
char c = 'A'; // das zu verschlüsselnde Zeichen
int pos = c - 'A'; // Position im Alphabet - wir zählen ab 0
pos += offset; // Verschiebung
// jetzt kann pos < 0 oder pos > 25 gelten, das muss behandelt werden
if (pos < 0) {
    pos += 26;
} else if (pos > 25) {
    pos -= 26;
}
char nc = (char)('A' + pos); // neues Zeichen
Das lässt sich, wenn man will, auch etwas kürzer schreiben. Aber lassen wir das besser. decrypt() kannst Du dagegen einfacher haben:
Java:
public String derypt( String geheimtext ){
    return new Caeser(-offset).encrypt(geheimtext);
}
kannst du mir erklären was du genau gemacht hast?also in sprache
 
Sei c das zu verschlüsselnde Zeichen. Dann berechne ich zunächst die Position von c im Alphabet (int pos = c - 'A';), wobei A=0, B=1, ..., Z=25.

Die Position verschiebe ich dann um das Offset (pos += offset;). Das Ergebnis kann nun aber außerhalb der Grenzen liegen, also kleiner 0 oder größer als 25 sein. Ist es kleiner 0, addiere ich die Anzahl der Buchstaben (26), ist es größer als 25, ziehe ich 26 ab.

Am Ende kehre ich die Umwandlung vom Anfang wieder um, d. h. ich addiere nun die Position zum Buchstaben 'A' und erhalte damit das verschlüsselte Zeichen.

(BTW: Das Geheimnis des Erfolgs ist der von Java verwendete Unicode-Zeichensatz 🙂 In diesem sind die Buchstaben nämlich wie im Alphabet nacheinander angeordnet.)

Bei decrypt() erzeuge ich einfach eine neue Cäsar-Verschlüsselung mit dem negativen des aktuellen Offsets. Das ist die Umkehrung der aktuellen Cäsar-Verschlüsselung.
 
Sei c das zu verschlüsselnde Zeichen. Dann berechne ich zunächst die Position von c im Alphabet (int pos = c - 'A';), wobei A=0, B=1, ..., Z=25.

Die Position verschiebe ich dann um das Offset (pos += offset;). Das Ergebnis kann nun aber außerhalb der Grenzen liegen, also kleiner 0 oder größer als 25 sein. Ist es kleiner 0, addiere ich die Anzahl der Buchstaben (26), ist es größer als 25, ziehe ich 26 ab.

Am Ende kehre ich die Umwandlung vom Anfang wieder um, d. h. ich addiere nun die Position zum Buchstaben 'A' und erhalte damit das verschlüsselte Zeichen.

(BTW: Das Geheimnis des Erfolgs ist der von Java verwendete Unicode-Zeichensatz 🙂 In diesem sind die Buchstaben nämlich wie im Alphabet nacheinander angeordnet.)

Bei decrypt() erzeuge ich einfach eine neue Cäsar-Verschlüsselung mit dem negativen des aktuellen Offsets. Das ist die Umkehrung der aktuellen Cäsar-Verschlüsselung.
kurz gefasst du rechnest die Position erstmal und danach "wandelst" du das in das zeichen um. Verstehe 🙂
aber bei decryp will der doch ein string wiedergeben wieso gibst du dann ein Objekt wieder?
 
Tue ich nicht. Das hier
Java:
return new Caesar(-offset).encrypt(geheimtext);
ist die Kurzfassung von
Java:
Caesar c = new Caesar(-offset);
return c.encrypt(geheimtext);
Aber c ist doch kein String? Achso durch eneypt wird das zu einem String verstehe.
 
Achso durch eneypt wird das zu einem String verstehe.
Das hier
Java:
return c.encrypt(geheimtext);
ist vom Ergebnis äquivalent zu
Java:
String ergebnis = c.encrypt(geheimtext);
return ergebnis;

Die Methode encrypt() liefert eine Referenz auf ein String-Objekt zurück. Diese Referenz wird oben direkt zurückgegeben, unten erst noch in der Variablen ergebnis zwischengespeichert und dann zurückgegeben.
 
Das hier
Java:
return c.encrypt(geheimtext);
ist vom Ergebnis äquivalent zu
Java:
String ergebnis = c.encrypt(geheimtext);
return ergebnis;

Die Methode encrypt() liefert eine Referenz auf ein String-Objekt zurück. Diese Referenz wird oben direkt zurückgegeben, unten erst noch in der Variablen ergebnis zwischengespeichert und dann zurückgegeben.
meinte ich mit meiner aussage nur etwas allgemeiner 🙁
weißt du wie man an solchen aufgaben rangehen kann als Anfänger?
 
meinte ich mit meiner aussage nur etwas allgemeiner
Das dachte ich mir schon, aber Deine Formulierung konnte man so nicht stehen lassen 😀

weißt du wie man an solchen aufgaben rangehen kann als Anfänger?
Verwende nur Dinge, die Du verstehst und versuche, immer mehr zu verstehen und herauszufinden. Mit Grundlagen kann man sich gar nicht genug beschäftigen - auch praktisch. Sehr vieles ist eine reine Übungs-/Lernsache.

Du hattest eingangs einen Lösungsansatz genannt. Setz den einfach mal um. Du kannst auch versuchen, Aufgaben auf möglichst verschiedene ggf. auch unkonventionelle Weisen zu lösen.

Dann haben wir ja noch @Javinner, der bestimmt den ein oder anderen Link für Dich hat 😉
 
Das dachte ich mir schon, aber Deine Formulierung konnte man so nicht stehen lassen 😀


Verwende nur Dinge, die Du verstehst und versuche, immer mehr zu verstehen und herauszufinden. Mit Grundlagen kann man sich gar nicht genug beschäftigen - auch praktisch. Sehr vieles ist eine reine Übungs-/Lernsache.

Du hattest eingangs einen Lösungsansatz genannt. Setz den einfach mal um. Du kannst auch versuchen, Aufgaben auf möglichst verschiedene ggf. auch unkonventionelle Weisen zu lösen.

Dann haben wir ja noch @Javinner, der bestimmt den ein oder anderen Link für Dich hat 😉
Das Problem an unserer Uni ist, die Aufgaben sind so beschissen gestellt plus viele sind wissenschaftsaufgaben dadurch ist es halt doppelt so schwer. Ok Dir Aufgabe war eigentlich einfach.
Nur halt bischen überlegen wie man es gescheit machen kann.
Aber manche Aufgaben sind zu heftig.
 

Zurück
Oben