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

Lekcja 27 i 28- Zadania

Ostatnio zmodyfikowano 2017-01-22 19:24
Autor Wiadomość
abcdef000
Temat założony przez niniejszego użytkownika
Lekcja 27 i 28- Zadania
» 2014-01-12 16:32:05
C/C++
#include <iostream>
#include <string>
using namespace std;
string konwertuj( std::string & sTekst )
{
    string sWynik;
    int a = sTekst.find( "<b>" );
    int b = sTekst.find( "</b>" );
   
    //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 );
   
   
   
   
   
   
    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:

C/C++
#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;
}
// szukanie liter;;;[/cpp]




[ 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;
}

//szukanie słow[/cpp]

[ 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;
}
//zadanie z lekcji 27
P-101981
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:
C/C++
while( sTekst.find( "  " ) != string::npos )
P-101988
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.
C/C++
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.
P-102130
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/
P-156747
karambaHZP
» 2017-01-21 19:26:16
Dlaczego w lekcji 27 przy deklarowaniu obiektów "znalezionaPozycja" użyto typu size_t?
Ponieważ metoda
std::string::find()
 zwraca wartość typu
std::size_t
.
http://en.cppreference.com/w​/cpp/string/basic_string/find
P-156748
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ę?
P-156749
karambaHZP
» 2017-01-21 20:52:09
To jest przykładowa implementacja typu przechowującego rozmiar w klasie
std::string
C/C++
#include <iostream>

namespace std {
    class string {
    public:
        typedef size_t size_type; // size_type to nadana nazwa dla typu std::size_t
        size_type length { 10 };
    };
}

int main()
{
    std::string s;
    std::string::size_type l = s.length; // tutaj użyto pełnej nazwy typu z klasy std::string
    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:
C/C++
#include <iostream>

namespace std {
    class String {
    public:
        typedef size_t size_type; // size_type to nadana nazwa dla typu std::size_t
        size_type length { 10 };
    };
}

int main()
{
    std::String s;
    std::String::size_type l = s.length; // tutaj użyto pełnej nazwy typu z klasy std::String
    std::cout << l << '\n';
}

http:www.tutorialspoint.comcpl​uspluscpp_namespaces.htm​"
» KursyProgramowanie obiektowe, C++ kurs

P-156751
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
P-156754
« 1 » 2
  Strona 1 z 2 Następna strona