?? common.cpp
字號:
#include <stdlib.h>
#include "common.h"
int error = NULL;
int prec = 6;
int infocmd = 0;
int infoarg = 0;
int ArgCounter = 0;
char VarName[MAXSIZE];
char *expString = NULL;
char *Unknown = NULL;
char *Command[2];
bool vision = false;
NODE *ExpressionHead = NULL;
NODE *ExpressionTail = NULL;
VARIABLE *VariableList = NULL;
VARIABLE *VariableListTail = NULL;
FUNCTION FunctionList[FUNCTION_MAXLENGTH] = {
{"sin",21},{"cos",22},{"tan",23},{"cot",24},{"arcsin",25},{"arccos",26},{"arctan",27},{"arccot",28},{"ln",29},{"lg",30}
};
bool strcopy (
char dest[],
char sour[],
int n
)
{
int i;
for (i = 0;i < n-1 && sour[i] != NULL;i ++) {
dest[i] = sour[i];
}
if (i >= n) {
return false;
} else {
dest[i] = NULL;
return true;
}
}
bool strcmp_a(const char str1[],const char str2[])
{
int i=0;
for(;str1[i] != NULL && str2[i] != NULL;i++) {
if(str1[i] != str2[i]) {
return false;
}
}
if (str1[i] == NULL && str2[i] == NULL) {
return true;
} else {
return false;
}
}
bool strmatch (
const char sour[],
const char p[]
)
/*++
函數描述:
功能:
實現字符串(字母序列)的大小寫模糊匹配
參數:
sour - 原字符串(字母序列)
p - 要匹配的字符串(字母序列)
返回值:
若匹配返回 true ,否則返回 false
--*/
{
int i;
for (i = 0;i < FUNCTION_NAME_MAXLENGTH && sour[i] != NULL && p[i] != NULL;i ++) {
if ((sour[i] - p[i])%32 != 0) {
return false;
}
}
if (sour[i] == NULL && p[i] == NULL) {
return true;
} else {
return false;
}
}
VARIABLE *NewVarNode (
char *NewName,
OPERAND NewOperand
)
{
VARIABLE *tmp;
tmp = (VARIABLE *) malloc (sizeof (VARIABLE));
if (tmp == NULL) {
error = memmory_allocation_failed;
return NULL;
}
strcopy (tmp->Name,NewName,MAXSIZE);
tmp->Operand = NewOperand;
tmp->Next = NULL;
return tmp;
}
VARIABLE *InsertVarNode (
VARIABLE *Tail,
VARIABLE *NewVar
)
{
if (Tail != NULL) {
Tail->Next = NewVar;
Tail = NewVar;
}
return Tail;
}
NODE *NewNode (
TERM NewTerm,
int NewTermSignal
)
/*++
函數描述:
功能:
生成一個新的結點
參數:
NewTerm - 一個新的項
NewTermSignal - 一個新的項標志
返回值:
無
--*/
{
NODE *p;
if ((p = (NODE *)malloc(sizeof(NODE))) != NULL) {
p->Term = NewTerm;
p->TermSignal = NewTermSignal;
p->Next = NULL;
}
return p;
}
void DeleteNodes (
NODE *first,
NODE *last
)
/*++
函數描述:
功能:
銷毀從 first 到 last 的所有結點 (不包含 first 結點)
并將 first 結點和 last 之后的結點鏈接起來
參數:
返回值:
無
--*/
{
NODE *tp,*savenext;
if (first != NULL && last != NULL) {
tp = first->Next;
first->Next = last->Next;
while (tp != first->Next) {
savenext = tp->Next;
free (tp);
tp = savenext;
}
}
}
void DeleteList (
NODE *head
)
/*++
函數描述:
功能:
銷毀整個鏈表,釋放內存
參數:
head - 鏈表頭指針
返回值:
無
--*/
{
NODE *savenext;
while (head!=NULL) {
savenext=head->Next;
free (head);
head=savenext;
}
}
void NODEcopy (
NODE *dest,
NODE *sour
)
/*++
函數描述:
功能:
將 sour 中的內容復制到 dest 中
參數:
返回值:
無
--*/
{
dest->Next = sour->Next;
dest->Term = sour->Term;
dest->TermSignal = sour->TermSignal;
}
void NODEcopyWithoutNext(
NODE *dest,
NODE *sour
)
{
dest->Term = sour->Term;
dest->TermSignal = sour->TermSignal;
}
void InsertAfter (
NODE *Target,
NODE *s
)
{
if (Target != NULL) {
s->Next = Target->Next;
Target->Next = s;
}
}
NODE *InsertEnd (
NODE *Tail,
NODE *s
)
/*++
函數描述:
功能:
在鏈表尾部插入一個結點
參數:
Tail - 鏈表尾結點
s - 要插入的結點
返回值:
返回鏈表的尾結點
--*/
{
if (Tail != NULL) {
Tail->Next = s;
s ->Next = NULL;
Tail = s;
}
return Tail;
}
int FunctionSearch (
FUNCTION FunctionList[],
char name[],
TERM *tempTerm
)
/*++
函數描述:
功能:數學函數查找,查找sin cos 等數學函數
參數:
FunctionList - 數學函數列表
name - 要查詢的函數名
tempTerm - 保存詢到的函數內部表示
返回:函數的內部表示數字
--*/
{
int i;
for (i = 0;i < FUNCTION_MAXLENGTH;i ++) {
if (strmatch (FunctionList[i].FunctionName,name)) {
tempTerm->Operator.Symbol = FunctionList[i].FunctionOperator;
tempTerm->Operator.Priority = 1;
tempTerm->Operator.OperandNumber = 1;
return MATH_FUNCTION;
}
}
return NULL;
}
bool FunctionNameSearch (
FUNCTION FunctionList[],
char symbol,
char name[]
)
{
int i;
for (i = 0;i < FUNCTION_MAXLENGTH;i ++) {
if (symbol == FunctionList[i].FunctionOperator) {
strcopy (name,FunctionList[i].FunctionName,FUNCTION_NAME_MAXLENGTH);
return true;
}
}
return false;
}
int VariableSearch (
VARIABLE *VariableList,
char name[],
TERM *tempTerm
)
/*++
函數描述:
功能:查找自定義變量,獲取變量中保存的值
參數:
VariableList - 自定義變量列表
name - 要查詢的變量名
tempTerm - 保存查詢到的自定義變量的值
返回:函數的內部表示數字
--*/
{
VARIABLE *p = NULL;
for (p = VariableList;p != NULL;p = p->Next) {
if (strmatch (p->Name,name)) {
tempTerm->Operand = p->Operand;
return ISVARIABLE;
}
}
return NULL;
}
VARIABLE *VariableSearch (
VARIABLE *VariableList,
char name[]
)
/*++
函數描述:
功能:查找自定義變量,獲取變量中保存的值
參數:
VariableList - 自定義變量列表
name - 要查詢的變量名
返回值:
找到的變量的地址
--*/
{
VARIABLE *p = NULL;
for (p = VariableList;p != NULL;p = p->Next) {
if (strcmp_a (p->Name,name)) {
return p;
}
}
return NULL;
}
void PrintVariable (
void
)
{
VARIABLE *p =NULL;
for (p = VariableList;p != NULL;p = p->Next) {
printf ("%s:",p->Name);
if (p->Operand.DataSignal == FLOAT) {
printf ("%f\n",p->Operand.Data.Real);
} else {
printf ("%d\n",p->Operand.Data.Integer);
}
}
}
void PrintList (
void
)
/*++
函數描述:
功能:
輸出鏈表中有意義的內容
參數:
Head - 鏈表的表頭指針
返回值:
無
--*/
{
NODE *p;
if (error != NULL || vision == false) {
return;
}
for (p = ExpressionHead;p != NULL;p = p->Next) {
if (p == ExpressionHead || p == ExpressionTail) {
continue;
}
if (p->TermSignal == ISDATA || p->TermSignal == ISVARIABLE) {
if (p->Term.Operand.DataSignal == INTEGER) {
printf ("%d",p->Term.Operand.Data.Integer);
} else {
printf ("%f",p->Term.Operand.Data.Real);
}
} else if (p->TermSignal == MATH_FUNCTION){
char mathfunctionname[FUNCTION_NAME_MAXLENGTH];
FunctionNameSearch (FunctionList,p->Term.Operator.Symbol,mathfunctionname);
printf ("%s",mathfunctionname);
} else {
printf ("%c",p->Term.Operator.Symbol);
}
putchar (' ');
}
}
void usage (
void
)
{
printf ("用法:\n");
printf ("有四個可用命令 set view help exit\n");
printf ("set 設置環境變量和自定義變量\n");
printf ("set [prec|自定義變量名] [表達式]]\n");
printf ("view 查看環境變量和已定義變量\n");
printf ("view [prec|自定義變量名|all]\n");
printf ("help 顯示幫助\n");
printf ("help [沒有參數]\n");
printf ("exit 退出程序\n");
printf ("exit [沒有參數]\n\n");
}
void logo (
void
)
{
printf ("=============== calculator ===============\n\n");
printf (" 程序能完成一定范圍內的算術運算\n");
printf (" + - * / \\(求余) %(百分號)\n");
printf (" 和三角,反三角,對數,指數函數運算\n");
printf (" sin arctan ln(自然對數) lg(10為底的對數)\n");
printf (" 還支持常量和自定義變量(用 set 變量名 表達式 定義變量)\n");
printf (" pai(3.1415926) e(2.71828)\n");
printf (" 可以用 set 設置顯示精度(prec)(默認是 6 )\n");
printf (" 說明:只用用字母序列作為變量名,輸入 help 可得到幫助\n\n");
}
void InitVvar (
void
)
{
VARIABLE *tmp;
OPERAND NewOperand;
NewOperand.DataSignal = FLOAT;
NewOperand.Data.Real = 3.1415926535897932385;
VariableList = NewVarNode ("pai",NewOperand);
if (VariableList == NULL) {
error = memmory_allocation_failed;
return;
}
VariableListTail = VariableList;
NewOperand.Data.Real = 2.7182818284590452354;
tmp = NewVarNode ("e",NewOperand);
if (VariableList == NULL) {
error = memmory_allocation_failed;
return;
}
VariableListTail = InsertVarNode (VariableListTail,tmp);
}
void FreeCMD (
void
)
{
int i;
for (i = 0;i < 2;i ++) {
if (Command[i] != NULL) {
free (Command[i]);
Command[i] = NULL;
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -