Zamiania spacji w string

0

Cześć,

Od czasu do czasu rozwiązuje łatwe zadania na spoj.com.
Oto moj kod oraz link do zadania:
AL_20_01 - Alfabet Morse'a

#include <iostream>
#include <string>

using namespace std;

int main()
{
    string morse[27] = { ".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--..", "/" };
    string slowo;
    getline(cin,slowo);
   
    char* tablica = new char[slowo.length()];

    for (int i = 0; i < slowo.length(); i++)
    {
        tablica[i] = slowo[i];
    }
    string przetlumaczony;
    for (int i = 0; i < slowo.length(); i++)
    {   
        for (int j = 0; j < 26; j++)
        {
            if ((tablica[i] - 97 == j)||(tablica[i] - 65 == j))
            {
                przetlumaczony += morse[j] + "/";
            }
            else if (tablica[i] == 32)
            {
                przetlumaczony += morse[26];
            }
        }
    }
    cout << przetlumaczony;

    delete[] tablica;
    
    system("pause");
    return 0;
}

Nie szukam gotowego rozwiązania, bardziej mam problem ze spacjami tzn w zadaniu spacja powinna być przekonwertowania na znak "/", ale podczas drukowania tekstu, wykorzystując znak spacja, znak "/" jest drukowany kilkukrotnie i przyznam szczerze nie wiem w czym jest problem.

2

Znak "/" dodajesz po każdej literze, więc a (a, spacja) zamieniasz na .-//

Tak poza tym, połowa tego kodu kłuje w oczy.

char* tablica = new char[slowo.length()];

po co to? Używasz string, żeby zaraz zrobić takiego potworka, wtf.

        for (int j = 0; j < 26; j++)
        {
            if ((tablica[i] - 97 == j)||(tablica[i] - 65 == j))
            {
                przetlumaczony += morse[j] + "/";
            }
            else if (tablica[i] == 32)
            {
                przetlumaczony += morse[26];
            }
        }

Ten pomysł jest poroniony z kilku względów:

  • szukanie O(n),
  • wykonujesz nawet 26 zbędnych porównań z 32, kiedy wystarczy jedno.
  • wystarczy zwykła arytmetyka, jeśli zakładasz ASCII i to, że znaki będą po sobie kolejno. Popatrz na nagłówek <cctype> i funkcje isalpha()/tolower()/toupper() - to można zapisać w dwóch liniach (c = tolower(str[i]); if(c >= 'a' && c <= 'z') out += morse[c - 'a'];)
  • magiczne liczby zamiast znaków. Użyj ' ', 'A' i 'a' jeśli musisz.

https://en.cppreference.com/w/cpp/header/cctype
https://dsp.krzaq.cc/post/176/ucze-sie-cxx-kiedy-uzywac-new-i-delete/

4

Strasznie przekombinowano!

#include <iostream>
#include <string>
#include <cctype>
using namespace std;

static const string Morse("ETINAMSDRGUKWOHBLZFCP*VX*Q*YJ*56*7***8*/+**(*94=******3***2*10*******:****?*****\"**;@*******'***********.*_)*****,*!*");

// .- .-.. .-  -- .-  -.- --- - .- -.-.-- // ala ma kota!
int main()
{
   
   printf("Podaj tekst (<Ctrl-Z><Enter> - koniec): ");
   for(char ch;cin.get(ch);cout<<' ')
   {
      if(isspace(ch)) cout<<'/';
      else 
      {
         size_t index=Morse.find(toupper(ch));
         if(index==string::npos) cout<<'?';
         else for(++index;index--;index>>=1) cout<<(index&1?'-':'.');
      }
   }
   return 0;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1