GIS二次开发学习专题(一)

假期时间想整理电脑内存,所以就把代码发到网上了,希望可以供大家参考,学习资料来自《牟乃夏 AE开发教程—基于C#.NET》
发的代码是我整理+老师布置的作业
第一部分是用c#写一个标准计算器和科学计算器

标准计算器与科学计算器在不同的窗体中,两者切换通过“按钮”来操作


首先是标准计算器的代码:
标准计算器是带括号的计算:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace HelloWorld
{public partial class Form1 : Form{public static List<char> inputStr = new List<char>(1000);    //用链表保存用户的输入public Form1(){InitializeComponent();}/*控制显示界面*/private void Form1_load(object sender, EventArgs e){txtReadout.Enabled = false;      //作用: 禁止人为手动修改CText.Enabled = false;      //如上            txtReadout.Text = "";            //初始化 显示CText.Text = "0"; }/*按键数字0-9*/private void btnNum1_Click(object sender, EventArgs e){inputStr.Add('1');                                       //在链表中追加记录txtReadout.AppendText("1");}//*以此类推*//*小数点*/private void btnPoint_Click(object sender, EventArgs e){inputStr.Add('.');                                      //在链表中追加记录txtReadout.AppendText(".");                             //在框中显示}/*左括号*/private void btnLeft_Click(object sender, EventArgs e){inputStr.Add('(');txtReadout.AppendText("(");}/*右括号*////*加减乘除类似此处省略*/private void btnRight_Click(object sender, EventArgs e){inputStr.Add(')');txtReadout.AppendText(")");}/*按钮[C]--所有值清零*/private void btnClear_Click(object sender, EventArgs e){txtReadout.Text = "";inputStr.Clear();       //清空链表的所有元素}  /*删除、退格*/private void btnDele_Click(object sender, EventArgs e){inputStr.RemoveAt(inputStr.Count - 1);              //点一次移除一格txtReadout.Text = "";for (int i = 0; i < inputStr.Count; i++){txtReadout.Text += inputStr[i];}}/*等号*/private void btnEqual_Click(object sender, EventArgs e){txtReadout.AppendText("=");CText.Text = txtReadout.Text;txtReadout.Text = DataOp.DataMain();string temp = DataOp.DataMain();                      //读取栈中算式inputStr.Clear();                                   //清除链表存算式for (int i = 0; i < temp.Length; i++){inputStr.Add(temp[i]);}}/*输入栏*/private void Tab(object sender, EventArgs e){ScienceCa science = new ScienceCa();this.Hide();science.ShowDialog();Application.ExitThread();}class DataOp : Form1{static Stack<double> number = new Stack<double>();  //创建栈存数字static Stack<char> symbol = new Stack<char>();      //创建栈存符号/*从inputStr中读值*/public static void Read(){for (int i = 0; i < inputStr.Count; i++){if (!IsOperator(inputStr[i]))                               //判断是否是操作符,取出算式中的数字入栈{string symbol = null;while (i < inputStr.Count && !IsOperator(inputStr[i])){symbol += inputStr[i];i++;}i--;double num2 = Convert.ToDouble(symbol);                         //将string转化为double number.Push(num2);                                              //入栈}else if (IsOper(inputStr[i]))   //判断是否是运算符+ - * /{if (symbol.Count.Equals(0) || symbol.Peek().Equals('(')){symbol.Push(inputStr[i]);}else if (OperatorPrecedence(inputStr[i]) > OperatorPrecedence(symbol.Peek())){symbol.Push(inputStr[i]);}else{double num1, num2;char sym1;num2 = number.Pop();num1 = number.Pop();sym1 = symbol.Pop();double sum = Operat(num1, num2, sym1);number.Push(sum);symbol.Push(inputStr[i]);}}else                    //(和){if (inputStr[i].Equals('(')){symbol.Push(inputStr[i]);}else if (inputStr[i].Equals(')')){while (!symbol.Peek().Equals('(')){double num1, num2;char sym1;num2 = number.Pop();num1 = number.Pop();sym1 = symbol.Pop();double sum = Operat(num1, num2, sym1);number.Push(sum);}symbol.Pop();}}}}public static double PopStack()   //栈顶{double result = 0;double num1, num2;char sym1;while (symbol.Count != 0){num2 = number.Pop();num1 = number.Pop();sym1 = symbol.Pop();result = Operat(num1, num2, sym1);number.Push(result);}return result;}
/*未完*/

下面是判断是否是操作符和运算符

public static bool IsOperator(char c)   //是否是操作符{if (c.Equals('+') || c.Equals('-') || c.Equals('*') || c.Equals('/') || c.Equals('(') || c.Equals(')') || c.Equals('²'))return true;return false;}public static bool IsOper(char c)   //是否是运算符{if (c.Equals('+') || c.Equals('-') || c.Equals('*') || c.Equals('/') || c.Equals('²'))return true;return false;}public static int OperatorPrecedence(char a)    //操作符优先级{int i = 0;switch (a){case '+': i = 3; break;case '-': i = 3; break;case '*': i = 4; break;case '/': i = 4; break;}return i;}public static double Operat(double n1, double n2, char s1){double result = 0;switch (s1){case '+': result = n1 + n2; break;case '-': result = n1 - n2; break;case '*': result = n1 * n2; break;case '/': result = n1 / n2; break;}return result;}public static string DataMain(){Read();return PopStack().ToString();}}}
}

其中读取算式的是txtReadOut,显示输出结果的是CText,如果不是想提高难度的话,可以把括号去了,因为有括号就涉及到运算符运算顺序,这些写法我也是参照许多大佬的代码改的

侵删

科学计算器:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading.Tasks;

这两个计算器可以用TabControl放在一个Form里,但是我觉得那样按钮命名比较麻烦,所以我打算用button切换,两个代码要放到一个命名空间:

public partial class ScienceCa : Form{double num1, num2,num3, result;           // 操作数及运算结果bool decimalFlag = false;             // 判断输入的是否为小数string myOperator;                    // 操作类型public ScienceCa(){InitializeComponent();}public void NumClick(int inNumber){if (decimalFlag)                    //如果输入的是小数,直接增加到文本框中{txtReadout.Text = txtReadout.Text + inNumber;}else{if (txtReadout.Text == "0.")     // 输入整数{// 输入的是整数的第一个数字txtReadout.Text = inNumber + ".";}else{// 否则从第0个字符开始,截取输入的不是整数的第一个数字txtReadout.Text = txtReadout.Text.Substring(0, txtReadout.Text.Length - 1) + inNumber + ".";}}}/*控制显示界面*/private void Form1_load(object sender, EventArgs e){txtReadout.Text = "0.";txtReadout.TextAlign = HorizontalAlignment.Right;}/*按键数字0-9*/private void btnNum1_Click(object sender, EventArgs e){NumClick(1);}......

相同的按钮都是复制form1的按钮

/*[C]所有值清零*/private void btnClear_Click(object sender, EventArgs e){num1 = 0;num2 = 0;txtReadout.Text = "0.";decimalFlag = false;        //[C]所有数值回归}/*[CE]当前输入值清零*/private void btnClearEntry_Click(object sender, EventArgs e){result = 0;                 //上一次计算结果清除num2 = 0;                   //本次输入数字清除txtReadout.Text = "0.";}/*删除、退格*/private void btnDele_Click(object sender, EventArgs e){string str=txtReadout.Text;if (str.Length > 0)                                             //长度>0,点一次截取一次{str = str.Substring(0, str.Length - 1);if (str.Length == 0){txtReadout.Text = "0.";}elsetxtReadout.Text = str;}}/*加法*/private void btnAdd_Click(object sender, EventArgs e){myOperator = "Add";num1 = double.Parse(txtReadout.Text);       //将字符串转换为double类型txtReadout.Text = "0.";decimalFlag = false;}/*减法*/private void btnSub_Click(object sender, EventArgs e){myOperator = "Sub";num1 = double.Parse(txtReadout.Text);txtReadout.Text = "0.";decimalFlag = false;}/*乘法*/private void btnMulti_Click(object sender, EventArgs e){myOperator = "Multi";num1 = double.Parse(txtReadout.Text);txtReadout.Text = "0.";decimalFlag = false;}/*除法*/private void btnDivi_Click(object sender, EventArgs e){myOperator = "Divi";num1 = double.Parse(txtReadout.Text);txtReadout.Text = "0.";decimalFlag = false;}/*求相反数*/private void btnOpp_Click(object sender, EventArgs e){myOperator = "Opp";num1 = double.Parse(txtReadout.Text);num3 = -num1;txtReadout.Text = num3.ToString();decimalFlag = false;}/*求二次根式*/private void btnSqrt_Click(object sender, EventArgs e){myOperator = "Sqrt";num3 = double.Parse(txtReadout.Text);if (num3 < 0)                              //负数不能开平方根txtReadout.Text = "负数不可开平方根!错误!";num3 = Math.Sqrt(num3);txtReadout.Text = num3.ToString();}/*求倒数*/private void btnOneDivi_Click(object sender, EventArgs e){num3 = double.Parse(txtReadout.Text);if (num3 == 0.0)txtReadout.Text = "零不可做分母!错误!";num3 = 1 / num3;txtReadout.Text = num3.ToString();}/*百分号*/private void btnPercent_Click(object sender, EventArgs e){num3 = double.Parse(txtReadout.Text);num3 = num3 / 100;txtReadout.Text = num3.ToString();}/*Abs--计算显示数字的绝对值。*/private void btn_Abs_Click(object sender, EventArgs e){num3 = double.Parse(txtReadout.Text);if (num3 < 0){num3 = -num3;}txtReadout.Text = num3.ToString();}/*ln--求以e为底的对数值*/private void btn_Ln_Click(object sender, EventArgs e){num3 = double.Parse(txtReadout.Text);if (num3 > 0){num3 = Math.Log(num3);txtReadout.Text = num3.ToString();}elsetxtReadout.Text = "真数必须>0";decimalFlag = false;}/*Mod--求余运算*/private void btn_Mod_Click(object sender, EventArgs e){myOperator = "Mod";num1 = double.Parse(txtReadout.Text);txtReadout.Text = "0.";decimalFlag = false;}/*lg--求以10为底的对数值*/private void btn_Lg_Click(object sender, EventArgs e){num3 = double.Parse(txtReadout.Text);if (num3 > 0){num3 = Math.Log10(num3);txtReadout.Text = num3.ToString();}elsetxtReadout.Text = "真数必须>0";}/*sin--求显示数字的正弦值*/private void btn_sin_Click(object sender, EventArgs e){num3 = double.Parse(txtReadout.Text);num3 = Math.PI * (num3 / 180);num3 = Math.Sin(num3);if (num3 < Math.Pow(10, -10))txtReadout.Text = "0";else txtReadout.Text = num3.ToString();}/*计算阶乘n!*/private void btn_factori_Click(object sender, EventArgs e){double number = double.Parse(txtReadout.Text);num3=1;for (int i = 1; i <= number; i++){num3= i * num3;}txtReadout.Text = num3.ToString();decimalFlag = false;}/*sin--求显示数字的余弦值*/private void btn_cos_Click(object sender, EventArgs e){num3 = double.Parse(txtReadout.Text);num3 = Math.PI * (num3 / 180);num3 = Math.Cos(num3);if (num3 < Math.Pow(10, -10))txtReadout.Text = "0";else txtReadout.Text = num3.ToString();}/*计算以10为底的指数*/private void btn_tenPower_Click(object sender, EventArgs e){num3 = double.Parse(txtReadout.Text);num3 = Math.Pow(10, num3);txtReadout.Text = num3.ToString();decimalFlag = false;}/*tan--求显示数字的正切值*/private void btn_tan_Click(object sender, EventArgs e){num3 = double.Parse(txtReadout.Text);if ((num3+90) % 90 == 0)                 //tan函数的定义域不等于kπ+π/2{txtReadout.Text = "该值不在正切函数定义域内!";}else{num3 = Math.PI * (num3/180);result = Math.Tan(num3);if (num3 < Math.Pow(10, -10))txtReadout.Text = "0";else txtReadout.Text = result.ToString();}}/*计算以e为底的指数 */private void btn_ePower_Click(object sender, EventArgs e){num3 = double.Parse(txtReadout.Text);num3 = Math.Exp(num3);txtReadout.Text = num3.ToString();}/*求显示数字的平方*/private void btn_square_Click(object sender, EventArgs e){num3 = double.Parse(txtReadout.Text);num3 = num3 * num3 ;txtReadout.Text = num3.ToString();}/*求显示数字的立方*/private void btn_cube_Click(object sender, EventArgs e){num3 = double.Parse(txtReadout.Text);num3 = num3 * num3 * num3;txtReadout.Text = num3.ToString();}/*求幂值(非单目运算)*/private void btn_xn_power_Click(object sender, EventArgs e){myOperator = "xn_power";num1 = double.Parse(txtReadout.Text);       //将字符串转换为double类型txtReadout.Text = "0.";}/*求立方根*/private void btn_cubeRoot_Click(object sender, EventArgs e){num3 = double.Parse(txtReadout.Text);double number = 3;num3 = Math.Pow(num3,1/number);txtReadout.Text = num3.ToString();}/*开n次方根(非单目运算)*/private void btn_nRoot_Click(object sender, EventArgs e){myOperator = "nRoot";num1 = double.Parse(txtReadout.Text);txtReadout.Text = "0.";}/*等号*/private void btnEqual_Click(object sender, EventArgs e){num2 = double.Parse(txtReadout.Text);switch (myOperator){case "Add":result = num1 + num2;txtReadout.Text = result.ToString();break;case "Sub":result = num1 - num2;txtReadout.Text = result.ToString();break;case "Multi":result = num1 * num2;txtReadout.Text = result.ToString();break;case "Divi":if (num2 == 0){txtReadout.Text = "除数不能为0";}else{result = num1 / num2;txtReadout.Text = result.ToString();}break;case "nRoot":if (num2 == 0){txtReadout.Text = "除数不能为0";}else{result = Math.Pow(num1, 1 / num2);txtReadout.Text = result.ToString();}break;case "xn_power":result = Math.Pow(num1, num2);txtReadout.Text = result.ToString();break;case "Mod":if (num2 == 0){txtReadout.Text = "除数不能为0";}result = num1 % num2;txtReadout.Text = result.ToString();break;}}/*切换至标准计算器*/private void btnChange_biao_Click(object sender, EventArgs e){Form1 form = new Form1();this.Hide();form.ShowDialog();Application.ExitThread();}}

以上就是所有的代码,关于窗口的具体设置可以自己摸索。
代码来源于老师+CDSN+自己摸索
源码链接:
https://download.csdn.net/download/Ziaaaaa/12111842
欢迎大家和我一起交流学习!

GIS二次开发学习专题(一)C#入门相关推荐

  1. c# AE GIS二次开发学习专题(二) 基本地图控件使用

    GIS二次开发学习专题(二) 基本地图控件使用 学习资料来自<牟乃夏 AE开发教程-基于C#.NET> 发的代码是我整理+老师布置的作业 这一部分是地图基本控件的使用与编写,包括: 一.二 ...

  2. AutoCAD.net/Map 3D/AIMS/MapGuide/Civil 3D二次开发学习指南

    作者:杜长宇 Autodesk Infrastructure Map Server(AIMS)/MapGuide API二次开发学习指南 Autodesk Infrastructure Map Ser ...

  3. 《SuperMap GIS二次开发MVC实战训练---江海区慢性病防治院系统》项目研发阶段性总结

    <SuperMap GIS二次开发MVC实战训练-江海区慢性病防治院系统>项目研发阶段性总结 作者:爱怡同学 本次任务完成时间:2019年1月1日-2019年1月10日 开发工具与关键技术 ...

  4. Map 3D API二次开发学习指南

    作者:杜长宇 – Autodesk开发技术顾问 2012年9月26日 AutoCAD Map 3D 是构建于AutoCAD之上,面向基础设施领域的产品,他采用FDO技术来实现对业界常见GIS数据格式的 ...

  5. GIS 二次开发概述 (整理)

    GIS 二次开发概述 地理信息系统根据其内容可分为两大基本类型:一是应用型地理信息系统,以某一专业.领域或工作为主要内容,包括专题地理信息系统和区域综合地理信息系统:二是工具型地理信息系统,也就是 G ...

  6. 【作废】Inventor 二次开发学习指南入门到精通(含Inventor最新二次开发教程下载)

    (由于AU中国已关闭,很多链接失效,而且有些内容需要更新.特作废此文,另外撰写一篇新的) 年初我曾撰写了一篇文章,登载到我同事的博客,以及AU中国.我想这篇作为本博客的第一篇正式技术文章,应该是最合适 ...

  7. GIS二次开发:实验五 综合实验

    一.实验目的 1.掌握栅格数据读取与另存: 2.掌握地图制图工具的实现: 3.基于遥感影像的森林资源信息管理与更新系统的实现 二.实验仪器与设备 计算机.visual studio 软件.ArcGIS ...

  8. GIS二次开发实习——鹰眼功能模块的实现(鹰眼锁定不能动,红框与主地图联动)

    GIS二次开发实习(一)--鹰眼功能实现 学期末为期2周的实习结束了,对实习要求所做 太湖水资源管理系统 的功能的实现一一做一个记录,今天先来鹰眼部分(细节部分这里就不说了看前面的文章(一)). 实现 ...

  9. [arcgis插件]gis二次开发 报备工具:SHP转TXT文本、TXT转SHP插件

    [arcgis插件]gis二次开发 报备工具:SHP转TXT文本.TXT转SHP插件 [2022.09.28版本更新] 1.shp转txt文件: 选择图层:选择面图层 保存路径:设置一个文件夹路径,可 ...

最新文章

  1. 20145223 《信息安全系统设计基础》课程总结
  2. Android短视频开发都需要什么技术?
  3. JBoss5.1.0部署SSH2
  4. Deep Learning for Chatbots, Part 2 – Implementing a Retrieval-Based Model in Tensorflow
  5. java什么内部类_Java的内部类学习
  6. DEBUG org.springframework.web.servlet.DispatcherServlet - Error rendering view [org.thymeleaf.spring
  7. 最新 | 更小、更快、更强!EfficientNetV2:Smaller-Faster-Better
  8. 信号signal()、alarm()、信号集函数、sigprocmask()
  9. PLSQL 的简单命令之三
  10. Maven依赖中scope的含义
  11. 怎么不带卡、刷手机进出图书馆---手机NFC
  12. 1 常用邮箱SMTP/POP3地址及端口
  13. 【每日爬虫】:生产者与消费者模式爬取王者荣耀壁纸
  14. ROMS模式RNT工具包的应用(弃用)
  15. 机器学习160问(建议收藏)
  16. 滴水逆向三期和中级和高期教程
  17. 如何正确使用 GC.SuppressFinalize()?
  18. STM32实例源码剖析(软件模拟IIC)
  19. 详解nginx服务器绑定域名和设置根目录的方法
  20. 11月27号,11月28号 319, 322, 324,328

热门文章

  1. maven下载源码和文档
  2. 【NC】NC6系列金额计算处理逻辑剖析
  3. oracle 本地数据库卸载,Oracle数据库卸载
  4. 北邮微型计算机原理及应用阶段二,北邮信通院微机原理第二章.ppt
  5. 一、unix指令—TIPTOP GP ERP二次开发新手教程
  6. bat脚本外部调用cmd_使用脚本控制外部流程-CMD
  7. (附源码)计算机毕业设计SSM在线党建学习平台
  8. 修复MAC系统下“邮件”出现QQ邮箱顽固无法登陆
  9. VM虚拟机 系统出现鼠标定位不准确、双鼠标问题
  10. 嵌入式linux .net core,嵌入式Linux+NetCore 笔记一