65.9K
CodeProject 正在变化。 阅读更多。
Home

专为教学而设计的 C# 命令行实现。同时也是一个命令行计算器(.NET 2)

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.82/5 (6投票s)

2005年10月20日

CPOL

5分钟阅读

viewsIcon

38062

downloadIcon

396

我正在编写的一个命令行计算器,用于帮助一个 9 岁的孩子学习编程

Sample Image - Fletexec.jpg

引言

该项目的可执行文件位于 bin 目录中。

源代码在 Visual Studio 2005 C# Express beta 2 中开发和编译,并且可以在正式版本中使用。

这是我在这里的第一篇文章,风格与其他许多文章不同,所以我希望我不会搞砸太多。抱歉语法不好。

有一天,我在一次田径比赛中,不小心透露我是一名程序员。我通常对此保持沉默,因为一个 14 岁的孩子编程的想法让我的大多数朋友都感到害怕。所以,教练的儿子 Gabriel 碰巧也是一名程序员,并且他想学习 C#,我能理解他,他之前一直在使用 chipmonk basic。所以我需要一种方法,让这个认为编程是线性的孩子来思考 C#。他从未见过“for”循环,我需要一种即时满足的方法。所以我着手设计“FLet”的想法,一个它的返回值会立即显示在屏幕上。我知道可以通过 Python 实现这一点,但他想要 C#。这个项目就是由此产生的。

使用此程序

该程序的目的是您可以输入 C# 代码,按 Enter 键并获得结果。它启动时配置为一个命令行计算器,因此您可以输入 5*5 并看到 25 作为答案。

用户界面快速概述

标记为“Answer”的第一个框包含 ans.ToString(); 的值。有一个大的绿色或红色区域,红色表示您处于高级编辑模式,绿色表示您处于简单编辑模式。编辑模式下面有描述。

在此顶部区域下方,您会看到主编辑框,其中包含您的 functionlet(将要运行的代码)的代码。

在主编辑框内,有几个按钮。从上到下,有设置模式按钮,单击后会弹出一个列表框。在其下方是“math”和“language”(请参阅下面的“语言模式”以获取描述)。然后是运行按钮,它会运行主编辑框中的代码。还有一个帮助按钮,用于显示帮助。

编辑模式

使用此程序非常简单。有两种编辑模式:“简单”和“高级”。从程序员的角度来看,您正在编写一个 C# 函数,而您在文本框中输入的文本将是该函数的一部分。在高级编辑模式下,创建函数的代码是这样的

ftext += "double ans = (double)Parameters[0];";
ftext += code;
ftext += "return ans;";

因此,ans 的前一个值是第一个参数,因此 ans == ans 最后的值。在高级编辑模式下,您可以输入“ans=5*5;”和“ans=ans*4;”,此时 ans 将为 100。在简单模式下,您只需输入“5*5”和“ans*4”即可使 ans 等于 100。在简单模式下,程序会在代码前后添加“ans=”和“;”。

高级模式的优点是您可以拥有 C# 的所有逻辑,这可能很有用。

语言模式

对象模式和数学模式之间有 3 处区别。

  1. 在数学模式下,ans 的类型是 double。在对象模式下,ans 的类型是 object
  2. 在数学模式下,所有数字都转换为 double,即在数学模式下,5*5 实际上是 (double)5*(double)5
  3. 在数学模式下,帮助中描述的数学函数被替换为 System.Math.functionname

此程序背后的代码

我首先需要知道如何在运行时编译 C#。我在 http://www.developerfusion.co.uk/show/4529/1/ 学到的,并将其代码应用到了子项目 fexec 中。这应该相当容易理解。

由于 Gabriel 是数学天才,我想让这个程序成为一种计算器。在预编译器项目中,我为预编译提供了函数,其中答案可以是 object double。计算器证明很困难。我发现为了执行简单的方程式,我需要将所有数字转换为 double。这在索引数组时会很危险(也许我需要使程序具有上下文感知性,即不在括号内进行转换)。我发布这篇文章的原因之一是,我想看看这个项目是否有足够多的关注者来找到修复这个问题的办法。

我遇到的另一个问题是数学函数的使用。我希望我的计算器能够完全支持 system.math 函数,而无需每次都写 system.math。由于 Cos 可能出现在变量名中,我创建了两个函数 getwords setwords

private static string[] Getwords(string page, char[] grammar, char[] letters)
        {
            System.Collections.ArrayList words = new System.Collections.ArrayList();
            bool end = false;
            int i = 0;
            while (!end)
            {
                int word = page.IndexOfAny(letters, i);
                if (word == -1)
                    end = true;
                else
                {
                    int endword = page.IndexOfAny(grammar, word);
                    words.Add(page.Substring(word, endword-word));
                    i = endword;
                }
            }
            return (string[])words.ToArray(typeof(string));
        }

private static string Setwords(string page, char[] grammar, char[] letters, 
                               string[] words)
        {
            bool end = false;
            int i = 0;
            int wordindex = 0;
            while (!end)
            {
                int word = page.IndexOfAny(letters, i);
                if (word == -1)
                    end = true;
                else
                {
                    int endword = page.IndexOfAny(grammar, word);
                    page = page.Remove(word, endword-word);
                    if (wordindex >= words.Length)
                        return null;
                    page = page.Insert(word, words[wordindex]);
                    i = word + words[wordindex].Length;
                    wordindex++;
                }
            }
            return page;
        }
    }
}

这些函数将 functionlet 中的单词制成一个数组,并允许您编辑该数组并重新插入新单词。然后,我可以将所有数学函数实例替换为 system.math 函数。

//replace math functions with System.Math functions
            string[] cl2csgrammar = new string[] { "Abs", "Acos", "Asin", 
"Atan", "Atan", "Cos", "Cosh", "Log", "Log10", "Sign", "Sinh", "Sin", 
"Sqrt", "Tan", "Tanh", "Truncate", "E", "PI" };//the math functions of system.math

            string Functionpath = "System.Math.";

            char[] Chars = new char[] { 'q', 'w', 'e', 'r', 't', 'y', 'u', 
         'i', 'o', 'p', 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'z', 
         'c', 'v', 'b', 'n', 'm', 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 
         'O', 'P', 'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L', 'Z', 'X', 
         'C', 'V', 'B', 'N', 'M', '.' };

            char[] Punctuation = new char[] { ' ', ';', '+', '-', '*', '/', 
                                          '(', ')', '=', '&', '{', '}' };
            string[] words = Getwords(code, Punctuation, Chars);

            int wordindex = 0;
            foreach (string word in words)
            {
                foreach (string function in cl2csgrammar)
                {
                    if (word.ToLower() == function.ToLower())
                        words[wordindex] = Functionpath + function;
                }
                wordindex++;
            }
            code = Setwords(code, Punctuation, Chars, words);

目前就这些。我希望在这里看到一些关于我的代码有多糟糕的反馈,以及我在做什么上浪费了多少时间。另外,我需要写作方面的帮助!它已经过时了,我不知道从哪里开始。;)

版本

即将推出

  • XML 文件格式
  • 支持嵌入的 functionlet GUI 和库。
  • 代码着色和代码完成

已发布的版本

  • Beta 2.3 代码格式更整洁,并修复了焦点错误
  • Beta 2.2 UI 重新设计,修复了 bug,改进了性能
  • Beta 2.1 新功能和 bug 修复。非常多...
  • Beta 2.0 基本未经测试的功能发布
  • 仍然是同一个程序,编辑了文章以改善语法、拼写和可读性
  • Beta 1.1 修复了更改模式时的 bug
© . All rights reserved.