找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 12854|回复: 0

JAVA第三方计算工具: jcalc

[复制链接]
发表于 2017-8-6 23:28:29 | 显示全部楼层 |阅读模式
[1.0.0.6]版,修复数组边界漏洞,修复随机函数算法。
跨平台JAVA第三方计算工具: jcalc.jar,使用增强版revpolish核心打造的。从 手机端 到 桌面端、服务器端 全覆盖运行。(所有图片一律为外链,jar包仅10kb,请下载附件)
链接: https://pan.baidu.com/s/1HhUgmb_dcFTqVD4v42TRrw?pwd=kx3x
兼容性   :java 1.6、java7、java8
跨平台性:完全做到一次编译,处处运行。可在各类安卓手机上直接运行,windows、linux、unix、mac、树莓派、各类微型智能设备,只要具备jre环境均可运行,不具备也可使用API转化技术运行。针对IOS设备可使用j2oc转化技术运行。
WINDOWS下运行图


linux下运行图

手机端运行请使用 ej 脚本运行http://www.bathome.net/thread-44950-1-1.html,更为便捷。
安卓手机下运行图


原创代码:

  1. package com.android.jcalc;


  2. /**Main主类
  3. * @author Happy from BatHome
  4. * @date Thu Aug 06 2017 20:11:16 GMT+0800
  5. * @description jcalc.jar
  6. */
  7. public class Main
  8. {
  9.         //帮助说明
  10.         private static final String HELP_INFORMATION =
  11.             ""
  12.             + "JCALC.JAR - JAVA CONSOLE CALCULATE TOOL, COPYRIGHT@2017~2019 BY HAPPY\n"
  13.             + "-----------------------------------------------------------------------\n"
  14.             + "Usage instructions:\n"
  15.             + "       java -jar jcalc.jar [expression]\n"
  16.             + "       java -Xms128m -Xmx1024m -jar jcalc.jar ...\n"
  17.             + "-----------------------------------------------------------------------\n"
  18.             + "General options:\n"
  19.             + "       --help, -h  Show help information\n\n"
  20.             + "Available math function:\n"
  21.             + "       pi=3.1415926535897932, e=2.7182818284590452\n"
  22.             + "       rand, round, int, ceil, floor, abs, sqrt, lg, ln, exp, cbrt\n"
  23.             + "       torad, sin, cos, tan, arcsin, arccos, arctan\n"
  24.             + "       sinh, cosh, tanh, arcsinh, arccosh, arctanh\n\n"
  25.             + "Official website:\n"
  26.             + "       http://www.bathome.net/thread-18688-1-1.html\n"
  27.             + "-----------------------------------------------------------------------\n"
  28.             + "AT LEAST JRE1.6, VERSION: 1.0.0.6\n";

  29.         //数学函数关键词
  30.         private static final String KEY_WORDS[]= {"e", "pi", "sqrt", "lg", "ln", "sin", "cos", "tan", "arcsin", "arccos", "arctan", "torad", "abs", "round", "floor", "ceil", "exp", "sinh", "cosh", "tanh", "arcsinh", "arccosh", "arctanh", "int", "cbrt", "rand", null};

  31.         //创建计算的堆栈
  32.         private static final int STACK_SIZE = 1024;
  33.         private static char[] STACK1= new char[STACK_SIZE];
  34.         private static char[] STACK2= new char[STACK_SIZE];
  35.         private static double[] STACK3= new double[STACK_SIZE];


  36.         /**阶乘函数
  37.          * @param n
  38.          * @return
  39.          */
  40.         private static long fact(long n)
  41.         {
  42.                 return (n<2) ?1 :n*(fact(n-1));
  43.         }
  44.        
  45.         /**计算器核心
  46.          * @param expression
  47.          */
  48.         private static double JCalcCore(String expression)
  49.         {
  50.                 char[] parseArray = expression.toCharArray();
  51.                 int parseArrayLen = parseArray.length;

  52.                 char[] tmpKeyCharArray;
  53.                 int tmpKeyCharArrayLen;

  54.                 int indexS1=0, indexS2=0, indexS3=0, brackets=0, indexKey, op, cp, kp;
  55.                 double di, ni;


  56.                 STACK3[0]=0;
  57.                 op = 0;

  58.                 //生成逆波兰
  59.                 while(op < parseArrayLen)
  60.                 {
  61.                         switch(parseArray[op])
  62.                         {
  63.                         case ' ' :
  64.                         case '\t':
  65.                         case '\r':
  66.                         case '\n':
  67.                                 //过滤空字符
  68.                                 op++;
  69.                                 continue;

  70.                         case '(':
  71.                                 brackets++;
  72.                                 STACK1[++indexS1]=parseArray[op];
  73.                                 if(parseArray[op+1]=='-' || parseArray[op+1]=='+')
  74.                                 {
  75.                                         STACK2[indexS2++]='0';
  76.                                         STACK2[indexS2++]=' ';
  77.                                 }
  78.                                 break;

  79.                         case ')':
  80.                                 //验证括号是否闭合
  81.                                 if(brackets ==0)
  82.                                 {
  83.                                         System.out.println("The brackets or ')' are not need");
  84.                                         System.exit(1);
  85.                                 }
  86.                                 brackets--;
  87.                                 while(STACK1[indexS1] != '(')
  88.                                 {
  89.                                         STACK2[indexS2++] = STACK1[indexS1--];
  90.                                 }
  91.                                 //舍弃'('
  92.                                 indexS1--;
  93.                                 break;

  94.                         case '+':
  95.                         case '-':
  96.                                 while( (indexS1 != 0) && (STACK1[indexS1] != '(') )
  97.                                 {
  98.                                         STACK2[indexS2++] = STACK1[indexS1--];
  99.                                 }
  100.                                 STACK1[++indexS1] = parseArray[op];
  101.                                 break;

  102.                         case '^':
  103.                                 //指数符
  104.                                 while('A'<=STACK1[indexS1] && STACK1[indexS1]<='Z')
  105.                                 {
  106.                                         STACK2[indexS2++] = STACK1[indexS1--];
  107.                                 }
  108.                                 STACK1[++indexS1] = parseArray[op];
  109.                                 break;

  110.                         case '!':
  111.                                 //阶乘符
  112.                                 STACK2[indexS2++] = parseArray[op];
  113.                                 break;

  114.                         case '%':
  115.                         case '*':
  116.                         case '/':
  117.                                 while(
  118.                                     (
  119.                                         ('A' <= STACK1[indexS1]) &&
  120.                                         (STACK1[indexS1] <= 'Z')
  121.                                     )                    ||
  122.                                     STACK1[indexS1]=='%' ||
  123.                                     STACK1[indexS1]=='*' ||
  124.                                     STACK1[indexS1]=='/' ||
  125.                                     STACK1[indexS1]=='^'
  126.                                 )
  127.                                 {
  128.                                         STACK2[indexS2++] = STACK1[indexS1--];
  129.                                 }
  130.                                 STACK1[++indexS1] = parseArray[op];
  131.                                 break;

  132.                         default :
  133.                                 if('a'<=parseArray[op] && parseArray[op]<='z')
  134.                                 {
  135.                                         //识别数学函数关键词
  136.                                         indexKey = 0;
  137.                                         while(KEY_WORDS[indexKey] != null)
  138.                                         {
  139.                                                 cp=op;
  140.                                                 kp=0;

  141.                                                 tmpKeyCharArray = KEY_WORDS[indexKey].toCharArray();
  142.                                                 tmpKeyCharArrayLen = tmpKeyCharArray.length;

  143.                                                 //比对关键词字母
  144.                                                 while(
  145.                                                         (kp < tmpKeyCharArrayLen) &&
  146.                                                         (cp < parseArrayLen)      &&
  147.                                                         (parseArray[cp] == tmpKeyCharArray[kp])
  148.                                                 ){
  149.                                                         cp++;
  150.                                                         kp++;
  151.                                                 }
  152.                                                 //验证关键词结尾
  153.                                                 if(
  154.                                                                 (kp == tmpKeyCharArrayLen) &&
  155.                                                                 (
  156.                                                                                 (tmpKeyCharArrayLen == parseArrayLen)      ||
  157.                                                                                 (parseArray[cp]<'a' || parseArray[cp]>'z')
  158.                                                                 )               
  159.                                                 )
  160.                                                 {
  161.                                                         op=cp;
  162.                                                         break;
  163.                                                 }
  164.                                                 indexKey++;
  165.                                         }
  166.                                         //构建伪双目
  167.                                         if(KEY_WORDS[indexKey] != null)
  168.                                         {
  169.                                                 STACK2[indexS2++]='.';
  170.                                                 STACK2[indexS2++]=' ';
  171.                                                 //伪双目入栈
  172.                                                 while('A'<=STACK1[indexS1] && STACK1[indexS1]<='Z')
  173.                                                 {
  174.                                                         STACK2[indexS2++] = STACK1[indexS1--];
  175.                                                 }
  176.                                                 STACK1[++indexS1] = (char)(indexKey+65);
  177.                                                 continue;
  178.                                         }
  179.                                         else
  180.                                         {
  181.                                                 //无法识别的数学函数
  182.                                                 System.out.println("Unrecognized math function\n");
  183.                                                 System.exit(1);
  184.                                         }

  185.                                 }
  186.                                 else if(('0'<=parseArray[op] && parseArray[op]<='9') || (parseArray[op]=='.'))
  187.                                 {
  188.                                         //浮点数入栈
  189.                                         while(
  190.                                                         (op < parseArrayLen) &&
  191.                                                         (
  192.                                                                 ('0'<=parseArray[op] && parseArray[op]<='9') ||
  193.                                                                 (parseArray[op]=='.')
  194.                                                         )
  195.                                         ){
  196.                                                 STACK2[indexS2++] = parseArray[op++];
  197.                                         }
  198.                                        
  199.                                         if(
  200.                                                         (op < parseArrayLen) &&
  201.                                                         ('a'<=parseArray[op] && parseArray[op]<='z')
  202.                                         ){
  203.                                                 //缺少必要的运算符
  204.                                                 System.out.println("Missing required operator\n");
  205.                                                 System.exit(1);
  206.                                         }
  207.                                         op--;
  208.                                         STACK2[indexS2++] = ' ';
  209.                                 }
  210.                                 else
  211.                                 {
  212.                                         //无法识别的运算符
  213.                                         System.out.println("Unrecognized operator\n");
  214.                                         System.exit(1);
  215.                                 }
  216.                                 break;
  217.                         }
  218.                         op++;
  219.                 }

  220.                 //验证括号是否闭合
  221.                 if(brackets !=0)
  222.                 {
  223.                         System.out.println("The brackets '(' are not closed\n");
  224.                         System.exit(1);
  225.                 }

  226.                 //收尾逆波兰
  227.                 while(indexS1 !=0)
  228.                 {
  229.                         STACK2[indexS2++] = STACK1[indexS1--];
  230.                 }
  231.                 STACK2[indexS2] = ' ';

  232.                 //计算逆波兰
  233.                 op=0;
  234.                 while(STACK2[op] != ' ')
  235.                 {
  236.                         switch(STACK2[op])
  237.                         {
  238.                         case 'A':
  239.                                 STACK3[indexS3] = Math.E;
  240.                                 break;
  241.                         case 'B':
  242.                                 STACK3[indexS3] = Math.PI;
  243.                                 break;
  244.                         case 'C':
  245.                                 if(STACK3[indexS3] <0)
  246.                                 {
  247.                                         //负数没有平方根
  248.                                         System.out.println("Negative numbers have no square root\n");
  249.                                         System.exit(1);
  250.                                 }
  251.                                 STACK3[indexS3 - 1] = Math.sqrt(STACK3[indexS3]);
  252.                                 indexS3--;
  253.                                 break;
  254.                         case 'D':
  255.                                 if(STACK3[indexS3] <0)
  256.                                 {
  257.                                         //负数没有对数
  258.                                         System.out.println("Negative numbers are not logarithmic\n");
  259.                                         System.exit(1);
  260.                                 }
  261.                                 STACK3[indexS3 - 1] = Math.log10(STACK3[indexS3]);
  262.                                 indexS3--;
  263.                                 break;
  264.                         case 'E':
  265.                                 if(STACK3[indexS3] <0)
  266.                                 {
  267.                                         //负数没有自然对数
  268.                                         System.out.println("Negative numbers have no natural logarithms\n");
  269.                                         System.exit(1);
  270.                                 }
  271.                                 STACK3[indexS3 - 1] = Math.log(STACK3[indexS3]);
  272.                                 indexS3--;
  273.                                 break;
  274.                         case 'F':
  275.                                 STACK3[indexS3 - 1] = Math.sin(STACK3[indexS3]);
  276.                                 indexS3--;
  277.                                 break;
  278.                         case 'G':
  279.                                 STACK3[indexS3 - 1] = Math.cos(STACK3[indexS3]);
  280.                                 indexS3--;
  281.                                 break;
  282.                         case 'H':
  283.                                 if(STACK3[indexS3] == Math.PI/2)
  284.                                 {
  285.                                         //90度没有正切值
  286.                                         System.out.println("The pi/2 has no tangent\n");
  287.                                         System.exit(1);
  288.                                 }
  289.                                 STACK3[indexS3 - 1] = Math.tan(STACK3[indexS3]);
  290.                                 indexS3--;
  291.                                 break;
  292.                         case 'I':
  293.                                 STACK3[indexS3 - 1] = Math.asin(STACK3[indexS3]);
  294.                                 indexS3--;
  295.                                 break;
  296.                         case 'J':
  297.                                 STACK3[indexS3 - 1] = Math.acos(STACK3[indexS3]);
  298.                                 indexS3--;
  299.                                 break;
  300.                         case 'K':
  301.                                 STACK3[indexS3 - 1] = Math.atan(STACK3[indexS3]);
  302.                                 indexS3--;
  303.                                 break;
  304.                         case 'L':
  305.                                 STACK3[indexS3 - 1] = Math.toRadians(STACK3[indexS3]);
  306.                                 indexS3--;
  307.                                 break;
  308.                         case 'M':
  309.                                 STACK3[indexS3 - 1] = Math.abs(STACK3[indexS3]);
  310.                                 indexS3--;
  311.                                 break;
  312.                         case 'N':
  313.                                 STACK3[indexS3 - 1] = Math.round(STACK3[indexS3]);
  314.                                 indexS3--;
  315.                                 break;
  316.                         case 'O':
  317.                                 STACK3[indexS3 - 1] = Math.floor(STACK3[indexS3]);
  318.                                 indexS3--;
  319.                                 break;
  320.                         case 'P':
  321.                                 STACK3[indexS3 - 1] = Math.ceil(STACK3[indexS3]);
  322.                                 indexS3--;
  323.                                 break;
  324.                         case 'Q':
  325.                                 STACK3[indexS3 - 1] = Math.exp(STACK3[indexS3]);
  326.                                 indexS3--;
  327.                                 break;
  328.                         case 'R':
  329.                                 STACK3[indexS3 - 1] = Math.sinh(STACK3[indexS3]);
  330.                                 indexS3--;
  331.                                 break;
  332.                         case 'S':
  333.                                 STACK3[indexS3 - 1] = Math.cosh(STACK3[indexS3]);
  334.                                 indexS3--;
  335.                                 break;
  336.                         case 'T':
  337.                                 STACK3[indexS3 - 1] = Math.tanh(STACK3[indexS3]);
  338.                                 indexS3--;
  339.                                 break;
  340.                         case 'U':
  341.                                 STACK3[indexS3 - 1] = Math.log(STACK3[indexS3]+Math.sqrt(STACK3[indexS3]*STACK3[indexS3]+1));
  342.                                 indexS3--;
  343.                                 break;
  344.                         case 'V':
  345.                                 STACK3[indexS3 - 1] = Math.log(STACK3[indexS3]+Math.sqrt(STACK3[indexS3]*STACK3[indexS3]-1));
  346.                                 indexS3--;
  347.                                 break;
  348.                         case 'W':
  349.                                 STACK3[indexS3 - 1] = Math.log((1+STACK3[indexS3])/(1-STACK3[indexS3]))/2;
  350.                                 indexS3--;
  351.                                 break;
  352.                         case 'X':
  353.                                 STACK3[indexS3 - 1] = (int)(STACK3[indexS3]);
  354.                                 indexS3--;
  355.                                 break;
  356.                         case 'Y':
  357.                                 STACK3[indexS3 - 1] = Math.cbrt(STACK3[indexS3]);
  358.                                 indexS3--;
  359.                                 break;
  360.                         case 'Z':
  361.                                 //随机数生成器
  362.                                 if(STACK3[indexS3] <0)
  363.                                 {
  364.                                         //负数不能作为随机数上限
  365.                                         System.out.println("A negative number can not be used as a random upper bound");
  366.                                         System.exit(1);
  367.                                 }
  368.                                 else if(STACK3[indexS3] <2)
  369.                                 {
  370.                                         //小于2的随机数为0~1之间的小数
  371.                                         STACK3[indexS3 - 1] = Math.random();
  372.                                 }
  373.                                 else
  374.                                 {
  375.                                         STACK3[indexS3 - 1] = (int)(Math.random() * (STACK3[indexS3]));
  376.                                 }
  377.                                 indexS3--;
  378.                                 break;
  379.                         case '+':
  380.                                 STACK3[indexS3 - 1] += STACK3[indexS3];
  381.                                 indexS3--;
  382.                                 break;
  383.                         case '-':
  384.                                 STACK3[indexS3 - 1] -= STACK3[indexS3];
  385.                                 indexS3--;
  386.                                 break;
  387.                         case '*':
  388.                                 STACK3[indexS3 - 1] *= STACK3[indexS3];
  389.                                 indexS3--;
  390.                                 break;
  391.                         case '%':
  392.                         case '/':
  393.                                 if(STACK3[indexS3] != 0)
  394.                                 {
  395.                                         if(STACK2[op] == '%')
  396.                                         {
  397.                                                 //取余数
  398.                                                 STACK3[indexS3 - 1]=(int)STACK3[indexS3 - 1] % (int)STACK3[indexS3];
  399.                                         }
  400.                                         else
  401.                                         {
  402.                                                 STACK3[indexS3 - 1] /= STACK3[indexS3];
  403.                                         }

  404.                                 }
  405.                                 else
  406.                                 {
  407.                                         //除数不能为零
  408.                                         System.out.println("Divisor is zero error\n");
  409.                                         System.exit(1);
  410.                                 }
  411.                                 indexS3--;
  412.                                 break;
  413.                         case '^':
  414.                                 if(STACK3[indexS3 - 1]==0 && STACK3[indexS3]<0)
  415.                                 {
  416.                                         //除数不能为零
  417.                                         System.out.println("Function pow's divisor is zero error\n");
  418.                                         System.exit(1);
  419.                                 }
  420.                                 STACK3[indexS3 - 1] = Math.pow(STACK3[indexS3 - 1], STACK3[indexS3]);
  421.                                 indexS3--;
  422.                                 break;
  423.                         case '!':
  424.                                 if(STACK3[indexS3] <0)
  425.                                 {
  426.                                         //负数没有阶乘
  427.                                         System.out.println("Negative numbers have no factorial\n");
  428.                                         System.exit(1);
  429.                                 }
  430.                                 STACK3[indexS3]=fact((long)(STACK3[indexS3]));
  431.                                 break;
  432.                         default :
  433.                                 //字符串转浮点
  434.                                 di=0;
  435.                                 ni=1;
  436.                                 while('0'<=STACK2[op] && STACK2[op]<='9')
  437.                                 {
  438.                                         di=10*di+(STACK2[op])-'0';
  439.                                         op++;
  440.                                 }
  441.                                 if(STACK2[op] == '.')
  442.                                 {
  443.                                         op++;
  444.                                         while('0'<=STACK2[op] && STACK2[op]<='9')
  445.                                         {
  446.                                                 di=10*di+(STACK2[op])-'0';
  447.                                                 op++;
  448.                                                 ni *= 10;
  449.                                         }
  450.                                 }
  451.                                 STACK3[++indexS3] = di/ni;
  452.                                 break;
  453.                         }
  454.                         op++;
  455.                 }

  456.                 //判断结果是否异常或溢出
  457.                 if( Double.isInfinite((float)STACK3[indexS3]) || Double.isNaN((float)STACK3[indexS3]) )
  458.                 {
  459.                         System.out.println("Overflow or illegal operation is calculated");
  460.                         System.exit(1);
  461.                 }

  462.                 //返回计算结果
  463.                 //return STACK3[indexS3];

  464.                 //打印中缀式
  465.                 System.out.printf("OriginalExp: %s\n", expression);

  466.                 //打印后缀式
  467.                 System.out.printf("Revpolish:   ");

  468.                 op = 0;
  469.                 while(op != indexS2)
  470.                 {
  471.                         if(STACK2[op]=='.' && STACK2[op+1]==' ')
  472.                         {
  473.                                 op++;

  474.                         }
  475.                         else if('A'<=STACK2[op] && STACK2[op]<='Z')
  476.                         {
  477.                                 System.out.printf("%s ", KEY_WORDS[STACK2[op]-65]);

  478.                         }
  479.                         else
  480.                         {
  481.                                 System.out.printf("%c", STACK2[op]);

  482.                                 if(
  483.                                     STACK2[op] == '+' ||
  484.                                     STACK2[op] == '-' ||
  485.                                     STACK2[op] == '*' ||
  486.                                     STACK2[op] == '/' ||
  487.                                     STACK2[op] == '%' ||
  488.                                     STACK2[op] == '^' ||
  489.                                     STACK2[op] == '!'
  490.                                 )
  491.                                 {
  492.                                         System.out.printf(" ");
  493.                                 }
  494.                         }
  495.                         op++;
  496.                 }
  497.                 System.out.printf("%c", '\n');

  498.                 //打印计算结果
  499.                 System.out.printf("Result:      %.12f\n", STACK3[indexS3]);
  500.                 return 0.0f;
  501.         }


  502.         /**主函数入口
  503.          * @param args
  504.          */
  505.         public static void main(String[] args)
  506.         {
  507.                 //抛出使用说明
  508.                 if (args.length != 1 || args[0].equals("-h") || args[0].equals("--help"))
  509.                 {
  510.                         System.out.println(HELP_INFORMATION);
  511.                         return;
  512.                 }

  513.                 //调用计算核心
  514.                 JCalcCore(args[0]);
  515.                 return;
  516.         }
  517. }
复制代码

评分

参与人数 1技术 +1 收起 理由
老刘1号 + 1 6

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-16 22:03 , Processed in 0.020881 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表