📄 linetype.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 + -