Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.net  
   

Die mobilen Seiten von c++.net:
https://m.c-plusplus.net

  
C++ Forum :: C (alle ISO-Standards) ::  Verschluesselungsprogramm macht sich selbstständig  
Gehen Sie zu Seite 1, 2  Weiter
  Zeige alle Beiträge auf einer Seite
Auf Beitrag antworten
Autor Nachricht
magamasta
Unregistrierter




Beitrag magamasta Unregistrierter 14:09:28 14.11.2017   Titel:   Verschluesselungsprogramm macht sich selbstständig            Zitieren

Hi, ich möchte ein Programm in C schreiben, welches mir einen eingegebenen klein bzw Großbuchtsaben mit der Funktion decrypt() erst verschluesselt und dann mit encrypt()entschluesselt. An den Rändern bzw bei 'w' und 'W' muss beachtet werden dass man wieder bei a beginnt. Der Buchstabe soll um 3 Stellen verschoben werden. Nun habe ich viel herumprobiert und habe das ganze mal ohne Funktion mal mit und in verschiedenen Variationen versucht.
Wird ein Wert eingegeben, wird er bei Ausgabe mit printf natürlich noch angezeigt. Kommt aber die Funktion ins Spiel ändert sich der Wert auf '0'/00/ oder ähnlich (nach dem Debugger). Bei der Ausgabe steht dann nichts da. Zwischendurch als ich das ganze mal ohne Funktionen erstellt habe, hab ich manchmal einen Pfeil nach links bzw rechts ausgegeben bekommen obwohl ein a meine Eingabe war, mal habe ich ein C mit einem punkt unten bekommen und mal sogar den richtigen Buchstaben. Nun hab ich aber das ganze mit Funktion erstellt wie es auch gefordert ist und so funktioniert es leider nichtmal nur falsch sondern es wird einfach nichts angeteigt.
Ich hoffe also jemand kann mal über den Code schauen, es ist nicht sehr viel.
Vielen Dank.


main:

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

 
/*
 * File:   main.c
 * Author: Neuer Benutzer
 *
 * Created on 12. November 2017, 13:09
 */


#include <stdio.h>

#include <stdlib.h>
#include "infopr2a3.h"
 
/*
 *
 */

int main(int argc, char** argv) {
   
    //Definition
    char buchstabe = 0;
    char buchstabeversch = 0;
    char buchstabeentsch = 0;
   
    //Abfrage des Buchstabens
    printf("Geben Sie einen Buchstaben ein: \n");
    fflush(stdin);
    scanf("%c", &buchstabe);
   
    //Verschluesselung
    buchstabeversch == decrypt(buchstabe);
   
    //Beachtung falls Eingabe groesser 'w' oder 'W'
    if (buchstabeversch > 'w' || buchstabeversch > 'W') {
        buchstabeversch == buchstabeversch - 26;
    }
    printf("Eingabe:%c Buchstabe verschluesselt:%c\n", buchstabe, buchstabeversch);
   
    //Entschluesselung
    buchstabeentsch == encrypt(buchstabeversch);
   
    //Beachtung dass entschluesselter buchstabe wieder der urpruengliche ist
    if (buchstabeentsch < 'd' || buchstabeentsch 'D') {
        buchstabeentsch == buchstabeentsch + 26;
    }
    //Ausgabe des entschluesselten Wertes
    printf("Der Buchstabe ist entschluesselt: %c", buchstabeentsch);
    return (EXIT_SUCCESS);
}



source:


C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

 
char decrypt( char a){
    int i = 3;
    char z;
    return (z==a+i);
}
 
char encrypt(char b){
    int i=3;
    char z;
   
    return(z==b-i);
}



header

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

 
/*
 * File:   infopr2a3.h
 * Author: Neuer Benutzer
 *
 * Created on 14. November 2017, 12:15
 */


#ifndef INFOPR2A3_H

#define INFOPR2A3_H
#include "infopr2a3.h"

#ifdef __cplusplus

extern "C" {
#endif
   
//Prototyping Signatur Verschluesselung und entschluesselung;
    char decrypt(char);
    char encrypt(char);

#ifdef __cplusplus

}
#endif

#endif /* INFOPR2A3_H */
Belli
Mitglied

Benutzerprofil
Anmeldungsdatum: 29.08.2009
Beiträge: 2679
Beitrag Belli Mitglied 14:28:55 14.11.2017   Titel:              Zitieren

C:
    //Beachtung falls Eingabe groesser 'w' oder 'W'
    if (buchstabeversch > 'w' || buchstabeversch > 'W') {
        buchstabeversch == buchstabeversch - 26;
    }

