Programm zum umwandeln von Codes

yappa

Grünschnabel
Hallo Forum,

ich benötige etwas Hilfe für eine Schulaufgabe zum Thema C.
Ich soll ein Programm erstellen mit dem es möglich ist Buchstaben in Morsecodes umzuwandeln und Morsecodes in Buchstaben.

Bis jetzt habe ich nur die benötigte Abfrage ob Option1 oder Option2 gewählt werden soll. Jetzt weiß ich aber nicht wie ich weitermachen soll wenn der Benutzer sich für eine Option entschieden hat. :rolleyes:

Hier das Programm:

Code:
	PGM:


  int Auswahl;

  printf("Bitte waehlen.\n");
  printf("\n");
  printf("\n");
  printf("### Option1: Buchstaben in Morsecode (Druecke 1)\n");
  printf("### Option2: Morse code in Buchstaben (Druecke 2)\n");
    scanf("%d", &Auswahl);
        switch(Auswahl)
        {
                case 1:
                        printf(" fuer Option 1 entschieden.\n");
                        break;
                case 2:
                        printf("fuer Option 1 entschieden.\n");
						break;
              
                default:
                        printf("Falsche Eingabe\n");
						goto PGM;
		}



// Wie mache ich jetzt weiter  sofern der Benutzer sich für Möglichkeit 1 oder 2 entschieden hat? 



	return 0;


}

Vielen Dank für eure Hilfe
 
Willkommen bei tutorials.de :)

Zuerst würde ich einmal ein Array aus Strings machen, in dem für jeden Buchstaben der Morsecode eingetragen ist.
Beim Umwandeln von Buchstaben zu Morse gehst du dann in einer Schleife jeden Buchstaben durch und gibst den entsprechenden Morsecode aus.
Umgekehrt suchst du, zu welchem Buchstaben der eingegebene Code passt.
 
Hallo und vielen dank Sheel!
also ich habe mich jetzt ein bisschen mit den ganzen Arrays auseinandergesetzt aber leider komm ich nicht weiter.

würde das ganze dann so aussehen?:
Code:
float Alphabet[35]   // Buchstaben + 0-9 Zahlen

float A, B, C, D, E ..........

Also irgendwie kommt mir das ganze falsch vor :( Wäre sehr dankbar für Hilfe.


Grüße
 
Hi

Warum 35? Ich finde, 36 wäre angebrachter.

Und auf keinen Fall float.
Buchstaben in C/C++ basieren grundsätzlich auf Normen wie dem ASCII-Code.
Dieser teilt jedem Buchstaben/Satzzeichen/Ziffer/... eine Nummer zu.
Wirklich in deinem Programm gespeichert wird für einen Satz nur die Nummer jedes Buchstabens.

Da bei der Durchnummerierung aber keine Kommazahlen dabei sind, wäre statt float int angebrachter.
Und weil ein int 4 Byte hat (und damit Zahlen bis 4294967296 reinpassen), und die ganzen nummerierten Buchstaben/Zahlen/Soderzeichen im ASCII auch mit einem 1-Byte-int auskommen würden, hat man das auch gemacht: In C/C++ heißt es char.

Hast du noch nie mit einem char-Array zu tun gehabt, um einen Satz darin zu speichern?
Falls schon, ist es jetzt vielleicht etwas klarer.
Dass bei einer Ausgabe etc auch wirklich Buchstaben statt ihren Nummern an den Bildschirm kommen, ist das "Problem" von printf und den anderen Ausgabefunktionen. Da muss man sich nicht selber darum kümmern.

Zum Array: Ich würde das so aufbauen:
C++:
char morsecode[36][6]=
{
    ".-", "-...", "-.-.",
};
Muss natürlich noch vervollständigt werden.
Damit hab ich jetzt ein Array aus Buchstabenarrays.
Insgesamt 36 Stück davon (A-Z und 0-9), und jedes hat 6 Buchstaben.
Warum 6? Der längste Morsecode besteht aus 5 Punkten/Strichen, und dazu noch die binäre Null, zum Markieren vom Stringende.

Zum Unwandeln Satz->Morse:
Geh jedes eingegebene Zeichen durch.
Wenn ein Zeichen nicht A-Z ist, zB ein Beistrich oder ein Punkt, machst du damit gar nichts.
Wenn es aber ein Buchstabe ist, gibst du mit printf den entsprechenden Eintrag im morsecode-Array aus.

morsecode[0] ist für a, morsecode[1] für b usw...
Zu der Nummer kommt man auch recht einfach:
Ein A im Ascii-Code ist nicht (wie wir hier brauchen) Nummer 0, sondern 65.
Das B (und die anderen Buchstaben bis Z) kommen aber immerhin genau hintereinander, also B=66, C=67 usw...

Wenn du jetzt die Nummer des Buchstaben minus 65 rechnest, kommt es ganeu darauf, das A=0, B=1, C=2 usw... ist.
Und weil C so eine nette Sprache ist, kannst du direkt mit den Buchstaben rechnen.
Also einfach ...-'A' weil das Ganze ja mit A beginnt und das 65 ist.
Du könntest auch ...-65 schreiben, so wird es aber von vielen Programmierern als "schöner" empfunden.

Gruß
 
Um auf die Ursprungsfrage zurückzukommen:
Code:
    PGM:
 
 
  int Auswahl;
 
  printf("Bitte waehlen.\n");
  printf("\n");
  printf("\n");
  printf("### Option1: Buchstaben in Morsecode (Druecke 1)\n");
  printf("### Option2: Morse code in Buchstaben (Druecke 2)\n");
    scanf("%d", &Auswahl);
        switch(Auswahl)
        {
                case 1:
                        printf(" fuer Option 1 entschieden.\n");
                        //hier Schleifen bzw. Code für Option 1
                        break;
                case 2:
                        printf("fuer Option 2 entschieden.\n"); //soll doch "2" heissen?
                        //hier Schleifen bzw. Code für Option 2
                        break;
              
                default:
                        printf("Falsche Eingabe\n");
                        goto PGM;
        }
 
 
 
    return 0;
 
 
}

Oder wie meinst du das?

cwriter
 
Hi

Warum 35? Ich finde, 36 wäre angebrachter.

Und auf keinen Fall float.
Buchstaben in C/C++ basieren grundsätzlich auf Normen wie dem ASCII-Code.
Dieser teilt jedem Buchstaben/Satzzeichen/Ziffer/... eine Nummer zu.
Wirklich in deinem Programm gespeichert wird für einen Satz nur die Nummer jedes Buchstabens.

Da bei der Durchnummerierung aber keine Kommazahlen dabei sind, wäre statt float int angebrachter.
Und weil ein int 4 Byte hat (und damit Zahlen bis 4294967296 reinpassen), und die ganzen nummerierten Buchstaben/Zahlen/Soderzeichen im ASCII auch mit einem 1-Byte-int auskommen würden, hat man das auch gemacht: In C/C++ heißt es char.

Hast du noch nie mit einem char-Array zu tun gehabt, um einen Satz darin zu speichern?
Falls schon, ist es jetzt vielleicht etwas klarer.
Dass bei einer Ausgabe etc auch wirklich Buchstaben statt ihren Nummern an den Bildschirm kommen, ist das "Problem" von printf und den anderen Ausgabefunktionen. Da muss man sich nicht selber darum kümmern.

Zum Array: Ich würde das so aufbauen:
C++:
char morsecode[36][6]=
{
    ".-", "-...", "-.-.",
};
Muss natürlich noch vervollständigt werden.
Damit hab ich jetzt ein Array aus Buchstabenarrays.
Insgesamt 36 Stück davon (A-Z und 0-9), und jedes hat 6 Buchstaben.
Warum 6? Der längste Morsecode besteht aus 5 Punkten/Strichen, und dazu noch die binäre Null, zum Markieren vom Stringende.

Zum Unwandeln Satz->Morse:
Geh jedes eingegebene Zeichen durch.
Wenn ein Zeichen nicht A-Z ist, zB ein Beistrich oder ein Punkt, machst du damit gar nichts.
Wenn es aber ein Buchstabe ist, gibst du mit printf den entsprechenden Eintrag im morsecode-Array aus.

