Algoritmizace

Monday, 27 September 2010 22:06 administrator
Print
There are no translations available.

Přednášející: Dagmar Brechlerová

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í