| ZER DAKIDAN: Karaktere-kate bat teklatuz irakurtzen dakit. ZER IKASIKO DUDAN: Karaktere-kate baten char datu-motako elementuak banan-banan prozesatuko ditut. Enkriptazio algoritmo bat aplikatuko dut hasierako mezua ezkutatzeko. |
|
Kriptografian, Zesarren zifratze-sistema (edo Zesar zifratzea) mezuak enkriptatzeko teknikarik zaharrenetarikoa da, baita erabilienetako bat ere. Ordezkatze-metodo bat da, non hasierako mezuaren letra bakoitza beste letra batengatik ordezkatzen den: Alfabetoan 3 posizio aurrerago dagoen letrarengatik. Horrela, A letra D letra bihurtuko litzateke, B-a E etab. Metodo honek Julio Zesar ospetsuaren ohorean dauka izena, zeinek bere jeneralekin komunikatzeko erabiltzen zuen. |
Eskatzen den programaren zifratze-sistemak ASCII taularen ondoko karaktereak onartuko ditu:
- A-tik Z-ra bitarteko letra larriak
- a-tik z-ra bitarteko letra xeheak
- 0-tik 9-ra bitarteko zifrak
- ASCCI taulan jarraian dauden bost karaktere hauek: * + , - .
![]() |
| Koloretako laukietan dauden karaktereak mezuan agertzen badira zifratuko dira, mezuaren bestelako karaktereak ez dira zifratuko. |
Programaren lehen bertsio honek Zesar zifratzea delako enkriptazio teknika erakusten du, emaitza pantailaratzen du baina ez du aldagai berria sortzen emaitza gordetzeko:
/* Ariketa-49a_ZesarZifratzea: mezuak enkriptatzeko teknika */
// Zesar zifratze-teknikan letra bakoitzaren desplazamendua 3 da. Baina
// programa honek desplazamenduaren neurria hautatzeko aukera ematen du.
// cKaraktereBatZifratu() funtzioari esker emaitza pantailan
// idazten da baina ez da inon gordetzen.
#include <stdio.h>
#include <string.h> // strlen() funtzioarako
// karaktere bat zifratzeko funtzioa
char cKaraktereBatZifratu(char cKarak, int iDesplazamendua);
int main()
{
char sMezua[100]; // 99 karaktere biltegitzeko tokia
int iDesplazamendua;
printf("Ezkutatu nahi den mezua sartu (gehienez 99 karaktere): ");
fgets(sMezua, 100, stdin);
printf("Sarrerako mezua ezkutatu aurretik: |%s|\n", sMezua);
printf("Ondorioz, katearen bukaera hau da: \\n\\0 \n");
sMezua[strlen(sMezua)-1] = '\0'; // INTRO karakterea kentzeko
printf("Mezu bera INTRO karaktererik gabe: |%s|\n", sMezua);
printf("\nEnkriptatze-gakoa sartu (oso bat): ");
scanf("%d", &iDesplazamendua);
if (iDesplazamendua < 0) // gako negatiboa bada positibo jarri
iDesplazamendua = iDesplazamendua * (-1);
printf("Sartutakoaren mezu ezkutua hau da: |");
for (int iKont = 0; sMezua[iKont] != '\0'; iKont++)
{
printf("%c", cKaraktereBatZifratu(sMezua[iKont], iDesplazamendua));
}
printf("|\n\n");
return 0;
}
char cKaraktereBatZifratu(char cKarak, int iDesplazamendua)
{
if (cKarak >= 'a' && cKarak <= 'z')
{
return ((cKarak - 'a' + iDesplazamendua) % 26) + 'a';
// a-tik abiatu (+) desplazamendua eta 26 letra xehe
}
else if (cKarak >= 'A' && cKarak <= 'Z')
{
return ((cKarak - 'A' + iDesplazamendua) % 26) + 'A';
// A-tik abiatu (+) desplazamendua eta 26 letra larri
}
else if (cKarak >= '0' && cKarak <= '9')
{
return ((cKarak - '0' + iDesplazamendua) % 10) + '0';
// 0-tik abiatu (+) desplazamendua eta 10 zifra
}
else if (cKarak >= '*' && cKarak <= '.') // * + , - .
{
return ((cKarak - '*' + iDesplazamendua) % 5) + '*';
// *-tik abiatu (+) desplazamendua eta 5 karaktere
}
return cKarak; // onartzen ez den bestelako karakterea bada aldatu gabe itzuli
}
Programaren bigarren bertsio honek Zesar zifratzea delako enkriptazio teknika erakusten du, emaitza pantailaratzeko lehenik katea den aldagai berri bate elikatzen du:
/* Ariketa-49b_ZesarZifratzea: mezuak enkriptatzeko teknika */
// Zesar zifratze-teknikan letra bakoitzaren desplazamendua 3 da. Baina
// programa honek desplazamenduaren neurria hautatzeko aukera ematen du.
// sMezuaZifratu() funtzioari esker emaitza kate batean gordetzen da.
#include <stdio.h>
#include <string.h> // strlen() eta strcpy() funtzioetarako
// karaktere-kate osoa zifratzeko funtzioa
void sMezuaZifratu(char sMezua[], int iDesplazamendua, char *sEmaitza);
int main()
{
char sMezua[100]; // 99 karaktere biltegitzeko tokia
char sEmaitza[100] = ""; // kate hutsa
int iDesplazamendua;
printf("Ezkutatu nahi den mezua sartu (gehienez 99 karaktere): ");
fgets(sMezua, 100, stdin);
sMezua[strlen(sMezua)-1] = '\0'; // INTRO karakterea kentzeko
printf("Enkriptatze-gakoa sartu (kopuru oso bat): ");
scanf("%d", &iDesplazamendua);
if (iDesplazamendua < 0) // gako negatiboa bada positibo jarri
iDesplazamendua = iDesplazamendua * (-1);
sMezuaZifratu(sMezua, iDesplazamendua, sEmaitza);
printf("\nMezua ezkutatu aintzin: |%s|", sMezua);
printf("\nMezua ezkutatu ondoren: |%s|", sEmaitza);
printf("\n\n");
return 0;
}
void sMezuaZifratu(char sMezua[], int iDesplazamendua, char *sEmaitza)
{
// hasieran sEmaitza kateak sMezua katearen edukia gordetzen du, for aginduan
// sMezua[iKont] karakterea onartzen den bat ez bada (letra bat, zifra bat edo
// bost karaktere berezietatik bat * + , - .) sEmaitza kateari dagokion
// iKont-garren karakterea ez da aldatuko
strcpy(sEmaitza, sMezua);
for (int iKont = 0; sMezua[iKont] != '\0'; iKont++)
{
if (sMezua[iKont] >= 'a' && sMezua[iKont] <= 'z')
{
sEmaitza[iKont] = ((sMezua[iKont] - 'a' + iDesplazamendua) % 26) + 'a';
// a-tik abiatu (+) desplazamendua eta 26 letra xehe
}
else if (sMezua[iKont] >= 'A' && sMezua[iKont] <= 'Z')
{
sEmaitza[iKont] = ((sMezua[iKont] - 'A' + iDesplazamendua) % 26) + 'A';
// A-tik abiatu (+) desplazamendua eta 26 letra larri
}
else if (sMezua[iKont] >= '0' && sMezua[iKont] <= '9')
{
sEmaitza[iKont] = ((sMezua[iKont] - '0' + iDesplazamendua) % 10) + '0';
// 0-tik abiatu (+) desplazamendua eta 10 zifra
}
else if (sMezua[iKont] >= '*' && sMezua[iKont] <= '.') // * + , - .
{
sEmaitza[iKont] = ((sMezua[iKont] - '*' + iDesplazamendua) % 5) + '*';
// *-tik abiatu (+) desplazamendua eta 5 karaktere
}
// onartzen ez den bestelako karakterea bada, sEmaitza aldagaian aldatu gabe utzi
}
}
Bigarren bertsioko aurreko programan sMezuaZifratu() funtzioa ikusi da, orain bere osagarria garatuko dugu sMezuaDeszifratu() delako funtzio, zeinek enkriptatutako mezu bati dagokion hasierako testua itzultzen duen.
/* Ariketa-49c_ZesarZifratzea: mezuak enkriptatzen eta desenkriptatzen */
// Zesar zifratze-teknikan letra bakoitzaren desplazamendua 3 da. Baina
// programa honek desplazamenduaren neurria hautatzeko aukera ematen du.
// sMezuaZifratu() funtzioari esker emaitza kate batean gordetzen da.
// sMezuaDeszifratu() funtzioak emaitzatik hasierako mezua itzultzen du.
#include <stdio.h>
#include <string.h> // strlen() eta strcpy() funtzioetarako
// karaktere-kate osoa zifratzeko funtzioa
void sMezuaZifratu(char sMezua[], int iDesplazamendua, char *sEmaitza);
// karaktere-kate osoa deszifratzeko funtzioa
void sMezuaDeszifratu(char sMezua[], int iDesplazamendua, char *sEmaitza);
int main()
{
char sMezua[100]; // 99 karaktere biltegitzeko tokia
char sEmaitza[100] = ""; // kate hutsa
char sHasierakoa[100] = ""; // kate hutsa
int iDesplazamendua;
printf("Ezkutatu nahi den mezua sartu (gehienez 99 karaktere): ");
fgets(sMezua, 100, stdin);
sMezua[strlen(sMezua)-1] = '\0'; // INTRO karakterea kentzeko
printf("Enkriptatze-gakoa sartu (kopuru oso bat): ");
scanf("%d", &iDesplazamendua);
if (iDesplazamendua < 0) // gako negatiboa bada positibo jarri
iDesplazamendua = iDesplazamendua * (-1);
sMezuaZifratu(sMezua, iDesplazamendua, sEmaitza);
printf("\nMezua ezkutatu aintzin: |%s|", sMezua);
printf("\nMezua ezkutatu ondoren: |%s|", sEmaitza);
sMezuaDeszifratu(sEmaitza, iDesplazamendua, sHasierakoa);
printf("\nEzkutatua deszifratuta: |%s|", sHasierakoa);
printf("\n\n");
return 0;
}
void sMezuaZifratu(char sMezua[], int iDesplazamendua, char *sEmaitza)
{
// hasieran sEmaitza kateak sMezua katearen edukia gordetzen du, for aginduan
// sMezua[iKont] karakterea onartzen den bat ez bada (letra bat, zifra bat edo
// bost karaktere berezietatik bat * + , - .) sEmaitza kateari dagokion
// iKont-garren karakterea ez da aldatuko
strcpy(sEmaitza, sMezua);
for (int iKont = 0; sMezua[iKont] != '\0'; iKont++)
{
if (sMezua[iKont] >= 'a' && sMezua[iKont] <= 'z')
{
sEmaitza[iKont] = ((sMezua[iKont] - 'a' + iDesplazamendua) % 26) + 'a';
// a-tik abiatu (+) desplazamendua eta 26 letra xehe
}
else if (sMezua[iKont] >= 'A' && sMezua[iKont] <= 'Z')
{
sEmaitza[iKont] = ((sMezua[iKont] - 'A' + iDesplazamendua) % 26) + 'A';
// A-tik abiatu (+) desplazamendua eta 26 letra larri
}
else if (sMezua[iKont] >= '0' && sMezua[iKont] <= '9')
{
sEmaitza[iKont] = ((sMezua[iKont] - '0' + iDesplazamendua) % 10) + '0';
// 0-tik abiatu (+) desplazamendua eta 10 zifra
}
else if (sMezua[iKont] >= '*' && sMezua[iKont] <= '.') // * + , - .
{
sEmaitza[iKont] = ((sMezua[iKont] - '*' + iDesplazamendua) % 5) + '*';
// *-tik abiatu (+) desplazamendua eta 5 karaktere
}
// onartzen ez den bestelako karakterea bada, sEmaitza aldagaian aldatu gabe utzi
}
}
void sMezuaDeszifratu(char sMezua[], int iDesplazamendua, char *sEmaitza)
{
// hasieran sEmaitza kateak sMezua katearen edukia gordetzen du, for aginduan
// sMezua[iKont] karakterea onartzen den bat ez bada (letra bat, zifra bat edo
// bost karaktere berezietatik bat * + , - .) sEmaitza kateari dagokion
// iKont-garren karakterea ez da aldatuko
strcpy(sEmaitza, sMezua);
for (int iKont = 0; sMezua[iKont] != '\0'; iKont++)
{
if (sMezua[iKont] >= 'a' && sMezua[iKont] <= 'z')
{
sEmaitza[iKont] = ((sMezua[iKont] - 'z' - iDesplazamendua) % 26) + 'z';
// z-tik abiatu (-) desplazamendua eta 26 letra xehe
}
else if (sMezua[iKont] >= 'A' && sMezua[iKont] <= 'Z')
{
sEmaitza[iKont] = ((sMezua[iKont] - 'Z' - iDesplazamendua) % 26) + 'Z';
// Z-tik abiatu (-) desplazamendua eta 26 letra larri
}
else if (sMezua[iKont] >= '0' && sMezua[iKont] <= '9')
{
sEmaitza[iKont] = ((sMezua[iKont] - '9' - iDesplazamendua) % 10) + '9';
// 9-tik abiatu (-) desplazamendua eta 10 zifra
}
else if (sMezua[iKont] >= '*' && sMezua[iKont] <= '.') // * + , - .
{
sEmaitza[iKont] = ((sMezua[iKont] - '.' - iDesplazamendua) % 5) + '.';
// .-tik abiatu (-) desplazamendua eta 5 karaktere
}
// onartzen ez den bestelako karakterea bada, sEmaitza aldagaian aldatu gabe utzi
}
}
|





iruzkinik ez:
Argitaratu iruzkina