# uncertaintyCalc **Repository Path**: smallcatx0/uncertaintyCalc ## Basic Information - **Project Name**: uncertaintyCalc - **Description**: 直接测量数据的不确定度计算器 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2018-04-16 - **Last Updated**: 2022-03-30 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README > 作 者:smallcatx0; 谨以此文献给 绵阳师范学院 物理学14.1/2班的同学们 转载的同学请注明原链接 http://blog.heykui.cn/index.php/archives/77/ ## 0. 前言 做测量类实验时,计算不确定度往往是个很麻烦的事情。 **而我们可以编写一个小程序来解决这个小麻烦,此次我用这个例子来介绍下[aardio](http://bbs.aardio.com/portal.php?mod=view&aid=5)这个国产的开源编程工具** ![](http://heykui.oss-cn-beijing.aliyuncs.com/18-4-17/28143112.jpg) ## 1 aardio介绍 什么是aardio? > aardio 专用于桌面软件快速开发,开发环境仅 6.5 MB, 绿色软件解压即用 - 无论个人或企业都可以永久免费使用本软件开发商用、或非商用的应用程序。使用aardio开发的软件不需要放置鸣谢链接、不需要声明使用aardio开发。 > --摘自[官方的简介](http://bbs.aardio.com/portal.php?mod=view&aid=5) aardio有什么特点? - 绿色轻便:开发环境仅 6.5 MB, 绿色软件解压即用 - 混合型编程语言 :具有动态语言轻便、灵活的特性,而且又可以同时支持静态类型开发 - 直接支持原生DLL,支持的接口很丰富、可以支持com静态动态双接口,象VBS一样原生支持com对象 - 可以嵌入汇编机器码,C语言,Java,PHP,C#,Python,Javascript,VBScript......等等数量众多的第三方编程语言,方便的互调函数,并且这些调用第三方语言的功能模块都是使用aardio实现( 开放源码 ) - 软件界面快速开发:直接拖控件或者用web窗体加载网页设计界面 ## 2 准备工作 先从[官网下载aardio](http://bbs.aardio.com/portal.php?mod=view&aid=2) 解压就可以用了(可以花点时间浏览下aardio的[快速入门教程](http://bbs.aardio.com/forum.php/?mod=viewthread&tid=8663&from=portal)) 打开软件,新建一个窗口程序,然后拖一波控件 ![aardio拖控件](http://p1plagkme.bkt.clouddn.com/18-4-16/29951373.jpg) 在右边的属性里修改各个控件的**大小、颜色、字体等属性** ![属性页面](http://heykui.oss-cn-beijing.aliyuncs.com/18-4-16/99132618.jpg) ## 3 分析逻辑(别急着上来就写代码) 显然,3个文本框里有两个是数据输入框,一个数据输出框。 此程序的逻辑无非就是 - **获取输入数据** 从文本输入框直接得到的都是字符串,需要转换成数组 - **计算** 平均值,标准差,A类不确定度,B类不确定度,合成不确定度 - **显示计算结果** 程序主体逻辑如下: ```JavaScript // 获取输入框原始数据(字符串) var inputStr = mainForm.inData.text; // 将字符串处理成单个数据(数组) var arrData = getData(inputStr); // 获取仪器最小刻度 var dt = mainForm.dt.text; // 将数据拿去计算 var res = calc(arrData,dt); // 算完后显示 showRes(res); ``` ## 4 开始撸代码(根据逻辑分析) ### 4.1 获取输入原数据 这一条代码就能获取到文本框中的文本数据(得到的是一个字符串) ```JavaScript // 将mainForm窗体里的 // 名称为inData的控件的 text(这里指文本框里的内容) // 赋值给局部变量inputStr var inputStr = mainForm.inData.text; ``` **这时可能就有人会问了:我要在哪里写入这行代码呢?并且怎么看我是否获取到了输入框中的数据呢?** 下面我就简单的讲一下,**事件触发** 以及如何调试程序 - 事件触发 简单解释就是发生了什么事(最常见的就是鼠标单击)就执行某段代码(我们自己写) 系统会给我们提供很多事件监听函数,我们将发生此事件后的处理代码写到里面。在程序执行时如果触发了某事件,程序将跳转到时间监听函数里去执行代码。 比如,这个小程序的**事件逻辑**就是: : 用户输入完数据(输入框失去焦点) -> 就将输入的数据存到数组里 用户用鼠标单击了计算按钮 -> 就将数组中的数据计算出来,并显示到结果框 而最简单的鼠标单击事件,只需要在设计窗口双击某个控件 ![双击计算按钮](http://heykui.oss-cn-beijing.aliyuncs.com/18-4-17/83967238.jpg) 比如我现在双击`计算`按钮,就自动调整到代码页面,并且为我们自动生成了`计算按钮`鼠标单击事件的监听函数 ![代码页面](http://heykui.oss-cn-beijing.aliyuncs.com/18-4-17/75044709.jpg) (ps:想回到设计模式只需要点上面的设计视图,或者按快捷键`ctrl+u`) 一起来测试一下这个东东能不能正常工作(写任何代码,在还不是非常熟悉时,都建议**每写一个功能就先测试下**。避免200行代码,199个Error这种尴尬的情况): 在代码页面第一行写: `import console;`(不解释,想了解的去看[官方的文档](http://bbs.aardio.com/doc/reference/)) 然后在刚才生成的单击事件监听函数内写入 `console.log("你点我干啥?")` 如图: ![测试鼠标单击函数](http://heykui.oss-cn-beijing.aliyuncs.com/18-4-17/34973536.jpg) 点上面的运行按钮,或按`F5` ![运行效果](http://heykui.oss-cn-beijing.aliyuncs.com/18-4-17/29926428.jpg) 运行效果如图,说明我们的程序计算按钮的鼠标单击正常。 到这里,同学们是否还记得我们刚才讲到的**获取输入内容** 现在你可以试下将哪行代码写到这个单击监听函数中并将内容用`console.log()` 控制台输出看看了 ```JavaScript mainForm.button.oncommand = function(id,event){ var inputStr = mainForm.inData.text; console.log(inputStr); } ``` 运行: ![运行效果](http://heykui.oss-cn-beijing.aliyuncs.com/18-4-17/69114918.jpg) 此时,我们便获取到了输入框中的源数据 【补】刚才只讲了鼠标单击事件怎么绑定 再贴一个控件失去焦点的事件监听函数,其他的事件可以去[这里查看](http://bbs.aardio.com/doc/MSG.HTM) ```JavaScript // mainForm窗口内的名称为inData的控件的失去焦点监听函数 mainForm.inData.wndproc = function(hwnd,message,wParam,lParam){ if(message = 0x0008){//光标焦点离开 // 事件处理代码 } //无返回值则继续调用默认回调函数 } ``` ### 4.2 数据的处理 上面我某已经获得了输入的字符串,现在我们要将获得的字符串**解析成数组**以方便计算 ```JavaScript // 解析字符串(以逗号分隔的),返回数组 function getData(inputStr){ // 为了支持中文和英文逗号,我们先将所有中文逗号都替换成英文逗号。 var sTemp = string.replace(inputStr,",",","); // 用英文逗号分隔字符串,获得输入的数据(数组) var arrData = string.split(sTemp,","); return arrData; } ``` 写完记得测试一下(ps:`console.log()`只能输出字符串、整数、浮点数等直接储存的东西,要在控制台输出数组或对象等指针变量,请用`console.varDump()`); ![](http://heykui.oss-cn-beijing.aliyuncs.com/18-4-17/29545654.jpg) 此时我们便得到了输入的每个数据(存在数组里) ### 4.3 计算 拿到了输入的每个数据后,我们下一步做什么呢? > 答: **计算** 那不确定度到底怎么算呢? ![A类不确定度](http://heykui.oss-cn-beijing.aliyuncs.com/18-4-16/39018466.jpg) ![B类不确定度](http://heykui.oss-cn-beijing.aliyuncs.com/18-4-16/95650340.jpg) 根据上图,写代码。 ```JavaScript // 计算 function calc(arrData,dt) { var Data = { arr = arrData ; // 原数据 arrCount = 0; // 原数据的个数 sum = 0; // 总和 avr = 0; // 平均值 sigma = 0; // 标准差 uA = 0; // A类不确定度 uB = 0; // B类不确定度 U = 0; // 合成标准不确定度 }; var arrDataCount = 0; // 计算总和 for index in arrData{ // 统计数据的个数 arrDataCount ++; Data.sum += arrData[index]; } // 计算平均值 Data.avr = Data.sum/arrDataCount; Data.arrCount = arrDataCount; // 计算标准差 var temp = 0; for index in arrData{ temp += (arrData[index] - Data.avr)*(arrData[index] - Data.avr) } Data.sigma = math.sqrt(temp/(arrDataCount-1)); // A类标准不确定度 Data.uA = Data.sigma/math.sqrt(Data.arrCount); // 判断是否需要计算B类不确定度 if(dt != null){ // 计算B类不确定度 Data.uB = dt/math.sqrt(3); // 计算合成标准不确定度 Data.U = math.sqrt(Data.uA*Data.uA+Data.uB*Data.uB); }else { Data.U = Data.uA; } return Data; } ``` 当然写好了后我们还是要测试一下再往下走 ### 4.4 输出计算结果 这个比较简单 只需要将你需要显示的内容拼接成字符串 再将其赋值给显示控件的text属性 `mainForm.calcRes.text = "你想显示的任何内容"` 代码如下: ```JavaScript // 结果的显示 function showRes(res){ var resStr = "您输入的数据是:"; for(i=1;#res.arr;1){ resStr += res.arr[i]+' '; } resStr += '\n' resStr += "数据个数:" + res.arrCount +' | '; resStr += "总和:" + res.sum + ' | '; resStr += "平均数:" + res.avr + '\n'; resStr += "标准差:" + res.sigma +'\n'; resStr += "A类标准不确定度:" + res.uA + '\n'; if(res.uB == 0){ resStr += "未提供仪器最小刻度,无法估算B类不确定度!" + '\n'; resStr += "标准不确定度:" + res.U ; }else { resStr += "B类不确定度:" + res.uB+'\n'; resStr += "合成标准不确定度:" + res.U; } // 显示的代码与获取的代码刚好相反 mainForm.calcRes.text = resStr; } ``` 运行调试: ![](http://heykui.oss-cn-beijing.aliyuncs.com/18-4-17/28143112.jpg) ## 5 打包发布 做好了后直接点发布或者`F7` --- 完整代码:在[我的码云](https://gitee.com/smallcatx0/uncertaintyCalc)