C programozás oktatás kezdőknek
Kérdésed van? +36 70 410 1763 info@c-programozas.hu

Vigenére tábla

Érettségi feladat - 2005. május 27.

Már a XVI. században komoly titkosítási módszereket találtak ki az üzenetek elrejtésére. A század egyik legjobb kriptográfusának Blaise de Vigenère-nek a módszerét olvashatjuk a következőkben.

A kódoláshoz egy táblázatot és egy ún. kulcsszót használt. A tábla adatait a vtabla.dat fájlban találjuk a következő formában.

Vigenére tábla érettségi feladat

A kódolás feltételei:

  • A magyar ékezetes karakterek helyett ékezetmenteseket kell használni. (Például á helyett a, ő helyett o, stb.)
  • A nyílt szövegben az átalakítás után csak az angol ábécé betűi szerepelhetnek.
  • A nyílt szöveg az átalakítás után legyen csupa nagybetűs.

Készítsünk programot kodol néven a következő feladatok végrehajtására!

Kérjünk be a felhasználótól egy maximum 255 karakternyi, nem üres szöveget!
A továbbiakban ez a nyílt szöveg. (3 pont)

1
2
3
4
5
6
#define MAX 256

void beker(char s[]){
	printf("Adjon meg egy maximum %d karakternyi, nem üres szöveget!\n",MAX-1);
 	fgets(s,MAX,stdin);
}

Olvassunk be a szabvány bemenetről egy maximum 255 karakter hosszú szöveget, és tároljuk le egy karaktertömbben.

Alakítsuk át a nyílt szöveget, hogy a későbbi kódolás feltételeinek megfeleljen! (12 pont)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
#include <ctype.h>

void atalakit(char s[]){
	int j,i,k=0;
	char kis[]={"áéíóöőúüű"},nagy[]={"ÁÉÍÓÖŐÚÜŰ"},angol[]={"aeiooouuu"};
	for(i=0;s[i];i++){
		j=0;
		while(kis[j] && (s[i]!=kis[j] && s[i]!=nagy[j])){
			j++;
		}
		if(kis[j]){
			s[i]=angol[j]; 
		}
		if(isalpha(s[i])){
			s[k]=toupper(s[i]); k++;
		}
	}
	s[k]='\0';
}

Alakítsuk át a bekért szöveget a kódolási elvárások szerint. Egy karaktertömbben határozzuk meg az ékezetes karaktereket, és a bekért szövegben helyettesítsük őket nem ékezetes karakterekkel. Ügyeljünk arra, hogy ne tegyünk különbséget a kis- és nagybetűk között. Távolítsuk el a szövegből az oda nem illő karaktereket úgy, hogy csak az angol ábécé karaktereit tartalmazza. A megmaradt karakterlánc elemeit alakítsuk nagybetűssé.

Írjuk ki a képernyőre az átalakított nyílt szöveget! (1 pont)

Lásd a főprogramban...

Kérjünk be a felhasználótól egy maximum 5 karakteres, nem üres kulcsszót! A kulcsszó a kódolás feltételeinek megfelelő legyen! Alakítsuk át a kulcsszót csupa nagybetűssé! (4 pont)

1
2
3
4
5
6
#define KMAX 6

void kulcsszo_beker(char s[]){
	printf("Adjon meg egy maximum %d karakternyi kulcsszót!\n",KMAX-1);
 	fgets(s,KMAX,stdin);
}

A bekérésnél sem átalakítás, sem ellenőrzés nem kell.

A kódolás első lépéseként fűzzük össze a kulcsszót egymás után annyiszor, hogy az így kapott karaktersorozat (továbbiakban kulcsszöveg) hossza legyen egyenlő a kódolandó szöveg hosszával! Írjuk ki a képernyőre az így kapott kulcsszöveget! (6 pont)

A kódolás második lépéseként a következőket hajtsuk végre! Vegyük az átalakított nyílt szöveg első karakterét, és keressük meg a vtabla.dat fájlból beolvasott táblázat első oszlopában! Ezután vegyük a kulcsszöveg első karakterét, és keressük meg a táblázat első sorában! Az így kiválasztott sor és oszlop metszéspontjában lévő karakter lesz a kódolt szöveg első karaktere. Ezt ismételjük a kódolandó szöveg többi karakterével is! (15 pont)

Írjuk ki a képernyőre és a kodolt.dat fájlba a kapott kódolt szöveget! (4 pont)

A főprogram

 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
#include <stdio.h>
#include <ctype.h>

#define MAX 256
#define KMAX 6

/* Függvények... */

int main(void){
	char szoveg[MAX],kulcsszo[KMAX];
	
	system("CHCP 1250"); system("CLS");
	
	/* 1. feladat */
	beker(szoveg);
	
	/* 2. feladat */
	atalakit(szoveg);
	
	/* 3. feladat */
	printf("\nAz átalakított nyílt szöveg: %s\n\n",szoveg);
	
	/* 4. feladat */
	kulcsszo_beker(kulcsszo);
	atalakit(kulcsszo);
	printf("\nAz átalakított kulcsszó: %s\n\n",kulcsszo);
	
	return 0;
}

Hívjuk meg a fent bemutatott függvényeket a főprogramban, és jelenítsük meg a képernyőn a kapott eredményeket.

A program egy lehetséges kimenete

Adjon meg egy maximum 255 karakternyi, nem üres szöveget!
Ez a próba szöveg, amit kódolunk!

Az átalakított nyílt szöveg: EZAPROBASZOVEGAMITKODOLUNK

Adjon meg egy maximum 5 karakternyi kulcsszót!
autó

Az átalakított kulcsszó: AUTO

  Az itt található érettségi feladat megoldása nem az Oktatási Minisztérium által kiadott hivatalos megoldás. A feladatokat azért dolgoztam ki C nyelven is, hogy segítsem a diákjaim sikeres emelt szintű érettségi felkészülését. A megoldások irányadó jellegűek, a feladatok többféleképpen is megoldhatóak.

  Ha a lakattal jelölt feladatok megoldásaira is kíváncsi vagy, keress bizalommal!