Morsecode

#1
Hallo Leute,
es ist mal wieder Zeit für ne neue Aufgabe, ich denk mir was Einfaches ist erstmal nicht schlecht, weil sich da viele beteiligen können :)

Also es geht darum ein Programm zu schreiben das einen Text in Morsecode übersetzt und gerne auch andersherum.

Hier also erstmal das Morsealphabet:
A .-
B -...
C -.-.
D -..
E .
F ..-.
G --.
H ....
I ..
J .---
K -.-
L .-..
M --
N -.
O ---
P .--.
Q --.-
R .-.
S ...
T -
U ..-
V ...-
W .--
X -..-
Y -.--
Z --..

Ä .-.-
Ö ---.
Ü ..--
ß ...--..
. .-.-.
, --..--
( -.-.-
) -.--.-
= -...-

1 .----
2 ..---
3 ...--
4 ....-
5 .....
6 -....
7 --...
8 ---..
9 ----.
0 -----

verstanden ...-...
Schlusszeichen .-.-.

also viel Spaß beim coden
mfg
Nornagest
 
#3
So wie ich das sehe kennzeichnet das Schlußzeichen das ende einer Nachricht
und das Verstanden, dass sie angekommen ist.
Ich denke das ist vor allem bei einer richtigen Kommunikation notwendig.
 
R

Rushjo

Guest
#5
So, das ist mein Ansatz mit einiger Unterstützung von posidron.

Code:
/*
Morsecode-Aufgabe von [URL]http://www.hackerboard.de/thread.php?threadid=5520&sid=[/URL]

made by Rushjo (with some technical assistenz by posidron :D :D )

[user@home user]gcc morsecode.c -o morsecode
[user@home user]./morsecode

*/

#include<stdio.h>
#include<string.h>

