• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Rozmowa komputerem - bot, wyszukiwanie frazy w tekście

0 głosów
484 wizyt
pytanie zadane 19 marca 2016 w C i C++ przez gryzon Początkujący (480 p.)

Witam.

Mam do zrobienia pewien projekt, niestety trochę ciężko mi to ugryźć, zakopałem się w pewnym momencie i brak mi pomysłu na to dlatego też postanowiłem poprosić Was o pomoc. 

Zadanie polega na tym aby użytkownik wprowadził zdanie z klawiatury i w zależności od zawartych tam fraz komputer ma wykonać odpowiednią czynność a konkretnie zwrócić datę. Np "jaki jutro jest dzien" wynik: jutrzejsza data. Postanowiłem więc, że zacznę od "mechanizmu" rozpoznawania tych fraz, niestety nie do końca mi to działa. 

Oto kod:

#include <iostream>
#include <string>
#include <conio.h>
#include <cstdio>
#include <cstring>

using namespace std;

void wyszukiwanie(string& , string );


int main()
{


    const int rozmiar = 3;
    string slowaSzukane[rozmiar] = {"dzisiaj", "dzis", "jutro"};
    string zdanie;


    cout << "Daj zdanie: ";
    getline(cin, zdanie);


    for(int i=0;i<rozmiar;i++)
    {
        wyszukiwanie(zdanie, slowaSzukane[i]);
    }







    return 0;
}

void wyszukiwanie(string& tekst, string fraza)
{

    size_t znalezionaPozycja = tekst.find(fraza);
    if(znalezionaPozycja == string::npos)
    {
        return;
    }

    do
    {
        cout << "Znalezione slowo to: " << fraza;
        znalezionaPozycja = tekst.find( fraza, znalezionaPozycja + fraza.size() );
    }while(znalezionaPozycja != string::npos);


}
W związku z tym mam kilka pytań:

Czy funkcja find jest odpowiednia do tego typu zadań ?

Czy lepszym wyjściem byłoby zwrócenie przez funkcję "wyszukiwanie" znalezionej pozycji  ? 

Serdecznie proszę o radę i pozdrawiam.

Z góry dziękuję.

3 odpowiedzi

0 głosów
odpowiedź 19 marca 2016 przez 0xf Dyskutant (8,180 p.)
Proponuje wrzucic wszystkie takie frazy do tablicy i sprawdzac w petli czy input od uzytkownika==frazy[i].

I analogicznie druga tablica do odpowiedzi i w tym samym indeksie obu tablic bedzie powiazanie pytanie odpowiedz.

Chyba najlatwiejszy sposob.

A jezeli chcesz zrobic swojego rodzaju sztuczna inteligencje ktora ma z toba dialogowac to ja niestety ci nie pomoge.

Pozdrawiam
komentarz 19 marca 2016 przez gryzon Początkujący (480 p.)
edycja 19 marca 2016 przez gryzon

Nie wiem czy dobrze zrozumiałem, ale chyba podobnie myślałem. :p 

Nie bardzo tylko wiem jak to zrobić i czy to w ogóle możliwe ?


string slowaSzukane[] = {"dzis", "dzisiaj", "jutro"};

string zdanie;

cout << "Uzytkowniku wprowadz swoje zdanie: ";
getline(cin, zdanie);

// I teraz jak porównać slowaSzukane[i] == zdanie   ??

Czy dobrze zrozumiałem :P ?

 

Hmm albo czy jest możliwe rozłożenie zdania na poszczególne wyrazy i np. zapisanie gdzieś tych wyrazów a następnie porównanie ich z wyrazami z tablicy ?

komentarz 19 marca 2016 przez 0xf Dyskutant (8,180 p.)
#include <iostream>
#include <string>

using namespace std;

int main()
{

string pytania[1];
string odpowiedzi[1];

pytania[0]="Z kim rozmawiam ?"; odpowiedzi[0]="Z komputerem";
string input;

cout<<"Zadaj pytanie"<<endl;
getline(cin, input);

for(int i=0;i<1;i++)
{
    if(input==pytania[i])
        cout<<odpowiedzi[i];
    else
        cout<<"Nie rozumiem twojego pytania :("<<endl;

}

return 0;
}
0 głosów
odpowiedź 19 marca 2016 przez 0xf Dyskutant (8,180 p.)
Zaraz ci to okoduje poczekaj
0 głosów
odpowiedź 19 marca 2016 przez gryzon Początkujący (480 p.)

Chyba sobie poradziłem. Oto co nasmarowałem:

#include <iostream>
#include <string>
#include <windows.h>
#include <cstdio>

using namespace std;

int wyszukawanie(string&, string);

int main()
{
    const int rozmiar = 3;
    const int rozmiar_tab = 10;
       // string slowaSzjukane[rozmiar] = {"dzisiaj", "dzis", "jutro"};
    //string dni[rozmiar] = {"wczoraj", "dzis", "jutro"};
    string* tab;
    tab = new string[rozmiar];
    

    


    string* zdania;
    zdania= new string[rozmiar_tab];

    string pomocnicza;

    int licznik=0;

     int przerwij=0;

    char zdanie[250];
    char korektor[] = " ";
    char *schowek;

    cout << "Daj zdanie: ";
    cin.getline(zdanie, 250);

    schowek = strtok(zdanie, korektor);


        while(schowek != NULL)
        {
            zdania[licznik]=schowek;
            schowek = strtok(NULL, korektor);
            licznik++;
        }




for(int i=0;i<3;i++)
{
    //cout << "Element " << i << "tablicy zdania: " << zdania[i] << endl
    //    << "Element " << i << "tablicy slowa: " << tab[i] << endl;
    for(int j=0;j<licznik;j++)
    {
        if(przerwij != 0)
        {
            break;
        }
       if(tab[i]==zdania[j])
        {
            //cout << "Znalazl slowo";
            pomocnicza=zdania[j];
            przerwij=1;
            break;

        }
        else
        {
            //cout << "NIe udalo sie;";
        }
    }


}
    if((pomocnicza=="dzis") || (pomocnicza=="dzisiaj") || (pomocnicza=="dzisiejsza"))

    {
        cout << "Dzis jest 2016-03-19";
    }
    else if ((pomocnicza=="wczoraj") || (pomocnicza=="poprzedni"))
    {
        cout << "Wczoraj byl 2016-03-18";
    }
    else
    {
        cout << "Jutro jest 2016-03-20";
    }

   // cout << "Znalazlem slowo: " << pomocnicza;
    return 0;
}

Czy ktoś mógłby ocenić ten kod :P ? 

Podobne pytania

0 głosów
1 odpowiedź 287 wizyt
pytanie zadane 29 listopada 2021 w PHP przez roberto23 Początkujący (270 p.)
0 głosów
2 odpowiedzi 485 wizyt
pytanie zadane 14 września 2022 w C i C++ przez RockySniper Nowicjusz (140 p.)
0 głosów
0 odpowiedzi 690 wizyt
pytanie zadane 1 maja 2019 w C i C++ przez Huberti Gaduła (4,500 p.)

93,742 zapytań

142,678 odpowiedzi

323,297 komentarzy

63,328 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...