⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 200114072guijie.cpp

📁 人工智能课程的实验中用C语言环境实现子句归结的算法和反映
💻 CPP
字号:
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<string.h>
#define MaxCharNum  81
int  GetData(char data[][MaxCharNum])
{
	int n=0;
	char check[MaxCharNum],str[]="1234";
	printf("please input some data and input 1234 to end data input:\n");
	 while(n+1)
	{  
		scanf("%s",check);
        if(!strcmp(check,str))
			break;
        else strcpy(data[n],check);
          n++;
	}
      return n;
}
int Atom(char atm)
{
	 if(atm>='A'&&atm<='Z')
	    return 1;
   
	 else if(atm>='a'&&atm<='z')
		return 2;
	
	  return 0;  
}
int CheckCorrect(char *str)
{
   int i,j=0,k=0;
   i=strlen(str);
   if(str[j]!='~'||!Atom(str[j]))
       return 0;
   for(j=1;j<i;j++)
   {  
	   if(str[j]=='~'||str[j]=='+'||Atom(str[j]))
	   {
		  if(str[k]=='~'&&!Atom(str[j]))
           return 0;
          if(Atom(str[k])&&str[j]!='+')
		   return 0;
		  if(str[k]=='+'&&str[j]=='+')
		   return 0;
	   }
	   else return 0;
	   		k++;
           j++;
   }  
   return 1;
}
void DataStardard(char *s)
{   
	int i=0,j=0,k=0,n=0;
	char tem[MaxCharNum];
	i=strlen(s);
    while(Atom(s[n]))

	{if(Atom(s[n])!=2)
		tem[k++]=s[n];
	else tem[k++]=s[n]-32;
	}
	for(j=1;j<i;j++)
	{
	  while(s[j]=='~'||s[j]=='+')
	  {
	  if (s[j-1]=='~'&&Atom(s[j])==1);
		  tem[k++]=s[j]+32;
	  if(s[j-1]=='~'&&Atom(s[j])==2);
          tem[k++]=s[j];
     if(s[j-1]=='+'&&Atom(s[j])==1);
		  tem[k++]=s[j];
      if(s[j-1]=='+'&&Atom(s[j])==2);
          tem[k++]=s[j]-32;
      }
	}
    tem[k++]=0;
    strcpy(s,tem);
}
void Extract(char *str)
{
	int i,j=0,k=0;
	char tem[MaxCharNum];
	i=strlen(str);
    if(str[j]<'a')
		 { 
		   	tem[k++]=str[j];
	      
		 }
	else 
	{
	       tem[k++]='~';
		   tem[k++]=str[j]-32;
	
	}
     for(j=1;j<i;j++)
	 {   tem[k++]='+';
		 if(str[j]<'a')
		 { 
		   tem[k++]=str[j];
		 }
         else tem[k++]='~';
		   tem[k++]=str[j]-32;  
	 }
	 tem[k]=0;
	 strcpy(str,tem);
}
int FindChar(char *source ,char dest)
{
	int i,j;
	i=strlen(source);
	for(j=0;j<i;j++)
		while(abs(source[j]-dest)==32)
			return j;
		return -1;
}
void DeleteSubString(char *source,int start,int numbers)
{
	int i;
	for(i=start;source[i+numbers]!='\0';i++)
		source[i]=source[i+numbers];
        source[i]='\0';
}
int GetNewSentence(char *frt,char *secd,char *New)
{
   int i=0,j;
   char str[MaxCharNum];
    while(frt[i])
	{   
        j=FindChar(secd,frt[i]);
		if(j==-1)
		{
			i++;  continue;
		}
		strcpy(str,frt);
        DeleteSubString(str,i,1);
		i=strlen(str)+j;
		strcat(str,secd);
		DeleteSubString(str,i,1);
		strcpy(New,str);
         return 1;
	}
	return 0;
}
int CheckExist(char d[][MaxCharNum],char *m,int num)
{
    int i;
	for(i=0;i<num;i++)
		if(!strcmp(d[i],m))
			return 1;
           return 0;
}
void Simipify(char *str)
{
	int i,length,k;
    length=strlen(str);
	for(i=0;i<length;i++)
       for(k=i+1;k<length;k++)
		   if(str[i]==' ')
			   break;
		   else if(str[i]==str[k])
			     str[k]=' ';
     for(i=0,k=0;i<length;i++)
		 if(str[i]!=' ')str[k++]=str[i];
		 str[k]=0;
}
int CheckEverValue(char *str)
{
     int i,j,length;
      length=strlen(str);
       for(i=0;i<length-1;i++)
           for(j=i+1;j<length;j++)
               if(abs(str[j]-str[i])==32)
				   return 1;
                 return 0;
}
void CheckContent(char data[][MaxCharNum],int n)
{
   int i,j;
   char up[MaxCharNum],down[MaxCharNum];
   for(i=0;i<n;i++)
   {   strcpy(up,data[i]);
	   Extract(up);
	   printf("%d . %-50s\n",i+1,up);
   }
   for(i=0;i<n;i++)
	 for(j=i+1;j<n;j++)
	 { 
	   if(!GetNewSentence(data[i],data[j],down))
		   continue;
	   Simipify(down); 
	   if(!CheckExist(data,down,n))
		   continue;
       if(!CheckEverValue(down))  
		   goto next;
     }
next:
       if(i>n)
          {
             printf("The set of sub_sentence can be content");
             return ;
          }
        strcpy(up,down);
	    Extract(up);
	    if(!up[0])  strcpy(up,"NUL");
        printf("(%d) %-30s (%d) and (%d)\n ",n+1,up,i+1,j+1);
        if(!down[0]) return;
        getch();
      while(1)
	  {
         for(i=0;i<n;i++)
		 {	 if(!GetNewSentence(down,data[i],up))continue;
			 Simipify(up);
			 if(!CheckExist(data,up,n))continue;
			 if(!CheckEverValue(up)) break;
		 }
		 if(i>=n)
		 {
            printf("The set of sub_sentence can be content");
             return ;
         }
         strcpy(data[++n],down);
		 strcpy(down,up);
		 Extract(down);
		 if(!down[0])   strcpy(down,"NUL");
         printf("(%d) %-30s (%d) and (%d)\n ",n+1,down,i+1,n);
         if(!up[0]) break;
		 strcpy(down,up);
         getch();
	  }
	  printf("The set of sub_sentence can't be content.");
}
void main()
{
  char data[150][MaxCharNum];
  int i,n,error;
   n=GetData(data);
   error=0;
   for(i=0;i<n;i++)
   {
       if(!CheckCorrect(data[i]))
		   continue;
       printf("line%d has error;%s\n",i+1,data[i]);
       error=1;
   }
   if(error) 
   {
	   getch();
       exit(0); 
   }
   for(i=0;i<n;i++)
   DataStardard(data[i]);
   CheckContent(data,n);
   getch();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -