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

Poziom 3 Rozdział 28

Ostatnio zmodyfikowano 2015-08-06 11:45
Autor Wiadomość
Szymon2727
» 2015-08-04 21:17:03
Nie wiem po co tak kombinujesz - usuń dane, a potem je dodaj - jeżeli przeczytałeś kurs to jedyny problem z insertem i appednem będzie co najwyżej z podaniem lokalizacji usunięcia/dodania tekstu.
P-135722
Braile
Temat założony przez niniejszego użytkownika
» 2015-08-05 11:25:52
Już rozumiem. Nie wiem czemu miałem taki mętlik w głowie. Program działa już prawie tak jak powinien. Mam problem tylko z usunięciem nadmiarowych spacji tj. pętla ta wykonuje się tylko raz.
C/C++
#include<iostream>
#include<string>
using namespace std;

string konwertuj( string & tekst )
{
    string sWynik;
    string fraza1 = "<";
    string fraza2 = ">";
    string nowafraza1 = "[";
    string nowafraza2 = "]";
    string spacja = "  ";
    size_t znalezionyznacznik1 = tekst.find( fraza1 );
    size_t znalezionyznacznik2 = tekst.find( fraza2 );
    size_t znalezionaspacja = tekst.find( spacja );
   
    //'<'
    do
    {
        sWynik = tekst.erase( znalezionyznacznik1, fraza1.size() );
        sWynik = tekst.insert( znalezionyznacznik1, nowafraza1 );
        znalezionyznacznik1 = tekst.find( fraza1, znalezionyznacznik1 + fraza1.size() );
    }
    while( znalezionyznacznik1 != string::npos );
   
    //'>'
    do
    {
        sWynik = tekst.erase( znalezionyznacznik2, fraza2.size() );
        sWynik = tekst.insert( znalezionyznacznik2, nowafraza2 );
        znalezionyznacznik2 = tekst.find( fraza2, znalezionyznacznik2 + fraza2.size() );
    }
    while( znalezionyznacznik2 != string::npos );
   
    //spacja
    do
    {
        sWynik = tekst.erase( znalezionaspacja, spacja.size() );
        znalezionaspacja = tekst.find( spacja, znalezionaspacja + spacja.size() );
    }
    while( znalezionaspacja != string::npos );
   
    return sWynik;
}

int main()
{
    string tekst = "<b>to jest </b> testowy        napis     :)";
    cout << konwertuj( tekst );
    return 0;
}
P-135759
pekfos
» 2015-08-05 11:51:06
C/C++
sWynik = tekst.erase( znalezionaspacja, spacja.size() );
znalezionaspacja = tekst.find( spacja, znalezionaspacja + spacja.size() );
Nie masz usuwać całej frazy, tylko jej pierwszy znak. Nie wstawiasz tu nic w znalezione miejsce, więc nie możesz przeskoczyć o spacja.size() do przodu przy następnym poszukiwaniu.

Po co tu zmienna sWynik..? Ta wersja erase zwraca stringa, na którym została wywołana, więc niepotrzebnie kopiujesz przetwarzany tekst do niepotrzebnej zmiennej przy każdej operacji. sWynik będzie miało tą samą wartość, co tekst. Do tego, tekst przekazujesz przez referencję, więc operujesz na obiekcie z main(), po co w ogóle chcesz tu coś zwracać?

Skąd ty właściwie bierzesz te, coraz to nowe, dziwne zapisy w kodzie..?
P-135765
Szymon2727
» 2015-08-05 13:06:28
Człowieku przestań kombinować, pętle są zbędne, a do wykonania samego zadania wystarczy tylko wypisanie odpowiednio erase i append/insert.
P-135772
pekfos
» 2015-08-05 13:42:36
Człowieku przestań kombinować, pętle są zbędne
Nie są zbędne. Program ma przetworzyć wszystkie znaczniki, niezależnie od ilości. Tylko w przykładowych danych jest po jednym znaczniku. Odstępów jest już więcej.
P-135778
Braile
Temat założony przez niniejszego użytkownika
» 2015-08-05 15:47:58
Okej, program działa już poprawnie, wiem już na czym polegał mój błąd i zrozumiałem wreszcie temat w 100% ! Dziękuję za pomoc, a szczególnie za cierpliwość :)
A co do przypisywania tej zmiennej sWynik to zauważyłem, że operuje na głównym tekście dzięki przekazywania argumentów przez referencję i mogę sobie ją odpuścić i nie zwracać funkcją żadnej wartości, ale do zadania był fragment aplikacji, który mogę wykorzystać. Nie doczytałem, że jest to tylko możliwość, a nie konieczność, dlatego dziękuję także za przypomnienie tej kwestii dzięki, której mogłem bardziej zoptymalizować kod.
C/C++
#include <iostream>
#include <string>

