Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C/С++] Программа "Робот для общения"


Автор: Sibi 5.5.2009, 17:55
Уважаемые программисты. Дали нам в институте такое задание, как указано в теме. Лабораторных ни одной не было. Поэтому я в панике. Прошла начальный курс С++, но ума не приложу как это написать.
Требования такие:
1) Не должно быть ни одного вопроса, который бот оставил бы без ответа.
2)бот не должен ругаться
3)бот сам должен здороваться и задавать вопросы
4) бот должен поддержать беседу на 3 темы (любых).
Может, кто-нибудь сталкивался с таким, я могу изменить готовую прога или дописать. Главное понять принцип написания. Помогите, пожалуйста!!! smile 

Автор: neic 5.5.2009, 19:45
1) Запихнуть последний заданый вопрос в глобальную переменную (ну или каким-то макаром запомнить)
2) Ну если ты не научишь бота ругаться, то он и не будет
3) При запуске выдавать приветствие. Ждать пока собесеседник ответит и смотреть в глобальную переменную на последний заданный вопрос, там будет пусто, значит задаём любой вопрос.
4) Предусмотреть сценарии разговора.

С чего нужно начать:
Нужно определить, как бот будет обрабатывать сообщение посланные собеседником (кстати как будут предаваться сообщения? На локальном компе или через какой-то проткол?).

Лично я вижу такую реализацию:
При посылке сообщения собеседником, смотреть сначала 100% совпадающее слово (фразу), а если это слово (фраза) не найдена, то резать сообщение на слова (союзы и предлоги наверное нужно будет выкидывать) и фразу, которая больше всего содержит эти слова, нужно будет выбрать.

Также нужно будет предусмотреть синонимы.

Я лишь описал ход моих мыслей, C не знаю так что с кодингом не могу помочь.

П.с. естественно нужно хранить базу со словами (фразами), а также синонимы (или похожие фразы)

Автор: Sibi 5.5.2009, 20:24
Спасибо. Сообщения будут просто вводиться на экране запущенного exe-файла. А как нужно проверять совпадения слов? И как в программе предусмотреть базу?

Автор: neic 5.5.2009, 23:49
Цитата(Sibi @  5.5.2009,  20:24 Найти цитируемый пост)
А как нужно проверять совпадения слов?


Цитата(neic @  5.5.2009,  19:45 Найти цитируемый пост)
Лично я вижу такую реализацию:
При посылке сообщения собеседником, смотреть сначала 100% совпадающее слово (фразу), а если это слово (фраза) не найдена, то резать сообщение на слова (союзы и предлоги наверное нужно будет выкидывать) и фразу, которая больше всего содержит эти слова, нужно будет выбрать.




Цитата(Sibi @  5.5.2009,  20:24 Найти цитируемый пост)
И как в программе предусмотреть базу? 

Ну тут есть 3 варианта:
1) Вшить ответы в программу
2) Создать текстовой файл
3) Создать БД (SQL)

Из всего перечисленного 2ой пункт наверное самое оптимальное.

Автор: Dmi3ev 6.5.2009, 00:48
Цитата

2) Создать текстовой файл
3) Создать БД (SQL)

Да именно так, советую юзать БД, удобнее будет, мне кажется...
И начать с того, что создать пустую БД, где будет грубо говоря два поля
вопрос и ответ на него
Если ты при запуске проги вводишь вопрос, а не на него нет ответа, то предложить пользователю ввести ответ на него, так твоя программа будет самообучаться, в следующий раз на этот вопрос она уже ответит...
такая реализация тупая, но, думаю, для того чтобы сдать в инсте хватит и этого...
Можно и с файлом, структуру создать:
Код

struct my_pair
{
char q[256];
char a[256];
};

а потом читать из файла ее в вектор (или еще куда), и записывать в файл, если такой пары вопрос ответ еще нет...
сам выбирай, я бы БД взял... neicу файл по душе... это уже дело твое...

Автор: Sibi 6.5.2009, 12:44
Спасибо. Я не знаю как БД подключать, поэтому создам файл. А вот в проге написать, чтобы она осуществлял поиск по словам в файле? Подскажите, пожалуйста.

Автор: zim22 6.5.2009, 12:50
Цитата(Sibi @  6.5.2009,  12:44 Найти цитируемый пост)
 А вот в проге написать, чтобы она осуществлял поиск по словам в файле?

Sibi, почитайте какую-нибудь книжечку по С++. 

Автор: neic 6.5.2009, 21:44
Dmi3ev, у меня было 2 критерия выбора в пользу текстового файла:
1) легкость в освоении (не нужно знать про БД)
2) лёгкая расширяемость за счёт других пользователей, т.е. я захотел создал одну базу объединил эту базу с базой другого чела и т.д.

Автор: neic 6.5.2009, 22:23
Sibi, можно просто в файле сделать так

Код

вопрос<тут разделитель>ответ


Например:
Это ты?::Да, это я.

:: - разделитель

Автор: Dmi3ev 7.5.2009, 17:24
Цитата

Dmi3ev, у меня было 2 критерия выбора в пользу текстового файла:
1) легкость в освоении (не нужно знать про БД)
2) лёгкая расширяемость за счёт других пользователей, т.е. я захотел создал одну базу объединил эту базу с базой другого чела и т.д.

neic, у меня никаких возражений...

Автор: Dmi3ev 7.5.2009, 17:57
+ еще хочу поговорить про реализацию.
Так вот, файл так файл, тогда бери *.ini файл, а для разработки бери C++ Builder, потому как при использовании такой связки можно быть полным нубом в программировании... А задание выполнишь за 10 секунд, не больше... Удобно!
1) Создаешь проект, кидаешь на форму два эдита и кнопку (5 секунд думаю хватит)
2) В событие OnClick кнопки пишешь следующий код (Думаю секунды 3 хватит чтобы это сделать):
Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
        TIniFile *mif=new TIniFile("D:\\myDB.ini");
        Edit2->Text=mif->ReadString("Questions", Edit1->Text, "I don't know!");
}

Все готово! Остается еще 2 секунды до того, как пройдет 10 секунды с создания проекта, они нужны чтобы вставить вот этот хидер:
Код

#include <IniFiles.hpp>

Ах да, сам файл myDB.ini должен выглядеть так:
Код

[Questions]
Hi="Hi"
What is your name?="My name is Dmi3ev"

Проще некуда...

Добавлено через 1 минуту и 43 секунды
В случае, если вопрос не найден будет выдаваться фраза по умолчанию
Цитата

I don't know!

Автор: Sibi 7.5.2009, 18:05
neic, спасибо! Попробую.

Добавлено через 4 минуты и 40 секунд

Dmi3ev, ух ты, спасибо! Я правда C++ Builder никогда не пользовалась, но надо начинать.

Автор: Dmi3ev 7.5.2009, 18:24
Цитата

Dmi3ev, ух ты, спасибо! Я правда C++ Builder никогда не пользовалась, но надо начинать. 

Для тебя в данном случае C++ Builder лучший выход, потому как разобраться в двух строках проще, чем в тоннах кода... Тем более, что их надо еще родить  smile 
Единственное, можно продумать о добавлении новой пары вопрос-ответ в файл (это не сложно, а можно и ручками дописывать, структуру файла я тебе показал, по аналогии думаю сможешь написать вопросов и ответов сколько тебе надо)  smile 
и + еще можно добавить 1 строку, так будет более правильно:
Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
        TIniFile *mif=new TIniFile("D:\\myDB.ini");
        Edit2->Text=mif->ReadString("Questions", Edit1->Text, "I don't know!");
        mif->Free();
}

Удачи...

Автор: Sibi 20.5.2009, 20:55
Dmi3ev, помоги еще раз, пожалуйста. Програмка работает, но не читает из файла вопросы, на любой отвечает "не знаю".  Что делать?

Автор: Dmi3ev 20.5.2009, 21:02
Sibi, как не читает?

Добавлено через 33 секунды
у меня этот код работает на ура, покажи свой... че ты без кода просишь че-то

Автор: zim22 20.5.2009, 21:05
Цитата(Sibi @  20.5.2009,  20:55 Найти цитируемый пост)
Програмка работает, но не читает из файла вопросы, на любой отвечает "не знаю".  Что делать?

не знаю  smile 

Автор: Sibi 20.5.2009, 21:11
Dmi3ev, я код точно с тебя скопировала
Код

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
#include <IniFiles.hpp>
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
 void __fastcall TForm1::Button1Click(TObject *Sender)
{
    TIniFile *mif=new TIniFile("С:\\myDB.ini");
        Edit2->Text=mif->ReadString("Questions", Edit1->Text, "I don't know!");
        mif->Free();
}

Автор: Dmi3ev 20.5.2009, 22:57
а ини файл как выглядит?

Добавлено через 37 секунд
и лежит ли он на С? и имеет ли он расширение ini?

Автор: Sibi 20.5.2009, 23:49
Dmi3ev, лежит на С, имеет расширение ini
Код

[Questions]
hi="Hi"
What is your name?="My name is Dmi3ev"

Автор: Dmi3ev 21.5.2009, 00:18
Sibi, сделай тогда вот что, сотри имя файла, те "С:\\myDB.ini" и напиши его своими руками... попробуй...

Добавлено через 46 секунд
те то же самое, но заново, потому как возможно, что там есть русский символ ))) например С или В...

Автор: Sibi 21.5.2009, 00:39
Ура! Получилось smile !!! Благодарю от всей души!

Добавлено через 5 минут и 45 секунд
Вот у нас тетка такая странная, ни разу не появилась. атребует невозможного. Как создать робота, который ни один вопрос не оставляет без ответа? Это же не реально!

Автор: Dmi3ev 21.5.2009, 01:33
Цитата

Это же не реально! 

конечно, ничто не заменит человека )))

Автор: Sibi 21.5.2009, 16:33
Я сегодня пыталась ей сдать. Говорит, что вместо ответа "не знаю" должно выдаваться окно, где можно добавить вопрос ответ в файл. Я сказала, что я не программист высшей категории, а она ответила, чтоб еще раз подумала. Вот вредина. Может кто знает как?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)