D4rkr00t23
Grünschnabel
Eben erstellte ich ein Programm, welches eine Gronsfeld-Verschlüsselung automatisch dekodiert. Aber ich habe noch Problem: Funktion für ein herausgefundendes Codewort. Ich weiß nicht, ob ich etwas falsches geschrieben habe und ich kann nicht Fehler finden, weil ich Code geschrieben habe, nur was ich weiß bzw. erkenne.
Mein Programm: MS Visual Studio 2008
Es ist so ähnlich wie ein anderes Thema http://www.tutorials.de/forum/c-c/141626-textcodierer-c.html
Mein Programm: MS Visual Studio 2008
Es ist so ähnlich wie ein anderes Thema http://www.tutorials.de/forum/c-c/141626-textcodierer-c.html
Code:
#include "stdafx.h"
#include "string.h"
void DateitextInArraySpeichern(char * acText, const char * acQuelldatei)
{
bool bContinue = true;
char cBuffer;
int iCounter = 0;
FILE * file = 0;
file = fopen(acQuelldatei, "r");
while (bContinue)
{
cBuffer = fgetc (file);
if (cBuffer != EOF)
{
acText[iCounter] = cBuffer;
iCounter++;
}
else
{
bContinue = false;
}
}
fclose (file);
}
char MachGross(char c)
{
if(c>=97 && c<=122)
c-= 32;
return c;
}
void Verschiebe(char & c, char cVer, bool bHoch)
{
c = MachGross(c);
cVer = MachGross(cVer);
if (c >= 65 && c <= 90)
{
if(bHoch)
c += cVer-'A';
else c -= cVer-'A';
if(c>'Z')
c -= 26;
else if(c<'A')
c+= 26;
}
};
void ChiffriereDechiffriere(char*pcCodewort, char*pcQuelldatei, char*pcZieldatei, bool bHoch)
{
FILE * fileQuelle= 0;
FILE * fileZiel= 0;
fileQuelle= fopen(pcQuelldatei,"r");
fileZiel= fopen(pcZieldatei,"w");
if(fileQuelle == 0)
printf("Quelldatei %s kann nicht geoeffnet werden\n", pcQuelldatei);
else if(fileZiel == 0)
printf("Zieldatei %s kann nicht geoeffnet werden\n", pcZieldatei);
else
{
int j = 0; char c;
while((c = fgetc(fileQuelle))!= EOF)
{
Verschiebe(c,pcCodewort[j], bHoch);
fputc(c,fileZiel);
j=(j+1)%(int)strlen(pcCodewort);
}
fclose(fileQuelle); fclose(fileZiel);
}
};
int iGGT(int iMin, int iMax)
{
if (iMin > iMax)
{
int iTemp = iMax;
iMax = iMin;
iMin = iTemp;
}
for ( int i = iMin; i > 0; i--)
{
if ((iMin % i) == 0 && (iMax % i) == 0)
{
// GCD is found
return i;
}
}
// No GCD found -> 1 is GCD
return 1;
}
void LauflaengenErmitteln(int * piLauflaengen, int & iLauflaenge, char * pcText, int iMaxPattern)
{
iLauflaenge = 0;
int k;
int iLg = (int)strlen(pcText); //iLg
for(int i=0 ; i<iLg ; i++) //iLg
{
for(int j=i+1 ; j<iLg ; j++) //
{
k = 0;
while(pcText[i+k] == pcText[j+k] && k<iMaxPattern)
k++;
if(k == iMaxPattern)
piLauflaengen[iLauflaenge++] = j-i;
}
}
}
int iGesamtGGT(int * piLauflaengen, int & iLauflaenge) //ohne a
{
if(iLauflaenge == 0)
return 0;
else if(iLauflaenge == 1)
return piLauflaengen[0];
else
{
int iGGT = piLauflaengen[0];
for(int i=0;i<iLauflaenge;i++)
iGGT = piLauflaengen[i]; // GGT
return iGGT;
}
}
int Alphabetposition(char & rcBuchstabe)
{
int iReturn = 0;
// Upper
if (rcBuchstabe >= 65 && rcBuchstabe <= 90)
{
iReturn = ((int)rcBuchstabe - 64);
}
// Lower
else if (rcBuchstabe >= 97 && rcBuchstabe <= 122)
{
iReturn = ((int)rcBuchstabe - 96);
}
return iReturn;
}
void HistogrammeErstellen(int aaiBuchstabenhaeufigkeit[30][27], char * acText, int iCodewortlaenge)
{
for(int i=0, iHistogramm=0; i<(int)strlen(acText); i++, iHistogramm=(iHistogramm+1)%iCodewortlaenge)
aaiBuchstabenhaeufigkeit[iHistogramm]
[Alphabetposition(acText[i])]++;
};
void CodewortErmitteln(int aaiBuchstabenhaeufigkeit[30][27], char * acCodewort, int iCodewortlaenge)
{
int iMax; int iB;
for(int iHistogramm=0; iHistogramm<iCodewortlaeng; iHistogramm++)
{
iMax = 0;
for(int iBuchstabe=0; iBuchstabe<26; iBuchstabe++)
{
{
if(aaiBuchstabenhaeufigkeit
[iHistogramm][iBuchstabe]>iMax)
{
iMax=aaiBuchstabenhaeufigkeit
[iHistogramm][iBuchstabe];
iB=iBuchstabe-4;
if(iB<0)
iB+=26;
acCodewort[iHistogramm] = iB+'A';
}
}
}
}
};
void main()
{
char acText[100000]={0};
char ac[255];
char acQuelldatei[256];
char acZieldatei[256];
char acCodewort[256]={0};
FILE * fileQuelle=0;
FILE * fileZiel=0;
int iLauflaenge=0;
int aiLauflaengen[100000]={0};
char cAntwort;
int iMaxPattern = 30;
printf("\nQuelldatei->");
scanf("%s",acQuelldatei);fflush(stdin);
DateitextInArraySpeichern(acText, acQuelldatei);
while(iLauflaenge<20)
{
LauflaengenErmitteln(aiLauflaengen,iLauflaenge,acText,iMaxPattern--); ////////
printf("Lauflaengenermittelt, Anzahl: %i \n", iLauflaenge);
}
for(int i=0; i<iLauflaenge; i++)
printf("Lauflaenge%i: %i\n", i, aiLauflaengen[i]);
printf("\n");
int iCodewortlaenge = iGesamtGGT(aiLauflaengen, iLauflaenge);
printf("Die Laenge des Codeworts betraegt: %i\n", iCodewortlaenge);
int aaiBuchstabenhaeufigkeit[30][27] = {{0}};
CodewortErmitteln(aaiBuchstabenhaeufigkeit, acCodewort, iCodewortlaenge);
printf("Wahrscheinliches Codewort: %s\n", acCodewort);
printf("\nZieldatei->");
scanf("%s",acZieldatei);fflush(stdin);
// printf("\nCodewort->");
// scanf("%s",acCodewort);fflush(stdin);
printf("\nVer-[V] oder Entschluesseln[E]? ->");
scanf("%c",&cAntwort);fflush(stdin);
if(MachGross(cAntwort)=='V')
ChiffriereDechiffriere(acCodewort,acQuelldatei, acZieldatei, true);
else
ChiffriereDechiffriere(acCodewort,acQuelldatei, acZieldatei, false);
getchar();
}
Zuletzt bearbeitet: