GIS二次开发学习专题(一)C#入门
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#入门相关推荐
- c# AE GIS二次开发学习专题(二) 基本地图控件使用
GIS二次开发学习专题(二) 基本地图控件使用 学习资料来自<牟乃夏 AE开发教程-基于C#.NET> 发的代码是我整理+老师布置的作业 这一部分是地图基本控件的使用与编写,包括: 一.二 ...
- AutoCAD.net/Map 3D/AIMS/MapGuide/Civil 3D二次开发学习指南
作者:杜长宇 Autodesk Infrastructure Map Server(AIMS)/MapGuide API二次开发学习指南 Autodesk Infrastructure Map Ser ...
- 《SuperMap GIS二次开发MVC实战训练---江海区慢性病防治院系统》项目研发阶段性总结
<SuperMap GIS二次开发MVC实战训练-江海区慢性病防治院系统>项目研发阶段性总结 作者:爱怡同学 本次任务完成时间:2019年1月1日-2019年1月10日 开发工具与关键技术 ...
- Map 3D API二次开发学习指南
作者:杜长宇 – Autodesk开发技术顾问 2012年9月26日 AutoCAD Map 3D 是构建于AutoCAD之上,面向基础设施领域的产品,他采用FDO技术来实现对业界常见GIS数据格式的 ...
- GIS 二次开发概述 (整理)
GIS 二次开发概述 地理信息系统根据其内容可分为两大基本类型:一是应用型地理信息系统,以某一专业.领域或工作为主要内容,包括专题地理信息系统和区域综合地理信息系统:二是工具型地理信息系统,也就是 G ...
- 【作废】Inventor 二次开发学习指南入门到精通(含Inventor最新二次开发教程下载)
(由于AU中国已关闭,很多链接失效,而且有些内容需要更新.特作废此文,另外撰写一篇新的) 年初我曾撰写了一篇文章,登载到我同事的博客,以及AU中国.我想这篇作为本博客的第一篇正式技术文章,应该是最合适 ...
- GIS二次开发:实验五 综合实验
一.实验目的 1.掌握栅格数据读取与另存: 2.掌握地图制图工具的实现: 3.基于遥感影像的森林资源信息管理与更新系统的实现 二.实验仪器与设备 计算机.visual studio 软件.ArcGIS ...
- GIS二次开发实习——鹰眼功能模块的实现(鹰眼锁定不能动,红框与主地图联动)
GIS二次开发实习(一)--鹰眼功能实现 学期末为期2周的实习结束了,对实习要求所做 太湖水资源管理系统 的功能的实现一一做一个记录,今天先来鹰眼部分(细节部分这里就不说了看前面的文章(一)). 实现 ...
- [arcgis插件]gis二次开发 报备工具:SHP转TXT文本、TXT转SHP插件
[arcgis插件]gis二次开发 报备工具:SHP转TXT文本.TXT转SHP插件 [2022.09.28版本更新] 1.shp转txt文件: 选择图层:选择面图层 保存路径:设置一个文件夹路径,可 ...
最新文章
- 20145223 《信息安全系统设计基础》课程总结
- Android短视频开发都需要什么技术?
- JBoss5.1.0部署SSH2
- Deep Learning for Chatbots, Part 2 – Implementing a Retrieval-Based Model in Tensorflow
- java什么内部类_Java的内部类学习
- DEBUG org.springframework.web.servlet.DispatcherServlet - Error rendering view [org.thymeleaf.spring
- 最新 | 更小、更快、更强!EfficientNetV2:Smaller-Faster-Better
- 信号signal()、alarm()、信号集函数、sigprocmask()
- PLSQL 的简单命令之三
- Maven依赖中scope的含义
- 怎么不带卡、刷手机进出图书馆---手机NFC
- 1 常用邮箱SMTP/POP3地址及端口
- 【每日爬虫】:生产者与消费者模式爬取王者荣耀壁纸
- ROMS模式RNT工具包的应用(弃用)
- 机器学习160问(建议收藏)
- 滴水逆向三期和中级和高期教程
- 如何正确使用 GC.SuppressFinalize()?
- STM32实例源码剖析(软件模拟IIC)
- 详解nginx服务器绑定域名和设置根目录的方法
- 11月27号,11月28号 319, 322, 324,328
热门文章
- maven下载源码和文档
- 【NC】NC6系列金额计算处理逻辑剖析
- oracle 本地数据库卸载,Oracle数据库卸载
- 北邮微型计算机原理及应用阶段二,北邮信通院微机原理第二章.ppt
- 一、unix指令—TIPTOP GP ERP二次开发新手教程
- bat脚本外部调用cmd_使用脚本控制外部流程-CMD
- (附源码)计算机毕业设计SSM在线党建学习平台
- 修复MAC系统下“邮件”出现QQ邮箱顽固无法登陆
- VM虚拟机 系统出现鼠标定位不准确、双鼠标问题
- 嵌入式linux .net core,嵌入式Linux+NetCore 笔记一