char eingabe;
char ausgabe[300];
char *morsecode[]={".- ","-... ","-.-. ","-.. ",". ","..-. ","--. ",".... ",".. ",".--- ","-.- ",".-.. ","-- ","-. ","--- ",".--. ","--.- ",".-. ","... ","- ","..- ","...- ",".-- ","-..- ","-.-- ","--.. ",".-.-. ","--..-- ","-.-.- ","-.--.- ","-...- ",".---- ","..--- ","...-- ","....- ","..... ","-.... ","--... ","---.. ","----. ","----- ","...-... ",".-.-. ",".- ","-... ","-.-. ","-.. ",". ","..-. ","--. ",".... ",".. ",".--- ","-.- ",".-.. ","-- ","-. ","--- ",".--. ","--.- ",".-. ","... ","- ","..- ","...- ",".-- ","-..- ","-.-- ","--.. "};
char alphabet[]={'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','.',',','(',')','=','1','2','3','4','5','6','7','8','9','0','verstanden','Schlusszeichen','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
int a = 0;

void crypt()
{
	int i;

	fprintf(stdout, "Please enter your text: \n");
	fprintf(stdout, "\nTo end this translation press \"Escape\" or \"!\".\n\n"); 
	
	while((eingabe= getchar()) != '!')
	{ 
		for(i=0; i<69; i++)
		{
			if(alphabet[i] == eingabe)
			{ 
				fprintf(stdout, "%s", morsecode[i]); 
				
			}
		}
	}
}

void encrypt()
{ 
	printf("\n\nThis function is not avaible!\n\n\n");
}

int main()
{
	int i;
	
	do{
	printf(	"\n\n\033[31mWelcome to this littleToy!\033[0m\n\n"
		"<1> Alphabet 2 Morsecode\n"
		"<2> Morsecode 2 Alphabet\n"
		"<3> End\n\n");
	printf("Make your Choice: ");
	scanf("%d",&i);
		switch (i)
		{
			case 1 : crypt();
				 break;
			case 2 : encrypt();
				 break;
			case 3 : printf("\n\nThis is not the END, my friend! :-) \n\n\n");
				 break;
			default : printf("Unknown option!\nPlease choice an other option!\n");
		}
	}while(i!=3);
	return(0);
}
Das Problem ist lediglich, das:

1. Die Sonderzeichen Ä, Ö, Ü, "Verstanden" und "Schluss" lassen hier hier nicht verarbeiten. Mir ist bisher
auch noch keine Idee gekommen.
2. Bei der Übersetzung von Morsezeichen in Alphabet taucht das Problem auf, das die Morsezeichen-
Folge nicht eindeutig in einzelne Zeichen teilbar ist, aufgrund der unterschiedlichen Zeichenlänge
einzelner Morsezeichen. z.B. E = "." und 0 = "-----"
Die Fähigkeit dies zu erkennen, läßt meinen Erfahrungen nach nicht realisieren. Oder hat jemand eine
Idee???

MfG Rushjo
 
#6
Thema: Rücküberstzung von Morsecode in Alphabet:
-Zwischen den einzelnen Morsezeichen muss ein Trennzeichen eingefügt werden, damit eine eindeutige Übersetzung möglich ist
Ich habe dies bereits mit einigen Leuten im Chat besprochen und auch bei andren Umsetzungen im Netz keine andere Lösung gefunden
 

Ryven

New member
#8
Also die rückübersetztung kann man so lösen.
Beim Geben der Zeichen läst man zwischen den Zeichen 2/10 s Pause und zwischen den Buchstaben eine doppelte Pause also 4/10 s. So kann man bei der Rückübersetzung erkennen wann eine Buchstabe aufhört.
Cu
Ryven
 
#9
Hi!

Ich habs in C geschrieben.
Bei mir wird im oberen Teil des Fenster der
Text und im unteren Teil der Morse-Code angegeben.

Hier der Code:
Code:
//Morsecode-Übersetzer
//by Blackvirus

//Dieses Programm übersetzt "normale" Zeichen in Morsecode
//Das einzige Problem liegt darin, dass sobald man für
//den Text zuviele Zeilen benötigt, der obere Teil vom Morsecode überschrieben wird

#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <windows.h>

void main()
	{
	char *morsecode[]={".- ","-... ","-.-. ","-.. ",". ","..-. ","--. ",".... ",".. ",".--- ","-.- ",".-.. ","-- ","-. ","--- ",".--. ","--.- ",".-. ","... ","- ","..- ","...- ",".-- ","-..- ","-.-- ","--.. ",".-.-. ","--..-- ","-.-.- ","-.--.- ","-...- ",".---- ","..--- ","...-- ","....- ","..... ","-.... ","--... ","---.. ","----. ","----- ","...-... ",".-.-. ",".- ","-... ","-.-. ","-.. ",". ","..-. ","--. ",".... ",".. ",".--- ","-.- ",".-.. ","-- ","-. ","--- ",".--. ","--.- ",".-. ","... ","- ","..- ","...- ",".-- ","-..- ","-.-- ","--.. "};
	char alphabet[]={'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','.',',','(',')','=','1','2','3','4','5','6','7','8','9','0','#','*','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
	char eingabe;
	int i,x=0,y=8,x2=0,y2=15;

	COORD xypos;
	HANDLE hStdIn,hStdOut;
  
	hStdIn = GetStdHandle(STD_INPUT_HANDLE);
	hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);

	printf("\t\tM O R S E C O D E - %c B E R S E T Z E R\n\n",154);
	printf("Dr%ccken Sie die ESCAPE-Taste um die Eingabe zu beenden!\n",129);
	printf("Bitte geben Sie den Text ein den Sie %cbersetzen m%cchten!\n\n",129,148);
	xypos.X=0;										//Cursor Position wird gewechselt
	xypos.Y=6;										//um 'TEXT' zuschreiben
	SetConsoleCursorPosition(hStdOut, xypos);		//eine Zeile unter 'TEXT' wird im DOS-Fenster
	printf("TEXT:");								//der eingegebene Text stehen
	xypos.X=0;										//Hier wird die Cursor Position noch einmal
	xypos.Y=13;										//gewechselt um 'MORSECODE' zu schreiben
	SetConsoleCursorPosition(hStdOut, xypos);		//eine Zeile unter 'MORSECODE' wird im DOS-Fenster
	printf("MORSECODE:");							//der Morsecode stehen,der zur Eingabe gehört
	while(eingabe!=27)
		{	
		fflush(stdin);
		eingabe=getch();
		if(eingabe==13 || x==77)					//Wenn RETURN gedrückt wird, soll nur (!!) die Textzeile
			{										//um eins nach unter 'gerückt' werden
			y++;
			x=0;
			}
		if(x2==77)									//Das gleiche geschieht hier mit der Morsecode-Zeile
			{										//Sobald die X-Position des Cursors 77 beträgt
			y2++;									//wird der Morsecode in die nächste Zeile geschrieben
			x2=0;  
			}
		for(i=0;i<=69;i++)
			{
			if(alphabet[i] == eingabe)				//Eingabe wird mit Alphabet-String verglichen
				{
				xypos.X=x;										//Cursor Position wird gewechselt
				xypos.Y=y;										//um Zeichen auszugeben
				SetConsoleCursorPosition(hStdOut, xypos);
				printf("%c",eingabe);
				xypos.X=x2;										//Cursor Position wird wieder
				xypos.Y=y2;										//gewechselt um Morse-Code
				SetConsoleCursorPosition(hStdOut, xypos);		//auszugeben
				printf("%s",morsecode[i]);
				x++;											//Cursor Position von Text wird um eins erhöht
				x2+=7;											//Cursor Position von Morsecode wird um 7 erhöht
				}												//Erhöhung um 7 zur besseren Sichtbarkeit vom Morsecode
			}
		}
	}
MfG

Blackvirus
 
#10
Einfach in Perl mit Hashes gemacht ...

Code:
#!/usr/bin/perl
use strict;

my(%mcode) = ("A" => ".-","B" => "-...","C" => "-.-.","D" => "-..","E" => ".","F" => "..-.","G" => "--.","H" => "....","I" => "..","J" => ".---","K" => "-.-","L" => ".-..","M" => "--","N" => "-.","O" => "---","P" => ".--.","Q" => "--.-","R" => ".-.","S" => "...","T" => "-","U" => "..-","V" => "...-","W" => ".--","X" => "-..-","Y" => "-.--","Z" => "--..",
              "Ä" => ".-.-","Ö" => "---.","Ü" => "..--",
              "ß" => "...--..","." => ".-.-.","," => "--..--","(" => "-.-.-",")" => "-.--.-","=" => "-...-",
              "1" => ".----","2" => "..---","3" => "...--","4" => "....-","5" => ".....","6" => "-....","7" => "--...","8" => "---..","9" => "----.","0" => "-----");

chomp(my $input = <STDIN>);

$input =~ s/\s//g;    # Alle Leezeichen entfernen
$input = "\U$input";  # Input in Grossbuchstaben setzen

my(@Words) = split(//, $input);

printf("%s ", $mcode{$_}) foreach(@Words);
 
#11
GiggyGsk:
Soweit so gut, um eine Rückübersetzung möglich zu machen kommst du aber um ein Trennzeichen zwischen den Buchstaben nicht herum. (z.B. einfach an jedes Morsezeichen ein Leerzeichen anhängen)

Allerdings in eine Richtung imho eine recht elegante Lösung.
 
#14
Original von Rushjo
Das Problem ist lediglich, das:
1. Die Sonderzeichen Ä, Ö, Ü, [...]

2. [...] unterschiedlichen Zeichenlänge [...]
zu 1: Variante a) ä=ae; Variante b) ä=a..
"Verstanden" und "Schluss": OK und EOC

zu 2: man kann statt einem zwei Leerzeichen als Buchstabentrennung einfügen
 
#15
Mir war langweilig, also hab ichs mal in C# als Windows- und Konsolenanwendung gemacht:

Konsole:
Code:
using System;
namespace MorseCode
{

	class CMorseUmwandlung
	{
		static string[] MorseAlphabet = new string[]
							{
								" .- "," -... "," -.-. "," -.. "," . "," ..-. "," --. ",
								" .... "," .. "," .--- "," -.- "," .-.. "," -- "," -. ",
								" --- "," .--. "," --.- "," .-. "," ... "," - "," ..- ",
								" ...- "," .-- "," -..- "," -.-- "," --.. "," .-.- ",
								" ---. "," ..-- "," ...--.. "," .-.-. "," --..-- ",
								" -.-.- "," -.--.- "," -...- "," .---- "," ..--- ",
								" ...-- "," ....- "," ..... "," -.... "," --... ",
								" ---.. "," ----. "," ----- "};
		static string[] Alphabet = new string[]
							{
								"A","B","C","D","E","F","G","H","I","J","K","L","M","N",
								"O","P","Q","R","S","T","U","V","W","X","Y","Z","Ä","Ö",
								"Ü","ß","<",",","(",")","=","1","2","3","4","5","6","7",
								"8","9","0"};

		static string morse = "";
		static string alpha = "";
		
		public static string ToMorse(string Eingabe)
		{
			CMorseUmwandlung.morse = Eingabe.ToUpper();
			CMorseUmwandlung.morse = CMorseUmwandlung.morse.Replace(".","<");
			int i = 0;
			while (i != 45)
			{
				CMorseUmwandlung.morse = CMorseUmwandlung.morse.Replace(Alphabet[i],MorseAlphabet[i]);
				i++;
			}

			return CMorseUmwandlung.morse;
		}

		public static string ToAlpha(string Eingabe)
		{
			CMorseUmwandlung.alpha = Eingabe.ToUpper();
			CMorseUmwandlung.alpha = " " + CMorseUmwandlung.alpha.Replace(" ","  ") + " ";
			int i = 0;
			while (i != 45)
			{
				CMorseUmwandlung.alpha = CMorseUmwandlung.alpha.Replace(MorseAlphabet[i],Alphabet[i]);
				i++;
			}
			CMorseUmwandlung.alpha = CMorseUmwandlung.alpha.Replace("<",".");
			return CMorseUmwandlung.alpha;
		}

	}

class CHauptklasse
	{
		static void Main(string[] args)
		{
			string sEingabe;
			int iAuswahl;

			do 
			{
				Console.WriteLine("(1) Alphabet in MorseAlphabet umwandeln");
				Console.WriteLine("(2) MorseAlphabet in Alphabet umwandeln");
				Console.WriteLine("(3) Programm Beenden\n");
				iAuswahl = Convert.ToInt32(Console.ReadLine());
				Console.WriteLine();
				switch(iAuswahl)
				{
					case 1:
						Console.WriteLine("Bitte Zeichenfolge eingeben: ");
						sEingabe = Console.ReadLine();

						sEingabe = CMorseUmwandlung.ToMorse(sEingabe);
						Console.WriteLine(sEingabe);
						Console.WriteLine("\n\n");
						break;
					
					case 2:
						Console.WriteLine("Bitte MorseCode eingeben (Mit Spacer nach jedem Morsezeichen): ");
						sEingabe = Console.ReadLine();

						sEingabe = CMorseUmwandlung.ToAlpha(sEingabe);
						Console.WriteLine(sEingabe);
						Console.WriteLine("\n\n");
						break;
					
					case 3:
						break;
				}
			}
				while (iAuswahl != 3);
		}
	}
}


Windows:
Code:
using System;
using System.Windows.Forms;
namespace MorseCode_Windows
{

	class CMorseUmwandlung
	{
		static string[] MorseAlphabet = new string[]
							{
								" .- "," -... "," -.-. "," -.. "," . "," ..-. "," --. ",
								" .... "," .. "," .--- "," -.- "," .-.. "," -- "," -. ",
								" --- "," .--. "," --.- "," .-. "," ... "," - "," ..- ",
								" ...- "," .-- "," -..- "," -.-- "," --.. "," .-.- ",
								" ---. "," ..-- "," ...--.. "," .-.-. "," --..-- ",
								" -.-.- "," -.--.- "," -...- "," .---- "," ..--- ",
								" ...-- "," ....- "," ..... "," -.... "," --... ",
								" ---.. "," ----. "," ----- "};
		static string[] Alphabet = new string[]
							{
								"A","B","C","D","E","F","G","H","I","J","K","L","M","N",
								"O","P","Q","R","S","T","U","V","W","X","Y","Z","Ä","Ö",
								"Ü","ß","<",",","(",")","=","1","2","3","4","5","6","7",
								"8","9","0"};

		static string morse = "";
		static string alpha = "";
		