std::string konwertuj( std::string & sTekst )
{
    std::string sWynik;
    //TODO: tu należy napisać kod realizujący zadanie
    return sWynik;
}
int main()
{
    std::string tekst = "<b>to jest </b> testowy       napis     <b>:)";
    std::cout << konwertuj( tekst ) << std::endl;
    return 0;
}

Akutalnie mój kod wygląda tak:
C/C++
#include<iostream>
#include<string>
using namespace std;

void konwertuj( string & sTekst )
{
   
    string fraza1 = "<";
    string fraza2 = ">";
    string nowafraza1 = "[";
    string nowafraza2 = "]";
    string spacja = "  ";
    size_t znalezionyznacznik1 = sTekst.find( fraza1 );
    size_t znalezionyznacznik2 = sTekst.find( fraza2 );
    size_t znalezionaspacja = sTekst.find( spacja );
   
   
    do
    {
        sTekst.erase( znalezionyznacznik1, fraza1.size() );
        sTekst.insert( znalezionyznacznik1, nowafraza1 );
        znalezionyznacznik1 = sTekst.find( fraza1, znalezionyznacznik1 + fraza1.size() );
    }
    while( znalezionyznacznik1 != string::npos );
   
    do
    {
        sTekst.erase( znalezionyznacznik2, fraza2.size() );
        sTekst.insert( znalezionyznacznik2, nowafraza2 );
        znalezionyznacznik2 = sTekst.find( fraza2, znalezionyznacznik2 + fraza2.size() );
    }
    while( znalezionyznacznik2 != string::npos );
   
    do
    {
        sTekst.erase( znalezionaspacja, 1 );
        znalezionaspacja = sTekst.find( spacja );
    }
    while( znalezionaspacja != string::npos );
   
    cout << sTekst << endl;
}

int main()
{
    string tekst = "<b>to jest </b> testowy        napis     :)";
    konwertuj( tekst );
    return 0;
}
P-135797
Braile
Temat założony przez niniejszego użytkownika
» 2015-08-05 23:29:10
Otwieram, ponieważ gnębi mnie jedna myśl. Pytanie z jednej strony zgodne z tematem, z drugiej strony jednak nie, ponieważ nie odnosi się do zadania, a do rozdziału 28, konkretniej metody find.
Zakładając, że nie znam metody(?) eof(), o której do tego momentu bieżącego kursu nie powinienem mieć pojęcia, to gdybym miał w jakimś pliku x liczb, których nie wiem ile jest, ale chciałbym je zliczyć, to do pętli mogę przykładowo napisać taki kod ?:
C/C++
void( string sNazwaPliku )
{
    (...)
    int a;
    size_t znalezionoliczb = sNazwaPliku.find( a );
    (...)
}

I czy teraz metoda find znajdzie ile jest pozycji liczb całkowitych, dzięki typowi int, tak żebym mógł wykorzystać tą ilość pozycji do późniejszej pętli ? Dodam, że taki zapis działał i dzięki pętli byłem w stanie wczytać wszystkie liczby wpisane do pliku, oczywiście był to kod bardziej poplątany i zagmatwany niż z pętlą, w której korzystałem z metody eof, jednak bardziej chciałbym wiedzieć dla siebie, czy taki zapis wyszukiwania liczb w pliku jest poprawny ?
Nie jestem w stanie napisać tego o czym myślę ;__;. Mam nadzieję, że zrozumiecie ocb :)
P-135809
pekfos
» 2015-08-06 11:45:56
Nie.
P-135818
1 2 « 3 »
Poprzednia strona Strona 3 z 3