C#实现任意大数的计算和简单逻辑命题的证明——前言
介绍
这是本人毕业设计的项目,一直想将其整理成文,可一不小心4年就过去了(这个时间又可以读个大学了)。现在给自己定一个目标,一个月时间里将项目的所有关键点都整理出来。不然真怕一眨眼又一个4年过去了,而代码依然躺在硬盘里。
项目取名MathAssist,使用vs2008。分成四个子项目:
- MathAssistLibrary 提供一个接口,以便实现用dll拓展的插件机制
- SuperCalculator 实现任意大数计算的插件
- 命令证明 实现简单逻辑命题证明的插件
- MathAssist 主程序,会扫描并加载其路径下所有符合条件的dll
其主程序可以从插件中扫描可用的命令,也可以显示插件中可用的窗体。如下是主程序界面,其加载了两个插件:“superCalculator”和“命令证明”。它们分别提供命令cal prove。

点击菜单项"插件"的子菜单后可以分别打开两个插件中实现的窗口。如下图


分别实现了大数计算和逻辑命题的证明。
在这篇前言中就先只介绍插件机制的实现吧,大数计算和逻辑命题的证明就留给后面的系列。
插件机制的实现
MathAssistLibrary接口的定义
在MathAssistLibrary项目中只定义了两个接口: ICommand, IForm,分别用于提供命令行功能和窗口功能。
/// <summary>命令接口</summary>
public interface ICommand
{
/// <summary>命令名称</summary>
string Name { get; } /// <summary>执行命令</summary>
/// <param name="cmd">命令参数</param>
/// <returns>返回的结果</returns>
string Excute( string cmd ); /// <summary>对命令的使用作相应的说明</summary>
string Describe { get; }
}
/// <summary>获得插件的窗体</summary>
public interface IForm
{
/// <summary>窗体名</summary>
string Text { get; } /// <summary>窗体对象</summary>
Form GetForm { get; }
}
MathAssistLibrary
ICommand接口
- Name 用于表示命令的名称
- Excute 用于执行命令
- Describe 用于对这个命令提供一个简要的帮助文档说明
IForm接口
- Text 用于表示窗体的名称
- GetForm 用于获取Form对象。在主程序中获取Form对象后,再调用Show()即可显示之。
插件实现
在插件项目中只要实现ICommand和IForm两个接口即可,以SuperCalculator为例:
public partial class frmSuperCalculator : Form, IForm
{
string IForm.Text {
get { return "计算器"; }
} frmSuperCalculator frm;
Form IForm.GetForm {
get {
if (frm == null || frm.IsDisposed) {
frm = new frmSuperCalculator();
}
return frm;
}
}
...
}
public class Calculator : MathAssistLibrary.ICommand
{
string MathAssistLibrary.ICommand.Describe {
get { return "cal命令可以进行相关的数学运算。比如cal 1+max(2,3)*2"; }
}
string MathAssistLibrary.ICommand.Name {
get { return "cal"; }
}
string MathAssistLibrary.ICommand.Excute(string cmd) {
try {
Expression exp = new Expression();
exp.Format = cmd;
return exp.Calculator().ToString();
} catch (ExpressionException e) {
return string.Format("表达式出错。出错类型:{0},出错位置{1}", e.Message, e.Index);
}
}
}
主程序对插件的扫描
FindDllFile()函数找到与程序同路径下的所有dll文件,代码如下:
List<string> FindDllFile(string foldername) {
DirectoryInfo dir = new DirectoryInfo(foldername);
FileInfo[] files = dir.GetFiles();
List<string> result = new List<string>();
foreach (FileInfo fi in files) {
if (fi.Name.ToUpper().EndsWith(".DLL"))
result.Add(fi.FullName);
}
return result;
}
FindDllFile
LoadOne()从一个文件中找一个特定的类型,并返回其对象,代码如下:
private List<object> LoadOne(string filename, Type type) {
List<object> result = new List<object>();
try {
Assembly ass = Assembly.LoadFrom(filename);
Module[] mods = ass.GetModules();
foreach (Module mod in mods) {
Type[] typs = mod.GetTypes();
foreach (Type typ in typs) {
if (type.IsAssignableFrom(typ)) {
result.Add(ass.CreateInstance(typ.FullName));
}
}
}
} catch (BadImageFormatException) {
}
return result;
} // end func
先用Assembly.LoadFrom()加载程序集,然后获取所有模块,最后在所有模块中用type.IsAssignableFrom()找与传入参数type相匹配的类型,如果匹配那么就创建一个对象并返回。
在主程序中分别用如下两行代码调用LoadOne()
List<object> cmd = LoadOne(filename, typeof(ICommand));
List<object> frm = LoadOne(filename, typeof(IForm));
这样用cmd.Excute()就可以执行插件中实现的代码,用frm.Show()就可以显示插件中所实现的窗体。
现提供MathAssist.exe的下载路径。在后面的文章中会给出整个程序的源码,敬请期待~~
参数文献: http://www.cnblogs.com/conexpress/archive/2009/03/04/MyCalculator_01.html
C#实现任意大数的计算和简单逻辑命题的证明——前言的更多相关文章
- boost计算随机数和计算crc32简单示例 - jwybobo2007的专栏 - 博客频道 - CSDN.NET
boost计算随机数和计算crc32简单示例 - jwybobo2007的专栏 - 博客频道 - CSDN.NET boost::crc_32_type crc32; crc32. ...
- boost计算随机数和计算crc32简单示例
boost计算随机数和计算crc32简单示例 - jwybobo2007的专栏 - 博客频道 - CSDN.NET boost计算随机数和计算crc32简单示例 2013-02-18 17:14 10 ...
- C++算法之大数加法计算的代码
如下代码段是关于C++算法之大数加法计算的代码,希望对大家有用. { int length; int index; int smaller; int prefix = 0; if(NULL == sr ...
- JQuery插件让图片旋转任意角度且代码极其简单 - 摘自网友
JQuery插件让图片旋转任意角度且代码极其简单 2012-04-01 09:57:03 我来说两句 收藏 我要投稿 引入下方的jquery.rotate.js文件,然后通过$ ...
- ASP.NET中登录功能的简单逻辑设计
ASP.NET中登录功能的简单逻辑设计 概述 逻辑设计 ...
- Android计算器简单逻辑实现
Android计算器简单逻辑实现 引言: 我的android计算器的实现方式是:按钮输入一次,就处理一次. 但是如果你学过数据结构(栈),就可以使用表达式解析(前缀,后缀)处理. 而这个方式已经很成熟 ...
- Scrapy爬取小说简单逻辑
Scrapy爬取小说简单逻辑 一 准备工作 1)安装Python 2)安装PIP 3)安装scrapy 4)安装pywin32 5)安装VCForPython27.exe ........... 具体 ...
- python的一个表达式的计算(超简单)
运行的过程如下: 输入计算表达式:3+5 计算结果:8 然后再次显示计算表达式,等待输入完成后,再次显示结果,依此循环. 作为初学者再适合不过,代码也简单,如下所示: #!/usr/bin/env ...
- MDX Cookbook 12 - 计算 SMA 简单移动平均 LastPeriods() 函数的使用
先认识一下这几个名词 Moving Average (MA) 移动平均,或者叫做移动平均线,是技术分析中一种分析时间序列数据的工具.最常见的就是利用股价,回报或交易量等变数计算出移动平均.可以利用移动 ...
随机推荐
- js相关参考资料
[图片等比例适配:]http://www.cnblogs.com/zengxiangzhan/archive/2009/09/12/1565323.html
- YARN资料收集
hdfs2的HA: http://www.cnblogs.com/meiyuanbao/p/hadoop2.html
- grep查询文本:问一个简单shell问题,将grep的输出赋值给一个变量
问一个简单shell问题,将grep的输出赋值给一个变量 用grep命令得到的输出赋值给一个变量不成功. grep命令如下: 代码: $ grep -c '^abc' file.txt 输出为22,表 ...
- C语言状态机模板
转载声明:如果转载本博客内容,请联系869119842@qq.com,获得作者书面授权. 前言 上一篇我的博客中探讨了一种非swtich-case结构的状态机写法,但是个人感觉写起来比较麻烦,如果增加 ...
- [解决方案] pythonchallenge level 2
http://www.pythonchallenge.com/pc/def/ocr.html 根据页面提示查看网页源代码,在最后:<!--find rare characters in the ...
- PKU1004
求平均数,就是要注意浮点数精度保持,由于浮点数在计算机内部的表示不同,会导致精度不好,这里由于输入的限制,计算的时候采用了整数,防止精度丢失 // 1004.cpp : 定义控制台应用程序的入口点. ...
- HTML5 LocalStorage 本地存储
HTML5 LocalStorage 本地存储 说到本地存储,这玩意真是历尽千辛万苦才走到HTML5这一步,之前的历史大概如下图所示: 最早的Cookies自然是大家都知道,问题主要就是太小,大概也就 ...
- BZOJ 1799 同类分布
一开始没想出来..一看题解 我艹直接枚举数位的和啊.....怪不得给50s. 还是太蠢. #include<iostream> #include<cstdio> #includ ...
- [c++]默认参数
=================默认参数==================在函数声明时表明默认值,在函数定义时正常定义void function(int a = 2)// 函数声明void fu ...
- CentOS7.1配置源
现在网上最新的是CentOS7.1, 但是在配置国内流行的163源的时候,网上的文章大多数我这里都通不过. 错误信息大概是: One of the configured repositories fa ...