		public static string ToMorse(string Eingabe)
		{
			CMorseUmwandlung.morse = Eingabe.ToUpper();
			CMorseUmwandlung.morse = CMorseUmwandlung.morse.Replace(".","<");
			int i = 0;
			while (i != 45)
			{
				CMorseUmwandlung.morse = CMorseUmwandlung.morse.Replace(Alphabet[i],MorseAlphabet[i]);
				i++;
			}

			return CMorseUmwandlung.morse;
		}

		public static string ToAlpha(string Eingabe)
		{
			CMorseUmwandlung.alpha = Eingabe.ToUpper();
			CMorseUmwandlung.alpha = " " + CMorseUmwandlung.alpha.Replace(" ","  ") + " ";
			int i = 0;
			while (i != 45)
			{
				CMorseUmwandlung.alpha = CMorseUmwandlung.alpha.Replace(MorseAlphabet[i],Alphabet[i]);
				i++;
			}
			CMorseUmwandlung.alpha = CMorseUmwandlung.alpha.Replace("<",".");
			return CMorseUmwandlung.alpha;
		}

	}

public class Hauptform : System.Windows.Forms.Form
	{
		private System.Windows.Forms.Label Schrift;
		private System.Windows.Forms.TextBox Eingabe;
		private System.Windows.Forms.TextBox Ausgabe;
		private System.Windows.Forms.Label EingabeText;
		private System.Windows.Forms.Label AusgabeText;
		private System.Windows.Forms.RadioButton Alpha2Morse;
		private System.Windows.Forms.RadioButton Morse2Alpha;
		private System.Windows.Forms.Button Button;

		private System.ComponentModel.Container components = null;

		public Hauptform()
		{
			InitializeComponent();
		}
		protected override void Dispose( bool disposing )
		{
			if( disposing )
			{
				if (components != null) 
				{
					components.Dispose();
				}
			}
			base.Dispose( disposing );
		}


