Text mit einem Schlüsselwort de- oder codieren

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

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:
Zurück