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 + -
显示快捷键?