📄 dwsb.cpp
字号:
#include<iostream.h>
#include<fstream.h>
#include<stdlib.h>
#include<iomanip.h>
struct cause{
int cau;
cause *next;
} *datacause;
struct rule{
int used; //标志规则是否已用
int result;//标志规则推出的结论;
int flag;//标志是否为终止性规则
int count;//标志规则所含前提的个数
cause *causep;// 规则的事实即前提部分
rule *next; // 指向下一条规则
} *knorule=NULL;
void list();
void input_rule();
void input();
void output(cause *cp,rule *rp);
bool match(cause *cp,rule *rp);
bool newcause(cause *cp,rule *rp);
//各函数的声明
void main()
{
input_rule();
list();
//while(1){
input();
cout<<"正在进行推理........"<<endl;
rule *head1=knorule;
cause *head2=datacause;
while(knorule)
{
if(knorule->used==1)
knorule=knorule->next;
else if(match(datacause,knorule))
if(knorule->flag==1)
{
cout<<"你所要识别的动物是:"<<endl;
switch(knorule->result)
{
case 24:cout<<"猎豹"<<endl;break;
case 25:cout<<"老虎"<<endl;break;
case 26:cout<<"长颈鹿"<<endl;break;
case 27:cout<<"斑马"<<endl;break;
case 28:cout<<"鸵鸟"<<endl;break;
case 29:cout<<"企鹅"<<endl;break;
case 30:cout<<"海燕"<<endl;break;
}
cout<<"☆★ 成功 ☆★"<<endl;
break;
}
else if(newcause(datacause,knorule))
{
cout<<"产生了一个中间事实!!!"<<endl;
cause *cp=new cause;
cp->cau=knorule->result;
cp->next=datacause;
datacause=cp;
knorule=head1;
//exit(1);
}
else knorule=knorule->next;
else knorule=knorule->next;
}
if(knorule==NULL)
cout<<"很抱歉,没有找到你要识别的动物"<<endl;
// }
cout<<endl<<endl;
}
void list()
{
cout<<"********************************************************************************"<<endl;
cout<<" "<<"☆★☆★☆★ ~_~ ~_~ ~_~ ☆★☆★☆★"<<endl<<endl;
cout<<" "<<"☆★欢迎使用动物识别系统☆★"<<endl<<endl;
cout<<" "<<"☆★选择你所需要匹配的事实,动物识别系统的事实如下所示:☆★"<<endl;
cout<<endl;
cout<<setiosflags(ios::left);
cout<<setw(15)<<"1 有毛发";
cout<<setw(15)<<"2 有奶";
cout<<setw(15)<<"3 有羽毛";
cout<<setw(15)<<"4 会飞或善飞";
cout<<setw(15)<<"5 会下蛋"<<endl;
cout<<setiosflags(ios::left);
cout<<setw(15)<<"6 会吃肉";
cout<<setw(15)<<"7 有犬齿";
cout<<setw(15)<<"8 有爪";
cout<<setw(15)<<"9 眼盯前方";
cout<<setw(15)<<"10 是哺乳动物"<<endl;
cout<<setiosflags(ios::left);
cout<<setw(15)<<"11 有蹄";
cout<<setw(15)<<"12 会反刍";
cout<<setw(15)<<"13 是食肉动物";
cout<<setw(15)<<"14 是黄褐色";
cout<<setw(15)<<"15 有暗斑点"<<endl;
cout<<setiosflags(ios::left);
cout<<setw(15)<<"16 有黑色条纹";
cout<<setw(15)<<"17 有长脖子";
cout<<setw(15)<<"18 有长腿";
cout<<setw(15)<<"19 不会飞";
cout<<setw(15)<<"20 有黑白二色"<<endl;
cout<<setiosflags(ios::left);
cout<<setw(15)<<"21 会游泳";
cout<<setw(15)<<"22 是鸟";
cout<<setw(15)<<"23 有蹄动物"<<endl<<endl;
cout<<" "<<"☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★☆★"<<endl<<endl;
cout<<"********************************************************************************"<<endl<<endl;
}
void input()
{
int m;
cause *cp;
datacause=NULL;
cout<<"请输入你所要识别的动物的特征, 以0结束:"<<endl;
cin>>m;
while(1)
{
if(m==0)
break;
cp=new cause;
cp->cau=m;
cp->next=datacause;
datacause=cp;
cin>>m;
}
}
void input_rule() //从rule.txt文中读入规则
{
cause *cp=NULL;
rule *rp=NULL;
int j,n;
ifstream fp("rule.txt",ios::in|ios::nocreate);
if(!fp){
cerr<<"rule.txt file not open!"<<endl;
exit(1);
}
while(fp>>n)
{
j=n;
rp=new rule;
rp->causep=NULL;
rp->count=j;
rp->used=0;
for(int i=1;i<=j;i++)
{
fp>>n;
cp=new cause;
cp->cau=n;
cp->next=rp->causep;
rp->causep=cp;
}
fp>>n;
rp->result=n;
fp>>n;
rp->flag=n;
rp->next=knorule;
knorule=rp;
}
fp.close() ;
}
void output(cause *cp,rule *rp) //输出函数
{
while(rp){
while(rp->causep){
cout<<rp->causep->cau<<" ";
rp->causep=rp->causep->next;
}
cout<<rp->flag<<endl;
rp=rp->next;
}
while(cp){
cout<<cp->cau<<" ";
cp=cp->next;
}
cout<<endl;
}
bool match(cause *cp,rule *rp) //匹配函数
{
int i=0;
rp->used=1;
while(cp)
{
cause *cp1=rp->causep;
while(cp1)
{
if(cp->cau==cp1->cau)
{
i=i+1;
break;
}
cp1=cp1->next;
}
cp=cp->next;
}
if(i==rp->count)
return true;
return false;
}
bool newcause(cause *cp,rule *rp)
{
while(cp)
{
if(cp->cau==rp->result)
return 0;
cp=cp->next;
}
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -