学生:归结原理 ,问题:程序不能工作,没有错误、警告
为什么不能工作呢,没有语法错误与警告??请大侠看看#include"stdio.h"
#include"stdio.h"
#define MaxSize 100
////////////////////////////////////////////////////////////
typedef struct{
int data;
}ElemType;
////////////////////////////////////////////////////////////
typedef struct{
ElemType elem[MaxSize];
int len;
}SqList;
//////////////////////////////////////////////////////////////
typedef struct{
SqList and;
SqList or;
}TC;
////////////////////////////////////////////////////////////
void InitSqList(SqList *p){
p->len=0;
}
///////////////////////////////////////////////////////////
void InitTC(TC *p){
InitSqList(&p->and);
InitSqList(&p->or);
}
/////////////////////////////////////////////////////////////////
int InsertAnd(TC *tc,SqList *p, int e){
if(p->len>=MaxSize)
return 0;
p->elem[p->len].data=e;
p->len=p->len+1;
tc->and=*p;
return 1;
}
////////////////////////////////////////////////////////////////////
int InsertOr(TC *tc,SqList *p,int e){
if(p->len>=MaxSize)
return 0;
p->elem[p->len].data=e;
p->len=p->len+1;
tc->or=*p;
return 1;
}
////////////////////////////////////////////////////////////////////////
void ShowTc(TC *tc){
int i,j;
for(i=0;i<tc->and.len-1;i++)
if(tc->and.elem[i].data!=0){
printf("P%d&",tc->and.elem[i].data);
}
if(tc->and.elem[i].data!=0)
printf("P%d",tc->and.elem[i].data);
printf("->");
for(j=0;j<tc->or.len-1;j++)
if(tc->or.elem[i].data!=0){
printf("P%d|",tc->or.elem[j].data);
}
if(tc->or.elem[j].data!=0)
printf("P%d",tc->or.elem[j].data);
printf("\n\n");
}
////////////////////////////////////////////////////////////////////////////
int Relution(TC TC[],int n,int num[],int m){
int i,j,k;
int number1[MaxSize]={0};
int number2[MaxSize]={0};
for(i=0;i<m;i++){
for(j=0;j<n;j++){
for(k=0;k<TC[j].and.len;k++)
if(num[i]==TC[j].and.elem[k].data){
number1[i]=number1[i]+1;
}
}
if(i==0)
printf("And:\n");
printf("%d\tP(%d+1)\n",number1[i],i);
}
////////////////////////////////////////////////////////////////////////////////////
for(i=0;i<m;i++){
for(j=0;j<n;j++){
for(k=0;k<TC[j].or.len;k++){
if(num[i]==TC[j].or.elem[k].data){
number2[i]=number2[i]+1;
}
}
}
if(i==0)
printf("Or:\n");
printf("%d\tP(%d+1)\n",number2[i],i);
}
//////////////////////////////////////////////////////////////////////////////////////
for(i=0;i<m;i++){
if(number1[i]==number2[i])
printf("this is empty\n");
}
for(i=0;i<m;i++){
if(number1[i]>number2[i]) {
for(j=1;j<=(number1[i]-number2[i]);j++)
printf("P%d&",(num[i]));
j=i;
if(number1[j+1]>number2[j+1]&&(j+1)<m)
printf("&");
}
}
printf("->");
for(i=0;i<m;i++){
if(number1[i]<number2[i]) {
for(j=1;j<=(number2[i]-number1[i]);j++)
printf("P%d",(num[i]));
j=i;
if(number1[j+1]<number2[j+1]&&(j+1)<m)
printf("|");
}
}
printf("\n");
return 1;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////
void Relution2(TC tc[] ,int n1,int n2){
int i, j=0, k ,x=0,y=0 , l=0 ,m=0;
int r1=0,r2=0,r3=0,r4[2][20]={0},r5[2]={0},r6,r7[2][20]={0},r8[2]={0},r9;
int p,q,r;
int num1=0,num2=0;
int sign1,sign2;
for(i=0;i<n1+r1;i++){// 重复 利用 字句 包括 新生成
for(k=0;k<n1;k++){//重复使用 已知条件
r6=0;
r9=0;
if(k!=i){
while(x<tc[i].and.len||y<tc[i].or.len){//while 2
while(l<tc[k].and.len||m<tc[k].or.len){// while 3
if(tc[i].and.elem[x].data!=0){
if(tc[i].and.elem[x].data==tc[k].or.elem[m].data){// 查找 可生成的新字句
r4[0][r5[0]++]=x;
r4[1][r5[1]++]=m;
r6++;
}//end if
}
if(tc[i].or.elem[y].data==0){
if(tc[i].or.elem[y].data==tc[k].and.elem[l].data){// 查找 可生成的新字句
r7[0][r8[0]++]=y;
r7[1][r8[1]++]=l;
r9++;
}//end if
}
l++;
m++;
}//end while 3
x++;
y++;
}// end while 2
//*********************************************************************************************************************************
if(r6>0||r9>0){
if(r6>0){
if(r6<tc[i].and.len){
for(p=0;p<tc[i].and.len;p++){
r=0;
if(tc[i].and.elem[p].data!=0){
for(q=0;q<r5[0];q++){
if(p!=r4[0][q]){
r++;
if(r==(r5[0]-1))
{tc[n1+r1].and.elem[num1++].data=tc[i].and.elem[p].data;}// end if r=..//s生成新字句
}// end if p != r4..
}//end for q <r5[]..
}//end if tc[i].and.elem[p]!=0
}// end for p <tc[i].and.len
}//end if r6<tc[i].and.len
if(r6<tc[k].or.len){
for(p=0;p<tc[k].or.len;p++){
r=0;
if(tc[k].or.elem[p].data!=0){
for(q=0;q<r5[1];q++){
if(p!=r4[1][q]){
r++;
if(r==(r5[1]-1))
{ tc[n1+r1].or.elem[num2++].data=tc[k].or.elem[p].data;} // end if //s生成新字句
}// end if p
}//end for q
}// end if tc[k].or.elem[p]!=0
}// end for p
}//end if r6<tc[k].or.len
}// end if r6 !=0
//***********************************************************************************************************************************
if(r9>0){
if(r9<tc[i].or.len){
for(p=0;p<tc[i].or.len;p++){
r=0;
if(tc[i].or.elem[p].data!=0){
for(q=0;q<r8[0];q++){
if(p!=r7[0][q]){
r++;
if(r==(r8[0]-1))
{ tc[n1+r1].or.elem[num2++].data=tc[i].or.elem[p].data;}//end if r //s生成新字句
}//end if p
}// end for q
}// end if tc[i].or.elem[p]!=0
}// end for p
}//end if r9<tc[i].or.len
if(r9<tc[k].and.len){
for(p=0;p<tc[k].and.len;p++){
r=0;
if(tc[k].and.elem[p].data!=0){
for(q=0;q<r8[1];q++){
if(p!=r7[1][q]){
r++;
if(r==(r8[1]-1))
{tc[n1+r1].and.elem[num1++].data=tc[k].and.elem[p].data;}// end if r //s生成新字句
}// end if p
}// end for q
}// end if tc[k].and.elem[p].data!=0
}//end for p
}// end if r9 <tc[k].and.len
}//end if r9!=0
if(r6==tc[i].and.len&&r9==tc[k].and.len){ //s生成新字句
tc[n1+r1].and.elem[num1++].data=0;
}
if(r6==tc[i].or.len&&r9==tc[k].or.len){ //s生成新字句
tc[n1+r1].or.elem[num2++].data=0;
}
if(i>=n1&&i<n2){
sign1=0;
sign2=0;
for(p=0;p<tc[n1+r1].and.len;p++){
if(tc[n1+r1].and.elem[p].data==0)
sign1++;
}
for(q=0;q<tc[n1+r1].or.len;q++){
if(tc[n1+r1].or.elem[q].data==0)
sign2++;
}
if(sign1==tc[n1+r1].and.len&&sign2==tc[n1+r1].or.len){// 判断新子句是否
printf("->");
break;
}
if((n1+r1)>=(n2-1)){// 判断是否应该输出
printf("error!\n");
break;
}
}
r1++;
//*********************************************************************************************************************************
}//end if r6 || r9 !=0
} // end if k!=i
}// end for
}// end for
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////
main(){
int e;
int i;
int num[]={1,2,3};
SqList and,or;
TC TC[20];
for(i=0;i<50;i++)
InitTC(&TC[i]);
InitSqList(&and);
InitSqList(&or);
e=2;
InsertAnd(&TC[0],&and,e);
e=3;
InsertAnd(&TC[0],&and,e);
e=1;
InsertOr(&TC[0],&or,e);
ShowTc(&TC[0]);
InitSqList(&and);
InitSqList(&or);
e=0;
InsertAnd(&TC[1],&and,e);
e=2;
InsertOr(&TC[1],&or,e);
ShowTc(&TC[1]);
InitSqList(&and);
InitSqList(&or);
e=0;
InsertAnd(&TC[2],&and,e);
e=3;
InsertOr(&TC[2],&or,e);
ShowTc(&TC[2]);
InitSqList(&and);
InitSqList(&or);
e=1;
InsertAnd(&TC[3],&and,e);
e=0;
InsertOr(&TC[3],&or,e);
ShowTc(&TC[3]);
Relution(TC,4,num,3);
Relution2(TC,4,50);
return 1;
}