CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - chatterbot

chatterbot

dział ogólny

chatterbot

Nowy postprzez Agnieszka16 » niedziela, 22 maja 2011, 18:11

Dzień dobry wszystkim, robię sobie chatterbota ale nie wiem czy robię go dobrze. Jeżeli by ktoś mógł to proszę obejrzeć mój kod źródłowy w załączniki i powiedzieć czy robię go dobrze.
Avatar użytkownika
Agnieszka16
Bladawiec
Bladawiec
 
Posty: 19
Dołączył(a): sobota, 7 maja 2011, 14:36
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: windowsxp
Kompilator: c++ builder 6
Gadu Gadu: 0
    Windows XPFirefox

Re: chatterbot

Nowy postprzez Agnieszka16 » niedziela, 22 maja 2011, 18:13

A oto kod mojego chatterbota:

KOD cpp:     UKRYJ  
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
AnsiString odpowiedz = "No cześć.";
AnsiString tmp;
if (Edit1->Text == "Cześć.")
{
tmp=Memo1->Text;
tmp+=odpowiedz;
Memo1->Text=tmp;
Edit1->Clear();
}
Edit1->SetFocus();
Memo1->CaretPos=TPoint(99999, 99999);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer3Timer(TObject *Sender)
{
AnsiString odpowiedz = "A nic, nudzę się.";
AnsiString tmp;
if (Edit1->Text == "Co robisz?.")
{
tmp=Memo1->Text;
tmp+=odpowiedz;
Memo1->Text=tmp;
Edit1->Clear();
}
Edit1->SetFocus();
Memo1->CaretPos=TPoint(99999, 99999);
}
Avatar użytkownika
Agnieszka16
Bladawiec
Bladawiec
 
Posty: 19
Dołączył(a): sobota, 7 maja 2011, 14:36
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: windowsxp
Kompilator: c++ builder 6
Gadu Gadu: 0
    Windows XPFirefox

Re: chatterbot

Nowy postprzez Cyfrowy Baron » niedziela, 22 maja 2011, 20:39

Jeżeli działa więcej niż jeden Timer na raz, to będą sobie wchodzić w paradę.

Co to za chatterbot, któremu trzeba zadawać predefiniowane pytania?!

Na tworzenie programu ze sztuczną inteligencją to masz chyba za małą wiedzę o programowaniu...
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: chatterbot

Nowy postprzez Agnieszka16 » niedziela, 29 maja 2011, 13:47

Czyli jak będzie działało na przykład 5 Timerów to co wtedy się może dziać podczas działania programu?
Avatar użytkownika
Agnieszka16
Bladawiec
Bladawiec
 
Posty: 19
Dołączył(a): sobota, 7 maja 2011, 14:36
Podziękował : 0
Otrzymał podziękowań: 0
System operacyjny: windowsxp
Kompilator: c++ builder 6
Gadu Gadu: 0
    Windows XPFirefox

Re: chatterbot

Nowy postprzez Cyfrowy Baron » niedziela, 29 maja 2011, 14:28

Kod z każdego Timera będzie wykonywał się oddzielnie, ale nie w oddzielnych wątkach, więc gdy np. Timer1 będzie wykonywał kod, to Timer2 na ten czas zostanie wstrzymany.
Używanie tylu Timerów nie ma sensu, gdyż w Timerze chodzi tylko o zdarzenie OnTimer, które wykonuje się cyklicznie, więc wystarczy jeden Timer i jedno zdarzenie.

W przypadku Twojego kodu mogłoby to wyglądać tak:

KOD cpp:     UKRYJ  
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
  String odpowiedz1 = "No cześć.";
  String odpowiedz2 = "A nic, nudzę się.";

  if(Edit1->Text == "Cześć.")
  {
    Memo1->Text += odpowiedz1;
    Edit1->Clear();
  }

  if (Edit1->Text == "Co robisz?.")
  {
   Memo1->Text += odpowiedz2;
   Edit1->Clear();
  }

  Edit1->SetFocus();
  Memo1->CaretPos=TPoint(99999, 99999);
}


Twój kod jest jednak zbyt prymitywny, by mógł z tego powstać jakiś sensowny chat. Trudno wszak zdefiniować jawnie wszystkie możliwe pytania i odpowiedzi.
Przedstawię prosty kod, który może stanowić wstęp do takiego programu:

KOD cpp:     UKRYJ  
 String quote[]  = {"Cześć.", "Co robisz?."};
 String answer[] = {"No cześć.", "A nic, nudzę się."};

template <class M> void GoToLine(M *Obiekt, int line)
{
 Obiekt->SelStart = Obiekt->Perform(EM_LINEINDEX, line - 1, 0);
 Obiekt->SelLength = 0;
 Obiekt->Perform(EM_SCROLLCARET, 0, 0);
 Obiekt->SetFocus();
}
//------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
   if( !Edit1->Text.IsEmpty() )
   {
       for(int i = 0; i < ARRAYSIZE(quote); i++)
       {
          if( SameText(Edit1->Text, quote[i]) )
          {
            Memo1->Text += answer[i];
            Edit1->Clear();
         }
       }  

    GoToLine(Memo1, Memo1->Lines->Count);
    Edit1->SetFocus();
  }
}


Używanie zegara nie ma jednak sensu, gdyż odpowiedź to Memo1 może się pojawić po zatwierdzeniu pytania w Edit1 np. po wciśnięci klawisza ENTER. Zauważ, że zegarem jest ten problem, iż podczas wpisywania tekstu do Edit1 warunek może zostać spełniony i zdarzenie OnTimer może wyczyścić zawartość Edit1 zanim użytkownik zada całe pytanie.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox


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 5 gości