		private void InitializeComponent()
		{
			this.Schrift = new System.Windows.Forms.Label();
			this.Eingabe = new System.Windows.Forms.TextBox();
			this.Ausgabe = new System.Windows.Forms.TextBox();
			this.EingabeText = new System.Windows.Forms.Label();
			this.AusgabeText = new System.Windows.Forms.Label();
			this.Alpha2Morse = new System.Windows.Forms.RadioButton();
			this.Morse2Alpha = new System.Windows.Forms.RadioButton();
			this.Button = new System.Windows.Forms.Button();
			this.SuspendLayout();


			this.Schrift.Font = new System.Drawing.Font("Microsoft Sans Serif", 11.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
			this.Schrift.Location = new System.Drawing.Point(24, 16);
			this.Schrift.Name = "Schrift";
			this.Schrift.Size = new System.Drawing.Size(344, 40);
			this.Schrift.TabIndex = 0;
			this.Schrift.Text = "Im unteren Feld bitte die Zeichenfolge oder den Morsecode eingeben";
			this.Schrift.Click += new System.EventHandler(this.label1_Click);


			this.Eingabe.Location = new System.Drawing.Point(16, 112);
			this.Eingabe.Name = "Eingabe";
			this.Eingabe.Size = new System.Drawing.Size(544, 20);
			this.Eingabe.TabIndex = 1;
			this.Eingabe.Text = "";


			this.Ausgabe.Font = new System.Drawing.Font("Arial", 11.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
			this.Ausgabe.Location = new System.Drawing.Point(16, 168);
			this.Ausgabe.Multiline = true;
			this.Ausgabe.Name = "Ausgabe";
			this.Ausgabe.ReadOnly = true;
			this.Ausgabe.Size = new System.Drawing.Size(544, 40);
			this.Ausgabe.TabIndex = 4;
			this.Ausgabe.Text = "";


			this.EingabeText.Location = new System.Drawing.Point(16, 96);
			this.EingabeText.Name = "EingabeText";
			this.EingabeText.Size = new System.Drawing.Size(288, 16);
			this.EingabeText.TabIndex = 3;
			this.EingabeText.Text = "Eingabe:";


			this.AusgabeText.Location = new System.Drawing.Point(16, 152);
			this.AusgabeText.Name = "AusgabeText";
			this.AusgabeText.Size = new System.Drawing.Size(288, 16);
			this.AusgabeText.TabIndex = 4;
			this.AusgabeText.Text = "Ausgabe:";


			this.Alpha2Morse.Location = new System.Drawing.Point(416, 16);
			this.Alpha2Morse.Name = "Alpha2Morse";
			this.Alpha2Morse.Size = new System.Drawing.Size(152, 16);
			this.Alpha2Morse.TabIndex = 5;
			this.Alpha2Morse.Text = "Alphabet zu MorseCode";


			this.Morse2Alpha.Location = new System.Drawing.Point(416, 48);
			this.Morse2Alpha.Name = "Morse2Alpha";
			this.Morse2Alpha.Size = new System.Drawing.Size(152, 16);
			this.Morse2Alpha.TabIndex = 6;
			this.Morse2Alpha.Text = "MorseCode zu Alphabet";


			this.Button.Location = new System.Drawing.Point(208, 216);
			this.Button.Name = "Button";
			this.Button.Size = new System.Drawing.Size(152, 24);
			this.Button.TabIndex = 7;
			this.Button.Text = "Uebersetzen !";
			this.Button.Click += new System.EventHandler(this.label1_Click);


			this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
			this.ClientSize = new System.Drawing.Size(576, 254);
			this.Controls.Add(this.Button);
			this.Controls.Add(this.Morse2Alpha);
			this.Controls.Add(this.Alpha2Morse);
			this.Controls.Add(this.AusgabeText);
			this.Controls.Add(this.EingabeText);
			this.Controls.Add(this.Ausgabe);
			this.Controls.Add(this.Eingabe);
			this.Controls.Add(this.Schrift);
			this.Name = "Hauptform";
			this.Text = "MorseCode Translator";
			this.ResumeLayout(false);

		}


		static void Main() 
		{
			Application.Run(new Hauptform());
		}

		private void label1_Click(object sender, System.EventArgs e)
		{
			if(Alpha2Morse.Checked)
				Ausgabe.Text = CMorseUmwandlung.ToMorse(Eingabe.Text);
			else if(Morse2Alpha.Checked)
				Ausgabe.Text = CMorseUmwandlung.ToAlpha(Eingabe.Text);
		
		}

	}
}
 
#16
@Rushjo:

Wenn ich Deinen Code so wie er oben steht compiliere, dann erhalte ich zwei Fehler in Zeile 17. Dort meckert er, dass für Daten vom Typ char nur ein oder zwei Zeichen erlaubt sind.
Du hast hier aber zweimal ein Wort ( ,'verstanden','Schlusszeichen', ) verwendet.
Nachdem ich die beiden Worte auf zwei Zeichen verkürzt hatte, wurde das Programm fehlerfrei compiliert.

17: | char alphabet[]={'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','.',',','(',')','=','1','2','3','4','5','6','7','8','9','0',' OK','ND ','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};

Das Umwandeln von Alphabet in Morsecode funktioniert.

Die Funktion des Umwandelns von Morsecode zu Alphabet ist zwar bei dir nicht "available", aber den Hinweissatz gibt er dann als Endlosschleife aus und spammt die gesamte Konsole zu. :)

Vielleicht kann man dort ja noch eine Abfangbedingung reinsetzen?


Information an den Mod des Threads:

Die Farbtags funktionieren hier nicht korrekt. Er setzt aus mir unverständlichen Gründen hinter die Einleitung des schließenden Tags [/ ein Leerzeichen.(?)
Vielleicht könnt ihr diesen kleinen Bug ja noch beheben. :)

Antwort: Ja, bei '[ kommt es zu Problemen, setz einfach ein Leerzeichen dazwischen, dann funktioniert es.
 

CubiC

Member of Honour
#17
Teil 1 Klartext -> Morsecode in Python

Hi

Da eine Lösung in Python noch nicht vertreten ist , hier meine :
Code:
#! /usr/bin/python

from string import *
import string

mc = {" ":" ","a":".-","b":"-...","c":"-.-.","d":"-..","e":".","f":"..-.","g":"--.","h":"....","i":"..","j":".---","k":"-.-","l":".-..","m":"--","n":"-.","o":"---","p":".--.","q":"--.-","r":".-.","s":"...","t":"-","u":"..-","v":"...-","w":".--","x":"-..-","y":"-.--","z":"--..","ä":".-.-","ö":"---.","ü":"..--","ß":"...--..","1":".----","2":"..---","3":"...--","4":"....-","5":".....","6":"-....","7":"--..","8":"---..","9":"----.","0":"-----","ack":"...-...","eol":".-.-."}
eingabe=(string.lower(raw_input("Bitte geben Sie hier Ihren Klartext ein: "))) 
vera = list(eingabe)                            
ausgabe=""                                         
i=0                                                     
for a in vera:                                     
    if mc.has_key(vera[i]):                    
        ausgabe = ausgabe + mc[vera[i]] 
        i = i+1                                        
    else:                                               
        print "Dieses Zeichen kann nicht uebersetzt werden !" 

print "-------------------------"
print " Morsecode :             "
print " "+eingabe +" = " + ausgabe + " " + mc["eol"]
print "-------------------------"
Auch mit Hashtables (die in Python "Dictionaries" heissen) gelöst.
Bis jetzt nur Einweg, ich arbeite am Rückweg ;)

EDIT : Habe vergessen, das Schlusszeichen anzuhängen ("eol") -> geändert

Gruß

CubiC
 
#18
So, hier nen wieder Morsecode 2 ASCII Maker ;-)

Code:
#!/usr/bin/perl
use strict;

my(%mcode) = ("A" => ".-","B" => "-...","C" => "-.-.","D" => "-..","E" => ".","F" => "..-.","G" => "--.","H" => "....","I" => "..","J" => ".---","K" => "-.-","L" => ".-..","M" => "--","N" => "-.","O" => "---","P" => ".--.","Q" => "--.-","R" => ".-.","S" => "...","T" => "-","U" => "..-","V" => "...-","W" => ".--","X" => "-..-","Y" => "-.--","Z" => "--..",
              "Ä" => ".-.-","Ö" => "---.","Ü" => "..--",
              "ß" => "...--..","." => ".-.-.","," => "--..--","(" => "-.-.-",")" => "-.--.-","=" => "-...-",
              "1" => ".----","2" => "..---","3" => "...--","4" => "....-","5" => ".....","6" => "-....","7" => "--...","8" => "---..","9" => "----.","0" => "-----");

chomp(my $input = <STDIN>);

foreach(split(/[^\.|\-]+/, $input)) {
  foreach my $chr (keys(%mcode)) {
    print $chr if($mcode{$chr} eq $_);
  }
}
 
#19
Hmm, ich habe mich auch mal an die Aufgabe drangesetzt, da ich aber nicht grade ein C++-Guru bin, macht der Code nicht ganz das, was ich will...

Code:
#include <iostream>

using namespace std;

int main()
{
    int i, j;
    char *morse[] = {".- ","-... ","-.-. ","-.. ",". ","..-. ","--. ",".... ",".. ",".--- ","-.- ",".-.. ","-- ","-. ","--- ",".--. ","--.- ",".-. ","... ","- ","..- ","...- ",".-- ","-..- ","-.-- ","--.. ",".- ","-... ","-.-. ","-.. ",". ","..-. ","--. ",".... ",".. ",".--- ","-.- ",".-.. ","-- ","-. ","--- ",".--. ","--.- ",".-. ","... ","- ","..- ","...- ",".-- ","-..- ","-.-- ","--.. "}; //Pool der Morse-Zeichen
    char alpha[] = {'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'}; // Pool des Alphabets
    char eingabe[256];
    cin.getline(eingabe, 256); //Einlesen der gesamten Zeile
    for (j=0; j<257; j++) 
     for (i=0; i<63; i++)
     if (eingabe[j]!='\0') //Überprüft, ob das Ende erreicht wurde
       if (eingabe[j]==alpha[i])
        cout << morse[i];
    system("PAUSE");
    return 0;
}
Naja, wenn mans kompiliert, bemerkt man die ersten Bugs: Wenn ich ein Wort eingebe, werden bei der Ausgabe irgendwelche Buchstaben im Morsecode drangehängt, wenn ich die Überprüfungszeile für die binäre Null weglasse, bekommsch irgendwelchen Kauderwelsch ausgeworfen. Ich hoffe, ihr habt ein paar Verbesserungsvorschläge...
 
#20
Hat sich hier zwar scheinbar etwas tot gelaufen, aber hier trotzdem mein Versuch für alle die es noch interessiert:
Code:
#include <iostream>
#include <cstring>
#define SSize 100
using namespace std;

int morsetotext(char*, char*);      //wandelt morse in text um
int texttomorse(char*, char*);      //wandelt text in morse-code um
void toUpperCase(char*);            //wandelt string in uppercase um
void decodieren(char *, char *);    //testfunktion
void codieren(char*, char*);        //testfunktion


int texttomorse(char text[], char morse[])  //wandelt text in morse-code um
{
 char *morsecode[]={".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",
 ".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-",
 "-.--","--..",".-.-.","--..--","-.-.-","-.--.-","-...-",".----","..---","...--",
 "....-",".....","-....","--...","---..","----.","-----"};
 char alphabet[]={'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T',
 'U','V','W','X','Y','Z','.',',','(',')','=','1','2','3','4','5','6','7','8','9','0'}; //40
 for(int i=0; i<strlen(text); i++)  // index für klartext
    for(int j=0; j<40; j++)         //index für morsealphabet
            if(text[i]==alphabet[j]) sprintf(morse, "%s %s", morse, morsecode[j]);
 return 0;
}

int morsetotext(char morse[], char text[])
{
    int count=0;
    char tmp[SSize]={0};
    char *morsecode[]={".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",
    ".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-",
    "-.--","--..",".-.-.","--..--","-.-.-","-.--.-","-...-",".----","..---","...--",
    "....-",".....","-....","--...","---..","----.","-----"};
    char alphabet[]={'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T',
    'U','V','W','X','Y','Z','.',',','(',')','=','1','2','3','4','5','6','7','8','9','0'};
    for(int i=0; i<=strlen(morse);)
    {
            for(int j=0; morse[i+j]!=32 && i+j<strlen(morse); j++)
                {
                    sprintf(tmp, "%s%c", tmp, morse[i+j]); 
                    count++;
                }
            for(int k=0; k<40; k++)
                    if(strcmp(tmp, morsecode[k])==0) 
                    {
                                   sprintf(text, "%s%c", text, alphabet[k]); 
                                   break;
                    }
            i+=count+1;
            for(int l=0; l<SSize; l++)
                          tmp[l]=0;
            count=0;          
    }        
    return 0;
}

void toUpperCase(char string[])  //wandelt string in uppercase um
{
      for(int i=0 ; i<strlen(string); i++)
          string[i]=toupper(string[i]);
} 

void codieren(char text[], char morse[])
{
    strcpy(text, "aherrz");
    toUpperCase(text);
    texttomorse(text, morse);
    cout<<text<<" ergibt: "<<morse<<endl;
}

void decodieren(char morse[], char text[])
{
    for(int i=0; i<SSize; i++)     //text wieder löschen
              text[i]=0;
    //strcpy(morse, "--..-- .- --..");
    morsetotext(morse, text);
    cout<<morse<<" ergibt: "<<text<<endl;
}
     

int main()
{
    char text[SSize]={0};
    char morse[(SSize)*4]={0};
    codieren(text, morse);
    decodieren(morse, text);
    system("PAUSE");
    return 0;
}
Die Idee mit der Anordnung der Zeichen in Arrays hab ich von Rushjo, der Rest ist selbst erarbeitet. Es fehlt natürlich noch eine Eingabemaske und Auswahl Codierung/Decodierung, aber zum testen der Funktionalität reicht das hier ja erstmal. Den Rest kann man leicht selbst hinzufügen.
Sonderzeichen wie verstanden/ok habe ich weggelassen, könnte man aber machen, indem man sie als ein Sonderzeichen des Alphabets definiert.

@RedFish
Sowas liegt fast immer an falsch gesetzten Abbruchbedingungen (was dazu führt, dass er irgendwo in den Speicher greift).
Ersetze mal in Zeile 12:
for (j=0; j<strlen(eingabe); j++)
dann sollte es gehen. Und die Abfrage auf \0 kannst du eigentlich auch rauswerfen, da die von dir benutzte Methode meines Wissens nach keine Zeichen "anhängt" und das limit durch strlen im Schleifenkopf bereits ausreicht.
 
Oben