Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > Prolog
Перезагрузить страницу помогите с программой
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
Леся Леся вне форума
Member
 
Сообщений: 20
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 28.04.2008
По умолчанию 15.05.2008, 08:05

Мне нужно составить программу на Visual prolog 7.0.
Задача состоит в следующем...
Дано генеалогическое дерево, где Джейн и Пэм-женщины, Джон и Билл мужчины.. Джейн явл родителем Джона, Джон яв родителем Билла а Билл яв родителем Пэм.
Нужно создать форму, на ней должны быть фотографии всех членов семьи, затем должна быть кнопочки которые производят расчет..
Первая кнопка будет выводить отцов результат теста, следующего содержания
father test
Jhon is father Billa
Bill is father Pam
вторая кнопка будет выводить дедушку Пэм результат теста, следующего содержания
Jhon is grandfather of Pam
третья кнопка будет выводить предков Пэм результат теста, следующего содержания
Jhon is (предок по английски) of Pam
Jhon is (предок) of Pam
jeyn is (предок) of Pam
И кнопка выхода из программы.

Помогите сделать, пожалуйста...
Ответить с цитированием
  (#2 (permalink)) Старый
Alison Alison вне форума
Member
 
Сообщений: 4,771
Сказал(а) спасибо: 0
Поблагодарили 119 раз(а) в 116 сообщениях
Регистрация: 17.11.2004
По умолчанию 15.05.2008, 10:23

Шаг 1. Создайте GUI-проект, нажмите кнопку B на панели инструментов.
Шаг 2. Выделите корень дерева проекта, откройте с помощью правой кнопки мыши всплывающее меню и выберите New in New Packcage.
В окне Create Project Item слева выделите Form, в поле Name напишите testForm.
Разместите в редакторе формы нужные элементы управления - кнопки, а также те, где будут результаты выводиться (наверное, editControl). Закройте форму и скомпилируйте testForm.pack.
Шаг 3. Откройте taskMenu.mnu, найдите там пункт меню File->New, выделите и уберите галочку из поли Disabled.
Шаг 4. Выделите элемент taskWindow.win в дереве проекта и с помощью правой кнопки мыши откройте Code Expert, найдите там Menu->id_file_new, кликните там.
Затем в коде добавьте к onFileNew:
Код:
onFileNew(_Source, _MenuTag) :-
    _ = testForm::display(This).
Запустите, посмотрите, что получится.

Если не ошибаюсь, это все описано в документации, ссылка на которую была в одном из последних сообщений на форуме. Откройте руководство с картинками, где все хорошо видно, и далее делайте по нему.
Ответить с цитированием
  (#3 (permalink)) Старый
Alison Alison вне форума
Member
 
Сообщений: 4,771
Сказал(а) спасибо: 0
Поблагодарили 119 раз(а) в 116 сообщениях
Регистрация: 17.11.2004
По умолчанию 15.05.2008, 16:36

Задавайте конкретные вопросы.
Ответить с цитированием
  (#4 (permalink)) Старый
Леся Леся вне форума
Member
 
Сообщений: 20
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 28.04.2008
По умолчанию 16.05.2008, 06:31

как создавать обычный проект, я знаю..
Мне нужна сама программа полносью ...
Как ёё написать так чтоб при щелчке мыши по кнопке, выводился результат именно моего теста??
Ответить с цитированием
  (#5 (permalink)) Старый
Леся Леся вне форума
Member
 
Сообщений: 20
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 28.04.2008
По умолчанию 16.05.2008, 06:33

результат теста должен выводиться в поле результатов..
При щелчке на кнопку 2 тест должен выводиться результат 2 теста, при этом старый тест должен очищаться
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
Alison Alison вне форума
Member
 
Сообщений: 4,771
Сказал(а) спасибо: 0
Поблагодарили 119 раз(а) в 116 сообщениях
Регистрация: 17.11.2004
По умолчанию 16.05.2008, 18:33

Код:
predicates
    onButton1Click : button::clickResponder.
clauses
    onButton1Click(_Source) = button::defaultAction:-
          Результаты=результатыТеста1(),
          edit_ctl:setText(Результаты).
А для предиката результатыТеста1 пишете отдельный код, например (не то что Вам нужно, но похоже):
Код:
facts
    parent : (string, string).
clauses
    parent("Ann", "Tom").
    parent("Bill", "Tom").

predicates
    результатыТеста1 : () -> string.   % найти родителей Тома
clauses
    результатыТеста1() = string::concatWithDelimiter(СписокРодителей, "\n"):- 
        findall(Родитель, parent(Родитель, "Tom"), СписокРодителей).
Ответить с цитированием
  (#7 (permalink)) Старый
Леся Леся вне форума
Member
 
Сообщений: 20
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 28.04.2008
Unhappy 20.05.2008, 10:29

У меня вообще ничего не получается.. может кто нить поможет решить, т.е составить програмку... диплом на носу а я вообще не шарю..
Ответить с цитированием
  (#8 (permalink)) Старый
Alison Alison вне форума
Member
 
Сообщений: 4,771
Сказал(а) спасибо: 0
Поблагодарили 119 раз(а) в 116 сообщениях
Регистрация: 17.11.2004
По умолчанию 20.05.2008, 12:31

Это где, интересно, перед защитой диплома ни с того, ни сего Пролог сдавать требуется? Как Ваш вуз называется?

Вы скачали готовую программу с сайта (там же, где Вы брали консольный вариант)?

То, что здесь написано, Вы сделали?
Что конкретно не получается? Какое действие?
Ответить с цитированием
  (#9 (permalink)) Старый
Леся Леся вне форума
Member
 
Сообщений: 20
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 28.04.2008
По умолчанию 23.05.2008, 08:10

консульный вариант работает... Но он слишком легкий для диплома..
И мне дали переделать эту задачу, с другими требованиями..
Чтобы результат выводился не в окне Windows..
А чтобы он выводился в любом элементе либо в крайнем случае в окне Сообщения..
Но надо чтобы была красочная форам, с кнопочками, которая бедт по щелчку выводить результат ( либо в окне сообщения либо в др. элементе который расположен на форме)

Задача. Дана семья.
сын Олег дочь Аня ->Мама Катя
/ \
папа Миша
/ /
дедушка Саша бабушка Алиса

Например - форма..
на ней кнопки button1,button2,button3,
button1 ее название тест1. при нажатии на нее выводится результат теста ( он должен выводить кто является родителями , Мишы)
button2, ее название тест2 при нажатие вывод рез-т теста 2.. заключается в том у папы есть Аня и Олег
button3,ее название тест2 при нажатие вывод рез-т теста 3 имя пробабушки и продедушки Олега и Ани
вот
Но нужно же както задать, т.е может там базу данных надо, в ней все описать..
только как это сделать..
как потом эту базу связать с кнопками...
Ответить с цитированием
  (#10 (permalink)) Старый
Леся Леся вне форума
Member
 
Сообщений: 20
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 28.04.2008
По умолчанию 23.05.2008, 08:12

Задача. Дана семья. (типо дерово)
сын Олег дочь Аня ->Мама Катя
/.......................... \
папа Миша
/ ........./
дедушка Саша бабушка Алиса
Ответить с цитированием
  (#11 (permalink)) Старый
Alison Alison вне форума
Member
 
Сообщений: 4,771
Сказал(а) спасибо: 0
Поблагодарили 119 раз(а) в 116 сообщениях
Регистрация: 17.11.2004
По умолчанию 23.05.2008, 17:01

Конкретные вопросы и описание в очередной раз того, что надо сделать, - это совершенно разные вещи.
Если Вы не начнете делать проект, то Вы и не сможете задавать вопросы, на которые можно ответить.

Скачайте Visual Prolog 7.1 Personal Edition c www.visual-prolog.com, т.к. Вам нет никакого смысла писать в VIP 7.0.
У меня он сейчас не стоит на компьютере, на котором я обычно работаю.

1. Итак, я предполагаю, что Вы сделали то, что написано в сообщении 2 этой темы (т.е. по крайней мере создали форму testForm и научились ее открывать из меню). Иначе Вы с мертвой точки не сдвинетесь.
Поместите 3 кнопки (Push Button).
1) Сначала вставьте в редакторе формы куда захочется первую кнопку.
2) Выделите эту кнопку ( с помощью мыши), в поле Name окна Properties укажите button1_ctl, в поле Text напишите Parent test.

То же самое сделайте для второй кнопки (Name: button2_ctl, Text: Child test)
Затем для третьей (Name: button3_ctl, Text: Grandparent test)

После этого поместите editControl, выделите и из Text сотрите все, а для AlignBaseline выберите значение False.

Закройте редактор форму, выделите testForm.pack, затем в помощью правой кнопки мыши выберите команду Compile.

2. Выделите корень дерева проекта (он называется, как проект), затем с помощью правой кнопки мыши выберите команду New in New Package, в окне Create Project Item выделите Class, в поле Name напишите familyDB, нажмите кнопку Create. Откроются три файла.
1) В файл familyDB.i должен выглядеть так:
Код:
interface familyDB
    open core

predicates
    getChild_nd : (string) -> string nondeterm.
    getParent_nd : (string) -> string nondeterm.
    getGrandParent_nd : (string) -> string nondeterm.

end interface familyDB
Сотрите то, что там написано, и вставьте это.
2) Файл familyDB.cl (полностью):
Код:
class familyDB : familyDB
    open core

predicates
    classInfo : core::classInfo.
    % @short Class information  predicate. 
    % @detail This predicate represents information predicate of this class.
    % @end

constructors
    new: (string FIleName).

end class familyDB
3) Файл familyDB.pro (полностью):
Код:
implement familyDB
    open core

constants
    className = "familyDB/familyDB".
    classVersion = "".

clauses
    classInfo(className, classVersion).

clauses
    new(FileName):-
        try file::consult(FIleName, family) 
        catch Error do
            stdio::writef("Error %. Unable to load the file '%'.\n", Error, FileName)
        end try.    
        
facts - family
    parent : (string Parent, string Child).

clauses
    getChild_nd(Parent) = Child:-
        parent(Parent, Child).

    getParent_nd(Child) = Parent:-
        parent(Parent, Child).
    
    getGrandParent_nd(GrandChild) = GrandParent:-
        parent(Parent, GrandChild),
        parent(GrandParent, Parent).

end implement familyDB
3. Выберите команду меню File-> New, затем в окне Create Project Item выделите (слева) Text file,
в поле Name напишите family, затем нажмите кнопку Browse... найдите папку Exe этого проекта и нажмите на нее.

В открывшийся текстовый файл поместите следующее:
Код:
clauses
    parent("Катя","Олег").
    parent("Катя","Аня").
    parent("Миша","Олег").
    parent("Миша","Аня").
    parent("Саша","Миша").
    parent("Алиса","Миша").
Сохраните этот файл.

4. Откройте редактор формы (кликните на testForm.frm), затем в окне Properties откройте вкладку Events, найдите там ShowListener, кликните в поле на onShow (откройте его там). В файл testForm.pro добавится код:
Код:
predicates
    onShow : window::showListener.
clauses
    onShow(_Source, _Data).
Вы должны изменить его так:
Код:
predicates
    onShow : window::showListener.
clauses
    onShow(_Source, _Data):-
        family := familyDB::new("family.txt").

facts
    family : familyDB := erroneous.
Теперь в редакторе формы выделите кнопку с надписью Parent test и кликните по ней.
Появится код:
Код:
predicates
    onButton1Click : button::clickResponder.
clauses
    onButton1Click(_Source) = button::defaultAction.
Измените его так:
Код:
predicates
    onButton1Click : button::clickResponder.
clauses
    onButton1Click(_Source) = button::defaultAction:-
        ParentList = [Parent || Parent = family:getParent_nd("Миша")],
        Result = string::concat(
                "Родители Миши\n\n",
                string::concatWithDelimiter(ParentList," и ")
            ),
        edit_ctl:setText(Result).
Аналогично для двух оставшихся кнопок. В результате должен появиться следующий код:
Код:
predicates
    onButton2Click : button::clickResponder.
clauses
    onButton2Click(_Source) = button::defaultAction:-
        ChildList = [Child || Child = family:getChild_nd("Миша")],
        Result = 
            string::concatWithDelimiter(["Дети Миши\n"|ChildList], "\n"),
        edit_ctl:setText(Result).


predicates
    onButton3Click : button::clickResponder.
clauses
    onButton3Click(_Source) = button::defaultAction:-
        GParentList1 = [GParent1 || GParent1 = family:getGrandParent_nd("Олег")],
        GParentList2 = [GParent2 || GParent2 = family:getGrandParent_nd("Аня")],
        GParentList = list::union(GParentList1,GParentList2),
        Result = 
            string::concatWithDelimiter(["Бабушки-дедушки Олега и Ани\n"|GParentList],"\n"),
        edit_ctl:setText(Result).
Теперь компилируйте, запускайте и используйте.

Пока Вы все это не сделаете, продолжать дальнейший разговор будет совершенно бессмысленно!
Вопросы нужно задавать конкретные. Пока еще Вы не задали ни одного конкретного вопроса.
Ответить с цитированием
  (#12 (permalink)) Старый
Леся Леся вне форума
Member
 
Сообщений: 20
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 28.04.2008
По умолчанию 27.05.2008, 10:30

Спасибочки..программа работает..!
Еще, можно вас чуть побеспокоить..
мне еще нужно на форму вставить фотография..
Для этого нужно отдельный класс создавать,пакет, и пользоваться процедурой onpaint???
И как сделать чтобы еще была одна кнопка, что бы содержимое очищалось в ctl_edit??
и еще можно написать как работает одна из кнопок( любая)
Что сначала начинает выполняться в программе... выполняется цель программы run::.... а потом куда идет программа??
что означает
facts
family : familyDB := erroneous. ( вот эта команда)
И если можно что вообще обозначет каждая строка программы.

(Извините, если мои вопросы снова покажутся не конкретными, я незнаю как по другому спросить.. я просто вообще ничего не понимаю.. только в простом Проле чуть-чуть)
Ответить с цитированием
Ads
  (#13 (permalink)) Старый
Alison Alison вне форума
Member
 
Сообщений: 4,771
Сказал(а) спасибо: 0
Поблагодарили 119 раз(а) в 116 сообщениях
Регистрация: 17.11.2004
По умолчанию 27.05.2008, 14:29

Цитата:
мне еще нужно на форму вставить фотография..
Для этого нужно отдельный класс создавать,пакет, и пользоваться процедурой onpaint???
Насколько я понимаю, Вы хотите на форме разместить сразу все фотографии всех членов семьи (их всего 6 человек).
Я бы сделала по другому - записала список имен в листбокс, а при выделении имени члена семьи показывала его портрет.
Но так, как Вы хотите, немного проще.

1. Подготовительная работа. Размещаете в папке Exe проекта фотографии членов семьи - файлы в формате .bmp (можно и .jpg, но там кода будет немного больше).

В файл familyDB.i (интерфейс familyDB) добавляете объявление (до слова end, конечно же):
Код:
predicates
    getPhoto: (string Name) -> string FileName determ.
В файле familyDB.pro (имплементации класса familyDB, который имеет интерфейс familyDB) делаете следующие изменения:
1) добавляете объявление предиката photo:
Код:
facts - family
    parent : (string Parent, string Child).
    photo : (string Name, string PhotoFileName).
2) добавляете реализацию предиката getPhoto:
Код:
clauses
    getPhoto(Name) = FileName:-
        photo(Name, FileName),
        !.
Открываете файл family.txt и добавляете факты о том, где хранятся фотографии, после фактов для parent, например:
Код:
photo("Катя", "kate.bmp").
photo("Олег", "oleg.bmp").
...
2. Выделите папку testForm дерева проекта и выберите команду всплывающего меню New in New Package.
В окне Create Project Item слева выделите Draw Control, в поле Name напишите portControl, нажмите Create.
Потом закройте редактор формы и скомпилируйте portControl.pack.

3. Откройте редактор формы - testForm.frm, поместите на форме customControl (на котором ключик нарисован), в окне Choose Class Name for Custom Control выберите элемент portControl.
Теперь выделите его уже на форме, и в поле Name окна Properties напишите kate_ctl.

Затем опять то же самое, снова в окне Choose Class Name for Custom Control выберите элемент portControl, но в поле Name окна Properties напишите oleg_ctl.

И так для всех оставшихся членов семьи.
Закройте редактор формы, скомпилируйте testForm.pack.

4. В интерфейс portControl (файл portControl.i) добавьте объявление:
Код:
predicates
    drawPhoto : (string FileName).
В файл portControl.pro, содержащий имплементацию класса portControl, добавляете код:
Код:
facts
    pict : picture := erroneous.
    pictRect : rct := rct(0,0,0,0).

clauses
    drawPhoto(FileName):-
        try pict := vpi::pictLoad(FileName) 
        catch Error do
            stdio::writef("Error %. Unable to load a picture from '%'\n", Error, FileName),
            fail
        end try,
        !, 
        vpi::pictGetSize(pict, W, H, _),
        pictRect := rct(0,0,W,H).
     drawPhoto(_FileName).
Затем открываете редактор контрола portControl.ctl и с помощью вкладки Events окна Properties добавляете PaintResponder, т.е. обработчик onPaint. Код имеет вид:
Код:
predicates
    onPaint : drawWindow::paintResponder.
clauses
    onPaint(_Source, Rectangle, GDIObject):-
        not(isErroneous(pict)),
        !,
        GDIObject:pictDraw(pict, Rectangle, pictRect, rop_SrcCopy).
    onPaint(_Source, Rectangle, GDIObject):-
        GDIObject:drawTextInRect(Rectangle, "No photo", [dtext_Center, dtext_SingleLine, dtext_Vcenter]).
Скомпилируйте portControl.pack.
5. В файле testForm.pro найдите код для предиката onShow, измените его так:
Код:
    onShow(_Source, _Data):-
        family := familyDB::new("family.txt"),
        if KateFileName = family:getPhoto("Катя") then
            kate_ctl:drawPhoto(KateFileName)
        end if,
        if OlegFileName = family:getPhoto("Олег") then
            oleg_ctl:drawPhoto(OlegFileName)
        end if.
Аналогично для остальных членов семьи.
Теперь при открывании окошка там сразу будут фотографии (либо надписи no photo).
Цитата:
И как сделать чтобы еще была одна кнопка, что бы содержимое очищалось в ctl_edit??
Как и раньше, добавьте в редакторе формы testForm кнопку (PushButton), выделите ее, затем в поле Name окна Properties напишите clear_ctl, а в поле Text слово Clear.
Кликните по этой кнопке, появится код для обработчика нажатия на кнопку (как раньше), измените его так:
Код:
predicates
    onClearClick : button::clickResponder.
clauses
    onClearClick(_Source) = button::defaultAction:-
        edit_ctl:setText("").
Цитата:
и еще можно написать как работает одна из кнопок( любая)
Код:
    onButton2Click(_Source) = button::defaultAction:-
        ChildList = [Child || Child = family:getChild_nd("Миша")],
        Result =
            string::concatWithDelimiter(["Дети Миши\n"|ChildList], "\n"),
        edit_ctl:setText(Result).
Конструкция [...||...] - это обощение findall. Вот то же самое:
Код:
findall(Child, Child = family:getChild_nd("Миша"), ChildList).
А дальше список строк соединяется в одну строку через заданный разделитель, в данном случае "\n". Читайте в Help описания предикатов.
Цитата:
Что сначала начинает выполняться в программе... выполняется цель программы run::.... а потом куда идет программа??
Выберите команду меню среды Debug -> Run, а дальше для начала нажимайте кнопку F11. Если захочется перескочить какой-нибудь шаг, то нажмите F10.
Цитата:
что означает
facts
family : familyDB := erroneous. ( вот эта команда)
Это объявление факта-переменной family, в которой будет храниться указатель на объект familyDB.
Факту-переменной при объявлении присваивается значение erroneous, т.к. никакого другого значения изначально ей и нельзя присвоить (и не надо). Когда объект создается, тогда ей и присваивается значение этого объекта.
Цитата:
И если можно что вообще обозначает каждая строка программы.
Это Вы уж сами постарайтесь написать. У меня время не резиновое. Если что-то категорически не будет понятно - посмотрим.
Ответить с цитированием
  (#14 (permalink)) Старый
Леся Леся вне форума
Member
 
Сообщений: 20
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 28.04.2008
По умолчанию 29.05.2008, 05:59

Вы знаете, у меня не показываются фотки...
Программа запусается, но фоток нет... И надпись No photo, при запуске отображается "везде", может отобразиться в верхнем правом углу, либо по серединки, либо так bbubububububub.. вот.
может лучше сделать, как вы предложили..
Цитата
Я бы сделала по другому - записала список имен в листбокс, а при выделении имени члена семьи показывала его портрет.

И еще вопрос, а шрифты другие можно сделать, при выводе результата???
Ответить с цитированием
  (#15 (permalink)) Старый
Леся Леся вне форума
Member
 
Сообщений: 20
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 28.04.2008
По умолчанию 29.05.2008, 06:03

или можно на форму поместить общую фотографию, а как Вы предложили с помощью листбокса показывать уже отдельные фотки....
Ответить с цитированием
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите с программой в Матлабе! Olga898 Задания за деньги 1 18.03.2012 16:00
Помогите с программой! zEnemy Pascal 4 12.12.2011 18:03
Помогите с программой 61cent Любые вопросы от новичков 8 09.10.2011 14:15
Помогите с программой Виктория8.11 Вопросы начинающих программистов 0 02.05.2011 15:32
Помогите с программой!!!! Владислав Анатольевич Программы и софт 1 08.02.2011 06:07
Помогите с программой (VP 5.2) menand Prolog 4 14.01.2010 23:40
Помогите с программой (VP 5.2) menand Prolog 17 28.12.2009 13:20
Помогите с программой fifty Prolog 3 15.09.2009 11:57
Помогите с программой ZAGA Pascal 4 22.05.2006 22:04
Помогите с программой ZAGA Pascal 0 22.05.2006 17:49
Помогите с программой Yadron Pascal 0 06.05.2006 18:20
Помогите с программой Anonymous Visual Basic 1 22.11.2003 08:55



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов