======= Ú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
++++