morsecode[0] ist für a, morsecode[1] für b usw...
Zu der Nummer kommt man auch recht einfach:
Ein A im Ascii-Code ist nicht (wie wir hier brauchen) Nummer 0, sondern 65.
Das B (und die anderen Buchstaben bis Z) kommen aber immerhin genau hintereinander, also B=66, C=67 usw...

Wenn du jetzt die Nummer des Buchstaben minus 65 rechnest, kommt es ganeu darauf, das A=0, B=1, C=2 usw... ist.
Und weil C so eine nette Sprache ist, kannst du direkt mit den Buchstaben rechnen.
Also einfach ...-'A' weil das Ganze ja mit A beginnt und das 65 ist.
Du könntest auch ...-65 schreiben, so wird es aber von vielen Programmierern als "schöner" empfunden.

Gruß


Hallo,

sorry das ich erst jetzt wieder antworten kann, hatte viel um die Ohren. Vielen dank für deine ausführliche Antwort. Das mit den Arrays habe ich soweit jetzt hin bekommen. Nun habe ich aber schon das nächste Problem.

Nachdem ich nun meine Auswahl getroffen habe, in welche Richtung ich den Umwandeln soll - wie genau fahre ich da jetzt fort damit die Buchstaben die ich einlese auch in den MorsC. ausgegeben werden?


Beste Grüße und ein schönes Wochenende
 
Hab ich doch geschrieben...
jetzt gehst du in einer Schleife jeden eingegebenen Buchstaben durch.
Wieviele das sind bekommst mit der Funktion strlen heraus.

In der Schleife gibst du einen Morsecode aus dem Array mit printf("%s...") aus, und zwar das Element, das als Index (Buchstabe -'A') hat.

C++:
char eingabe[1234];
...
gets(eingabe);
...
int i;
for(i=0;i<strlen(eingabe);i++)
{
    if(eingabe[i]>='A' && eingabe[i]<='Z')
        printf("%s",morsecode[eingabe[i] - 'A');
    if(eingabe[i]>='a' && eingabe[i]<='z')
        printf("%s",morsecode[eingabe[i] - 'a');
}
Das if in der Schleife ist zur Überprüfung, ob es sich um einen Buchstaben handelt
Andere Zeichen werden einfach nicht umgewandelt und nicht ausgegeben.
Gruß
 
Hab ich doch geschrieben...
jetzt gehst du in einer Schleife jeden eingegebenen Buchstaben durch.
Wieviele das sind bekommst mit der Funktion strlen heraus.

In der Schleife gibst du einen Morsecode aus dem Array mit printf("%s...") aus, und zwar das Element, das als Index (Buchstabe -'A') hat.

C++:
char eingabe[1234];
...
gets(eingabe);
...
int i;
for(i=0;i<strlen(eingabe);i++)
{
    if(eingabe[i]>='A' && eingabe[i]<='Z')
        printf("%s",morsecode[eingabe[i] - 'A');
    if(eingabe[i]>='a' && eingabe[i]<='z')
        printf("%s",morsecode[eingabe[i] - 'a');
}
Das if in der Schleife ist zur Überprüfung, ob es sich um einen Buchstaben handelt
Andere Zeichen werden einfach nicht umgewandelt und nicht ausgegeben.
Gruß

Hallo und nochmals Danke für die schnelle Antwort.

Also das mit dem "gets" ging bei mir nicht, irgendwie erkennt mein Compiler diesen Befehl nicht.
Nun funktioniert es bei mir schon fast so wie es soll.

Es funktioniert aber leider nur wenn ich meine Texteingabe ohne Leerzeichen mache. Also z.B. "abcdef" wird richtig als Morsecode ausgegeben, sobald ich aber versuche "a b c d e f" einzugeben, wird nur der erste Buchstabe als MC ausgegeben. Und bei den Zahlen klappt's leider auch noch nicht so wie es soll. Dort kommen dann anstatt den MC's irgendwelche komischen Zeichen :(

Grüße,
yappa
---------------

So sieht's momentan bei mir aus:

Code:
	scanf("%s", eingabe);  // Text wird eingelesen

	for(i=0;i<strlen(eingabe);i++)
{
	if(eingabe[i]>='A' && eingabe[i]<='Z')
    if(eingabe[i]>='a' && eingabe[i]<='z')
    printf("%s",morsecode[eingabe[i] - 'a']);	
	if(eingabe[i]>='0' && eingabe[i]<='9')
    printf("%s",morsecode[eingabe[i] - '0']);
}


Die Arrays sehen so aus:

Code:
	char morsecode[36][6]=			
{
	".-", "-...", "-.-.", "-..", "." ,"..-.", "--.", "....",                                       // A - H
	"..", ".---", "-.-", ".-...", "--", "-.", "---", ".--.",                                     // I - P
	"--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..",                                       // Q - X
	"-.--", "--..",											 // Y & Z

	"-----",".----", "..---", "...--", "....-", ".....", "-....",                                 // 0 - 6
	"--...", "---..", "----."										// 7 - 9

};


	char buchstaben[36][6]=		
{
    "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",

	"0", "1", "2", "3", "4", "5", "6",
	"7", "8", "9"
};
 
Das mit dem Leerzeichen-abschneiden bei der Eingabe liegt amn scanf.
gets hätte dieses Problem nicht...aber warum soll er das nicht kennen?
Hast du mal probiert, string.h zu inkludieren?

Zum Schleifeninneren:
Erstens hast du eine Zeile vergessen.
Wie das so funktioniert hat, ist mir schleierhaft...oder ist sie nur beim Reinkopieren verloren gegangen?
C++:
if(eingabe[i]>='A' && eingabe[i]<='Z')
    printf("%s",morsecode[eingabe[i] - 'A']);   
if(eingabe[i]>='a' && eingabe[i]<='z')
    printf("%s",morsecode[eingabe[i] - 'a']);   
if(eingabe[i]>='0' && eingabe[i]<='9')
    printf("%s",morsecode[eingabe[i] - '0' +26]);

Und die zweite Änderung, für die Zahlen: Das +26, das oben schon drin ist.
Im Array Morsecode beginnen die Buchstaben am Index 0, für die Ziffern müssen aber die 26 Buchstaben übersprungen werden.
Beispiel: Eingabe 1 = Asciicode 49
Minus '0' (48) =1
Und jetzt nocheinmal 26 dazu -> 27.
Dort ist dann der Einser im morsecodearray, weil die Buchstaben eben zuerst kommen.

Gruß

PS: Das Array buchstaben brauchst du hier nicht.
 
Hallo, wow du bist mir eine wirklich große Hilfe, vielen lieben Dank!!

Ja da ging mir was beim Reinkopieren flöten. Nun verstehe ich wieso das mit den Zahlen nicht geklappt hat, auf das +26 wäre ich gar nicht gekommen :(

Zum gets Befehl;

Ich habe am Programmanfang
Code:
 #include <string.h>
drinne, aber normal werden bei meinem Compiler solche Befehle blau, nur bei "gets" passiert rein gar nichts bei mir,

Folgende Meldungen kommen aber:

wenn ich benutze;
Code:
 gets (eingabe);
kommt: Warnung 2 warning C4996: 'gets': This function or variable may be unsafe. Consider using gets_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS.

Also versuchte ich es mit
Code:
 gets_s (eingabe);

Da kommt dann keine Meldung mehr. Allerdings wird das DOS-Fenster sofort geschlossen nach dem ich meine Buchstaben eingegeben habe und Enter drücke (Da sollte dann normal der Morsecode erscheinen)

Hier nochmals der Anfang:

Code:
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>

int _tmain(int argc, _TCHAR* argv[])
{

Ich benutze, bzw muss benutzen; MS Visual Studio 2010 Premium

Dann noch kurz was zum Buchstaben Array, wenn ich aber von MorseCode zu Buchstaben umwandeln möchte benötige ich das Array dann auch nicht?


Liebe Grüße und einen schönen Samstag
 
Zurück