Permalänk
Medlem

Morse kod c++

Hej

Har lite problem med att få ihop mitt översättningsprogram för översättning av morsekod. Det jag har problem med är hur jag ska göra för att jämföra bokst med morse och senad få ut det man angett i textin efter att det blivit översatt till morse.. vill att den översatta koden ska hamna i kod variabeln.

#include <iostream> #include <cstring> #include <string> #include "iodos.h" using namespace std; int main() dos_console(); string textin, kod; string bokst ("abcdefghijklmnopqrstuvwqyzåäö"); string morse[] = {".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", "-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--..", ".--.-", ".-.-", "---."}; cout << "Skriv in text som du vill översätta till morse" << endl; getline(cin, textin); cout << "Översatt till morse blir det" << endl; for (int i=0; i<textin.length(); i++) { textin.length() == bokst[i], morse[i]; cout << morse[textin[i]]; }

Permalänk
Medlem

textin.length() == bokst[i], morse[i];

Vad gör du här?

Enklast hade väl varit att göra en HashMap med bokstäver som key och morse som value.
Sen går du igenom bokstav för bokstav och hämtar morse-koden.
Nu är jag inte insatt i C++, men i Java hade det sett ut nått liknande:

for(int = 0; i < textin.length(); i++) { System.out.print(hashMap.get(textin.charAt(i))); }

Det den gör är att kolla i HashMapen efter exempelvis 'b' (Key) och får ut morsekoden (Value).
Key: a, Value: .-
Key: b, Value: -...
osv...

Får väl även kolla efter otillåten input och space etc, det har jag lämnat ute. Vill du spara koden i en egen variabel så är det ju bara appenda på strängen.

Går säkert lösa snyggare, känns dock inte som det spelar någon större roll i detta lilla sammanhang.

Visa signatur

Citera mig för svar.
Arch Linux

Permalänk
Medlem

En hashmap är väl kanske lite overkill. Man kan ju istället använda bokstävernas ASCII-värden. T.ex. så har ju a till z värden 97 till 122, så om du bara vill hantera a till z så kan du köra

if(textin[i] > 'a' && textin[i] < 'z') // Se till att det verkligen är ett tecken mellan a till z. { int index = textin[i] - 97; }

for att få ett index till din morse-tabell. En string är ju bara en abstraktion för en array av chars, och en char är ju bara ett heltal med storleken en byte. åäö ställer dock till det en del då de inte hör till ASCII, och är allmänt knepiga att hantera i C++ över huvud taget. Även om det ser ut som att åäö är ett tecken var så kommer de att stoppas in i strängen som två tecken tror jag, vilket du säkert ser om du skriver ut strängen.

Permalänk
Medlem

Onödigt krånglig C version av en hashmap för skojs skull (och för att jag inte har någon C++ kompilator installerad). Du har ju i princip allt på plats, med undantag för hur du ska hämta översättningen (för vilket jag nog skulle rekommendera något av de tidigare förslagen om jag ska vara ärlig).

#include <stdio.h> #include <string.h> typedef struct morse_t { char letter; char* code; } morse; int main() { const morse translate[] = { {'a', ".-"}, {'b', "-..."}, ... {'z', "---."}, {0, 0} }; char* textin = "hej!"; int i, j; for (i = 0; i < strlen(textin); i++) { for (j = 0; textin[i] != translate[j].letter && translate[j].letter != 0; j++); if (translate[j].letter != 0) printf("%s ", translate[j].code); else printf("\nInvalid character '%c'!\n", textin[i]); } return 0; }

Permalänk
Medlem
Skrivet av perost:

En hashmap är väl kanske lite overkill. Man kan ju istället använda bokstävernas ASCII-värden. T.ex. så har ju a till z värden 97 till 122, så om du bara vill hantera a till z så kan du köra

if(textin[i] > 'a' && textin[i] < 'z') // Se till att det verkligen är ett tecken mellan a till z. { int index = textin[i] - 97; }

for att få ett index till din morse-tabell. En string är ju bara en abstraktion för en array av chars, och en char är ju bara ett heltal med storleken en byte. åäö ställer dock till det en del då de inte hör till ASCII, och är allmänt knepiga att hantera i C++ över huvud taget. Även om det ser ut som att åäö är ett tecken var så kommer de att stoppas in i strängen som två tecken tror jag, vilket du säkert ser om du skriver ut strängen.

Intressant att du tycker en simpel hashmap är overkill medans att pilla med ASCII-värden skulle vara enklare?

HashMap<Character, String> hm = new HashMap<Character, String>(); hm.put('a', ".-"); hm.put('b', "-..."); ... String morse = null; for(int i = 0; i < textin.length(); i++) { morse = hm.get(textin.charAt(i)); if(morse != null) System.out.println(morse); else Gör nått annat... }

Tycker inte det är overkill alls?
EDIT: Fortfarande Java*

Skrivet av Thomas H:

Onödigt krånglig C version av en hashmap

Inte för att vara sån, men det är väl inte direkt en hashmap om den saknar hashar?
Om man rent hypotetiskt har en superlång text man vill översätta så tjänar man ju in en del tid på att uppslaget är O(1).

Visa signatur

Citera mig för svar.
Arch Linux

Permalänk
Medlem

Vad som är en hash eller inte är en definitionsfråga. Ett charvärde duger lika bra som något annat, i alla fall i ett sånt här program där du inte lär behöva fler värden än det finns tecken. Att sortera och köra binärsökning känns också som lite overkill med max 256 element.

Permalänk
Medlem
Skrivet av fog:

Intressant att du tycker en simpel hashmap är overkill medans att pilla med ASCII-värden skulle vara enklare?

Grejen är ju att chars i C++ kan hanteras som heltal (jag antar att samma gäller för Java), så man kan ju använda dem direkt för att indexera en array. Hur kan det bli enklare än så? Sedan har vi ju också det faktum att C++ inte har någon inbyggd hashmap (än i alla fall, det är på väg).

Permalänk
Medlem
Skrivet av perost:

Grejen är ju att chars i C++ kan hanteras som heltal (jag antar att samma gäller för Java), så man kan ju använda dem direkt för att indexera en array. Hur kan det bli enklare än så?

Jag kan hålla med dig om att det är på ett sätt kanske simplare att lösa det på det sättet rent tekniskt. Min lösning ansåg jag var lättare för en nybörjare att se, eller visualisera.

Skrivet av perost:

Sedan har vi ju också det faktum att C++ inte har någon inbyggd hashmap (än i alla fall, det är på väg).

Är som sagt inte insatt i C++, då var det ju inte mycket att orda om. Som sagt, det var mest tänkt för att ge fler "synvinklar". Som Thomas skriver ovan, det spelar ju egentligen ingen större roll hur man implementerar det i det här fallet eftersom det är så pass lite data att hantera.

Visa signatur

Citera mig för svar.
Arch Linux

Permalänk
Medlem

Råkade se att din string i första posten har två st q, det sista skall nog vara x om jag minns alfabetet rätt