CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - BCB C++ ciagi znaków obsługa synonimów

BCB C++ ciagi znaków obsługa synonimów

dział ogólny

BCB C++ ciagi znaków obsługa synonimów

Nowy postprzez Darek_C++ » czwartek, 24 listopada 2011, 20:33

Witam ponownie,

W branyż SEO często używa się tak zwanych synonimów czyli tekstu o składni np "{Witaj|Witam|Witaj wędrowcze} na naszej {stronie|witrynie}. Zapraszam do {spróbowania|wypróbowania|przetestowania|sprawdzenia} {tej mieszarki|tego skryptu|tego narzędzia}." Z którego program losuje to co w nawiasach {|||} i wsatwia w tekscie np:
Witaj na naszej witrynie. Zapraszam do sprawdzenia tej mieszarki.
Witam na naszej witrynie. Zapraszam do wypróbowania tego narzędzia.
itd....
I z tymi nie mam problemu, ale jak sobie poradzić z podwójnym zagnieżdżeniem w synonimach np:

{Pan {Piotrek|Andrzej}|{Koleżanka|Pani} {Ala|Kasia} Nowak} {ma|posiada} {{kota|psa}|krokodyla} w {domu|mieszkaniu|garażu} którym się {zajmuje|opiekuje} {codziennie|co noc|w soboty|w niedzielę}

Wyniki można zobaczy np na tej stronie http://unikalnatresc.pl/mieszarka-synonimow.php

Ja się do tego zabrać ?

Pozdrawiam
Avatar użytkownika
Darek_C++
Elektrowied
Elektrowied
 
Posty: 454
Dołączył(a): piątek, 25 lipca 2008, 14:33
Podziękował : 66
Otrzymał podziękowań: 4
System operacyjny: Windows XP Pro SP2
Kompilator: Turbo Explorer C++
Gadu Gadu: 0
    Windows XPFirefox

Re: BCB C++ ciagi znaków obsługa synonimów

Nowy postprzez polymorphism » czwartek, 24 listopada 2011, 21:24

A jak przetwarzasz łańcuch z jednopoziomowymi wariantami? Sprawa jest generalnie banalna. Słowo klucz - rekurencja.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2177
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 203
System operacyjny: Windows 7 Pro
Windows 8.1
Linux Mint 19
Kompilator: Visual Studio 2015 Community
CodeLite (MinGW)
MSYS2 (MinGW, clang)
g++
Gadu Gadu: 0
    Windows XPFirefox

Re: BCB C++ ciagi znaków obsługa synonimów

Nowy postprzez Darek_C++ » czwartek, 24 listopada 2011, 21:37

Hmmm w jednopoziomowym zagnieżdżeniu realizuje to takim kodem:
KOD cpp:     UKRYJ  
String WybieraczSynonimow:: LosujString(String xtemp)
{
        if(xtemp.Pos("|")>0)
        {
                TStringList *Lista = new TStringList;
                ExtractStrings(TSysCharSet()<<'|',TSysCharSet()<<' ',xtemp.c_str(),Lista);
                int ile = Lista->Count;
                list<int> los;
                while(los.size()<ile)
                {   int i = rand()%ile;
                        if(find(los.begin(),los.end(),i)==los.end())
                                los.push_back(i);
                }
                list<int>::iterator it;
                String temp;
                for (it=los.begin(); it!=los.end(); it++)
                {
                        temp+=Lista->Strings[*it];
                        break;
                }
                delete Lista; Lista = NULL;
                return temp;
        }
        else
        {
                return xtemp;
    }
}

String __fastcall WybieraczSynonimow::getGotowaTresc(String wejsciowy)
{

        TStringList *Lista = new TStringList;
        ExtractStrings(TSysCharSet()<<'{',TSysCharSet()<<' ',wejsciowy.c_str(),Lista);
        int ile = Lista->Count;
        vector<string> sMyVector;
        for(int ii = 0; ii < ile; ii++)
        {
                String dane = Lista->Strings[ii];
                int gdzie = dane.Pos("}");
                if(gdzie > 0)
                {

                        sMyVector.push_back(dane.SubString(1,gdzie-1).c_str());
                        sMyVector.push_back(dane.Delete(1,gdzie).c_str()) ;
                }
                else
                {
                        sMyVector.push_back(dane.c_str());
                }
        }
        delete Lista; Lista = NULL;
        String temp,linia,chwilowy;

        for(int ii=0; ii < sMyVector.size(); ii++)
        {
                linia = LosujString(sMyVector[ii].c_str());
                temp+=linia;

        }
        return temp;
}
więc nie wiem czy to jest tak prosta sprawa :)
Avatar użytkownika
Darek_C++
Elektrowied
Elektrowied
 
