P
Uch hab mich der Sache mal kurz und buendig angenommen. Dabei codiere ich die Morsezeichen binaer: '.' = 0, '-' = 1. Um keine fuehrenden Nullen zu haben stelle ich noch eine 1 voran. Ein 'A' waere also ein ".-" -> "01" -> 101 = 5. 'S' = "..." -> "000" -> 1000 = 8. Ich gehe den String dann zeichenweise durch. kommt ein '.' oder '-', haenge ich entsprechend eine 0 oder 1 hinten an die Zahl an (shiftoperator, evtl +1). Kommt ein ' ', ist das Zeichen zu ende und wird ausgegeben und die Zahl wieder auf 1 gesetzt. bei zwei aufeinanderfolgenden Leerzeichen hab ich daher eine 1 im Speicher und gebe ein einzelnes Leerzeichen aus. Ungueltige Zeichen und Umlaute werden als '#' ausgegeben.
#include <iostream>
#include <string>
using namespace std;
const char Morsechar[32] = {'#', ' ', 'E', 'T', 'I', 'A', 'N', 'M',
'S', 'U', 'R', 'W', 'D', 'K', 'G', 'O',
'H', 'V', 'F', '#', 'L', '#', 'P', 'J',
'B', 'X', 'C', 'Y', 'Z', 'Q', '#', '#'};
template <class InputIterator>
void parse_morse(InputIterator first, InputIterator const& last)
{
unsigned short val = 1;
for (; first!=last; ++first) {
switch(*first) {
case '.': val=val<<1; break;
case '-': val=val<<1; val+=1; break;
case ' ': if (val<32) cout<<Morsechar[val];
else {
cerr<<"morsecode too long"<<endl;
return;
}
val=1; break;
default: cerr<<"unknown symbol: "<<*first<<endl;
return; break;
}
}
if (val<32) cout<<Morsechar[val]<<endl;
else {
cerr<<"morsecode too long"<<endl;
return;
}
}
int main()
{
cout << "Morsecode eingeben: ";
string code;
getline(cin, code);
parse_morse(code.begin(), code.end());
const char sos[12] = "... --- ...";
cout<<"... --- ... ergibt: ";
parse_morse(sos, sos+12);
}