Hast Du daran gedacht, dass ALLE Kleinbuchstaben größer als 'W' sind?
Also diese Bedingung trifft auf alle Buchstaben von 'a' - 'z' und von 'X' - 'Z' zu!
SeppJ
Global Moderator

Benutzerprofil
Anmeldungsdatum: 10.06.2008
Beiträge: 28211
Beitrag SeppJ Global Moderator 14:29:45 14.11.2017   Titel:              Zitieren

Deine Logik ist falsch. Mal angenommen, die Buchstaben hätten diese Reihenfolge:
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
Wenn du nun den Buchstaben 'f' um 3 verschiebst, kommt 'i' heraus. Aber was passiert nun bei einer Abfrage wie
C:
if (buchstabeversch > 'w' || buchstabeversch > 'W')
? 'i' ist zwar kleiner als 'w', aber größer als 'W'! Das ist nicht das, was du wolltest. Ebenso bei anderen Abfragen dieser Art.

Tipp zur Struktur deines Programms:
Eine Funktion sollte genau eine Sache tun und die dann auch richtig. Dadurch, dass du die Nachbehandlung des decrypt-Ergebnisses aus der Funktion decrypt herausgezogen hast, hast du nun in der gesamten Programmlogik Teile des decrypten verteilt (und ebenso encrypt). Wie viele Stellen im Programm müsstest du ändern, wenn du statt 3 um 7 verschieben möchtest? Ich zähle mindestens 4. Das sollte nur eine Stelle sein. Deine encrpyt und decrypt Funktion sollte so geschrieben sein, dass sie gleich das korrekte, vollständige Ergebnis zurück geben.

Idealerweise gestaltest du es auch noch so, dass man den Funktionen die Verschiebung mitgeben kann, anstatt dass sie fest im Programm steht. Vielleicht fällt dir dann auch die Formulierung einer besseren if-Bedingung für das obige Problem leichter.

_________________
Korrekte Rechtschreibung und Grammatik sind das sprachliche Äquivalent zu einer Dusche und gepflegter Kleidung.
Wutz
Mitglied

Benutzerprofil
Anmeldungsdatum: 15.04.2010
Beiträge: 3917
Beitrag Wutz Mitglied 15:04:23 14.11.2017   Titel:              Zitieren

Zeile 38,47 und 10,17 machen nicht das was du beabsichtigst.

_________________
Java, the best argument for Smalltalk since C++. -- Frank Winkler
magamasta
Unregistrierter




Beitrag magamasta Unregistrierter 20:30:35 14.11.2017   Titel:              Zitieren

ok dann klappt das so nicht und ich werde es bearbeiten. Nur ist das Problem nicht dass die falschen Zeichen ausgegeben werden sondern dass nichts ausgegeben wird. Selbst wenn hier jetzt ein völlig anderes Zeichen ausgegeben werden würde müsste es ja trotzdem ausgegeben werden aber es wird eben nichts ausgegeben!
Wade1234
Unregistrierter




Beitrag Wade1234 Unregistrierter 20:57:21 14.11.2017   Titel:              Zitieren

normalerweise macht man diese verschlüsselung auch mit dem modulo-operator (%) und "verschlüsseln" bedeutet "encrypt", nicht umgekehrt.
SeppJ
Global Moderator

Benutzerprofil
Anmeldungsdatum: 10.06.2008
Beiträge: 28211
Beitrag SeppJ Global Moderator 22:20:57 14.11.2017   Titel:              Zitieren

magamasta schrieb:
ok dann klappt das so nicht und ich werde es bearbeiten. Nur ist das Problem nicht dass die falschen Zeichen ausgegeben werden sondern dass nichts ausgegeben wird. Selbst wenn hier jetzt ein völlig anderes Zeichen ausgegeben werden würde müsste es ja trotzdem ausgegeben werden aber es wird eben nichts ausgegeben!
Wenn gar nichts ausgegeben wird dann mach mal die Zeile 30 raus. Die ist nicht nur unnötig und falsch, es ist sogar undefiniertes Verhalten fflush aus einem Ausgabestream anzuwenden. Die Konsole völlig zu zerschießen ist ein typischer Nebeneffekt der daraus resultieren kann.

Damit solltest du auf jeden Fall irgendeine Ausgabe erhalten. Ob falsch oder richtig hängt davon ab, ob du den restlichen Hinweisen (Achte unbedingt auch auf Wutzs Hinweise!) gefolgt bist.

_________________
Korrekte Rechtschreibung und Grammatik sind das sprachliche Äquivalent zu einer Dusche und gepflegter Kleidung.
magamasta
Unregistrierter




Beitrag magamasta Unregistrierter 11:23:26 15.11.2017   Titel:              Zitieren

