subsentence.c

来自「这个程序是人工智能里字句归结的一个程序」· C语言 代码 · 共 206 行

C
206
字号
#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
#define MaxCharNum  81
int  GetData(char data[][MaxCharNum])
{
	int n=0;
	char checkNum[MaxCharNum],str[]="end";
	printf("please input data:\n");
	printf("input end finish data input\n");
    while(1)
	{  
		scanf("%s",checkNum);
        if(strcmp(checkNum,str)==0)
			break;
        strcpy(data[n],checkNum);
          n++;
	}
      return n;
}

void StardardData(char *s)
{   
	int i,j,k=0,n=0;
	char tem[MaxCharNum];
	i=strlen(s);
  for(j=0;j<i;j++)
	{
	  if(s[j]=='~'||s[j]=='+')
	    continue;
	}
    tem[k++]=0;
	//printf("%s\n",tem);
    strcpy(s,tem);
}
void Extract(char *s)
{
	int i,j=0,k=0;
	char GetExtrat[MaxCharNum];
	i=strlen(s);
    if(s[j]>='a')
		 { GetExtrat[k++]='~';
		   GetExtrat[k++]=s[j]-32;
		  
		 }
	else 
	{
		GetExtrat[k++]=s[j];
	    
	}
     for(j=1;j<i;j++)
	 {   GetExtrat[k++]='+';
		 if(s[j]>='a')
		 { 
		  GetExtrat[k++]='~';
		   GetExtrat[k++]=s[j]-32;
		 }
         else GetExtrat[k++]=s[j];  
	 }
	 GetExtrat[k]=0;
	 strcpy(s,tem);
}
int FindChar(char *source ,char charch)
{
	int i,j;
	i=strlen(source);
	for(j=0;j<i;j++)
		if(abs(source[j]-charch)==32)
			return j;
		return -1;
}
void DeleteSubString(char *source,int start,int length)
{
	int i;
	for(i=start;source[i+length]!='\0';i++)
		source[i]=source[i+length];
     source[i]='\0';
}
int GetNewSentence(char *first,char *second,char *New)
{
   int i=0,j;
   char str[MaxCharNum];
    while(first[i])
	{   
        j=FindChar(second,first[i]);
		//printf("%d",j);
		if(j==-1)
		{i++;	continue;}
		strcpy(str,first);
        DeleteSubString(str,i,1);
		i=strlen(str)+j;
		strcat(str,second);
		DeleteSubString(str,i,1);
		strcpy(New,str);
         return 1;
	}
	return 0;
}
int CheckExist(char d[][MaxCharNum],char *m,int n)
{
    int i;
	for(i=0;i<n;i++)
		if(strcmp(d[i],m)==0)
			return 0;
      return 1;
}
void Simipify(char *d)
{
	int i,j,k;
    j=strlen(d);
	for(i=0;i<j;i++)
       for(k=i+1;k<j;k++)
		   if(d[i]==' ')break;
		   else if(d[i]==d[k])
			     d[k]=' ';
     for(i=0,k=0;i<j;i++)
		 if(d[i]!=' ')d[k++]=d[i];
		 d[k]=0;
}
int CheckEverValue(char *d)
{
     int i,j,length;
      length=strlen(d);
       for(i=0;i<length-1;i++)
           for(j=i+1;j<length;j++)
               if(abs(d[j]-d[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 . %-40s\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); 
	  // printf("%s\n",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);
	//	printf("%s\n",up);
        Extract(up);
	//	printf("  %s",up);
        if(!up[0])  strcpy(up,"NUL");
        printf("(%d) %-40s (%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) %-40s (%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[101][MaxCharNum];
  int i,n,error;
//   clrscr();
   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++)
   StardardData(data[i]);
   CheckContent(data,n);
   getch();
}

⌨️ 快捷键说明

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