• 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

Object Storage Arubacloud
0 głosów
269 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ź 112 wizyt
pytanie zadane 29 listopada 2021 w PHP przez roberto23 Początkujący (270 p.)
0 głosów
2 odpowiedzi 209 wizyt
pytanie zadane 14 września 2022 w C i C++ przez RockySniper Nowicjusz (140 p.)
0 głosów
0 odpowiedzi 432 wizyt
pytanie zadane 1 maja 2019 w C i C++ przez Huberti Gaduła (4,500 p.)

92,568 zapytań

141,424 odpowiedzi

319,630 komentarzy

61,956 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...