so nun einige aenderungen. Das erste fflush habe ich zum test mal raus genommen. Bin nun auch nochmal mit dem Debugger rüber. Die Variable der Eingabe geht wie sie soll auf 65 für 'A'.

main:
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
 
/*
 * File:   main.c
 * Author: Neuer Benutzer
 *
 * Created on 12. November 2017, 13:09
 */
 
#include <stdio.h>
#include <stdlib.h>
#include "infopr2a3.h"
 
/*
 *
 */
int main(int argc, char** argv) {
   
    //Definition
    char buchstabe = 0;
    char buchstabeversch = 0;
    char buchstabeentsch = 0;
   
    //Abfrage des Buchstabens
    printf("Geben Sie einen Buchstaben ein: \n");  //FFlush zum test raus
    scanf("%c", &buchstabe);
   
    //Verschluesselung
    buchstabeversch == encrypt(buchstabe);
   
    printf("Eingabe:%c Buchstabe verschluesselt:%c\n", buchstabe, buchstabeversch);
   
    //Entschluesselung
    buchstabeentsch == decrypt(buchstabeversch);
   
    //Ausgabe des entschluesselten Wertes
    printf("Der Buchstabe ist entschluesselt: %c", buchstabeentsch);
   
    return (EXIT_SUCCESS);
 
}



Sobald ich zur ersten Funktion komme (Encrypt nun auch geändert) zeigt er mir bei den Variablen wieder das 0/000/ oder so an also wie wenn sie gar nicht erst beschrieben werden würden. Die Bedingungen mit if grösser als W und so hab ich jetzt zwar immer noch etwas unsinnig aber eigentlich sollten sie so funktionieren? Das mit return z == a+í ist auch verändert wobei ich nicht verstehe warum dass so nicht geht. Ich denke mal der Fehler muss bei der Variablenbezeichnung liegen oder dass ich den falschen Datentyp genommen habe. Wie ich es verstanden habe kann ich aber doch auf ein char wie z.B. '65' ein int von z.B. i=3 addieren und komme so auf '68' bzw D oder? auf jeden Fall muss der Fehler in der Funktion liegen.

source:
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
 
char encrypt(char a) {
    int i = 3;
    char z;
    if (a > 'W' && a <= 'Z') { //Ueberpruefung ob Z ueberschritten wird
        z == a - 26 + i; //Handlung wenn es ueberschritten werden wuerde
    } else if (a > 'w' && a <= 'z') { //Ueberpruefung fuer kleinbuchst.
        z == a - 26 + i; //Handlung wenn es ueberschritten werden wuerde
    }
 
    z == a + i; //Handlung allgemein
    return (z);
}
 
char decrypt(char b) {
    int i = 3;
    char z;
    if (b <= 'D' && b >= 'A') {
        z == b + 26 - i;
    } else if (b <= 'd' && b >= 'a') {
        z == b + 26 - i;
    }
 
    z == b - i;
 
    return (z);
}


Die Header ist unverändert. Wäre nett wenn sich jemand nochmal die Funktion anschauen könnte. Vielen Dank.
Wade1234
Unregistrierter




Beitrag Wade1234 Unregistrierter 11:38:16 15.11.2017   Titel:              Zitieren

also:
"==" bedeutet "vergleiche die variable auf der linken seite mit der variable auf der rechten seite"
"=" bedeutet "weise der variablen auf der linken seite den wert der variablen auf der rechten seite zu"

du machst da also was falsch.
DirkB
Mitglied

Benutzerprofil
Anmeldungsdatum: 24.01.2016
Beiträge: 914
Beitrag DirkB Mitglied 11:58:47 15.11.2017   Titel:              Zitieren

Wade1234 schrieb:
"==" bedeutet "vergleiche die variable auf der linken seite mit der variable auf der rechten seite
auf Gleichheit. Wenn Ja, ergibt das 1, sonst 0.

magamasta schrieb:
Wie ich es verstanden habe kann ich aber doch auf ein char wie z.B. '65' ein int von z.B. i=3 addieren und komme so auf '68' bzw D oder?
Zeichen werden in C zwischen einfache Hochkomma gesetzt. Zahlenwerte nicht.
Darum: 'D' entspricht 68 (im ASCII)
Und es ist eigentlich egal ob du 'D' oder 68 schreibst. 'D' ist meist lesbarer und funktioniert oft auch bei nicht-ASCII.


magamasta schrieb:
Das mit return z == a+í
Zum == siehe Wade1234
Aber warum noch eine extra Variable z dafür? return a+i; reicht völlig
C++ Forum :: C (alle ISO-Standards) ::  Verschluesselungsprogramm macht sich selbstständig  
Gehen Sie zu Seite 1, 2  Weiter
Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.net ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.