C-hello world

评测结果下来了,专业知识评审建议学习C语言,于是有了今天的博客内容:Hello C。

整理了需要学习的24章学习点。这周完成了第一章:Hello World。

1.开发平台Visual Studio的安装。

2.创建第一个程序。

Visual Studio 是一款IDE工具,可以使用的语言有C,C++,C#,nodeJs,.net,asp,VB等等一大堆,总之挺牛的。我安装的是2015版本,之前装了2017版本但语言难以兼容,总是找不到 <stdio.h>文件。安装时间大约是3小时,需要看网速,因为它是一边下载一边安装,需要最少4个G的硬盘空间。这些在vs官方 before 都有提示的。

so:

#include <stdio.h>

int main(){

printf (“Hello C”);

}

JS-二叉树

想用JS模拟一个二叉树,然而失败了,有大bug,要改动。只能判断2的n次方,code如下:

    $(function(){
        var $arr = [1,2,3,4,5,6,7,8];
        var max_len = $arr.length;
        var obj_arr = [[$arr]];
        var $tag = true;
        while($tag == true){
            var last_arr = obj_arr[obj_arr.length-1];
            var $len = last_arr.length;
            if($len == max_len){
                $tag = false;
                break;
                return;
            }else{
                $tag= true;
            }
            var new_obj_arr = [];
            for(var i =0;i<$len;i++){
                var half_len = Math.floor(last_arr[i].length/2);
                if(half_len !== 0){
                    var new_arr = last_arr[i].splice(0,half_len);
                    new_obj_arr.push(new_arr,last_arr[i]);
                    obj_arr.push(new_obj_arr);
                }
            }
        }
        for(var key in obj_arr){
            document.write(" 
" + obj_arr[key][0]);
        }
    })

JS-约瑟夫环 2

之前的版本 JS-约瑟夫环 方法留了一个bug,所以具体是什么bug呢?

在循环到最后一轮时,如果for循环里面的count数值小于while循环里面的条件数字,就会产生意料外的多次out事件,所以需要在for循环时给与限制条件,具体就不表了。修整成JS方法如下:

function joseph(total,member,number){
    var arr = [];
    for(var i=1;i<=total;i++){ 
       arr.push(i); 
    } 
    var count = 0; 
    var out; 
    while(arr.length>member){
         out = 0;
        //遍历
        for(var s=0,len=arr.length;s<len;s++){ 
            count++; 
            if(count == number && arr.length > member){
                count = 0;
                arr.splice(s-out,1);
                out ++;
            }
        }
    }
    return arr;
}

JS-约瑟夫环

据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从。 所以坐在哪个位置可以活下来呢?

OK。先报数~第一轮,报到3的人自杀了

var arr = [];
for(var i=1;i=<41;i++){
    arr.push(i);
}
var count = 0;
var out = 0;
for(var s=0,len=arr.length;s<len;s++){
    count++;
    if(count == 3){
        count = 0;
        arr.splice(s-out,1);
        out ++;
    }
}

这里有一个arr.splice(s-out,1),按直脑子来说,应该arr.splice(s,1).但splice返回的是被删除后的数组,所以再次splice时,需要把被删除的位给减去,于是 arr.splice(s-out,1);

这一轮for循环之后,第一轮报数结束,得到count,out,arr分别为:

arr:1,2,4,5,7,8,10,11,13,14,16,17,19,20,22,23,25,26,28,29,31,32,34,35,37,38,40,41;

count:2;

out:13;

数数数到了2,已经出局了13人,再数一个就是出局14人了。

所以又需要一个for遍历,结束遍历的条件是剩两个人。再次循环时,out属于定位专用,需要清0,count数数专用,得接着数,不能断,不能清0:

var arr = [];
for(var i=1;i=<41;i++){
    arr.push(i);
}
var count = 0;
while(arr.length>2){
    var out = 0;
    //遍历
    for(var s=0,len=arr.length;s<len;s++){
        count++;
        if(count == 3){
            count = 0;
            arr.splice(s-out,1);
            out ++;
        }
    }
}

那所有人出局后,剩下最后2人的数组,就是答案了,最后是arr[16,31],坐在16和31位能活。

故事的结局是,joseph坐在第31位,朋友坐在16位,活下来了~

以上方法实际上应用时,会有一个小bug,预留下次~

JS return

JS 函数里面经常会看到return true;return false;return this;return。所以到底return 了什么?

var f = {
        aa: function(){
            return true;
        },
        bb: function(){
            return false;
        },
        cc: function(){
            return;
        },
        dd:function(){
            return this;
        },
        ee:function(){
            var m={
                a:"1",
                b:"2"
            }
            return m;
        }
    }

return true,return false 是一挂,return了一个布尔值。

console.log(f.aa());

打印结果为:true.

console.log(f.bb());

打印结果为:false.
纯粹的return; 是什么都没有返回,只有打断函数的作用。

console.log(f.cc());

打印结果为:undefined.
return this 一般用在链式调用里,谁调用返回谁。

console.log(f.dd());

打印结果为:Object {}
return obj …… 等等,返回的是啥就是啥了,和true/false差不多。

console.log(f.ee().a)

打印结果为:1

所以到底return了什么?return了函数想要给外部的结果

JS对象

W3C关于对象的解释是有属性和方法的特殊数据类型,我自己的理解是键值对的组合。

案例1如下:

题目:去掉字符串中多余的空格

解答:

function format_spaces(str){
    var new_str = [];
    var $len = str.length;
    for(var i=0;i<$len;i++){
        if(i==0 && str[i] != " "){
            new_str.push(str[i])
        }else if(i==$len-1 && str[i] != " "){
            new_str.push(str[i])
        }else if(str[i] != " " || str[i-1] != " "){
            new_str.push(str[i])
        }
    }
    return new_str;
}

案例2如下:

题目:在数组中,找出出现最多的数字

解答:

function most(arr){
    var $obj = {};
    var $times = 0;
    var $num = null;
    var $len = arr.length;
    for(var i =0;i<$len;i++){ 
        if($obj[arr[i]]){ 
            $obj[arr[i]]++; 
            if($obj[arr[i]]>$times){
                $times = $obj[arr[i]];
                $num = arr[i];
            }
        }else{
            $obj[arr[i]]=1;
            $times = 1;
            $num = arr[i];
        }
    }
    var info = {
        num:$num,
        times:$times
    }
    return info;
}

这两个解答方案都是用对象键值对特性解答的。