C-expr

表达式是可以放在等号右边的,称为右值,而事实上赋值运算本身也是一个右值。

真假的判断只有2个值,非0和0。

if ? true : false  三目运算内在逻辑就是个if判断。

使用多种表达式时,最好使用小括号分清楚内在层级关系,毕竟代码写出来有时候还是需要别人维护的。

C语言里面表达式可能会出现类型转换,不注意的话可能会丢失数据,比如6/8这样的结果会是0……,用书上的逻辑来说,是int的盒子比double的盒子矮一层,它没有放小数点的楼层,就丢失了,此时需要显性的(double)6/8出来。

C-string

字符分为4种: 字母;数字;标点;控制符。它的存储是一个二进制的数,这个二进制的十进制数字就是它的ascii码,比如A的ascii码就是:65。

字符串和它的ascii码可以互相转换。printf(“%c”,65) 结果是 A;printf(“%d”,’A’)结果就是65了。

字符的数组组合在一起就是字符串,字符串和数组差不多,区别有以下几点:

它必须使用char 声明

它必须以 \0 结束

它遇到\0就结束

char声明的字符串数组一定需要0来结尾,否则会报错。事实上,不只是字符串必须使用0技术,char 声明的其他数组也必需使用0结束。此处留疑,为什么要留0呢,因为C不知道数组到哪里结束,得给它一个结束得null,但为什么不知道呢?留存待解。

C-arr

C的数组是指同一个类型的数据的集合,例如 char arr[5] 表示5个char类型数据的集合,必需声明长度,后期可能会学到不需要声明长度的方法,预留。

数组的初始化:未初始化的数组所有的元素都默认为0。

数组的调试:打断点之后按F5,使用局部变量窗口查看,使用F10按键观察数组变化。

二维数组事实上和一维数组没有区别,注意,声明二维数组时每个第二维数组后面都需要以逗号结尾,如下:

char arr[2][2]{

{89,90},

{88,92},

}

C-变量&内存

C语言的变量,和JS的变量略有不同,C语言中一般提起变量是特指数据变量,根据数据类型不同,声明方式也不同,整数型有int,short,char;浮点型有float,double。附表:

var

上面的表中有一个sizeof的值,这个值表示该变量类型在内存中占多大字节,一个字节可以放8个0或者1,所以char声明的数值只能在0000 0000 到1111 1111之间,char的第一位是作为符号位出现的,1为负0为正,于是char的范围是-128-127,有负值的。unsigned char的声明第一位不是符号位,就没有负数的概念,范围是0-255。

不论是哪种声明方式声明的变量,他的值都可以从内存中读取到,这个变量就放在内存的这几个字节中,修改变量就是修改内存,读取变量就是读取内存,所以可以用小字节变量的时候就不需要用大的类型,以节省内存。

C-printf & scanf_s

C语言的第二章: printf和 scanf_s,输出与输入。

printf,在我心目中和console.log以及document.write差不多,都是打印用,但printf是有自己的参数的,它使用起来是这样的:printf(“%d+%f”,10,10.2)。

%d 或者 %f 是坑,显示后面的参数的,第一个””,后面出现的就都是参数了,参数之间使用英文逗号隔开。

scanf_s,原来应该是scanf,scanf_s是scanf的安全版,我使用的vs2015已经不支持scanf了。这个参数是让输入的意思,和keydown差不多了。也可以有好几个参数,使用起来是这样的:int a,b; scanf_s(“%d,%d”,&a,&b); 他的参数前面需要“&”,键入参数时需要完整的按照中间的间隔符键入,比如我这里使用了半逗号,就需要输入半逗号,输入其它都会报错。
#include <stdio.h>
int main() {
double float1;
double float2;
printf(“please multiplying two float_num like 1.2*1.2: “);
scanf_s(“%lf*%lf”, &float1,&float2);
printf(“The result of multiplying two numbers is:%f*%f=%.2f”,float1,float2,float1*float2);
return 0;
}

附加其它基础:

%d:十进制整数。
%4d:最小4位宽整数,不足4位宽前面补足空格。
%04d:最小4位宽整数,不足4位宽前面补足0(只能使用0)。
%f:浮点数,保留浮点数后6位。
%lf:
%.2f:浮点数,保留浮点数后2位。
int a=10:声明变量a是类型为数字10。
double a = 12.2123:声明变量a是类型为浮点数12.2123。

C语言中声明变量竟然还需要声明类型,每个类型有不同的声明,心塞塞。
注:scanf_s使用浮点数时,需要用double声明%lf这样的双精度浮点型,使用float声明的%f单精度浮点型就会报错,甚至有可能引起程序崩溃 。

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了函数想要给外部的结果