@smallcatx0
2018-04-18T01:07:44.000000Z
字数 3858
阅读 1846
编程解决生活中的问题
作 者:smallcatx0;
谨以此文献给 绵阳师范学院 物理学14.1/2班的同学们
转载的同学请注明原链接 http://blog.heykui.cn/index.php/archives/77/
做测量类实验时,计算不确定度往往是个很麻烦的事情。
而我们可以编写一个小程序来解决这个小麻烦,此次我用这个例子来介绍下aardio这个国产的开源编程工具
什么是aardio?
aardio 专用于桌面软件快速开发,开发环境仅 6.5 MB, 绿色软件解压即用 - 无论个人或企业都可以永久免费使用本软件开发商用、或非商用的应用程序。使用aardio开发的软件不需要放置鸣谢链接、不需要声明使用aardio开发。
--摘自官方的简介
aardio有什么特点?
先从官网下载aardio
解压就可以用了(可以花点时间浏览下aardio的快速入门教程)
打开软件,新建一个窗口程序,然后拖一波控件
在右边的属性里修改各个控件的大小、颜色、字体等属性
显然,3个文本框里有两个是数据输入框,一个数据输出框。
此程序的逻辑无非就是
程序主体逻辑如下:
// 获取输入框原始数据(字符串)
var inputStr = mainForm.inData.text;
// 将字符串处理成单个数据(数组)
var arrData = getData(inputStr);
// 获取仪器最小刻度
var dt = mainForm.dt.text;
// 将数据拿去计算
var res = calc(arrData,dt);
// 算完后显示
showRes(res);
这一条代码就能获取到文本框中的文本数据(得到的是一个字符串)
// 将mainForm窗体里的
// 名称为inData的控件的 text(这里指文本框里的内容)
// 赋值给局部变量inputStr
var inputStr = mainForm.inData.text;
这时可能就有人会问了:我要在哪里写入这行代码呢?并且怎么看我是否获取到了输入框中的数据呢?
下面我就简单的讲一下,事件触发 以及如何调试程序
而最简单的鼠标单击事件,只需要在设计窗口双击某个控件
比如我现在双击计算
按钮,就自动调整到代码页面,并且为我们自动生成了计算按钮
鼠标单击事件的监听函数
(ps:想回到设计模式只需要点上面的设计视图,或者按快捷键ctrl+u
)
一起来测试一下这个东东能不能正常工作(写任何代码,在还不是非常熟悉时,都建议每写一个功能就先测试下。避免200行代码,199个Error这种尴尬的情况):
在代码页面第一行写: import console;
(不解释,想了解的去看官方的文档)
然后在刚才生成的单击事件监听函数内写入
console.log("你点我干啥?")
如图:
点上面的运行按钮,或按F5
运行效果如图,说明我们的程序计算按钮的鼠标单击正常。
到这里,同学们是否还记得我们刚才讲到的获取输入内容
现在你可以试下将哪行代码写到这个单击监听函数中并将内容用console.log()
控制台输出看看了
mainForm.button.oncommand = function(id,event){
var inputStr = mainForm.inData.text;
console.log(inputStr);
}
运行:
此时,我们便获取到了输入框中的源数据
【补】刚才只讲了鼠标单击事件怎么绑定
再贴一个控件失去焦点的事件监听函数,其他的事件可以去这里查看
// mainForm窗口内的名称为inData的控件的失去焦点监听函数
mainForm.inData.wndproc = function(hwnd,message,wParam,lParam){
if(message = 0x0008){//光标焦点离开
// 事件处理代码
}
//无返回值则继续调用默认回调函数
}
上面我某已经获得了输入的字符串,现在我们要将获得的字符串解析成数组以方便计算
// 解析字符串(以逗号分隔的),返回数组
function getData(inputStr){
// 为了支持中文和英文逗号,我们先将所有中文逗号都替换成英文逗号。
var sTemp = string.replace(inputStr,",",",");
// 用英文逗号分隔字符串,获得输入的数据(数组)
var arrData = string.split(sTemp,",");
return arrData;
}
写完记得测试一下(ps:console.log()
只能输出字符串、整数、浮点数等直接储存的东西,要在控制台输出数组或对象等指针变量,请用console.varDump()
);
此时我们便得到了输入的每个数据(存在数组里)
拿到了输入的每个数据后,我们下一步做什么呢?
答: 计算
那不确定度到底怎么算呢?
根据上图,写代码。
// 计算
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;
}
当然写好了后我们还是要测试一下再往下走
这个比较简单
只需要将你需要显示的内容拼接成字符串
再将其赋值给显示控件的text属性
mainForm.calcRes.text = "你想显示的任何内容"
代码如下:
// 结果的显示
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;
}
运行调试:
做好了后直接点发布或者F7
完整代码:在我的码云