Posty: 454
Dołączył(a): piątek, 25 lipca 2008, 14:33
Podziękował : 66
Otrzymał podziękowań: 4
System operacyjny: Windows XP Pro SP2
Kompilator: Turbo Explorer C++
Gadu Gadu: 0
    Windows XPFirefox

Re: BCB C++ ciagi znaków obsługa synonimów

Nowy postprzez Darek_C++ » piątek, 25 listopada 2011, 12:20

polymorphism napisał(a):Sprawa jest generalnie banalna. Słowo klucz - rekurencja.
Jakaś podpowiedź, bo jak Widzisz nie mogę sobie z tym dać rady :(
Avatar użytkownika
Darek_C++
Elektrowied
Elektrowied
 
Posty: 454
Dołączył(a): piątek, 25 lipca 2008, 14:33
Podziękował : 66
Otrzymał podziękowań: 4
System operacyjny: Windows XP Pro SP2
Kompilator: Turbo Explorer C++
Gadu Gadu: 0
    Windows XPFirefox

Re: BCB C++ ciagi znaków obsługa synonimów

Nowy postprzez polymorphism » piątek, 25 listopada 2011, 14:01

KOD cpp:     UKRYJ  
const char* parse_text(const char *p1, const char *p2, std::string &out, bool braces = false)
{
        std::string str1;
        std::string str2;
        const char*     p3;
        const char*     delim = braces ? "|{}" : "{";
        vector<string> vect;

        while(p1 != p2)
        {
                p3 = p1;
                while(p3 != p2 && !strchr(delim, *p3)) ++p3;
                str1.append(p1, p3);

                if(p3 != p2)
                {
                        switch(*p3)
                        {
                        case '{':
                                p3 = parse_text(p3 + 1, p2, str2, true);
                                str1 += str2;
                                p1 = p3;
                                continue;

                        case '|':
                                vect.push_back(str1);
                                str1.clear();
                                p1 = p3;
                                ++p1;
                                continue;

                        case '}':
                                vect.push_back(str1);
                                out = vect[rand() % vect.size()];
                                return p3 + 1;
                        }
                }

                if(braces) throw invalid_argument("WTF?! '}' expected.");

                p1 = p3;
        }      

        out = str1;
        return p1;
}

/*** użycie ***/
const char *p1 = "{Pan {Piotrek|Andrzej}|{Kolezanka|Pani} {Ala|Kasia} Nowak} {ma|posiada} {{kota|psa}|krokodyla} w {domu|mieszkaniu|garażu} którym się {zajmuje|opiekuje} {codziennie|co noc|w soboty|w niedzielę}";
const char*     p2 =  p1 + strlen(p1);
string          text;

srand(time(NULL));
parse_text(p1, p2, text);
cout << text << '\n';

Nie wiem, dlaczego zawsze mi losuje Pana Andrzeja, choć do wyboru ma (zawszę, co też dziwne) Koleżankę Alę :P

edit: poprawiłem wywołanie srand.

p.s. oczywiście kod może nie działać w pewnych aspektach. Musisz go porządnie przetestować.
C++ Reference - opis wszystkich klas STL-a i funkcji C.

Za ten post autor polymorphism otrzymał podziękowanie od:
Darek_C++
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2177
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 203
System operacyjny: Windows 7 Pro
Windows 8.1
Linux Mint 19
Kompilator: Visual Studio 2015 Community
CodeLite (MinGW)
MSYS2 (MinGW, clang)
g++
Gadu Gadu: 0
    Windows XPFirefox

Re: BCB C++ ciagi znaków obsługa synonimów

Nowy postprzez Darek_C++ » piątek, 25 listopada 2011, 14:21

Z tego co widzę losuje prawidłowo nie tylko Pana Andrzeja ;)

Pan Piotrek posiada kota w mieszkaniu którym się zajmuje w niedzielę
Kolezanka Ala Nowak ma kota w garażu którym się opiekuje w niedzielę
Pani Kasia Nowak posiada kota w domu którym się opiekuje co noc

Jestem pod wrażeniem - jak się mogę odwdzięczyć poza dziękuję? :)
Avatar użytkownika
Darek_C++
Elektrowied
Elektrowied
 
Posty: 454
Dołączył(a): piątek, 25 lipca 2008, 14:33
Podziękował : 66
Otrzymał podziękowań: 4
System operacyjny: Windows XP Pro SP2
Kompilator: Turbo Explorer C++
Gadu Gadu: 0
    Windows XPFirefox


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 1 gość

cron