吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3998|回复: 12
收起左侧

[其他原创] 【原创源码】C#编写一款自己的脚本语言.第六章.下

[复制链接]
moodlee 发表于 2016-3-12 00:20
第六章.下

此章为代码章。
已经写成了类。建议你自己写一个,这样大脑才会活跃,兴奋。
能够解决:没有括号的运算,运算符号有“^*/%+-”,当然,你也可以自己添加一些运算符号
——————————

下一章,将会涉及括号的运算

用的都是自己想的方法,有可能不是最优的方法,抱歉。

在无括号运算方面,有些朋友提出了一些公认的好方法:

1、逆波兰

2、树(这个不是特别清楚,我尚未验证)

——————————

为什么我还在执着自己想的方法呢?而不用前辈想好的方法呢?

因为这样大脑才异常兴奋。

——————————

[C#] 纯文本查看 复制代码
using System;
using System.Collections.Generic;

namespace ScriptCode
{
    public class ScriptCodeU
    {
        /*
        */

        public string Eval(string myScript)
        {
            return eval_basicElement(myScript);
        }
        //
        private string eval_basicElement(string myScript)
        {
            string myResult;
            //-----
            /*定义储存变量*/
            string LeftVar = string.Empty;//左变量
            string RightVar = string.Empty;//右变量
            string unRunCode = string.Empty;//非执行代码
            bool SwitchOfRun = false;//运算开关
            char nowRunChar = char.MinValue;//当前运算符号
            string cmdResult;//计算结果
            /*定义优先级*/
            List<string> rankRunChar = new List<string>();
            rankRunChar.Add("^");
            rankRunChar.Add("*/%");
            rankRunChar.Add("+-");
            /*前期准备*/
            string tempScript = myScript;
            /*正式执行*/
            for(int c=0;c<rankRunChar.Count; c++)
            {
                for (int i = 0; i < tempScript.Length; i++)
                {

                    int CharType = judgeChar(tempScript[i], rankRunChar.ToArray(), c);//你们可以具体看一下judgeChar的函数,不然有可能不能理解
                    if (CharType == 0)
                    {//如果为:非当前优先级运算符号
                        if (SwitchOfRun)
                        {
                            //如果运算开关为真
                            cmdResult = cmd(nowRunChar, LeftVar, RightVar);
                            unRunCode += cmdResult+tempScript[i];
                            LeftVar = string.Empty;
                            RightVar = string.Empty;
                            SwitchOfRun = false;
                        }
                        else
                        {
                            //如果运算开关为假
                            unRunCode += LeftVar;
                            LeftVar = string.Empty;
                            unRunCode += tempScript[i];
                        }

                    }
                    else if (CharType == 1)
                    {//当前优先级运算符号
                        if (SwitchOfRun)
                        {
                            cmdResult = cmd(nowRunChar, LeftVar, RightVar);
                            LeftVar = string.Empty;
                            LeftVar += cmdResult;
                            RightVar = string.Empty;
                            SwitchOfRun = true;
                            nowRunChar = tempScript[i];
                        }
                        else
                        {
                            //如果运算开关为假
                            SwitchOfRun = true;
                            nowRunChar = tempScript[i];
                        }
                    }
                    else if (CharType == 2)
                    {
                        //数值
                        if (SwitchOfRun)
                        {
                            //如果运算开关为真
                            RightVar += tempScript[i];

                        }
                        else
                        {
                            //如果运算开关为假
                            LeftVar += tempScript[i];

                        }
                    }

                }
                //做最后一次运算
                if (SwitchOfRun)
                {
                    cmdResult = cmd(nowRunChar, LeftVar, RightVar);
                    unRunCode += cmdResult;
                }else
                {
                    unRunCode +=LeftVar;
                }

                //递交给下一次计算
                tempScript = unRunCode;
                //重置
                unRunCode = string.Empty;
                LeftVar = string.Empty;
                RightVar = string.Empty;
                SwitchOfRun = false;
                nowRunChar = char.MinValue;
                cmdResult = string.Empty;

            }
            myResult = tempScript;
            

            //-----
            return myResult;
        }
        /*与运算符号相对应的运算函数,加+减-乘*除/取余%次方^*/
        private string plues(string X,string Y)
        {
            string Z;
            //-----
            double lx = double.Parse(X);
            double ly = double.Parse(Y);
            Z = (lx + ly).ToString();
            //-----
            return Z;
        }
        private string minus(string X,string Y)
        {
            string Z;
            //-----
            
            double lx = X .Length !=0?double.Parse(X):0;
            double ly = double.Parse(Y);
            Z = (lx - ly).ToString();
            //-----
            return Z;
        }
        private string multiply(string X,string Y)
        {
            string Z;
            //-----
            double lx = double.Parse(X);
            double ly = double.Parse(Y);
            Z = (lx * ly).ToString();
            //-----
            return Z;
        }
        private string divide(string X,string Y)
        {
            string Z;
            //-----
            double lx = double.Parse(X);
            double ly = double.Parse(Y);
            Z = (lx / ly).ToString();
            //-----
            return Z;
        }
        private string module(string X,string Y)
        {
            string Z;
            //-----
            double lx = double.Parse(X);
            double ly = double.Parse(Y);
            Z = (lx % ly).ToString();
            //-----
            return Z;
        }
        private string pow(string X,string Y)
        {
            return Math.Pow(double .Parse (X),double .Parse (Y)).ToString ();
        }
        /*统一运算,根据运算符号进行运算*/
        private string cmd(char myCmd,string X,string Y)
        {
            string myResult = string.Empty;
            //-----
            switch (myCmd)
            {
                case '+':
                    myResult = plues(X ,Y);
                    break;
                case '-':
                    myResult = minus(X,Y);
                    break;
                case '*':
                    myResult = multiply(X,Y);
                    break;
                case '/':
                    myResult = divide(X,Y);
                    break;
                case '%':
                    myResult = module(X,Y);
                    break;
                case '^':
                    myResult = pow(X,Y);
                    break;
            }
            //-----
            return myResult;
        }

        /*判断字符类型*/
        private int judgeChar(char myChar, string[] myRunChar, int myRank)
        {
/*
myChar就是字符
myRunChar就是你定义的运算符号,就是上面的rankRunChar
myRank就是当前的优先级,"^","*/%","+-"的优先级不一样,在rankRunChar里面的下标分别是0,1,2.如果myRank=0,那么当myChar为'^'时就会返回[1:当前优先级运算符号]
*/
            /*
            0:非当前优先级运算符号
            1:当前优先级运算符号
            2:数值
            3:未知符号
            4:
            */

            int myResult =3;
            //-----
            if ((myChar >= '0' && myChar <= '9')||myChar =='.')
            {
                myResult = 2;//数值
            }
            
            bool isRunChar = false;
            for (int i = 0; i < myRunChar.Length; i++)//如果符号是运算符号,才会判断该符号是当前优先级还是不是当前优先级
            {
                if (myRunChar[i].IndexOf(myChar) != -1)
                {
                    isRunChar = true;
                    break;
                }
            }
            if (isRunChar)
            {
                if (myRunChar[myRank].IndexOf(myChar) != -1)
                {
                    myResult = 1;
                }
                else
                {
                    myResult = 0;
                }
            }
            //-----
            return myResult;
        }

    }
}

免费评分

参与人数 3热心值 +3 收起 理由
Cizel + 1 用心讨论,共获提升!
Peace + 1 我很赞同!
双木 + 1 楼主继续努力

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| moodlee 发表于 2016-3-12 00:23
我是人民币 发表于 2016-3-12 17:04
其实楼主这样也是挺好的,能自己独立思考,而不去用前人已经为我们想好的思路。现在就是缺的这种人。
虽然楼主写出来的不是最优解,但是肯定比那些借用前人思想的人来说进步了很多,楼主加油!
小怪 发表于 2016-3-12 02:14
双木 发表于 2016-3-12 07:48
技术含量不高,但是对于新手来说是很好的。
楼主继续努力
vae3489 发表于 2016-3-12 08:38 来自手机
谢谢楼主分享,学习了
E式丶男孩 发表于 2016-3-12 08:56
楼主真好啊,如果没猜错的话,楼主也是学生把
san19788 发表于 2016-3-12 09:45
支持楼主
 楼主| moodlee 发表于 2016-3-12 11:04
E式丶男孩 发表于 2016-3-12 08:56
楼主真好啊,如果没猜错的话,楼主也是学生把

哈哈,被你猜对了。大一。
renfeng 发表于 2016-3-12 16:45
膜拜大神,吾等渣渣向LZ看齐
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-6-17 11:44

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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