Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Rozdział 28 - usuwanie spacji.

Ostatnio zmodyfikowano 2019-01-31 13:21
Autor Wiadomość
Sulik
Temat założony przez niniejszego użytkownika
Rozdział 28 - usuwanie spacji.
» 2019-01-31 00:26:02
Cześć.

To mój pierwszy post na forum. Zacząłem kurs jakieś dwa tygodnie temu (moja pierwsza przygoda z C++). Na usuwaniu spacji po raz pierwszy utknąłem na dłużej. Po czterech godzinach łamania głowy spłodziłem taki kod:
C/C++
#include<iostream>
#include<string>

using namespace std;

void konwertuj( string & sTekst ) {
   
    do {
        sTekst = sTekst.insert( sTekst.find( "<" ), "[" );
        sTekst = sTekst.erase( sTekst.find( "<" ), 1 );
    } while( sTekst.find( "<" ) != string::npos );
   
    do {
        sTekst = sTekst.insert( sTekst.find( ">" ), "]" );
        sTekst = sTekst.erase( sTekst.find( ">" ), 1 );
    } while( sTekst.find( ">" ) != string::npos );
   
    unsigned int pozycjaSpacji = 0;
   
    do {
        if( sTekst.find( " ", pozycjaSpacji + 1 ) == pozycjaSpacji + 1 ) {
            do {
                sTekst = sTekst.erase( pozycjaSpacji, 1 );
            } while( sTekst.find( " ", pozycjaSpacji + 1 ) == pozycjaSpacji + 1 );
           
        }
        //if..do..while.. można zastąpić zwykłym while, ale to do rozdziału 28 nie było omawiane
        pozycjaSpacji = sTekst.find( " ", pozycjaSpacji + 1 );
    } while( sTekst.find( " ", pozycjaSpacji ) != string::npos );
   
}

int main() {
   
    string tekst = "<b>to jest </b> testowy       napis     <b>:)";
    konwertuj( tekst );
    cout << tekst << endl;
   
    return 0;
}

Byłbym wdzięczny za uwagi do tego kodu. Wygląda mi to bardzo topornie... Proszę o wyrozumiałość ;) Dopiero zaczynam przygodę z programowaniem, a z Ceplusplusem znamy się od dwóch tygodni.
P-173815
pekfos
» 2019-01-31 00:50:41
Kod nie działa poprawnie. Spróbuj podać pusty napis.
P-173817
Sulik
Temat założony przez niniejszego użytkownika
» 2019-01-31 01:34:00
Jasne. To miał być kod do usuwania spacji z podanego w zadaniu tekstu, który nie jest pusty. Wystarczy dodać na początku każdego z bloków w funkcji if'a z warunkiem z while'a, albo zamienić do...while na zwykłe while i będzie działać. Bardziej chodziło mi o komentarz do części dotyczącej usuwania spacji. Trochę jeszcze pomyślałem nad kodem i teraz wygląda tak:
C/C++
#include<iostream>
#include<string>

using namespace std;

void konwertuj( string & sTekst ) {
   
    while( sTekst.find( "<b>" ) != string::npos ) {
        sTekst = sTekst.insert( sTekst.find( "<b>" ), "[b]" );
        sTekst = sTekst.erase( sTekst.find( "<b>" ), 3 );
    }
    while( sTekst.find( "</b>" ) != string::npos ) {
        sTekst = sTekst.insert( sTekst.find( "</b>" ), "[/b]" );
        sTekst = sTekst.erase( sTekst.find( "</b>" ), 4 );
    }
    while( sTekst.find( "  " ) != string::npos )
         sTekst = sTekst.erase( sTekst.find( "  " ), 1 );
   
}

int main() {
   
    string tekst = "<b>to jest </b> testowy       napis     <b>:)";
    konwertuj( tekst );
    cout << tekst << endl;
   
    return 0;
}

Edit: w kodzie zmieniono:
- usunięto zamianę znaków "<" na "[" oraz ">" na "]";
- wstawiono zamianę znaczników <b> na oraz </b> na ;
P-173819
pekfos
» 2019-01-31 12:42:19
find(), insert() i erase() nie są darmowe. Nie ma sensu wywoływać bez przerwy find(), ani używać insert()/erase() by zamienić jeden znak na inny.

Napisz program, który z podanego łańcucha znaków usunie powtarzające się spacje występujące obok siebie i zastąpi wszystkie znaczniki <b> oraz </b> znacznikami [b] oraz [/b].
Kod ma zamieniać znaczniki, a nie same znaki < i >, które mogą występować w innym kontekście.

To miał być kod do usuwania spacji z podanego w zadaniu tekstu, który nie jest pusty.
To miał być kod do usuwania spacji i zamiany znaków w tekście, nawet jeśli nie ma w nim nic do zrobienia. Napis nie musi być pusty, by pierwszy kod nie działał. Jeśli miałbyś się ograniczać do tekstu podanego w zadaniu, to mógłbyś założyć, że elementy do zmodyfikowania są zawsze w tych samych miejscach, więc nie ma sensu ich szukać.
P-173820
Sulik
Temat założony przez niniejszego użytkownika
» 2019-01-31 13:21:03
Rozumiem zatem, że w rozwiązaniu zadania w rozdziale 28 "Modyfikowanie tekstu i sprawdzanie jego długości" dotyczącym między innymi metod insert() i erase() i mającym poćwiczyć ich stosowanie nie należy ich stosować. Trochę to nielogiczne... W rozdziale 23 brakuje podstawowej informacji czym jest tak naprawdę string i jakie ma własności na prostym przykładzie, np.:
C/C++
#include <iostream>
#include <string>

using namespace std;

int main()
{
    string napis = "Hello world!";
    for( unsigned int i = 0; i <= napis.size(); i++ )
         cout << napis[ i ] << endl;
   
    return 0;
}

W kursie od początku jest podkreślane, że jest on dla osób, które nie mają żadnych podstaw i wystarczy wiedza z wcześniejszych rozdziałów.
Oczywiście dziękuję za informację, że istnieją bardziej wydajne rozwiązania.

Temat zamykam - wydaje mi się, że kod jest najoptymalniejszy biorąc pod uwagę, że jest on podsumowaniem rozdziału 28 i powinien wykorzystywać metody insert() i erase(). Poprawiłem jeszcze kod tak by zamieniał znaczniki <b> i </b> na ['b'] i ['/b'] (a nie same nawiasy).

Edit. Nie potrafiłem sobie poradzić z wyświetleniem znaczników stąd apostrofy w kwadratowych nawiasach.
P-173821
« 1 »
  Strona 1 z 1