zápočtových úloha: naprogramovat aplikaci dle vybraného zadání (studenti si vybírají ze zveřejněného seznamu).
Moje úloha:
Napište program, který zkonvertuje zdrojový textový
soubor do morseovky a zapíše ji do nového souboru.
volání: telegraf zdroj_soubor novy_soubor
Řešení:
Viz archiv Jan_Tomsa_Algoritmizace_Uloha_18.zip
Zdrojový kód:
// Jan Tomsa, verze 1.0, vyhotoveno 17.11.2005 //------------------------------------------------------------------------- // úloha č. 18 //------------------------------------------------------------------------- // Zadání: // Napište program, který zkonvertuje zdrojový textový // soubor do morseovky a zapíše ji do nového souboru. // volání: telegraf zdroj_soubor novy_soubor //------------------------------------------------------------------------- #include <stdio.h> #include <stdlib.h> #include <ctype.h> #include <string.h> // Zástupná znaky pro binární strom #define CH 31 #define ALPHA '<' #define BETA '>' // Translation Table (převodní tabulka) - binární strom // obsahuje v nejnižším bitu informaci, // zda pro daný znak začíná překlad do morseovky tečkou nebo čárkou // ve zbývajících 7 bitech adresu, kterým znakem pokračovat // pokud adresa dalšího znaku je 0, skončit překlad // NNNNNNNO // \_____/^-- 0 .. "." / 1 .. "-" // ^------ adresa dalšího znaku // // Pro znaky, které nemají žádnou reprezentaci v morseovce obsahuje tabulka // číslo 255 // // příklad použití překladové tabulky pro písmeno "A" // TRANS_TABLE['A'] == 10101000 // \_____/^-- 0 => "." // ^------ 'T' // TRANS_TABLE['T'] == 00000001 // \_____/^-- 1 => "-" // ^------ 0 => konec // výsledek: 'A' --> ".-" unsigned char TRANS_TABLE[256] = { 0, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,//(0-15) 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, // (16-30) ('O' << 1)+1, // (31) /CH/ 255, // mezera (32) 255, // ! (33) 255, // " (34) 255, // # (35) 255, // $ (36) 255, // % (37) 255, // & (38) 255, // \ (39) 255, // ( (40) 255, // ) (41) 255, // * (42) 255, // + (43) 255, // , (44) 255, // - (45) 255, // . (46) 255, // / (47) (CH << 1)+1, // 0 (48) (CH << 1)+0, // 1 (49) ('J' << 1)+0, // 2 (50) ('W' << 1)+0, // 3 (51) ('V' << 1)+0, // 4 (52) ('H' << 1)+0, // 5 (53) ('H' << 1)+1, // 6 (54) ('B' << 1)+1, // 7 (55) ('Z' << 1)+1, // 8 (56) (ALPHA << 1)+1,// 9 (57) 255, // : (58) 255, // ; (59) ('G' << 1)+1, // < (60) /ALPHA/ 255, // = (61) ('M' << 1)+0, // > (62) /BETA/ 255, // ? (63) 255, // @ (64) ('T' << 1)+0, // A (65) ** 0-> "." ; pokračuj na indexu 'T' ('S' << 1)+1, // B ('R' << 1)+1, // C ('I' << 1)+1, // D ( 0 << 1)+0, // E ('R' << 1)+0, // F ('N' << 1)+1, // G ('S' << 1)+0, // H ('E' << 1)+0, // I ('O' << 1)+0, // J ('A' << 1)+1, // K ('D' << 1)+0, // L ('T' << 1)+1, // M ('E' << 1)+1, // N ('M' << 1)+1, // O ('G' << 1)+0, // P ('K' << 1)+1, // Q ('N' << 1)+0, // R ('I' << 1)+0, // S ( 0 << 1)+1, // T (84) ** 1-> "-" ; pokračuj na indexu 0 (=konec) ('A' << 1)+0, // U ('U' << 1)+0, // V (BETA << 1)+0, // W ('U' << 1)+1, // X (BETA << 1)+1, // Y ('D' << 1)+1, // Z (90) 255, // [ (91) 255, // \ (92) 255, // ] (93) 255, // ^ (94) 255, // _ (95) 255, // ` (96) ('T' << 1)+0, // a (97) ('S' << 1)+1, // b ('R' << 1)+1, // c ('I' << 1)+1, // d ( 0 << 1)+0, // e ('R' << 1)+0, // f ('N' << 1)+1, // g ('S' << 1)+0, // h ('E' << 1)+0, // i ('O' << 1)+0, // j ('A' << 1)+1, // k ('D' << 1)+0, // l ('T' << 1)+1, // m ('E' << 1)+1, // n ('M' << 1)+1, // o ('G' << 1)+0, // p ('K' << 1)+1, // q ('N' << 1)+0, // r ('I' << 1)+0, // s ( 0 << 1)+1, // t ('A' << 1)+0, // u ('U' << 1)+0, // v (BETA << 1)+0, // w ('U' << 1)+1, // x (BETA << 1)+1, // y ('D' << 1)+1, // z (122) 255, // { (123) 255, // | (124) 255, // } (125) 255, // ~ (126) 0, // (127) - 0 kvůli ukončení neex. znaků 255, // € (128) 255, // (129) 255, // ‚ 255, // (131) 255, // „ 255, // … 255, // † 255, // ‡ 255, // (136) 255, // ‰ (137) ('I' << 1)+0, // Š 255, // ‹ ('I' << 1)+0, // Ś ( 0 << 1)+1, // Ť (141) ('D' << 1)+1, // Ž (142) ('D' << 1)+1, // Ź 255, // (144) 255, // ‘ 255, // ’ 255, // “ 255, // ” 255, // • (149) 255, // – 255, // — 255, // (152) 255, // ™ ('I' << 1)+0, // š 255, // › (155) ('I' << 1)+0, // ś ( 0 << 1)+1, // ť (157) ('D' << 1)+1, // ž ('D' << 1)+1, // ź 255, // (160) 255, // ˇ 255, // ˘ (162) ('D' << 1)+0, // Ł 255, // ¤ ('T' << 1)+0, // Ą 255, // ¦ (166) 255, // § 255, // ¨ 255, // © (169) ('I' << 1)+0, // Ş (170) 255, // « 255, // ¬ 255, // 255, // ® ('D' << 1)+1, // Ż (175) 255, // ° 255, // ± 255, // ˛ ('D' << 1)+0, // ł (179) 255, // ´ (180) 255, // µ 255, // ¶ 255, // · 255, // ¸ ('T' << 1)+0, // ą (185) ('I' << 1)+0, // ş (186) 255, // » ('D' << 1)+0, // Ľ 255, // ˝ ('D' << 1)+0, // ľ (190) ('D' << 1)+1, // ż (191) ('N' << 1)+0, // Ŕ ('T' << 1)+0, // Á ('T' << 1)+0, // Â ('T' << 1)+0, // Ă ('T' << 1)+0, // Ä ('D' << 1)+0, // Ĺ (197) ('R' << 1)+1, // Ć ('R' << 1)+1, // Ç ('R' << 1)+1, // Č (200) ( 0 << 1)+0, // É (201) ( 0 << 1)+0, // Ę ( 0 << 1)+0, // Ë ( 0 << 1)+0, // Ě ('E' << 1)+0, // Í ('E' << 1)+0, // Î (206) ('I' << 1)+1, // Ď ('I' << 1)+1, // Đ ('E' << 1)+1, // Ń ('E' << 1)+1, // Ň (210) ('M' << 1)+1, // Ó ('M' << 1)+1, // Ô ('M' << 1)+1, // Ő ('M' << 1)+1, // Ö 255, // × (215) ('N' << 1)+0, // Ř (216) ('A' << 1)+0, // Ů (217) ('A' << 1)+0, // Ú (218) ('A' << 1)+0, // Ű ('A' << 1)+0, // Ü (220) (BETA << 1)+1, // Ý ( 0 << 1)+1, // Ţ 255, // ß ('N' << 1)+0, // ŕ ('T' << 1)+0, // á (225) ('T' << 1)+0, // â (226) ('T' << 1)+0, // ă (227) ('T' << 1)+0, // ä ('D' << 1)+0, // ĺ ('R' << 1)+1, // ć (230) ('R' << 1)+1, // ç ('R' << 1)+1, // č ( 0 << 1)+0, // é ( 0 << 1)+0, // ę ( 0 << 1)+0, // ë ( 0 << 1)+0, // ě ('E' << 1)+0, // í (237) ('E' << 1)+0, // î (238) ('I' << 1)+1, // ď ('I' << 1)+1, // đ (240) ('E' << 1)+1, // ń (241) ('E' << 1)+1, // ň (242) ('M' << 1)+1, // ó (243) ('M' << 1)+1, // ô (244) ('M' << 1)+1, // ő (245) ('M' << 1)+1, // ö (246) 255, // ÷ (247) ('N' << 1)+0, // ř (248) ('A' << 1)+0, // ů ('A' << 1)+0, // ú ('A' << 1)+0, // ű (251) ('A' << 1)+0, // ü (BETA << 1)+1, // ý ( 0 << 1)+1, // ţ 0 // ˙ (255) }; //------------------------------------------------------------------------- // Procedura pro převod znaku na reprezentaci v Morseově abecedě // Funkce využívá převodní tabulku TRANS_TABLE // // Parametry: // c Znak k přeložení // outbuf Výstupní řetězec void translate( unsigned char c, char *outbuf ) { int i; if ( (c == 32) || (c == 127) || (c == '\n') || (c == '\t') || (c == '<') || (c == '>') || (c == '?') || (c == 10) || (c == '"') || (c == 39) || (c == ':') || (c == '!') || (c == '(') || (c == ')') || (c == '{') || (c == '}') || (c == '=') || (c == '*') || (c == '_') || (c == '^')) { // Nepřekládané znaky - pouze doplnit znak "/" pro oddělení outbuf[0] = c; outbuf[1] = '/'; outbuf[2] = 0; } else { i = 0; // Přeložení znaku do morseovky s pomocí převodního binárního stromu do { outbuf[i] = ((TRANS_TABLE[c] & 1) == 0) ? '.' : '-'; if (TRANS_TABLE[c]!=255) { // Ošetření znaků, které nemají překlad i++; } } while ( (c = (unsigned char)(TRANS_TABLE[c] >> 1)) != 0 ); outbuf[i] = '/'; // doplnění oddělovače outbuf[i+1] = 0; } } //--------------------------------------------------------------------------- int main(int argc, char *argv[] ) { if (argc > 2) { char *in_name = argv[1]; char *out_name = argv[2]; char *options = ""; unsigned char buf1, buf2 = 0; char *outstr; FILE *in, *out; if (argc > 3) { options = argv[3]; } // alokace paměti pro pracovní řetězec outstr = (char *) malloc(20); // --------- osetření vstupu ------------- if ((in = fopen(in_name, "rt")) == NULL) { fprintf(stderr, "Chyba pri otevreni vstupniho souboru \"%s\".\n", in_name); return 1; } // Test na existenci výstupního souboru if ( ((out = fopen(out_name, "rt")) != NULL) && (strcmp( options, "-f" )) ) { fprintf(stderr, strcat("Vystupni soubor \"%s\" existuje.\n", "Prejete-li si jej prepsat, pouzijte prepinac -f"), out_name); fclose(out); return 1; } if ((out = fopen(out_name, "wt")) == NULL) { fprintf(stderr, "Chyba pri otevreni vystupniho souboru \"%s\".\n", out_name); return 1; } // --------- /osetření vstupu ------------ // ------------ zpracování ------------ while (!feof(in)) { // pokud 2. načtené písmeno při předchozím čtení nebylo H // tvořící CH, použij ho jako vstup // => nečti ze souboru, ale z buf2 if (buf2 == 0) { buf1 = (unsigned char)fgetc(in); } else { buf1 = buf2; buf2 = 0; } // test na "CH" // jestliže jsme načetli "C", načteme ještě jeden znak, // protože kdyby to bylo "H", musíme to zpracovat jako "CH" if (toupper(buf1)=='C') { if (!feof(in)) { buf2 = (unsigned char)fgetc(in); } else { buf2 = 0; } if (toupper(buf2)=='H') { buf1 = CH; // použití zástupného znaku pro CH buf2 = 0; } } translate( buf1, outstr ); // překlad znaku do morseovky // výpis přeloženého řetězce do výstupního souboru fprintf(out, outstr); } // ------------ /zpracování ---------- fclose(in); fclose(out); return 0; } else { // Pokud nejsou zadány parametry, vypsat nápovědu printf("Program TELEGRAF - prevod souboru do morseovy abecedy.\n"); printf("Pouziti: telegraf <vstupni soubor> <vystupni soubor> [-f]\n"); printf(" -f ... prepsat existujici vystupni soubor\n"); return 1; } } //---------------------------------------------------------------------------
Navazující předmět: Programování