abcdef000 Temat założony przez niniejszego użytkownika |
Lekcja 27 i 28- Zadania » 2014-01-12 16:32:05 #include <iostream> #include <string> using namespace std; string konwertuj( std::string & sTekst ) { string sWynik; int a = sTekst.find( "<b>" ); int b = sTekst.find( "</b>" ); if( sTekst.find( "<b>" ) != string::npos ) { sTekst.erase( sTekst.find( "<b>" ), 3 ); sTekst.insert( a, "[b] " ); } if( sTekst.find( "</b>" ) != string::npos ) { sTekst.erase( sTekst.find( "</b>" ), 4 ); sTekst.insert( b, " [/b] " ); } if( sTekst.find( " " ) != string::npos ) sTekst.erase( sTekst.find( " " ), 1 ); return sTekst; } int main() { std::string tekst = "<b>to jest </b> testowy napis :)"; std::cout << konwertuj( tekst ) << std::endl; return 0; }
1. czemu mi spacji nie usuwa? 2. czemu gdy chce zastosowac petle for. na te 3 if to zaden tekst sie nie wyswietla? czy cos nie tak zrobilem? 3. pytanie ogolne... jesli negujemy(!) liczbe 32 to daje nam zero? czyli w petli do while.... jakakolwiek liczba wieksza od 1 dziala jak 1? a zanegowana jako 0? Prosiłbym rowniez o ocenienie ponizszych prac: #include <iostream> #include <string> using namespace std;
int main() { string text; char key; cout << "podaj tekst" << endl; getline( cin, text ); cout << "podaj litere ktorej szukasz" << endl; cin >> key; for( size_t i = 0; i < text.size(); i++ ) if( text[ i ] == key ) cout << "litera " << key << " znajduje sie na pozycji nr " << i + 1 << endl; return 0; }
[ cpp ] #include <iostream> #include <string> using namespace std;
int main() { string text; string key; cout << "podaj tekst" << endl; getline( cin, text ); cout << "podaj slowo ktorego szukasz" << endl; cin >> key; size_t zp = text.find( key ); do { cout << "Fraza zostala odnaleziona na pozycji " << zp << endl;; zp = text.find( key, zp + key.size() ); } while( zp != string::npos ); return 0; }
[ cpp ] #include <iostream> #include <string> using namespace std; bool szukaj( std::string & tekst, std::string wyraz1, std::string wyraz2 ) { if( tekst.find( wyraz1 ) == string::npos ) return false; else if( tekst.find( wyraz2 ) == string::npos ) return false; else return true; }
void wypiszWynik( bool czyZnaleziono ) { if( czyZnaleziono ) std::cout << "Znaleziono" << std::endl; else std::cout << "Nie znaleziono" << std::endl; }
int main() { std::string napis = "Zadanie domowe z kursu C++ (http://cpp0x.pl) - najlepszy kurs C++ w Internecie!"; wypiszWynik( szukaj( napis, "ada", "kurs" ) ); wypiszWynik( szukaj( napis, "ada", "taki" ) ); wypiszWynik( szukaj( napis, "C++", "cpp0x" ) ); wypiszWynik( szukaj( napis, "C#", "cpp0x" ) ); return 0; }
|
|
leon_w |
» 2014-01-12 17:04:46 3. pytanie ogolne... jesli negujemy(!) liczbe 32 to daje nam zero? czyli w petli do while.... jakakolwiek liczba wieksza od 1 dziala jak 1? a zanegowana jako 0? |
W c++ jest tak że odpowiednikiem liczbowym false jest 0, a odpowiednikiem liczbowym true każda liczba inna niż 0... Czyli tak, każda liczba różna (także mniejsza) od "0" działa jak true, czyli "1" A do funkcji użyj pętli. Twoja nie działa, ponieważ chciałeś ją wykonywać zbyt wiele razy(tyle razy, ile tekst ma znaków). Możesz użyć np tekiej pętli: while( sTekst.find( " " ) != string::npos )
|
|
Duninho |
» 2014-01-14 00:23:34 Pewnie do tego już sam doszedłeś ale twój kod usuwa zbędne spacje tylko musisz funkcję parę razy zapętlić by przelęciała string kilkukrotnie. Tak jak jest teraz skanuje string raz i raz usuwa spację, w komentarzu masz podaną funkcję więc w czym problem? Czemu deklarujesz, że używasz namespace std; a potem przypisujesz do każdej metody osobno std:: ? 2. for( int i = 0; i < sTekst.size(); i++ ) { if( sTekst.find( "<b>" ) != string::npos ) { sTekst.erase( sTekst.find( "<b>" ), 3 ); sTekst.insert( a, "[b]" ); } if( sTekst.find( "</b>" ) != string::npos ) { sTekst.erase( sTekst.find( "</b>" ), 4 ); sTekst.insert( b, "[/b]" ); } if( sTekst.find( " " ) != string::npos ) sTekst.erase( sTekst.find( " " ), 1 ); }
U mnie działa wszystko prawidłowo. |
|
MadMax0 |
Wywołanie metody find » 2017-01-21 19:21:07 Dzień dobry,
nie chciałem zakładać nowego tematu, więc odkopię ten wątek. Dlaczego w lekcji 27 przy deklarowaniu obiektów "znalezionaPozycja" użyto typu size_t? Gdy zostanie użyty typ integer program wydaje się działać również poprawnie. W dokumentacji(1) jest napisane, że służy on do reprezentacji rozmiaru obiektu (w bajtach). Dlaczego więc jest on użyty w tym miejscu?
Jeżeli pytanie jest głupie to przepraszam, ale jestem początkujący, staram się czytać dokumentację i często (prawie zawsze) dużo rzeczy jest dla mnie niezrozumiałych.
(1) http://www.cplusplus.com/reference/cstring/size_t/ |
|
karambaHZP |
» 2017-01-21 19:26:16 |
|
MadMax0 |
» 2017-01-21 19:41:53 Dziękuję. A w takim razie jaka jest różnica między napisaniem string::size_type a size_t? Staram się to zrozumieć, czuję, że to są podstawy do zrozumienia działania języka, dlatego czy mógłbyś Karramba (lub ktoś inny) wytłumaczyć tą różnicę? |
|
karambaHZP |
» 2017-01-21 20:52:09 To jest przykładowa implementacja typu przechowującego rozmiar w klasie std::string #include <iostream>
namespace std { class string { public: typedef size_t size_type; size_type length { 10 }; }; }
int main() { std::string s; std::string::size_type l = s.length; std::cout << l << '\n'; } Nie skompilujesz tego ponieważ nastąpi redefinicja typu std::string , ale tak to może wyglądać. To już się skompiluje: #include <iostream>
namespace std { class String { public: typedef size_t size_type; size_type length { 10 }; }; }
int main() { std::String s; std::String::size_type l = s.length; std::cout << l << '\n'; } http:www.tutorialspoint.comcpluspluscpp_namespaces.htm"Programowanie obiektowe, C++ |
|
mokrowski |
» 2017-01-21 21:15:28 Pomysł z tym jakiśtam_typ_lub_kontener::size_type, polega na tym że: 1. Pisząc bibliotekę standardową konsekwentnie w każdym z kontenerów i innych klas, wpisywane jest size_type. 2. Każdy z elementów biblioteki jeśli czegoś używa to korzysta z tego size_type.
W konsekwencji: 1. Dzięki temu możesz dodać do biblioteki także kontenery które mają nietypowy typ rozmiaru. 2. Możesz mieć w bibliotece nietypowe kontenery przechowujące np. typ bool 3. Możesz użyć takiego kodu w swoich własnych szablonach niesamowicie elastycznie nie przejmując się czy to typ size_t czy... np. int (bo np. ma sens dla tego nietypowego kontenera), czy inna klasa która ... zachowuje się jak typ :-)
A teraz uwagi: 1. Mogę się założyć że jak dodasz do swojego kompilatora ostrzeżenia, to wyświetli Ci że używasz int zamiast size_t :-) Dla g++ to: -Wall -Wextra -pedantic 2. Kontenery w bibliotece standardowej mają (w 99% przypadków) rozmiar size_t. O tym ~1% nie warto teraz mówić. Stosuj więc w wyliczeniach, indeksach size_t |
|
« 1 » 2 |