C
Hi!
Bekomme das Feld2 aus dem Unterprogramm FallK in das Unterprogramm FallT übergeben. Mit meiner Version funktioniert es aber nicht. Kann mir jemand helfen?
MfG Cit22
/********************************************************************************/
/* verschluesselung.exe : Kodieren eines Wortes/Satzes mit bestimmtem Kode */
/* Projekt : Praktikumsaufgabe 3 */
/* Autor/in : Christoph Gieritz (ESA)& Nils Papke (MT) */
/* Version : 1.0 */
/* Datum : 15.12.2007 letzte Aenderung am : 13.01.2008 */
/* Beschreibung : Dieses Programm verschlüsselt ein Wort/einen Satz mit */
/* maximal 80 Zeichen. Zuerst wird eine */
/* Buchstabenverschiebung um anzugebene Stellen */
/* vorgenommen. Danach wird das neue Wort/der neue Satz */
/* mittels Ein- und Auslesen in/aus ein(em) Feld */
/* nochmals chiffriert. Für die Entschlüsselung wird die */
/* zugehörige Geheimzahl benötigt. */
/* Compiler : Borland C++ V 5.01 */
/********************************************************************************/
/* Testsatz:
Ich lerne C !
SoMm1*rx@*ov* 100305
Kontrollsätze:
Alles klar, Aufgabe bestanden!
"rGQpJQ"XJZYXKFpLSPFIQGJFJSWpu 690310
Erledigt, das war es!
\dYV mbVmgon5Z75ZY5rn 850505
Diese Aufgabe ist erledigt!
Km0npn"0lhl/ziylls""lHpk1zp 070408
Treffen im Landhaus um 19.00 Uhr! Freue mich auf Sie, James Bond
{oYLQM"V#QVMISIEotGqRJRfoLoHJHn%o@ILpVEEREeIYQoYeYJIMWoIoWQo}o]o 680710 */
/*Einfügen der Programmbibliotheken*/
#include <stdio.h> /*Programmbib. für Standardein- und -ausgabe einfügen*/
#include <conio.h> /*Programmbib. für Bildschirmausgabe einfügen*/
#include <math.h> /*Programmbib. für mathematische Funktionen einfügen*/
#include <stddef.h> /*Programmbib. für allgemeine Datentypen und Makros einfügen*/
#include <string.h> /*Programmbib. für Stringbenutzung einfügen*/
#include "codechar.h" /*Programmbib. für Kodeumsetzung einfügen*/
/* Konstantenvereinbarung mit define */
#define FALSE 0
#define TRUE 1
/*Unterprogramm-Deklaration*/
void fallK (int*,int*,int*, char*, int*);
void fallD (void);
void fallT (int,int,int,char*,int);
/*Definition der Unterprogramme*/
/*Unterprogramm Fall K*/
void fallK (int *pn, int *pspalten, int *pzeilen, char *pfeld2, int *ptest){
/*Variablendeklaration für FallK*/
char dummy[81];
char eingabe[81];
int zeichen;
char feld[81];
char feld2[81];
int i;
int arr[81];
int laenge;
int test; /*Var. zur Testfeldspeicherung*/
int n;
int spalten;
int zeilen;
/*Einlesen des Eingabestrings*/
printf("\nKodierung: Texteingabe (maximal 80 Zeichen)\n->");
gets(eingabe);
printf("\nKodierstufe 1: Zeichen um 0..%i Positionen Modulo",MAXSHIFT);
printf("verschieben");
/*Einlesen der Anzahl der Positionsverschiebungen (mit Verschiebungsbed.)*/
printf("\nEingabe Anzahl der Schiebepositionen -> "); scanf ("%i", &n);
if (n>89)
{ n=89; printf("Maximale Modulo-Verschiebung 89 Stellen"); }
laenge = strlen(eingabe);
/*Schleife für Moduloverschiebung*/
for(i=0; i<laenge; i++) {
zeichen = (int)eingabe[i];
arr[i] = CodeTab[zeichen];
arr[i] = ( arr[i] + n ) % CODECHARANZ;
feld[i] = DecodeTab[arr[i]];
}
printf("\nErgebnis Kodierstufe 1: %d Zeichen\n->",i);
/*Schleife für Ausgabe der Kodierstufe 1*/
for (i=0;i<strlen(eingabe);i++) {
printf("%c",(char)feld[i]);
}
printf("<-\n");
printf("\nKodierstufe 2: Zeichen zeilenweise in Feld eintragen und ");
printf("spaltenweise ausgeben.\n");
/*Einlesen der Spaltenanzahl (mit Spaltenbedingungen)*/
printf("Eingabe der Spaltenzahl (2..15) -> "); scanf( "%i", &spalten);
if (spalten>15) { spalten=15; printf("Maximale Spaltenanzahl 15."); }
if (spalten<2) { spalten=2; printf("Minimale Spaltenanzahl 2."); }
/*Funktion zur Berechnung und Aufrundung der Zeilenanzahl*/
zeilen = ceil((float)laenge / (float)spalten );
printf("\nErgebnis Kodierstufe 2: \tKodezahl (SchiftZeilenSpalten) : ");
/*Ausgabe der Kodezahl (Zweistellige Ausgabe der Komponenten)*/
printf("%02d%02d%02d\n",n,zeilen,spalten);
printf("->");
/*Schleife für Ausgabe und Speicherung des kodierten Wortes/Satzes*/
for (i=0;i<spalten;i++) {
zeichen = i;
for (test=0; zeichen < laenge; test++ ) {
printf("%c", (char)feld[zeichen]);
feld2[test]=feld[zeichen];
zeichen += spalten;
}
}
printf("<-\n\n");
printf("[return]"); gets(dummy);
/*Übergabe der Werte*/
*pn=n;
*pspalten=spalten;
*pzeilen=zeilen;
*pfeld2=feld[zeichen];
*ptest=zeichen;
}
/*Unterprogramm Fall D*/
void fallD (void) {
char dummy[81];
char feld[81];
char eingabe[81];
int zeichen;
int arr[81];
int n;
int laenge;
int spalten;
int zeilen;
int counter;
int counter2;
int fillchar;
int i;
printf("\nDekodierung: Eingabe der Kodezahl (nnnnnn)\n->");
/*Einlesen der Kodezahl*/
scanf("%02d%02d%02d",&n,&zeilen,&spalten);
gets(dummy);
/*Einlesen des Eingabestrings*/
printf("\nKodierung: Texteingabe (maximal 80 Zeichen)\n->");
gets(eingabe);
laenge = strlen(eingabe);
printf("\nErgebnis Dekodierung Stufe 2 (%d Zeichen):\n->",laenge);
counter = 0;
/*Leerfeldanzahlbestimmung*/
fillchar = laenge - (zeilen-1)*spalten;
/*Schleife für Ausgabe der 2. Dekodierungsstufe*/
for (i=0; i<zeilen; i++) {
zeichen = i;
counter2 = 1;
while ( zeichen < laenge && counter < laenge && counter2 <= spalten ) {
printf("%c", (char)eingabe[zeichen]);
feld[counter] = (char)eingabe[zeichen];
counter++;
if ( counter2 > fillchar ) zeichen += zeilen-1;
else zeichen += zeilen;
counter2++;
}
}
/*Schleife für Moduloverschiebung*/
for (i=0; i<laenge; i++) {
arr[i] = CodeTab[feld[i]];
arr[i] = ( CODECHARANZ + arr[i] - n ) % CODECHARANZ;
feld[i] = DecodeTab[arr[i]];
}
printf("\n\nErgebnis Dekodierung Stufe 1:\n->");
/*Schleife für Ausgabe der 1. Dekodierungsstufe*/
for (i=0;i<strlen(eingabe);i++) {
printf("%c",(char)feld[i]);
}
printf("<-\n\n");
printf("[return]");
}
/*Unterprogramm Fall T*/
void fallT (int n, int spalten ,int zeilen, char *feld2, int test) {
char eingabe[81];
char feld[81];
//unsigned char feld2[81];
int zeichen;
int arr[81];
int laenge;
int counter;
int counter2;
int i;
int fillchar;
printf("\nDekodierung: Testkodezahl (nnnnnn)\n->");
printf("%02d%02d%02d\n\n",n,zeilen,spalten);
printf("Zu dekodierender Testtext:\n->");
gets(feld2);
laenge = strlen(feld2);
printf("\nErgebnis Dekodierung Stufe 2 (%d Zeichen):\n->",laenge);
counter = 0;
/*Leerfeldanzahlbestimmung*/
fillchar = laenge - (zeilen-1)*spalten;
/*Schleife für Ausgabe der 2. Dekodierungsstufe*/
for (i=0; i<zeilen; i++) {
zeichen = i;
counter2 = 1;
while ( zeichen < laenge && counter < laenge && counter2 <= spalten ) {
printf("%c", (char)feld2[zeichen]);
feld[counter] = (char)feld2[test];
counter++;
if ( counter2 > fillchar ) zeichen += zeilen-1;
else zeichen += zeilen;
counter2++;
}
}
/*Schleife für Moduloverschiebung*/
for (i=0; i<laenge; i++) {
arr[i] = CodeTab[feld[i]];
arr[i] = ( CODECHARANZ + arr[i] - n ) % CODECHARANZ;
feld[i] = DecodeTab[arr[i]];
}
printf("\n\nErgebnis Dekodierung Stufe 1:\n->");
/*Schleife für Ausgabe der 1. Dekodierungsstufe*/
for (i=0;i<strlen(feld2);i++) {
printf("%c",(char)feld[i]);
}
printf("<-\n\n");
printf("[return]");
}
/*Initialisierung des Hauptprogramms*/
int main (void) {
/*Variablendeklaration*/
char select; /*Variable für Fallauswahl*/
char dummy[81]; /*Var. für Eingabepufferleerung*/
int zeilen;
int spalten;
int n;
char feld2[81];
int test;
/*Eingabeschleife*/
do {
clrscr(); /*Bildschirm löschen*/
/*Hauptausgabe*/
printf("Top Secret --- Private Note Dekoder --- Top Secret C.Gieritz, N.Papke\n");
printf("=======================================================================\n\n");
printf("Task: E-Ende K-Kodieren D-Dekodieren T-Testdekodierung (nach K) -> ");
/*Einlesen eines Buchstabens für Fallunterscheidung*/
gets(dummy); select = dummy[0];
/*Fallunterscheidung*/
switch (select) {
/*Fehlerfall*/
default:
printf("Fehler: Falsche Kode-Eingabe: %c \a [Return]", select);
break;
/*Fall für Programmende*/
case 'E': case 'e':
printf("Programmende [Return] \a");
return 0;
//break;
/*Fall für Kodierung*/
case 'K': case 'k':
fallK(&n, &zeilen, &spalten, feld2, &test);
break;
/*Fall für Dekodierung*/
case 'D': case 'd':
fallD();
break;
/*Fall für Testdekodierung*/
case 'T': case 't':
fallT(n, zeilen, spalten, feld2, test);
break;
};
gets(dummy);
} while( TRUE );
}
und hier noch die Headerdatei 'codechar.h':
/* codechar.h: Tabellen zur Kodierung und Dekodierung von ASCII-Zeichen
1. Datei in das aktuelle Arbeitsverzeichnis kopieren
2. Einbindung in den Quelltext: #include "codechar.h"
Kodetabelle fuer die Umkodierung bestimmter ASCII-Zeichen
============================================================================
0 1 2 3 Kodezahl
0123456789 0123456789 0123456789 0123456789
ABCDEFGHIJ KLMNOPQRST UVWXYZabcd efghijklmn ASCII-Zeichen
----------------------------------------------------------------------------
4 5 6 7 Kodezahl
0123456789 0123456789 0123456789 0123456789
opqrstuvwx yz01234567 89 .,:;!?" +-*%/=$@&# ASCII-Zeichen
----------------------------------------------------------------------------
8 9 Kodezahl
0123456789 0123456789
|<>()[]{}\ ab Nr. 90 nicht beleg t ASCII-Zeichen
----------------------------------------------------------------------------
erste Kodenummer: 'A' = ASCII-Tabelle Nr. 65 --> Kodiertabelle Nr. 0
letzte Kodenummer: '\' = ASCII-Tabelle Nr. 92 --> Kodiertabelle Nr. 89
Alle restlichen Zeichen erhalten formal den Kode 255.
Diese Zeichen duerfen im Eingabestring nicht vorkommen.
Das Zeichen '~' wird als Fuellzeichen fuer die spaltenweise Ausgabe des
Kodierfeldes festgelegt. Dieses Zeichen darf deswegen bei der Ergaenzung der
Kodier- bzw. Dekodier-Tabellen nicht in den Zeichensatz aufgenommen werden.
*/
#ifndef _CODECHAR /* .h-Datei nur einmal einfuegen */
#define _CODECHAR
#define CODECHARANZ 90 /* Anzahl der kodierbaren Zeichen */
#define MAXSHIFT (CODECHARANZ-1) /* groesstmoegliche Zeichenverschiebung */
#define FILLCHAR '~' /* Fuellzeichen fuer Kodierung, '~' = #126 */
const unsigned char CodeTab[256] = { /* CodeTab[ASCII-Nr.] -> Kode-Nr. */
/*#000..#015*/ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
/*#016..#031*/ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
/*#032..#047*/ 62, 67, 69, 79, 76, 73, 78,255, 83, 84, 72, 70, 64, 71, 63, 74,
/*#048..#063*/ 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 65, 66, 81, 75, 82, 68,
/*#064..#079*/ 77, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
/*#080..#095*/ 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 85, 89, 86,255,255,
/*#096..#111*/ 255, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
/*#112..#127*/ 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 87, 80, 88,255,255,
/*#128..#143*/ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
/*#144..#159*/ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
/*#160..#175*/ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
/*#176..#191*/ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
/*#192..#207*/ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
/*#208..#223*/ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
/*#224..#239*/ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
/*#240..#255*/ 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255
}; /* Tabelle zur Zeichenumkodierung */
/*
Dekodiertabelle zur Rueckkodierung der umkodierten und verschobenen Zeichen
in den urspruenglichen ASCII-Kode
*/
const unsigned char DecodeTab[] = /* DecodeTab[Kode-Nr.] -> ASCII-Nr. */
"ABCDEFGHIJ" "KLMNOPQRST" "UVWXYZabcd" "efghijklmn" "opqrstuvwx"
"yz01234567" "89 .,:;!?\"" "+-*%/=$@&#" "|<>()[]{}\\";
#endif