📄 jisuanqinew.cpp
字号:
printf("\n\n\t************ Debugging Information Are Closed ************\n\n");
Debug=0;
}
else
{
printf("\n\n\t************ Debugging Information Has Opened ************\n\n");
Debug=1;
}
}
}
}
void Show_About() //显示关于
{
system("cls");
printf("\n\t\t\t Expression Calculator V0.2\n");
printf("\n\tFunctional Profiles:\n");
printf("\t1.Support Real-Mathematical Operations,ect.:7+5(3^-1+4)*(1+9.44\n");
printf("\t2.Support Relations Operations,ect.:4+8.45>=3456.1234+233^-2.94\n");
printf("\t3.Support Save the Expression and Results to File\n");
printf("\t4.Support Load Expression for Calculate From File\n");
printf("\t5.Support Humanization Guide Mode\n");
printf("\t----------------------------------------------------\n");
getch();
}
int Menu_Sel() // 显示表达式计算主菜单...
{
char Sel;
int MaxItem=4;
printf("\n\t\t Expression Calculator\n");
printf("\t\t ===================================\n");
printf("\t\t | 1.[P]ress an Expression |\n");
printf("\t\t | 2.[L]oad Expression From File |\n");
printf("\t\t | ----------------------------- |\n");
printf("\t\t | 3.[C]lear Screen |\n");
printf("\t\t | 4.[A]bout ME |\n");
printf("\t\t | 0.[E]xit |\n");
printf("\t\t ===================================\n");
printf("\t\t Press a Key to Continue(0-%d):",MaxItem);
for (;;)
{
Sel=getch();
if ((Sel<'0'||Sel>MaxItem+'0')&&Sel!='D'&&Sel!='P'&&Sel!='p'&&Sel!='L'&&Sel!='l'&&Sel!='C'&&Sel!='c'&&
Sel!='A'&&Sel!='a'&&Sel!='E'&&Sel!='e'&&Sel!='X'&&Sel!='x'&&Sel!=27)
{
printf("\n\t\t Press Error! Please Retry(0-%d):",MaxItem);
}
else
break;
}
return Sel-'0';
}
int Do_Press() //手工输入表达式求值
{
char sel;
int WF=0; // 文件写入开关
char FN[256]; // 文件名
char strExp[Max]; // 要计算的表达式
double strRes; // 计算结果
int TF=0; // 真假判断
int strChk_Re=0;
FILE *fp;
printf("\nWhether Save The Expression and Result to File(Y/N)?");
scanf("%s",&sel); // 保存到文件
if(sel=='Y'||sel=='y')
{
WF=1;
for(;;)
{
printf("Press a File Name for Save Log(Press \'`\' to Exit):");
scanf("%s",FN);
if(FN[0]=='`') // 设置取消陷阱
{
WF=0;
printf("\nYou Cancelled Save Log Operation!\n");
break;
}
if (FileChk(FN)) // 文件检查
{
fp=fopen(FN,"a");
break;
}
}
}
for(;;)
{
printf("Please Press an Expression(Press a \'`\' to Exit):\n");
scanf("%s",strExp);
if(strExp[0]=='`') break; //设置取消陷阱
strChk_Re=StrChk(strExp);
if(strChk_Re==0) // 错误退出
{
printf("NO Activate Calculation...\n");
}
else if(strChk_Re==1) // 表达式计算
{
strRes=Operation(strExp);
StrReplace(strExp,'#','-');
if((long int)strRes==strRes) // 呵呵,去掉小数点
{
if(Debug) printf("...Conversion Double to Long Int.\n");
printf("\n%s=%ld\n",strExp,(long int)strRes);
if(WF) fprintf(fp,"%s=%ld\n",strExp,(long int)strRes);
}
else
{
printf("\n%s=%f\n",strExp,strRes);
if(WF) fprintf(fp,"%s=%f\n",strExp,strRes);
}
}
else // 表达式关系判断
{
TF=Nexus(strExp); // 调用判断函数判断
StrReplace(strExp,'#','-');
printf("\n%s --> %s\n",strExp,TF_Info[TF]);
if(WF) fprintf(fp,"%s --> %s\n",strExp,TF_Info[TF]);
}
getch();
}
if(WF) fclose(fp);
return 0;
}
int Do_File()// 文件导入表达式求值
{
char iFN[256]; // 输入文件名
char oFN[256]; // 临时文件名
FILE *ifp,*ofp;
double strRes; // 计算结果
char strExp[Max]; // 读取的字符串,也就是要计算的字符串
int TF=0; // TRUE FALSE Error 索引
int OutOther=0; // 输出到其它文件开关
int strChk_Re;
for(;;)
{
printf("\nPlease Press a File Name to Open(Press a \'`\' to Exit):\n"); //输入要打开的文件名
scanf("%s",iFN);
if(iFN[0]=='`') return 0;
ifp=fopen(iFN,"r");
if(ifp==0) // 文件存在检查
{
printf("File %s NOT Exist or Open Error!\n",iFN);
}
else break;
}
for(;;)
{
printf("\nPlease Press a File Name To Save(Press a \'`\' to Save to %s):\n",iFN); // 输入要打开的文件名
scanf("%s",oFN);
if(oFN[0]=='`')
{
strcpy(oFN,iFN); // 临时文件名,以及打开它
strcat(oFN,".null");
ofp=fopen(oFN,"w");
OutOther=0;
break;
}
else
{
if (FileChk(oFN))
{
ofp=fopen(oFN,"a");
OutOther=1;
break;
}
}
}
while(feof(ifp)==0) //如果没有读到文件尾
{
fscanf(ifp,"%s\n",strExp); // 逐行读取文件内容
strChk_Re=StrChk(strExp);
if(strChk_Re==0) // 合法性检查
{
printf("Fall Across Illegal Char...\n");
fprintf(ofp,"%s Include Illegal Char, Can't Calculate!\n",strExp);
}
else if(strChk_Re==1) //表达式计算
{
strRes=Operation(strExp); // 计算
StrReplace(strExp,'#','-');
if((long int)strRes==strRes) //去掉小数点及其后的 '0'
{
if(Debug) printf("...Conversion Double to Long Int.\n");
printf("\n%s=%ld\n",strExp,(long int)strRes);
fprintf(ofp,"%s=%ld\n",strExp,(long int)strRes);
}
else
{
printf("\n%s=%f\n",strExp,strRes); //屏幕打印
fprintf(ofp,"%s=%f\n",strExp,strRes); //打印输出到文件
}
}
else // 表达式关系判断
{
TF=Nexus(strExp);
StrReplace(strExp,'#','-');
printf("\n%s --> %s\n",strExp,TF_Info[TF]);
fprintf(ofp,"%s --> %s\n",strExp,TF_Info[TF]);
}
}
fclose(ifp); // 关闭文件
fclose(ofp);
if(OutOther)
{
printf("\nFile %s Operation Completed and The Result Save to %s...\n",iFN,oFN);
}
else
{
remove(iFN); //删除文件
rename(oFN,iFN); //重命名文件 int rename(const char *oldname, const char *newname);
printf("\nFile %s Operation Completed...\n",iFN);
}
getch();
return 0;
}
int FileChk(char FN[]) // 文件检查 0 重新输入,1 继续
{
FILE *fp;
char sel;
int nCount=0;
for(;FN[nCount];nCount++) //文件名合法检查 '\' 不好过滤...
{
if(FN[nCount]=='/'||FN[nCount]==':'||FN[nCount]=='*'||FN[nCount]=='?'||FN[nCount]=='\"'||FN[nCount]=='<'||FN[nCount]=='>'||FN[nCount]=='|')
{
printf("File Name %s Include Illegal Char \'%c\',Please Press a New One!\n",FN,FN[nCount]);
return 0;
}
}
fp=fopen(FN,"r");
if(fp==0) // 文件存在检查
{
fp=fopen(FN,"w"); //创建文件
if(fp==0) // 创建检查
{
printf("File %s Create Failure!\n",FN);
return 0; // 不可修复错误
}
fclose(fp);
return 1; // 成功提示
}
fclose(fp);
printf("File %s Already Exist,Rewrite or Cancel or Append(Y/N/A)?",FN); //文件存在了...
scanf("%s",&sel);
if(sel=='Y'||sel=='y') //覆盖
{
fp=fopen(FN,"w"); // 覆盖检查
if(fp==0)
{
printf("File %s Rewrite Failure!\n",FN);
return 0;
}
fclose(fp);
return 1;
}
else if(sel=='A'||sel=='a') // 允许追加
{
return 1;
}
else // 返回...
{
return 0;
}
}
int Nexus(char strIn[]) // 关系运算
{
int nCount=0; //循环索引 '>'=1 '<'=2 '='=4 '!'=8
char strTmp;
char strBuf[Max];
int iNexus=0; // 符号代码
double strRes1; //分步结果
double strRes2; //符号代码
for(;strIn[nCount];nCount++)
{
strTmp=strIn[nCount];
if(strTmp=='>'||strTmp=='<'||strTmp=='='||strTmp=='!')
{
Left_f(strIn,strBuf,nCount); // 提取字符串
if(StrChk(strBuf)!=1) // 二次检查
{
iNexus=0;
break;
}
strRes1=Operation(strBuf); // 存储结果
iNexus=0; // 初始化符号代码
if(strTmp=='>') iNexus++; //符号代码调整
else if(strTmp=='<') iNexus+=2;
else if(strTmp=='=') iNexus+=4;
else iNexus+=8;
strTmp=strIn[nCount+1]; // 取下一个字符
if(strTmp=='>'||strTmp=='<'||strTmp=='=')
{ // 符号代码调整
if(strTmp=='>') iNexus++;
else if(strTmp=='<') iNexus+=2;
else iNexus+=4;
nCount++; // 移动索引号
}
Right_f(strIn,strBuf,strlen(strIn)-nCount-1);
if(StrChk(strBuf)!=1) // 二次检查
{
iNexus=0;
break;
}
strRes2=Operation(strBuf);
break;
}
}
switch(iNexus) // 关系比较
{
case 1: // >
if(strRes1>strRes2) return 1;
else return 0;
case 2: // <
if(strRes1<strRes2) return 1;
else return 0;
case 4: case 8: // =,==
if(strRes1==strRes2) return 1;
else return 0;
case 3: case 12: // <> !=
if(strRes1!=strRes2) return 1;
else return 0;
case 5: // >=
if(strRes1>=strRes2) return 1;
else return 0;
case 6: // <=
if(strRes1<=strRes2) return 1;
else return 0;
default: // 出错,唉,如果发现多组关系运算符就...
return 2;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -