zoukankan      html  css  js  c++  java
  • 计算可塑性指数RDPI

    可塑性指数RDPI的计算公式如下:

    需要补充一点,i不能等于i‘。

    假设a为集合A的元素,b为集合B的元素,则对于a和b在可塑性指数中的贡献为tmp=(Math.abs(parseFloat(a[i])-parseFloat(b[j])))/(parseFloat(a[i])+parseFloat(b[j])),随后求和取平均值,为了通用性和界面友好,采用HTML+Javascript构建本脚本。版本一(calRDPI v1)如下

    <html>
    <body>
    
    <h1>计算RDPI</h1>
    	<form id="ctrl">
    		<label>数组1,英文空格分割<input type="text" id="a_str" size="100"/></label><br />
    		<label>数组2,英文空格分割<input type="text" id="b_str" size="100"/></label><br />
    		<input type="button" id="submit" value="提交" />
    		<input type="reset" id="reset" value="重置" /><br />
    		<label>提示消息<input type="text" id="msg" readonly="ture" size="100" /></label>
    	</form>
    
    <script>
    
    var oSubmit = document.getElementById("submit");
    var oMsg = document.getElementById("msg");
    oSubmit.onclick = init;
    
    function init(){
    	var oA = document.getElementById("a_str");
    	var oB = document.getElementById("b_str");
    	
    	var a = oA.value.split(" ");
    	var b = oB.value.split(" ");
    
    
    	// var a = [1,2,3,4,5,6,8];
    	// var b = [2,3,4,5,6,7,9];
    	var sum_array = new Array();
    	var sum_num = 0;
    	for (var i = 0; i < a.length; i++){
    		for (var j = 0; j < b.length; j++){
    			if(a[i] != "" && b[j] != ""){
    				var tmp = (Math.abs(parseFloat(a[i])-parseFloat(b[j])))/(parseFloat(a[i])+parseFloat(b[j]));
    				sum_array.push (tmp);
    				sum_num += tmp;
    				console.log(tmp);
    			}
    		}
    	}
    	oMsg.value = "计算"+sum_array.length+"次,加和为"+sum_num;
    }
    </script>
    
    </body>
    </html>
    

    当处理因素为4时,则有四组数组,手动遍历组合比较麻烦,可借助函数的调用,版本二(calRDPI v2)如下

    <!DOCTYPE html>
    <html>
    <body>
    
    <h1>计算RDPI</h1>
        <form id="ctrl">
            <label>数组1,英文空格或逗号分割<input type="text" id="a_str" size="100"/></label><br />
            <label>数组2,英文空格或逗号分割<input type="text" id="b_str" size="100"/></label><br />
            <label>数组3,英文空格或逗号分割<input type="text" id="c_str" size="100"/></label><br />
            <label>数组4,英文空格或逗号分割<input type="text" id="d_str" size="100"/></label><br />
    
            <input type="button" id="submit" value="提交" />
            <input type="reset" id="reset" value="重置" /><br />
            <label>提示消息<input type="text" id="msg" readonly="ture" size="100" /></label>
        </form>
    
    <script>
    
    var oSubmit = document.getElementById("submit");
    var oMsg = document.getElementById("msg");
    function calOnce(s1,s2){
        var part_array = new Array();
        var part_num = 0;
        var a = s1.split(",");
        var b = s2.split(",")
        for (var i = 0; i < a.length; i++){
            for (var j = 0; j < b.length; j++){
                if(a[i] != "" && b[j] != ""){
                    var tmp = (Math.abs(parseFloat(a[i])-parseFloat(b[j])))/(parseFloat(a[i])+parseFloat(b[j]));
                    part_array.push (tmp);
                    part_num += tmp;
                }
            }
        }
        return [part_num,part_array];
    }
    
    oSubmit.onclick = init;
    
    
    function init(){
        var oA = document.getElementById("a_str");
        var oB = document.getElementById("b_str");
        var oC = document.getElementById("c_str");
        var oD = document.getElementById("d_str");
        
        var reg = /s+|,/;
        var a = oA.value.split(reg);
        var b = oB.value.split(reg);
        var c = oC.value.split(reg);
        var d = oD.value.split(reg);
        var myData = new Array(a,b,c,d);
    
        var sum_array = new Array();
        var sum_length = 0;
        var sum_num = 0;
    
        for (var arr1 of myData){
            for (var arr2 of myData){
                if (arr1 != arr2){
                    var tmpArr = calOnce(arr1.toString(),arr2.toString());
                    //console.log(tmpArr[1].length)
                    sum_array.push (tmpArr[1]);
                    sum_length += tmpArr[1].length;
                    sum_num += tmpArr[0];
                }
            }
        }
        oMsg.value = "计算"+sum_length+"次,加和为"+sum_num+"平均数是"+sum_num/sum_length;
        console.log(sum_array)
    }
    </script>
    
    </body>
    </html>

    当有更多处理或者数据时,则需要以多行的形式一次性输入,需要扩展性更强的最终版本calRDPI v3

    <!DOCTYPE html>
    <html>
    <body>
    
    <h1>计算RDPI</h1>
        <form id="ctrl">
            <textarea rows="15" cols="100" id="str">英文空格或逗号为分隔符,换行分割数组,示例:
    
    
    1,2,3,4,5,7
    1 2 3 5 6
    12,13,14,15
    199,500</textarea><br/>
            <input type="button" id="submit" value="提交" />
            <input type="reset" id="reset" value="重置" /><br />
            <label>提示消息<input type="text" id="msg" readonly="ture" size="100" /></label>
        </form>
    
    <script>
    
    var oSubmit = document.getElementById("submit");
    var oMsg = document.getElementById("msg");
    function calOnce(s1,s2){
        var part_array = new Array();
        var part_num = 0;
        var reg = /s+|,/;
        var a = s1.split(reg);
        var b = s2.split(reg)
        for (var i = 0; i < a.length; i++){
            for (var j = 0; j < b.length; j++){
                if(a[i] != "" && b[j] != ""){
                    var tmp = (Math.abs(parseFloat(a[i])-parseFloat(b[j])))/(parseFloat(a[i])+parseFloat(b[j]));
                    part_array.push (tmp);
                    part_num += tmp;
                }
            }
        }
        return [part_num,part_array];
    }
    
    oSubmit.onclick = init;
    
    function init(){
        var oStr = document.getElementById("str");
        var myData = oStr.value.split("
    ");
    
        var sum_array = new Array();
        var sum_length = 0;
        var sum_num = 0;
    
        for (var arr1 of myData){
            for (var arr2 of myData){
                if (arr1 != arr2){
                    var tmpArr = calOnce(arr1,arr2);
                    sum_array.push (tmpArr[1]);
                    sum_length += tmpArr[1].length;
                    sum_num += tmpArr[0];
                }
            }
        }
        oMsg.value = "计算"+sum_length+"次,加和为"+sum_num+"平均数是"+sum_num/sum_length;
        console.log(sum_array)
    }
    </script>
    
    </body>
    </html>

    在编写脚本时,发现JavaScript的Array的split(" ")方法,不仅可以识别空格,也可以识别英文逗号,但为了减少不确定性,后两个版本使用了正则/s+|,/作为定界符。

    为解决浏览器编码问题,添加HTML meta信息<meta charset="utf-8">,版本v3.1如下

    <!DOCTYPE html>
    <html>
    <meta charset="utf-8">
    <meta name="description" content="相对距离可塑性指数(RDPI)计算" />
    <meta name="author" content="Lyle Liu; liulele62@163.com" />
    <title>相对距离可塑性指数(RDPI)计算</title>
    <body>
    
    <h1>相对距离可塑性指数(RDPI)计算V3.1</h1>
        <form id="ctrl">
            <textarea rows="15" cols="100" id="str"></textarea><br/>
            <input type="button" id="submit" value="提交" />
            <input type="reset" id="reset" value="重置" /><br />
            <label>提示消息<input type="text" id="msg" readonly="ture" size="100" /></label>
        </form>
    <div>
    <p>说明</p>
    英文空格或逗号为分隔符,换行分割数组,示例:<br/>
    1,2,3,4,5,7<br/>
    1 2 3 5 6<br/>
    12,13,14,15<br/>
    199,500<br/>
    <br/>
    <br/>
    <p>作者:Lyle Liu<p/>
    <p>邮箱:liulele622@163.com<p/>
    
    <div>
    <script>
    
    var oSubmit = document.getElementById("submit");
    var oMsg = document.getElementById("msg");
    function calOnce(s1,s2){
        var part_array = new Array();
        var part_num = 0;
        var reg = /s+|,/;
        var a = s1.split(reg);
        var b = s2.split(reg)
        for (var i = 0; i < a.length; i++){
            for (var j = 0; j < b.length; j++){
                if(a[i] != "" && b[j] != ""){
                    var tmp = (Math.abs(parseFloat(a[i])-parseFloat(b[j])))/(parseFloat(a[i])+parseFloat(b[j]));
                    part_array.push (tmp);
                    part_num += tmp;
                }
            }
        }
        return [part_num,part_array];
    }
    
    oSubmit.onclick = init;
    
    function init(){
        var oStr = document.getElementById("str");
        var myData = oStr.value.split("
    ");
    
        var sum_array = new Array();
        var sum_length = 0;
        var sum_num = 0;
    
        for (var arr1 of myData){
            for (var arr2 of myData){
                if (arr1 != arr2){
                    var tmpArr = calOnce(arr1,arr2);
                    sum_array.push (tmpArr[1]);
                    sum_length += tmpArr[1].length;
                    sum_num += tmpArr[0];
                }
            }
        }
        oMsg.value = "计算"+sum_length+"次,加和为"+sum_num+",平均数是"+sum_num/sum_length;
        console.log(sum_array)
    }
    </script>
    
    </body>
    </html>

     v3.2增加了行数显示,并对负值进行了折中处理。

    <!DOCTYPE html>
    <html>
    <meta charset="utf-8">
    <meta name="description" content="相对距离可塑性指数(RDPI)计算" />
    <meta name="author" content="Lyle Liu; liulele62@163.com" />
    <title>相对距离可塑性指数(RDPI)计算</title>
    <body>
    
    <h1>相对距离可塑性指数(RDPI)计算V3.2</h1>
        <form id="ctrl">
            <textarea rows="15" cols="100" id="str"></textarea><br/>
            <input type="button" id="submit" value="提交" />
            <input type="reset" id="reset" value="重置" /><br />
            <label>提示消息<input type="text" id="msg" readonly="ture" size="100" /></label>
        </form>
    <div>
    <p>说明</p>
    英文空格或逗号为分隔符,换行分割数组,示例:<br/>
    1,2,3,4,5,7<br/>
    1 2 3 5 6<br/>
    12,13,14,15<br/>
    199,500<br/>
    <br/>
    <br/>
    <p>作者:Lyle Liu<p/>
    <p>邮箱:liulele622@163.com<p/>
    
    <div>
    <script>
    
    var oSubmit = document.getElementById("submit");
    var oMsg = document.getElementById("msg");
    function calOnce(s1,s2){
        var part_array = new Array();
        var part_num = 0;
        var reg = /s+|,/;
        var a = s1.split(reg);
        var b = s2.split(reg)
        for (var i = 0; i < a.length; i++){
            for (var j = 0; j < b.length; j++){
                if(a[i] != "" && b[j] != ""){
                    var fA = parseFloat(a[i]);
                    var fB = parseFloat(b[j]);
                    if (fA * fB >= 0){
                        var tmp = (Math.abs(fA - fB))/(Math.abs(fA + fB));
                    }else{
                        fA = 2 * fB - fA;
                        var tmp = (Math.abs(fA - fB))/(Math.abs(fA + fB));
                    }
                    part_array.push (tmp);
                    part_num += tmp;
                }
            }
        }
        return [part_num,part_array];
    }
    
    oSubmit.onclick = init;
    
    function init(){
        var oStr = document.getElementById("str");
        var myData = oStr.value.split("
    ");
    
        var sum_array = new Array();
        var sum_length = 0;
        var sum_num = 0;
    
        for (var arr1 of myData){
            for (var arr2 of myData){
                if (arr1 != arr2){
                    var tmpArr = calOnce(arr1,arr2);
                    sum_array.push (tmpArr[1]);
                    sum_length += tmpArr[1].length;
                    sum_num += tmpArr[0];
                }
            }
        }
        oMsg.value = "共"+myData.length+"行,计算"+sum_length+"次,加和为"+sum_num+",平均数是"+sum_num/sum_length;
        //console.log(sum_array)
    }
    </script>
    
    </body>
    </html>
  • 相关阅读:
    openlayers 学习笔记之1
    objective C 学习之02
    xcode 中 的工程模板
    xcode 创建项目 勾选 git 出现警告
    html+css复习之第3篇 | jquery | bootstrap
    html+css复习之第2篇 | javascript
    iOS开发系列之 itms-services 协议
    App store 如何使用 promo code | app store 打不开精品推荐和排行榜
    设计一组N个数,确定其中第k个最大值
    [搬运]如何在C++中实现多态性
  • 原文地址:https://www.cnblogs.com/liulele/p/9614637.html
Copyright © 2011-2022 走看看