Übungsaufgabe

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?
 

mihe7

Top Contributor
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...
 
H

Heyoka955

Gast
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
 

mihe7

Top Contributor
Für Kleinbuchstaben ergibt sich also:
Java:
int delta = 7;
char src='x';
char dst = (char)('a' + (src - 'a' + delta) % 26);
 

mihe7

Top Contributor
Ja. Die Zeichen des Alphabets befinden sich in Unicode hintereinander und das sowohl für Klein- als auch Großbuchstaben.
 
H

Heyoka955

Gast
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;
    }

}
 
H

Heyoka955

Gast
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"));
    }
}
 

mihe7

Top Contributor
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);
}
 
H

Heyoka955

Gast
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
 

mihe7

Top Contributor
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.
 
H

Heyoka955

Gast
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?
 

mihe7

Top Contributor
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);
 
H

Heyoka955

Gast
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.
 

mihe7

Top Contributor
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.
 
H

Heyoka955

Gast
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?
 

mihe7

Top Contributor
meinte ich mit meiner aussage nur etwas allgemeiner
Das dachte ich mir schon, aber Deine Formulierung konnte man so nicht stehen lassen :D

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 ;)
 
H

Heyoka955

Gast
Das dachte ich mir schon, aber Deine Formulierung konnte man so nicht stehen lassen :D


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.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Laufzeitfehler bei Übungsaufgabe Java Basics - Anfänger-Themen 4
jonathanpizza Hilfe bei einer Übungsaufgabe Java Basics - Anfänger-Themen 6
K Rundbeet Übungsaufgabe Java Basics - Anfänger-Themen 3
J Hilfe bei Übungsaufgabe Java Basics - Anfänger-Themen 17
Z Unklarheit bei Übungsaufgabe [Anfänger] Java Basics - Anfänger-Themen 22
K Übungsaufgabe... Verständnisproblme (java 8.191) Java Basics - Anfänger-Themen 4
H Polynome Übungsaufgabe uni Java Basics - Anfänger-Themen 49
H Übungsaufgabe algorithmen Java Basics - Anfänger-Themen 2
L Übungsaufgabe zu Schleifen Java Basics - Anfänger-Themen 7
H Frage zu Übungsaufgabe, Array Java Basics - Anfänger-Themen 7
T Übungsaufgabe Event Handling Java Basics - Anfänger-Themen 0
T Übungsaufgabe abstrakte Klasse Java Basics - Anfänger-Themen 21
B Hilfe bei Übungsaufgabe von Freitagsrunde Java Basics - Anfänger-Themen 5
B Übungsaufgabe Java Basics - Anfänger-Themen 5
M Übungsaufgabe Problem Java Basics - Anfänger-Themen 6
N Übungsaufgabe aus Java Buch bringt Fehler. Java Basics - Anfänger-Themen 10
B Übungsaufgabe zu Klassen, Methoden ... Java Basics - Anfänger-Themen 2
K Methoden Uhr als Übungsaufgabe Klassen/Objekte Java Basics - Anfänger-Themen 3
S Verständnisproblem einer Übungsaufgabe Java Basics - Anfänger-Themen 6
J Hilfe bei Übungsaufgabe Java Basics - Anfänger-Themen 5
D Brauche Hilfe bei Modulo (Übungsaufgabe) Java Basics - Anfänger-Themen 14
U Erste Schritte Fehler in Übungsaufgabe Java Basics - Anfänger-Themen 22
W Übungsaufgabe:Dynamische Datenstrukturen Java Basics - Anfänger-Themen 10
pg1337 Übungsaufgabe für Anfänger Java Basics - Anfänger-Themen 26
N Übungsaufgabe mit static Wert Java Basics - Anfänger-Themen 27
P Datentypen Frage zu einer Übungsaufgabe Java Basics - Anfänger-Themen 15
N Übungsaufgabe mit Interface Java Basics - Anfänger-Themen 2
F Schleifen Übungsaufgabe Java Basics - Anfänger-Themen 4
A Übungsaufgabe lösen - Problem mit true und false Java Basics - Anfänger-Themen 6
D Schiedermeier 1. Semester Übungsaufgabe Problem Java Basics - Anfänger-Themen 8
C Übungsaufgabe Java Basics - Anfänger-Themen 10
R Problem bei Übungsaufgabe Java Basics - Anfänger-Themen 7
M Hilfe bei Übungsaufgabe :'( nooby Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben