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

📄 linetype.c

📁 即时计算加法
💻 C
字号:
/*
  Name:LineType.h
  Copyright:Starting Line
  Author:
  Date: 12-11-08 13:37
  Description:Liner类以及LineHis类的成员函数的定义
*/

#include "includes.h"

Liner * CalLine_; //全局变量,为了便于在各个处理例程之间传递参数

/*
  Function Name:LinerCreater
  Author: 
  Description:创建一个新的线性域
*/

void LinerCreater( Liner * CalLine )//此函数只在申请新的空间时调用
{
	Line Temp;//临时变量
	Temp = ( Line ) malloc (( sizeof ( char )) * LINE_SIZE );//给临时变量分配空间
	if ( (Temp == NULL ))
	{
		Error ( E_OVER_MEM );
	}
	else
	{
		CalLine -> CLine = Temp;//将临时变量的域定向到CLine
		Temp = NULL;//将Temp置空
		CalLine -> LineLen = LINE_SIZE;//当前小节的长度,用于扩展
	}
}

/*
  Function Name:LinerExpand
  Author: 
  Description:表达式扩展
*/

void LinerExpand ( Liner * Old )
{
	int i;
	Line Temp = NULL;
	Temp = ( Line ) malloc (( LINE_SIZE + ( Old -> LineLen )) * sizeof ( char ));
	//扩展CLine域的大小
	if ( Temp == NULL )
	{
		Error ( E_OVER_MEM );
	}
	else
	{
		//此处应该先将旧的表达式复制到新的内存中,然后重定向指针
		Old -> LineLen += LINE_SIZE;
		for ( i = 0 ; i < (( Old -> LineLen ) - LINE_SIZE ) ; ++i )
		{
			*( Temp + i ) = *( Old -> CLine );//旧空间内容复制到新空间
		}
		free ( Old -> CLine );//重定向到CLine
		Old -> CLine = Temp;
		free ( Temp ) ;//将NULL置空
		/*
		TO 
		注意这里扩展表达式空间的方式与原定的方式不同
		原来采用链表结构实现,但是这种方法过于复杂,所以放弃
		现在采用的方法是当表达式空间不够的时候,重新申请一段比原来更长的内存
		然后把原来的表达式复制到新的空间,再把原来的Liner类的CLine域指针指向新申请的内存上
		*/
	}
}

/*
  Function Name:GetLine
  Author: 
  Description:用于得到初始表达式
*/
void GetLine ( Liner * CalLine )
//参数CalLine在传入前应该初始化,GetLine不对其进行合法性检查
{
	int i = 0;//临时变量,用于标记位置
	/*
	采用非缓冲输入输出系统
	*/
	while (\
	((* (( CalLine -> CLine ) + i ) = getch ()) != '=' )\
	&& \
	((* (( CalLine -> CLine ) + i )) != 13 )\
	)
	//!!!!!!!!!!!!!!
	//!!!!!!!!!!!!!!
	//!!问题代码!!问题代码!!
	//!!!!!!!!!!!!!!
	//!!!!!!!!!!!!!!
	/*
	一个超长的while判断!实际上提供一个小一些的消息循环
	当输入不为=或者回车的时候就继续等候输入
	*/
	{
		putch ( *(( CalLine -> CLine ) + i ));//将输入的字符回显在屏幕上
		/*
		以下代码对输入的字符进行合法性检查
		表达式只能由
		1 数字
		2 小数点
		3 英文字母
		4 空格(空格不起任何实质性作用,只用于输入方便,表达式读入时虑过)
		5 * / + - 四个符号
		6 ^(乘方号)
		7 () 左右小括
		8 = 等号
		9 回车符
		10 冒号
		11 感叹号
		组成
		其余符号全部不能被输入
		本函数对输入字符的合法性进行检验,但是对其语法合法性不做检验
		*/
		if ( isalnum (*(( CalLine -> CLine ) + i )))
		{
			*(( CalLine -> CLine ) + i ) = tolower (*(( CalLine -> CLine ) + i ));
			if ( i == (( CalLine -> LineLen ) - 1 ))
			{
				LinerExpand ( CalLine );//若此时空间不足,则扩展空间
			}
			else
			{
				++i;//检查是否为0~9数字或者字母,若是则i加1
			}
		}
		else if (*(( CalLine -> CLine ) + i ) == ' ' )
		{
                        if ( i == (( CalLine -> LineLen ) - 1 ))
			{
				LinerExpand ( CalLine );//若此时空间不足,则扩展空间
			}
			else
			{
				//检查是否为空格,若是则i加1
			}
		}
		else if ( *(( CalLine -> CLine ) + i ) == '.'\
		|| *(( CalLine -> CLine ) + i ) == ':'\
		|| *(( CalLine -> CLine ) + i ) == '('\
		|| *(( CalLine -> CLine ) + i ) == ')'\
		|| *(( CalLine -> CLine ) + i ) == '^'\
		|| *(( CalLine -> CLine ) + i ) == '+'\
		|| *(( CalLine -> CLine ) + i ) == '-'\
		|| *(( CalLine -> CLine ) + i ) == '*'\
		|| *(( CalLine -> CLine ) + i ) == '\''\
		|| *(( CalLine -> CLine ) + i ) == '/'\
		|| *(( CalLine -> CLine ) + i ) == '!' )
		//超大的判断
		{
                        if ( i == (( CalLine -> LineLen ) - 1 ))
			{
				LinerExpand ( CalLine );//若此时空间不足,则扩展空间
			}
			else
			{
				++i;//检查是否为其他字符,若是则i加1
			}
		}
		else if ( *(( CalLine -> CLine ) + i ) == BACKSPACE )
		{
			if ( i > 0 )
			{
				--i;
			}
			putch ( ' ' );
			putch ( '\b' );
		}
		else
		{
			putch('\b');
			putch(' ');
			putch('\b');//将不合法的字符清除,造成输不进去的结果
		}
	}
	*( CalLine -> CLine + i ) = '\0';//设置表达式的结束标志
}

/*
  Function Name:GetLineFile
  Author: 
  Description:从文件得到初始表达式
*/

void GetLineFile ( Liner * CalLine , FILE * LineFile )
//参数CalLine在传入前应该初始化,GetLine不对其进行合法性检查
{
	int i = 0;//临时变量,用于标记位置
	/*
	采用非缓冲输入输出系统
	*/
	while (	feof ( LineFile ) == 0 )
	//!!!!!!!!!!!!!!
	//!!!!!!!!!!!!!!
	//!!问题代码!!问题代码!!
	//!!!!!!!!!!!!!!
	//!!!!!!!!!!!!!!
	/*
	一个超长的while判断!实际上提供一个小一些的消息循环
	当输入不为=或者回车的时候就继续等候输入
	*/
	{
		*(( CalLine -> CLine ) + i ) = getc ( LineFile );
		putch ( *(( CalLine -> CLine ) + i ));//将输入的字符回显在屏幕上
		/*
		以下代码对输入的字符进行合法性检查
		表达式只能由
		1 数字
		2 小数点
		3 英文字母
		4 空格(空格不起任何实质性作用,只用于输入方便,表达式读入时虑过)
		5 * / + - 四个符号
		6 ^(乘方号)
		7 () 左右小括
		8 = 等号
		9 回车符
		10 冒号
		11 感叹号
		组成
		其余符号全部不能被输入
		本函数对输入字符的合法性进行检验,但是对其语法合法性不做检验
		*/
		if ( isalnum (*(( CalLine -> CLine ) + i )))
		{
			if ( i == (( CalLine -> LineLen ) - 1 ))
			{
				LinerExpand ( CalLine );//若此时空间不足,则扩展空间
			}
			else
			{
				++i;//检查是否为0~9数字或者字母,若是则i加1
			}
		}
		else if (*(( CalLine -> CLine ) + i ) == ' ' )
		{
                        if ( i == (( CalLine -> LineLen ) - 1 ))
			{
				LinerExpand ( CalLine );//若此时空间不足,则扩展空间
			}
			else
			{
				//检查是否为空格,若是则i不加1
			}
		}
		else if ( *(( CalLine -> CLine ) + i ) == '.'\
		|| *(( CalLine -> CLine ) + i ) == ':'\
		|| *(( CalLine -> CLine ) + i ) == '('\
		|| *(( CalLine -> CLine ) + i ) == ')'\
		|| *(( CalLine -> CLine ) + i ) == '^'\
		|| *(( CalLine -> CLine ) + i ) == '+'\
		|| *(( CalLine -> CLine ) + i ) == '-'\
		|| *(( CalLine -> CLine ) + i ) == '*'\
		|| *(( CalLine -> CLine ) + i ) == '\''\
		|| *(( CalLine -> CLine ) + i ) == '/'\
		|| *(( CalLine -> CLine ) + i ) == '!'\
		/*|| *(( CalLine -> CLine ) + i ) == EOF*/ )
		//超大的判断
		{
                        if ( i == (( CalLine -> LineLen ) - 1 ))
			{
				LinerExpand ( CalLine );//若此时空间不足,则扩展空间
			}
			else
			{
				++i;//检查是否为其他字符,若是则i加1
			}
		}
		else if ( * (( CalLine -> CLine ) + i ) != EOF )
		{
			/*Error ( E_GE_FILE );//报错并中止
			free ( CalLine -> CLine );
			free ( CalLine );
			break;*/
			putch ( 'z' );
		}
	}
	*( CalLine -> CLine + i - 1 ) = '\0';//设置表达式的结束标志
}

⌨️ 快捷键说明

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