======= Úkoly k procvičování ====== ===== FEL Abeceda ===== * Naimplementujte program, který přeloží znaky 'A'--'Z' a 'a'--'z' na FEL abecedu. Ostatní znaky nechá nezměněné. * Abecedu je definována jediným polem znaků, ve kterém jsou jednotlivá slova za sebou a na mapování písemene abecedy na slovy je realizováno jako pole ukazatelů na textové řetězce. * V programu kontrolujte, že abeceda obsahuje všechna slova 'A'--'Z' začínající velkým písmenem, např. ''Bool test_alphabet(char *str);''. Seznamte se s voláním ''assert()'' z knihovny ''assert.h''. * Řetězec abecedy upravte tak, aby bylo možné tisknout slova abecedy, například funkcí ''printf("%s", words[i])''. Funkci můžet pojmenovat například následovně. _Bool fill_words(char *alphabet, size_t n, char **words); * Při implementace uvažujte počet slova abecedy jako #define WORDS_N ('Z' - 'A' + 1). * Program vhodně dekomponujte na funkce a implementujte (nebo použijte existující funkce), např. ''is_upper()'', ''is_lower()'', ''to_upper()''. ++++ Příklad výstupu| $ echo "I like PRP" | ./fel_alphabet Impulse Logic Impulse Kernel Electron Program Resistor Program ++++ * V programu uvažujte možnost anglické a české abecedy definované jako ++++ Anglická FEL abeceda| ^ Letter ^ Word ^ Letter ^ Word ^ | A | Algorithm | N | Node | | B | Bit | O | Oscilloscope | | C | Circuit | P | Program | | D | Diode | Q | Qubit | | E | Electron | R | Resistor | | F | Filter | S | Signal | | G | Generator | T | Transistor | | H | Hardware | U | Unit | | I | Impulse | V | Voltage | | J | Junction | W | Watt | | K | Kernel | X | Xenon | | L | Logic | Y | Yagi (antenna) | | M | Microprocessor | Z | Zener (diode) | ++++ ++++ Česká FEL abeceda | ^ Písmeno ^ Slovo ^ Písmeno ^ Slovo ^ | A | Algoritmus | N | Node | | B | Bit | O | Osciloskop | | C | Cykly | P | Program | | D | Diody | Q | Qubit | | E | Elektron | R | Rezistor | | F | Filtr | S | Signál | | G | Generátor | T | Tranzistor | | H | Hardware | U | Uzávěr (smyčky) | | I | Impuls | V | Výpočet | | J | Jednotka | W | Watt | | K | Kompilátor | X | Xenon | | L | Logika | Y | Yagi (anténa) | | M | Mikroprocesor | Z | Zenerka | ++++ * Využijte symbolické konstanty jako textové literály ++++ Definice abecedy | #define FEL_ALPHABET_CZ "AlgoritmusBitCyklyDiodyElektronFiltrGeneratorHardwareImpulsJednotkaKompilátorLogikaMikroprocesorNodeOscilloscopeProgramQubitRezistorSignálTransistorUzávěrVýpočetWattXenonYagiZenerka" #define FEL_ALPHABET_EN "AlgorithmBitCircuitDiodeElectronFilterGeneratorHardwareImpulseJunctionKernelLogicMicroprocessorNodeOscilloscopeProgramQubitResistorSignalTransistorUnitVoltageWattXenonYagiZener" ++++ * Která z následujících možností je správně a proč? ++++ A. Pole znaků | char alphabet[] = FEL_ALPHABET_EN; ++++ ++++ B. Ukazatel na (posloupnost) znak(ů) | char *alphabet = FEL_ALPHABET_EN; ++++ * Implementujte test abecedy a nastavení pole ukazatelů na řetězce ''char* words[WORDS_N]''. * Implementujte překlad textu na ''stdin'' na FEL abecedu na ''stdout'', případně ladící informace nebo chybová hlášení vypisujte na ''stderr''. ++++ Příklad hlavní funkce main() | int main(int argc, char* argv[], char **env) { int ret = EXIT_SUCCESS; char alphabet[] = FEL_ALPHABET_EN; // proč nemůžeme použít char * alphabet? char* words[WORDS_N] = {NULL}; // WORDS_N assert(test_alphabet(alphabet)); if (!fill_words(alphabet, WORDS_N, words)) { fprintf(stderr, "Fill words failed!\n"); return EXIT_FAILURE; } int r; _Bool prev = false; while ((r = getchar()) != EOF) { if (is_lower(r) || is_upper(r)) { char c = to_upper(r); prev && putchar(' '); // resolve the space printf("%c%s", c, words[c - 'A']); // space prev = true; } else { prev = false; putchar(r); } } return ret; } ++++ * Ověřte co dělá nastavení proměnné ''prev''. ==== Další úkoly ==== * Program rozšířte o přepínání anglické a české abecedy na základě hodnoty proměnné prostředí ''LANG=cs_CZ.UTF-8''. * Program rozšiřte o dynamickou alokace pole znaků s abecedou. * Program rozšiřte o načítání abecedy ze souboru, např. použitím ''FILE *file = fopen("soubor.txt", "r");'' a ''getc(file)'' s využitím dynamické alokace. ++++ Příklad výstupu| $ echo "I like PRP" | LANG=cs_CZ.UTF-8 ./fel_alphabet Impuls Logika Impuls Kompilátor Elektron Program Rezistor Program ++++