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
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 |
Definice abecedy
#define FEL_ALPHABET_CZ "AlgoritmusBitCyklyDiodyElektronFiltrGeneratorHardwareImpulsJednotkaKompilátorLogikaMikroprocesorNodeOscilloscopeProgramQubitRezistorSignálTransistorUzávěrVýpočetWattXenonYagiZenerka"
#define FEL_ALPHABET_EN "AlgorithmBitCircuitDiodeElectronFilterGeneratorHardwareImpulseJunctionKernelLogicMicroprocessorNodeOscilloscopeProgramQubitResistorSignalTransistorUnitVoltageWattXenonYagiZener"
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;
}