Informatika érettségi 2005. Október
Informatika érettségi 2005. Október
Ez az érettségi kevesebb feladatból áll, mint a tavaszi, viszont ebben a feladatok jobban egymásra épülnek. A viszonylag hosszú feladatkiírás sok részletében könnyű elveszni, de cserébe kis odafigyeléssel nagyon jól specifikált, hogy mit is kell csinálni.
A feladatkiírás
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 olvashatja a következőkben.
A kódoláshoz egy táblázatot és egy ún. kulcsszót használt. A táblázatot az alábbi ábra tartalmazza.
A tábla adatait a vtabla.dat fájlban találja a következő formában.
Készítsen programot kodol néven a következő feladatok végrehajtására!
- Kérjen be a felhasználótól egy maximum 255 karakternyi, nem üres szöveget! A továbbiakban ez a nyílt szöveg.
- Alakítsa át a nyílt szöveget, hogy a későbbi kódolás feltételeinek megfeleljen! 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.
- Írja ki a képernyőre az átalakított nyílt szöveget!
- Kérjen be a felhasználótól egy maximum 5 karakteres, nem üres kulcsszót! A kulcsszó a kódolás feltételeinek megfelelő legyen! (Sem átalakítás, sem ellenőrzés nem kell!) Alakítsa át a kulcsszót csupa nagybetűssé!
- A kódolás első lépéseként fűzze ö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! Írja ki a képernyőre az így kapott kulcsszöveget!
- A kódolás második lépéseként a következőket hajtsa végre! Vegye az átalakított nyílt szöveg első karakterét, és keresse meg a vtabla.dat fájlból beolvasott táblázat első oszlopában! Ezután vegye a kulcsszöveg első karakterét, és keresse 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ételje a kódolandó szöveg többi karakterével is!
- Írja ki a képernyőre és a kodolt.dat fájlba a kapott kódolt szöveget!
Példa:
Nyílt szöveg: Ez a próba szöveg, amit kódolunk!
Szöveg átalakítása: EZAPROBASZOVEGAMITKODOLUNK
Kulcsszó: auto
Kulcsszó nagybetűssé alakítása: AUTO
Nyílt szöveg és kulcsszöveg együtt:
EZAPROBASZOVEGAMITKODOLUNK
AUTOAUTOAUTOAUTOAUTOAUTOAU
Kódolt szöveg:
ETTDRIUOSTHJEATAINDCDIEINE
A megoldás
- Kérjen be a felhasználótól egy maximum 255 karakternyi, nem üres szöveget! A továbbiakban ez a nyílt szöveg.
Itt a 255 karakternyi megkötés a Pascal nyelvre szabás eredménye. Egy modern programozási nyelv esetén nem igen kell foglalkozni a szövegek méretével, mivel dinamikusan kezeltek. De ettől függetlenül a korrektség kedvéért ellenőrzötten olvassuk be a szövegünket, amit a _bemenet változó fog tárolni az osztályunkban.
public void Feladat01()
{
do
{
Console.WriteLine("Adja meg a bemenetet:");
_bemenet = Console.ReadLine();
}
while (string.IsNullOrEmpty(_bemenet)
&& _bemenet.Length > 255);
}
- Alakítsa át a nyílt szöveget, hogy a későbbi kódolás feltételeinek megfeleljen! 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.
A feladatban meg kell szabadulnunk az ékezetes betűktől és csupa nagybetűssé kell alakítani a szöveget. A string típus ToUpper() metódusa könnyen megbirkózik az ékezetes betűkkel is, ezért a szöveget kapásból nagybetűssé alakítjuk. A cserét pedig egy egyszerű csere Dictionary<char, char> segítségével valósítjuk meg. Végigmegyünk a karaktereken és ha egy olyan karaktert találunk, ami szerepel a cserélendők között, akkor kicseréljük a hozzá rendelt karakterre.
Azért, hogy az egész folyamat optimális legyen, a cseréket egy StringBuilder típusú változóval végezzük el. Az eredményt a _kodolando változó fogja tárolni az osztályunkban, mert a későbbi feladatban szükségünk lesz rá.
public void Feladat02()
{
var csere = new Dictionary<char, char>
{
{ 'Á', 'A' },
{ 'É', 'E' },
{ 'Í', 'I' },
{ 'Ó', 'O' },
{ 'Ö', 'O' },
{ 'Ő', 'O' },
{ 'Ú', 'U' },
{ 'Ü', 'U' },
{ 'Ű', 'U' },
};
StringBuilder cserelt = new StringBuilder(_bemenet.Length);
foreach (var chr in _bemenet.ToUpper())
{
if (!char.IsLetter(chr)) continue;
if (csere.ContainsKey(chr))
cserelt.Append(csere[chr]);
else
cserelt.Append(chr);
}
_kodolando = cserelt.ToString();
}
- Írja ki a képernyőre az átalakított nyílt szöveget!
public void Feladat03()
{
Console.WriteLine(_kodolando);
}
- Kérjen be a felhasználótól egy maximum 5 karakteres, nem üres kulcsszót! A kulcsszó a kódolás feltételeinek megfelelő legyen! (Sem átalakítás, sem ellenőrzés nem kell!) Alakítsa át a kulcsszót csupa nagybetűssé!
Ellenőrzött adatbekérés annyi könnyítéssel, hogy a beírt szöveget nem kell átalakítanunk. A bekért adatot a _kulcsszo fogja tárolni, mivel a későbbiek során szükségünk lesz rá.
public void Feladat04()
{
do
{
Console.WriteLine("Adja meg a kulcszót:");
_kulcsszo = Console.ReadLine().ToUpper();
}
while (string.IsNullOrEmpty(_kulcsszo) || _kulcsszo.Length > 5);
}
- A kódolás első lépéseként fűzze ö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! Írja ki a képernyőre az így kapott kulcsszöveget!
A kódolás első lépéseként a kulcsban található karaktereket addig kell ismételnünk, amíg egy ugyanolyan hosszú szöveget kapunk, mint a kódolandó szöveg. Ezt egy StringBuilder és két egymásba ágyazott ciklus segítségével könnyen meg tudjuk tenni.
public void Feladat05()
{
var kulcs = new StringBuilder();
do
{
foreach (var chr in _kulcsszo)
{
kulcs.Append(chr);
if (kulcs.Length == _kodolando.Length)
{
break;
}
}
}
while (kulcs.Length < _kodolando.Length);
_kulcsszoveg = kulcs.ToString();
Console.WriteLine(_kulcsszoveg);
}
- A kódolás második lépéseként a következőket hajtsa végre! Vegye az átalakított nyílt szöveg első karakterét, és keresse meg a vtabla.dat fájlból beolvasott táblázat első oszlopában! Ezután vegye a kulcsszöveg első karakterét, és keresse 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ételje a kódolandó szöveg többi karakterével is!
Ez egy viszonylag komplex feladat. Adatot kell olvasni és keresni benne. Az adatokat sorok listájaként tároljuk az osztályunkban a _vtabla nevű List<string> típusú változóban.
Ezután szükségünk van az első sor karaktereire és az első oszlop karaktereire. Ezt LINQ segítségével könnyen meghatározhatjuk.
Ezen információk alapján a kódolás már csak a megfelelő elem kiválasztásából és a bemenet cseréjéből áll. Az eredményt a _kodolt változó tárolja a megoldás osztályunkban.
public void Feladat06()
{
//fáj beolvasása
using (var file = File.OpenText("Vtabla.dat"))
{
string? sor = null;
do
{
sor = file.ReadLine();
if (!string.IsNullOrEmpty(sor))
{
_vtabla.Add(sor);
}
}
while (sor != null);
}
var elsoOszlop = _vtabla.Select(s => s[0]).ToList();
var elsoSor = _vtabla[0].ToList();
StringBuilder kodolt = new StringBuilder();
for (int i=0; i< _kodolando.Length; i++)
{
int sorindex = elsoOszlop.IndexOf(_kodolando[i]);
int oszlopindex = elsoSor.IndexOf(_kulcsszoveg[i]);
kodolt.Append(_vtabla[sorindex][oszlopindex]);
}
_kodolt = kodolt.ToString();
}
- Írja ki a képernyőre és a kodolt.dat fájlba a kapott kódolt szöveget!
A végére egy könnyű feladat. Csupán egy sort kell kiírnunk a képernyőre és egy fájlba. A feladatkiírás során megadott példával könnyen tesztelhetjük a megoldás helyességét.
public void Feladat07()
{
Console.WriteLine(_kodolt);
using (var file = File.CreateText("kodolt.dat"))
{
file.Write(_kodolt);
}
}

