/* ========================================================================== */ /* */ /* projekt1.c */ /* (C) 2008 Filip Munk xmunkf00@stud.fit.vutbr.cz */ /* */ /* Enkoduje ci dekoduje zadany text pomoci zadaneho klice */ /* */ /* ========================================================================== */ #include <stdio.h> #include <stdlib.h> #include <string.h> //////////////////////////////////////////////////////////////////////////////////////////// //zaklad soustavy znaku 0 - 35 const int BASE =35; //Pocet cislic const int NUMBERS =10; //Jednicka se tentokrat odecita skutecne aby to fungovalo. //Mohl bych to odecist rucne a napsat proste cislo.. toto je ale vymluvnejsi. vic to vysvetluje. //Je ale potreba odecist jedna zde, aby nevznikla tato nutnost v kodu nekolikrate. //Timto si nemusim pamatovat ani znak pred A ani znak po 9 v ASCII tabulce const int SPACE ='A'-'9'-1; //Konstanty pro funkci myprint //////////////////////////////////////////////////////////////////////////////////////////// //standartni string const int TEXT=3; // tisk string na stderr const int ERROR=2; //tisk znaku const int CHAR=1; //standartni tisk stringu const int NOERR=0; // Konstanty pouzivane jako pojmenovani erroru //////////////////////////////////////////////////////////////////////////////////////////// //prirazuje textovy retezec pro hlasky z MYTXT //spatny argument const int BADARGNUM=0; //spatna vstupni data const int BADINPUT=1; //spatna data v klici const int BADCODE=2; //////////////////////////////////////////////////////////////////////////////////////////// //Chybove hlasky pouzivane funkci myprint const char * MYTXT[] = { "\nChyba - byl zadan nespravny pocet parametru...\nPouzijte prosim napovedu. Vyvolate ji parametrem -h\n" ,"\nChyba - Neplatna vstupni data! Procist napovedu. parametr -h\n" ,"\nChyba - Neplatna data v argumentu! Procist napovedu. parametr -h \n" }; //////////////////////////////////////////////////////////////////////////////////////////// //Kontroluje znaky ocekava ASCII hodnotu cisla na vstupu.Vrati 1/0 pokud je znak neplatny/platny int check_char(int letter) { int res =1; if ((letter>='0' && letter<='9')||(letter>='A' && letter<='Z')) { res=0; } return res; } //Kontroluje zadany text. Ocekava string vrasi 1/0 pokud jediny znak v textu neplatny/vsechny platne/ int check_txt(char * txt) { int i=0; int len=0; int res=0; len=strlen(txt); while ( i<len) { if (check_char(txt[i])!=0) { res=1; } i++; } return res; } //Tato funkce enkoduje zadany text pomoci klice v argumentu programu. //Prvni ocekavana promenna je znak textu, Druha promena pak znak klice. //Posouva postupne znaky z ASCII tabulky tak, aby vysledek byl spravny znak v tabulce. int encode (int letter, int Code) { letter-='0'; if (letter> NUMBERS) { letter-=SPACE; } Code-='0'; if (Code> NUMBERS) { Code-=SPACE; } letter+=Code; if (letter>BASE) { letter -=(BASE+1); } letter+='0'; if (letter>'9') { letter+=(SPACE); } return letter; } //Funkce pouze pro tisk napovedy. void print_help(void) { printf("\nProgram koder (projekt 1) - verze 1.4.\n" "Autor: Filip Munk (c) 2008\n\n" "Format vstupu: [PARAMETR] [KLIC]\n\n\n" " PARAMETRY\n\n" "\t-h\t \tVypise tuto obrazovku.\n" "\t-encode\t [KLIC] Enkoduje zadany text podle klice.\n" "\t-decode\t [KLIC] Dekoduje zadany text podle klice.\n\n" " KLIC\n\n" "Program na vstupu zpracuje pouze cislice[0-9] a VELKA pismena anglicke abecedy.\n\n" ); } //Tato funkce dekoduje zadany text pomoci klice v argumentu programu. //Prvni ocekavana promenna je znak textu, Druha promena pak znak klice. //Posouva postupne znaky z ASCII tabulky tak, aby vysledek byl spravny znak v tabulce. //Vraci vysledny znak int decode (int letter,int Code) { letter-='0'; if (letter> 10) { letter-=SPACE; } Code-='0'; if (Code> 10) { Code-=SPACE; } letter-=Code; //Pokud se dostane pod nulu przacne pocitat zase od Z if (letter<0) { letter +=BASE+1; } letter+='0'; if (letter>'9') { letter+=SPACE; } return letter; } //Jednoducha funkce pouze pro ruzny zpusob tisku znaku. //Pro tuto funkci jsou vytvoreny konstanty. //Na vstupu ocekava cislo typu hlasky , dale cislo znaku ci hlasky int myprint (int mytype, int num) { if (mytype==3) { printf("%s", MYTXT[num]); } if (mytype==2) { fprintf(stderr,"%s", MYTXT[num]); } if (mytype==1) { putchar(num); } if (mytype==0) { printf("%i",num); } return EXIT_SUCCESS; } //Ve funkci main zjistuji zadane parametry a volam funkce s prectenym znakem. int main(int argc, char *argv[]) { int letter,Code,len,res; int a=0; if (argc==3 && (strcmp(argv[1],"-encode")==0 || strcmp(argv[1],"-decode")==0)) { //Do promene len ulozi delku druheho argumentu/ if (check_txt(argv[2])==1) { myprint(ERROR,BADCODE); return EXIT_FAILURE; } len=strlen(argv[2]); //nacita ze standartniho vstupu do promenne letter, do konce radku. while ((letter=getchar())!= '\n') { //zajistuje , aby a nebylo vic nez index posledniho znaku v poli. if (a>=len) { a=0; } Code=argv[2][a]; a++; //kontroluje funkcni znaky pomoci funkce check_char //Pokud je znak platny posleho funkci encode/decode. if (check_char(letter)==0 && check_char(Code)==0) { if (strcmp(argv[1],"-encode")==0) { res=encode(letter,Code); } else { res=decode(letter,Code); } myprint(CHAR,res); } else { myprint(ERROR,BADINPUT); return EXIT_FAILURE; } } } else if (argc==2 && strcmp(argv[1],"-h")==0) { print_help(); } else { myprint(ERROR,BADARGNUM); return EXIT_FAILURE; } myprint(CHAR,'\n'); return EXIT_SUCCESS; } //konec projekt1.c
|
|||
