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

📄 shixian.h

📁 用C++编的
💻 H
📖 第 1 页 / 共 2 页
字号:
/****************************************************
文件名:shixian.c
简要描述:写入行变动信息,添入修改标志
内容:调整各文件位置,补全资料
*****************************************************/
/****************************************************
文件名称:  read.c
简要介绍:本模块的功能是将要比较的两个文本文件的格式进行一定程度的修改
            使得最终比较结果更加精确,也就是对整个程序的输入进行加工
*****************************************************/
/* 函数名称:       Init()
   简要描述:       初始化数组所有的值均为空格,以避免打印出来不常见的字符
   输入(函数参数):主调函数传来的数组结构
   输出:            初始化好的数组
*/
void Init( char nw[],int x)
{
	int i;
	for(i=0;i<x;i++)
	{
		nw[i]='\0';
	}
}


/*函数名称:RdOld()
  简要描述:此函数实现的是将文件文本行中出现的不规则的格式进行规范化,针对不同的情况进行不同的处理
  输入:    主调函数传来的数组结构
  输出:    将文件中的文本行格式好以后,放入数组并返回值,操作成功返回值为0,文件结束返回值为1
*/
 int RdOld(char old[])
{

	int note;/*note=0代表回车符出现在一行(开头不是一行字符串或注释)的结尾,note=1代表此一行不作为输出*/
	int flag;/*flag=0代表这一行的开头没有空格或空格串,flag=1则代表有*/
	char *pold;/*指向数组old[]的指针*/
	char ch;/*存放取出的字符*/
	long num;/*统计一行字符的个数,同时用来表示空格或回车的位置*/
	int sign;/*sign=1代表=后的大括号出现,而后的第一个右大括号不能另立一行*/
	sign=0;
	LOLD: num=0;
	note=0;
	flag=0;
	pold=old;

    



	if(a_old=='}'||a_old=='{')
	{
		*pold=a_old;
                sh_old=a_old;
		a_old=0;/*每次将a送入数组old[]后,又清0*/
		return(0);/*读取一行成功返回值为*/
	}
	else
	{
	if(feof(fp_old))
	{
		return(1);/*如果文件结束则返回值为1*/
	}

	else
	{
		ch=fgetc(fp_old);
		num++;

		while(ch!=10&&ch!=EOF)/*此时的字符既不是回车也不是文件结束符*/
		{
			switch(ch)
			{
				case('{'):if(sh_old!='=')
				{ 
					sign=0;
					if(sh_old==10||sh_old==32)/*字符‘{’前如果是字符回车或者空格*/
					{     
						*pold=ch;
						return(0);/*读取一行成功返回值为0*/
					}
		           else
				   {  
						a_old=ch;
						return(0);
				 }
				}
	            else
				{     sign=1;/*大括号出现在枚举类型的定义中*/
			         *pold=ch;
			         pold++;
                     sh_old=ch;
			         ch=fgetc(fp_old);
					 num++;
				}break;
	  case('}'):if(sign==1)
				{   
					*pold=ch;
			         pold++;
                     sh_old=ch;
			         ch=fgetc(fp_old);
					 num++;
					 sign=0;
                }
		       else 
			   {
				   a_old='}';
				   if(sh_old=='}'||sh_old==10)
					   goto LOLD;
				   else
				   return(0);
               }
			   break;
		       
	  case(32):if(num==1)/*如果空格位于行首则全部不要*/
			   {
				   while(ch==32)
				   {
					   sh_old=ch;
				       ch=fgetc(fp_old);
					   num++;

				   }
				   flag=1;
				   if(ch==10)
				   /*说明回车出现在行首空格的后面*/
				   {

					   goto LOLD;/*此行不进行输出,返回调用函数的开头*/
				   }



               }
		      else /*空格出现在行中间,则只要一个空格,其于均要被省略*/
			  {        flag=0;
			    	   *pold=ch;
				       pold++;
				       sh_old=ch;
				       ch=fgetc(fp_old);
					   num++;
				    while(ch==32)
					{
				 	  sh_old=ch;
					  ch=fgetc(fp_old);
					  num++;
					}
				    *pold=ch;
				    pold++;
                    sh_old=ch;
				    ch=fgetc(fp_old);
					num++;
			  }break;
	  case('/'):   if(num==1||flag==1)/*若遇到  则其中的内容均忽略直到遇见 */
				   {
					   note=1;
				   }
			       sh_old=ch;
			      ch=fgetc(fp_old);
				   num++;
				   if(ch=='*')
				   {
					sh_old=ch;
					ch=fgetc(fp_old);

					sh_old=ch;
					ch=fgetc(fp_old);
					num++;
					while(sh_old!='*'&&ch!='/')
					{
						sh_old=ch;
						ch=fgetc(fp_old);
					}
					if(sh_old=='*'&&ch=='/')
					{
						ch=fgetc(fp_old);
						sh_old=ch;
					}
				}
				else
				{
					*pold=ch;
					pold++;
					sh_old=ch;
					ch=fgetc(fp_old);
					num++;
                }break;
	  default:   *pold=ch;
		         pold++;
		         sh_old=ch;
		         ch=fgetc(fp_old);
				 num++;
			   break;
	  }/*switch*/
   }/*while*/

   if(ch==10)
   {
	  if(num==1) /*回车出现在行首说明是一空行,则返回调用函数的开始*/
	  {
		  goto LOLD;/*此行不进行输出,返回调用函数的开头*/
      }
	 if(note==0)/*回车正常出现在字符串的后面,则代表一行读完*/
	 {
		sh_old=ch;
		max1++;
		return(0);/*文件一行读取成功并返回值0*/		
	 }
     else 
	 {
		goto LOLD;/*此行不进行输出,返回调用函数的开头*/
     }

}
    
	
		
    
  }/*else*/
  }/*else*/
return(1);
}/*RdOld()*/

 int RdNw(char nw[])
{

	int note;/*note=0代表回车符出现在一行(开头不是一行字符串或注释)的结尾,note=1代表此一行不作为输出*/
	int flag;/*flag=0代表这一行的开头没有空格或空格串,flag=1则代表有*/
	char *pnw;/*指向数组nw[]的指针*/
	char ch;/*存放取出的字符*/
	long num;/*统计一行字符的个数,同时用来表示空格或回车的位置*/
	int sign;/*sign=1代表=后的大括号出现,而后的第一个右大括号不能另立一行*/
	sign=0;
	LNW: num=0;
	note=0;
	flag=0;
	pnw=nw;




	if(a_nw=='}'||a_nw=='{')
	{
		*pnw=a_nw;
		sh_nw=a_nw;
		a_nw=0;/*每次将a送入数组nw[]后,又清0*/
		return(0);/*读取一行成功返回值为*/
	}
	else
	{
	if(feof(fp_nw))
	{
		return(1);/*如果文件结束则返回值为1*/
	}

	else
	{
		ch=fgetc(fp_nw);
		num++;

		while(ch!=10&&ch!=EOF)/*此时的字符既不是回车也不是文件结束符*/
		{
			switch(ch)
			{
				case('{'):if(sh_nw!='=')
				{ 
					sign=0;
					if(sh_nw==10||sh_nw==32)/*字符‘{’前如果是字符回车或者空格*/
					{     
						*pnw=ch;
						return(0);/*读取一行成功返回值为0*/
					}
		           else
				   {  
						a_nw=ch;
						return(0);
				 }
				}
	            else
				{     sign=1;/*大括号出现在枚举类型的定义中*/
			         *pnw=ch;
			         pnw++;
                     sh_nw=ch;
			         ch=fgetc(fp_nw);
					 num++;
				}break;
	  case('}'):if(sign==1)
				{   
					*pnw=ch;
			         pnw++;
                     sh_nw=ch;
			         ch=fgetc(fp_nw);
					 num++;
					 sign=0;
                }
		       else 
			   {
				   a_nw='}';
				   if(sh_nw=='}'||sh_nw==10)
					   goto LNW;
				   else
				   return(0);
               }
			   break;
		       
	  case(32):if(num==1)/*如果空格位于行首则全部不要*/
			   {
				   while(ch==32)
				   {
					   sh_nw=ch;
				       ch=fgetc(fp_nw);
					   num++;

				   }
				   flag=1;
				   if(ch==10)
				   /*说明回车出现在行首空格的后面*/
				   {

					   goto LNW;/*此行不进行输出,返回调用函数的开头*/
				   }



               }
		      else /*空格出现在行中间,则只要一个空格,其于均要被省略*/
			  {        flag=0;
			    	   *pnw=ch;
				       pnw++;
				       sh_nw=ch;
				       ch=fgetc(fp_nw);
					   num++;
				    while(ch==32)
					{
				 	  sh_nw=ch;
					  ch=fgetc(fp_nw);
					  num++;
					}
				    *pnw=ch;
				    pnw++;
                    sh_nw=ch;
				    ch=fgetc(fp_nw);
					num++;
			  }break;
	  case('/'):   if(num==1||flag==1)/*若遇到  则其中的内容均忽略直到遇见 */
				   {
					   note=1;
				   }
			       sh_nw=ch;
			      ch=fgetc(fp_nw);
				   num++;
				   if(ch=='*')
				   {
					sh_nw=ch;
					ch=fgetc(fp_nw);

					sh_nw=ch;
					ch=fgetc(fp_nw);
					num++;
					while(sh_nw!='*'&&ch!='/')
					{
						sh_nw=ch;
						ch=fgetc(fp_nw);
					}
					if(sh_nw=='*'&&ch=='/')
					{
						ch=fgetc(fp_nw);
						sh_nw=ch;
					}
				}
				else
				{
					*pnw=ch;
					pnw++;
					sh_nw=ch;
					ch=fgetc(fp_nw);
					num++;
                }break;
	  default:   *pnw=ch;
		         pnw++;
		         sh_nw=ch;
		         ch=fgetc(fp_nw);
				 num++;
			   break;
	  }/*switch*/
   }/*while*/

   if(ch==10)
   {
	  if(num==1) /*回车出现在行首说明是一空行,则返回调用函数的开始*/
	  {
		  goto LNW;/*此行不进行输出,返回调用函数的开头*/
      }
	 if(note==0)/*回车正常出现在字符串的后面,则代表一行读完*/
	  {
	   sh_nw=ch;
	   max2++;
	   return(0);/*文件一行读取成功并返回值0*/
	  }
      else 
	  {
		  goto LNW;/*此行不进行输出,返回调用函数的开头*/
      }

   }
    
	
		
    
  }/*else*/
  }/*else*/
return(1);
}/*RdNw*//*RdNw*/
/*********************************************************************/





/************************************************************************
函数名:  IntrCmp()
功能:    实现旧版本中与新版本中的对应行(非完全相同的两行)的行内比较
输入项:  两行非完全匹配的字符串newline,oldline
输出项:  1.函数返回值
         2.当函数返回值为1时,同时输出newline比oldline增加与删除的字符数组add,dl
*************************************************************************/
int IntrCmp(char newline[],char oldline[],char add[],char dl[])
{
	int i=0;
	int j=0;
	int len=0;
	int ka=0;
	int kd=0;
	int m=strlen(newline);
	int n=strlen(oldline);
	int maxlen=0;
	int c[MAX][MAX];
/************************************************************************/
	if(m>n)
		maxlen=m;
	else 
		maxlen=n;
	for(i=0;i<=m;i++)
		c[i][0]=0;
	for(j=1;j<=n;j++)
		c[0][j]=0;
	for(i=1;i<=m;i++)
	for(j=1;j<=n;j++)
	if(newline[i-1]==oldline[j-1])
		c[i][j]=c[i-1][j-1]+1;
	else
	{
		if(c[i-1][j]<c[i][j-1])
			c[i][j]=c[i][j-1];
		else  
		c[i][j]=c[i-1][j];
    }
	len=c[m][n];
	if((double)len /maxlen<0.8)
		 return 1;
	i=strlen(newline),j=strlen(oldline),ka=i-len,kd=j-len;
	*(add+ka)='\0';
	ka--;
	*(dl+kd)='\0';
	kd--;
	while(i>0&&j>0)
	{
		 if(c[i][j]==c[i-1][j]&&c[i][j]==c[i][j-1])
		{
			add[ka]=newline[i-1];
			dl[kd]=oldline[j-1];
			ka--;
			kd--;
			i--;
			j--;
		}
		if(c[i][j]==c[i-1][j]&&c[i][j]!=c[i][j-1])
		{
			add[ka]=newline[i-1];
			ka--;
			i--;
			j--;
		}
		if(c[i][j]!=c[i-1][j]&&c[i][j]==c[i][j-1])
		{
			dl[kd]=oldline[j-1];
			kd--;
			i--;
			j--;
		}
		else if(c[i][j]!=c[i-1][j]&&c[i][j]!=c[i][j-1])
		{
			i--;
			j--;
		}
		if(i==0&&j==0)
		break;
	}
	while(i>=0)
	{
		 add[ka]=newline[i];
		i--;
		ka--;
	}
	while(j>=0)
	{
		dl[kd]=oldline[j];
		j--;
		kd--;
	}
	return 0;
}
/**************************************************************/






/****************************************************
文件名:CMP_INCLD.c
简要描述:全局比较模块引用函数文件
修改记录:暂无
*****************************************************/



/**************************************************************************************
函数名称:InsQ

⌨️ 快捷键说明

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