Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 18.12.2011, 19:21
Yo_Asakyra Yo_Asakyra вне форума
Прохожий
 
Регистрация: 18.12.2011
Сообщения: 11
Репутация: 10
Восклицание Простая экспертная система

Зравствуйте всем.
Препод поставил задание- создать небольшую экспертную систему, которая бы давала советы пользователю в зависимости от неисправности ПК. Обязательным условием является наличие БД с вопросами и ответами.
Т.е. Пользователь отвечает на вопросы программы, которая в свою очередь выдаёт советы.
Я не могу придумать нормалый способ извлечения вопросов и ответов из БД.
Помогите люди, завтра сдавать, а я уже 3-й день бьюсь...
Вот примерная схема работы - ссылка : http://imageshost.ru/photo/41122/id1154631.html

Вариантами выборки из бд, советами, хоть чем нибудь

И мой ДИКИЙ и не завершенный код..... который к тому же еще и не работает как надо

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, DB, IBCustomDataSet, IBQuery, IBDatabase,
  Grids, DBGrids;

type
  TForm1 = class(TForm)
    RadioGroup1: TRadioGroup;
    Button1: TButton;
    Label1: TLabel;
    IBDatabase1: TIBDatabase;
    IBTransaction1: TIBTransaction;
    IBQuery1: TIBQuery;
    DataSource1: TDataSource;
    Button3: TButton;
    IBQuery2: TIBQuery;
    Button2: TButton;
    Button4: TButton;
    procedure Button1Click(Sender: TObject);
    procedure RadioGroup1Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  IdxQuestion:integer = 1; PushRadioButton:string; IdxAnswer:integer = 0;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin


case IdxQuestion of

1:if (IBQuery1.FieldByName('Question').AsString='Компьютер работает?') and (RadioGroup1.ItemIndex=1)
then IdxQuestion:=2
else
 Begin
  IBQuery2.Close;
  IBQuery2.SQL.Clear;
  IBQuery2.SQL.Add('select Answer from Answers where AnswerIDMain=:ID');
  IBQuery2.Prepare;
  IBQUery2.ParamByName('ID').AsInteger:=1;
  IBQuery2.Open;
  ShowMessage(IBQuery2.FieldByName('Answer').AsString)
 End;

2:if (IBQuery1.FieldByName('Question').AsString='Компьютер включается?') and (RadioGroup1.ItemIndex=1)
then IdxQuestion:=3 else IdxQuestion:=4;

3:if (IBQuery1.FieldByName('Question').AsString='Электричество есть?') and (RadioGroup1.ItemIndex=0)
then

  IBQuery2.Close;
  IBQuery2.SQL.Clear;
  IBQuery2.SQL.Add('select Answer from Answers where AnswerIDMain=5');
  IBQuery2.Open;
  ShowMessage(IBQuery2.FieldByName('Answer').AsString);

else
 Begin
  IBQuery2.Close;
  IBQuery2.SQL.Clear;
  IBQuery2.SQL.Add('select Answer from Answers where AnswerIDMain=3');
  IBQuery2.Open;
  ShowMessage(IBQuery2.FieldByName('Answer').AsString);
 End;

4:if (IBQuery1.FieldByName('Question').AsString='Изображение есть на мониторе?') and (RadioGroup1.ItemIndex=0)
then IdxQuestion:=7 else IdxQuestion:=5;

5:if (IBQuery1.FieldByName('Question').AsString='Монитор подключен к сети?') and (RadioGroup1.ItemIndex=0)
then IdxQuestion:=6
else
 Begin
  IBQuery2.Close;
  IBQuery2.SQL.Clear;
  IBQuery2.SQL.Add('select Answer from Answers where AnswerIDMain=5');
  IBQuery2.Open;
  ShowMessage(IBQuery2.FieldByName('Answer').AsString);
 End;

6:if (IBQuery1.FieldByName('Question').AsString='Лампочка на мониторе горит?') and (RadioGroup1.ItemIndex=0)
then ShowMessage(IBQuery2.FieldByName('Answer').AsString) else ShowMessage(IBQuery2.FieldByName('Answer').AsString);

7:if (IBQuery1.FieldByName('Question').AsString='Есть писк при загрузке ОС?') and (RadioGroup1.ItemIndex=1)
then IdxQuestion:=8 else ShowMessage(IBQuery2.FieldByName('Answer').AsString);

8:if (IBQuery1.FieldByName('Question').AsString='Загружается ОС?') and (RadioGroup1.ItemIndex=1)
then IdxQuestion:=9 else IdxQuestion:=10;

9:if (IBQuery1.FieldByName('Question').AsString='Есть сообщение об ошибке ОС?') and (RadioGroup1.ItemIndex=0)
then ShowMessage(IBQuery2.FieldByName('Answer').AsString) else ShowMessage(IBQuery2.FieldByName('Answer').AsString);

10:if (IBQuery1.FieldByName('Question').AsString='При входе в систему есть звук?') and (RadioGroup1.ItemIndex=1)
then IdxQuestion:=11 else IdxQuestion:=12;

11:if (IBQuery1.FieldByName('Question').AsString='У вас есть звуковая карта?') and (RadioGroup1.ItemIndex=1)
then IdxQuestion:=12 else ShowMessage(IBQuery2.FieldByName('Answer').AsString);

12:if (IBQuery1.FieldByName('Question').AsString='Система загрузилась без ошибок?') and (RadioGroup1.ItemIndex=0)
then ShowMessage(IBQuery2.FieldByName('Answer').AsString) else ShowMessage(IBQuery2.FieldByName('Answer').AsString);

End;

RadioGroup1.ItemIndex:=-1;
Button1.Enabled:=False;

IBQuery1.Close;
IBQuery1.SQL.Clear;
IBQuery1.SQL.Add('select Question from Questions where QestionIDMain=:ID');
IBQuery1.Prepare;
IBQUery1.ParamByName('ID').AsInteger:=IdxQuestion;
IBQuery1.Open;


IBQuery2.Close;
IBQuery2.SQL.Clear;
IBQuery2.SQL.Add('select Answer from Answers where AnswerIDMain=:ID');
IBQuery2.Prepare;
IBQUery2.ParamByName('ID').AsInteger:=IdxAnswer;
IBQuery2.Open;

Label1.Caption:=IBQuery1.FieldByName('Question').AsString;

End;


procedure TForm1.RadioGroup1Click(Sender: TObject);
begin
If RadioGroup1.ItemIndex >= 0 then Button1.Enabled:=True;

end;

procedure TForm1.Button3Click(Sender: TObject);
begin
Form1.Close;
end;



procedure TForm1.Button2Click(Sender: TObject);
begin

IBQuery1.Close;
IBQuery1.SQL.Clear;
IBQuery1.SQL.Add('select Question from Questions where QestionIDMain=:ID');
IBQuery1.Prepare;
IBQUery1.ParamByName('ID').AsInteger:=IdxQuestion;
IBQuery1.Open;


IBQuery2.Close;
IBQuery2.SQL.Clear;
IBQuery2.SQL.Add('select Answer from Answers where AnswerIDMain=:ID');
IBQuery2.Prepare;
IBQUery2.ParamByName('ID').AsInteger:=IdxAnswer;
IBQuery2.Open;
Label1.Caption:=IBQuery1.FieldByName('Question').AsString;
Button1.Enabled:=True;
Button4.Enabled:=True;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
IdxQuestion:=1;
IdxAnswer:=1;

IBQuery1.Close;
IBQuery1.SQL.Clear;
IBQuery1.SQL.Add('select Question from Questions where QestionIDMain=:ID');
IBQuery1.Prepare;
IBQUery1.ParamByName('ID').AsInteger:=IdxQuestion;
IBQuery1.Open;
Label1.Caption:=IBQuery1.FieldByName('Question').AsString;

IBQuery2.Close;
IBQuery2.SQL.Clear;
IBQuery2.SQL.Add('select Answer from Answers where AnswerIDMain=:ID');
IBQuery2.Prepare;
IBQUery2.ParamByName('ID').AsInteger:=IdxAnswer;
IBQuery2.Open;
Button4.Enabled:=False;
end;

end.
Ответить с цитированием
  #2  
Старый 18.12.2011, 19:27
ChinYan ChinYan вне форума
Тыкаю клавиши
 
Регистрация: 13.07.2009
Сообщения: 804
Версия Delphi:
Репутация: 48633
По умолчанию

Задание явно не на три дня, так что сразу делать надо было
Ответить с цитированием
  #3  
Старый 18.12.2011, 20:05
Yo_Asakyra Yo_Asakyra вне форума
Прохожий
 
Регистрация: 18.12.2011
Сообщения: 11
Репутация: 10
По умолчанию

Цитата:
Задание явно не на три дня, так что сразу делать надо было
Проблема заключается лишь в условиях выбора информации из БД. Больше мне ничего не надо

Последний раз редактировалось Yo_Asakyra, 18.12.2011 в 20:15.
Ответить с цитированием
  #4  
Старый 18.12.2011, 20:32
ChinYan ChinYan вне форума
Тыкаю клавиши
 
Регистрация: 13.07.2009
Сообщения: 804
Версия Delphi:
Репутация: 48633
По умолчанию

Ну в делфи куча возможностей. ADO к примеру
Ответить с цитированием
  #5  
Старый 18.12.2011, 20:48
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Самый простой вариант - сделать на продукционных правилах, т.е. правилах ЕСЛИ-ТО. Тогда схема для БД будет примерно такая:
Код:
CREATE TABLE RULE
(
  ID INTEGER PRIMARY KEY,
  NAME VARCHAR(100)
);

CREATE TABLE IFCLAUSE
(
  ID INTEGER PRIMARY KEY,
  RULE_ID INTEGER REFERENCE RULE(ID),
  QUESTION VARCHAR(255),
  VAR_NAME : VARCHAR(100)
);

CREATE TABLE THENCLAUSE
(
  ID INTEGER PRIMARY KEY,
  RULE_ID INTEGER REFERENCE RULE(ID),
  VAR_NAME VARCHAR(100),
  VAR_VALUE VARCHAR(100)
);

Работает примерно так.
Выбираешь правило (можно любое). Начинаешь анализировать IFCLAUSE. Если переменная в IFCLAUSE есть где-нить в THENCLAUSE, то начинаешь обрабатывть соотв. правило. Если такой ситуации нет, то задаешь вопрос пользователю. Ну и так, пока причина не будет найдена.

ЗЫ. Хотя тут релационная БД в общем не пришей кобыле хвост. Только как хранилище базы и то, не самое удобное.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 04:27.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter