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: #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 ); } 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. |
|
pekfos |
» 2019-01-31 00:50:41 Kod nie działa poprawnie. Spróbuj podać pusty napis. |
|
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: #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 ; |
|
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ć. |
|
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.: #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. |
|
« 1 » |