笔记 订阅
《笔记》是周笔畅演唱的歌曲,该歌曲由黄友桢作曲,唐恬恬和黄友桢作词。该歌曲收录于2005年超级女声《终极PK》合集,后被收录于由人民音乐出版社编辑的第一部《流行音乐》教材中 [1]  。2006年获第12届全球华语榜中榜“搜索最热门年度歌曲奖” [2]  、第13届东方风云榜“十大金曲奖” [3]  、香港新城国语力“热爆K歌奖” [4]  。 展开全文
《笔记》是周笔畅演唱的歌曲,该歌曲由黄友桢作曲,唐恬恬和黄友桢作词。该歌曲收录于2005年超级女声《终极PK》合集,后被收录于由人民音乐出版社编辑的第一部《流行音乐》教材中 [1]  。2006年获第12届全球华语榜中榜“搜索最热门年度歌曲奖” [2]  、第13届东方风云榜“十大金曲奖” [3]  、香港新城国语力“热爆K歌奖” [4]  。
信息
歌曲原唱
周笔畅
中文名称
笔记
发行时间
2005年
谱    曲
黄友桢
所属专辑
超级女声 终极PK
歌曲语言
普通话
填    词
唐恬恬,黄友桢
歌曲时长
4分18秒
笔记创作背景
《笔记》作为周笔畅出道后的第一首个人作品,由黄友桢作曲,唐恬恬作词。唐恬恬表示在筹备这张《终极pk》合辑的时,许多超级女声对人生中的第一首单曲都倾向以爱情为主旋律,而周笔畅却要选择一首唱给妈妈的歌,表达对妈妈的感谢。周笔畅在录制《笔记》这首歌时仅花了半个小时便录制完成。 [5] 
收起全文
精华内容
下载资源
问答
  • c语言入门这一篇就够了-学习笔记(一万字)

    万次阅读 多人点赞 2018-07-19 09:00:15
    内容来自慕课网,个人学习笔记。加上了mtianyan标签标记知识点。 C语言入门 -> Linux C语言编程基本原理与实践 -> Linux C语言指针与内存 -> Linux C语言结构体 ...C语言一经出现就以其功能...

    内容来自慕课网,个人学习笔记。加上了mtianyan标签标记知识点。

    C语言入门 -> Linux C语言编程基本原理与实践 -> Linux C语言指针与内存 -> Linux C语言结构体

    mark

    https://www.imooc.com/course/programdetail/pid/37

    c语言入门

    C语言一经出现就以其功能丰富、表达能力强、灵活方便、应用面广等特点迅速在全世界普及和推广。C语言不但执行效率高而且可移植性好,可以用来开发应用软件、驱动、操作系统等。C语言也是其它众多高级语言的鼻祖语言,所以说学习C语言是进入编程世界的必修课。

    hello,world

    #include<stdio.h> 
    int main()
    {
        /*在双引号中间输入Hello World*/ 
        printf("Hello World");
        return 0; 
    }
    

    注:在最新的C标准中,main函数前的类型为int而不是void

    c语言的具体结构

    简单来说,一个C程序就是由若干头文件函数组成。

    mark

    • #include <stdio.h>就是一条预处理命令, 它的作用是通知C语言编译系统在对C程序进行正式编译之前需做一些预处理工作。

    • 函数就是实现代码逻辑的一个小的单元

    必不可少之主函数

    一个C程序有且只有一个主函数,即main函数。

    mark

    • C程序就是执行主函数里的代码,也可以说这个主函数就是C语言中的唯一入口

    • main前面的int就是主函数的类型.

    • printf()格式输出函数,这里就记住它的功能就是在屏幕上输出指定的信息

    • return是函数的返回值,根据函数类型的不同,返回的值也是不同的。

    • \n是转义字符中的换行符。(注意:C程序一定是从主函数开始执行的)

    良好习惯之规范

    1. 一个说明或一个语句占一行,例如:包含头文件、一个可执行语句结束都需要换行
    2. 函数体内的语句要有明显缩进通常以按一下Tab键为一个缩进
    3. 括号要成对写,如果需要删除的话也要成对删除
    4. 当一句可执行语句结束的时候末尾需要有分号
    5. 代码中所有符号均为英文半角符号

    mark

    程序解释——注释

    注释是写给程序员看的,不是写给电脑看的。

    C语言注释方法有两种:

    多行注释: /* 注释内容 */

    单行注释: //注释一行

    有名有姓的C(标识符)

    C语言规定,标识符可以是字母(A~Z,a~z)、数字(0~9)、下划线_组成的字符串,并且第一个字符必须是字母或下划线。在使用标识符时还有注意以下几点:

    1. 标识符的长度最好不要超过8位,因为在某些版本的C中规定标识符前8位有效,当两个标识符前8位相同时,则被认为是同一个标识符。
    1. 标识符是严格区分大小写的。例如Imoocimooc 是两个不同的标识符。
    2. 标识符最好选择有意义的英文单词组成做到"见名知意",不要使用中文。
    3. 标识符不能是C语言的关键字。想了解更多C语言关键字的知识。

    变量及赋值

    变量就是可以变化的量,而每个变量都会有一个名字(标识符)。变量占据内存中一定的存储单元。使用变量之前必须先定义变量,要区分变量名变量值是两个不同的概念。

    mark

    变量定义的一般形式为:数据类型 变量名;

    多个类型相同的变量:数据类型 变量名, 变量名, 变量名…;

    mark

    注意:在定义中不允许连续赋值,如int a=b=c=5;是不合法的。

    变量的赋值分为两种方式:

    1. 先声明再赋值
    2. 声明的同时赋值

    基本数据类型

    C语言中,数据类型可分为:

    1. 基本数据类型
    2. 构造数据类型
    3. 指针类型
    4. 空类型四大类

    数据类型分类

    最常用的整型, 实型与字符型(char,int,float,double):

    整型,实型,字符型

    整型数据是指不带小数的数字(int,short int,long int, unsigned int, unsigned short int,unsigned long int):

    整型

    注:

    • int short int long int根据编译环境的不同,所取范围不同。
    • 而其中short intlong int至少是表中所写范围, 但是int在表中是以16位编译环境写的取值范围。
    • 另外 c语言int的取值范围在于他占用的字节数 ,不同的编译器,规定是不一样。
    • ANSI标准定义int是占2个字节,TC是按ANSI标准的,它的int是占2个字节的。但是在VC里,一个int是占4个字节的。

    浮点数据是指带小数的数字。

    生活中有很多信息适合使用浮点型数据来表示,比如:人的体重(单位:公斤)、商品价格、圆周率等等。

    因为精度的不同又分为3种(float,double,long double):

    浮点型

    注:**C语言中不存在字符串变量,字符串只能存在字符数组中,**这个后面会讲。

    格式化输出语句

    格式化输出语句,也可以说是占位输出,是将各种类型的数据按照格式化后的类型及指定的位置从计算机上显示。

    其格式为:printf("输出格式符",输出项);

    c语言常用格式化符

    当输出语句中包含普通字符时,可以采用一下格式:

    printf("普通字符输出格式符", 输出项);
    

    mark

    注意:格式符个数要与变量、常量或者表达式的个数一一对应

    不可改变的常量

    在程序执行过程中,值不发生改变的量称为常量

    mtianyan: C语言的常量可以分为直接常量和符号常量。

    • 直接常量也称为字面量,是可以直接拿来使用,无需说明的量,比如:
      • 整型常量:13、0、-13;
      • 实型常量:13.33、-24.4;
      • 字符常量:‘a’、‘M’
      • 字符串常量:”I love imooc!”

    mark

    在C语言中,可以用一个标识符来表示一个常量,称之为符号常量。符号常量在使用之前必须先定义,其一般形式为:

    #define 标识符 常量值 
    
    #include <stdio.h>
    #define POCKETMONEY 10    //定义常量及常量值
    int main()
    {
        // POCKETMONEY = 12;  //小明私自增加零花钱对吗?
        printf("小明今天又得到%d元零花钱\n", POCKETMONEY);
        return 0;  
    }
    

    符号常量不可以被改变。

    自动类型转换

    数据类型存在自动转换的情况.
    自动转换发生在不同数据类型运算时,在编译的时候自动完成

    自动转换

    char类型数据转换为int类型数据遵循ASCII码中的对应值.

    注:

    字节小的可以向字节大的自动转换,但字节大的不能向字节小的自动转换

    char可以转换为int,int可以转换为double,char可以转换为double。但是不可以反向。

    强制类型转换

    强制类型转换是通过定义类型转换运算来实现的。其一般形式为:

    (数据类型) (表达式)
    

    其作用是把表达式的运算结果强制转换成类型说明符所表示的类型

    在使用强制转换时应注意以下问题:

    1. 数据类型和表达式都必须加括号, 如把(int)(x/2+y)写成(int)x/2+y则成了把x转换成int型之后再除2再与y相加了。
    2. 转换后不会改变原数据的类型及变量值,只在本次运算中临时性转换
    3. 强制转换后的运算结果不遵循四舍五入原则。

    运算符号

    C语言中运算符:

    ※ 算术运算符
    ※ 赋值运算符
    ※ 关系运算符
    ※ 逻辑运算符
    ※ 三目运算符
    

    算术运算符

    c语言基本运算符:

    基本算术运算符

    除法运算中注意

    如果相除的两个数都是整数的话,则结果也为整数,小数部分省略,如8/3 = 2;

    而两数中有一个为小数,结果则为小数,如:9.0/2 = 4.500000

    mtianyan: 取余运算中注意

    该运算只适合用两个整数进行取余运算,如:10%3 = 1

    mtianyan: notes: 而10.0%3则是错误的;运算后的符号取决于被模数的符号,如(-10)%3 = -1;10%(-3) = 1;

    mtianyan: %%表示这里就是一个%符.

    注:C语言中没有乘方这个运算符,也不能用×, ÷等算术符号。

    自增与自减运算符

    • 自增运算符为++,其功能是使变量的值自增1
    • 自减运算符为--,其功能是使变量值自减1。

    它们经常使用在循环中。自增自减运算符有以下几种形式:

    自增自减

    赋值运算符

    C语言中赋值运算符分为简单赋值运算符复合赋值运算符

    简单赋值运算符=号了,下面讲一下复合赋值运算符:

    复合赋值运算符就是在简单赋值符=之前加上其它运算符构成.

    例如+=、-=、*=、/=、%=

    分析:定义整型变量a并赋值为3,a += 5;这个算式就等价于a = a+5; 将变量a和5相加之后再赋值给a

    注意:复合运算符中运算符和等号之间是不存在空格的。

    关系运算符

    C语言中的关系运算符:

    关系运算符

    关系表达式的值是,在C程序用整数10表示。

    注意:>=, <=, ==, !=这种符号之间不能存在空格

    逻辑运算符

    C语言中的逻辑运算符:

    逻辑运算符

    逻辑运算的值也是有两种分别为,C语言中用整型的1和0来表示。其求值规则如下:

    • 与运算 &&

    参与运算的两个变量都为真时,结果才为真,否则为假。例如:5>=5 && 7>5 ,运算结果为真;

    • 或运算 ||

    参与运算的两个变量只要有一个为真,结果就为真。 两个量都为假时,结果为假。例如:5>=5||5>8,运算结果为真;

    • 非运算!

    参与运算的变量为真时,结果为假;参与运算量为假时,结果为真。例如:!(5>8),运算结果为真。

    三目运算符

    C语言中的三目运算符:?:,其格式为:

    表达式1 ? 表达式2 : 表达式3; 
    

    执行过程是:

    先判断表达式1的值是否为真,如果是真的话执行表达式2;如果是假的话执行表达式3。

    #include <stdio.h>
    int main()
    {
        //定义小编兜里的钱
        double money =12.0      ; 
        //定义打车回家的费用
        double cost =11.5       ;  
        printf("小编能不能打车回家呢:"); 
        //输出y小编就打车回家了,输出n小编就不能打车回家
        printf("%c\n",money>=cost?'y':'n'                        );
        return 0;
    }
    

    运算符大比拼之优先级比较

    各种运算符号的顺序:

    运算符的优先级

    优先级别为1的优先级最高,优先级别为10的优先级别最低。

    分支结构之简单if语句

    C语言中的分支结构语句中的if条件语句。

    简单if语句的基本结构如下:

    if(表达式)
    {
    执行代码块;
    }
    

    其语义是:如果表达式的值为真,则执行其后的语句,否则不执行该语句。

    注意:if()后面没有分号,直接写{}

    分支结构之简单if-else语句

    简单的if-else语句的基本结构:

    if-else

    语义是: 如果表达式的值为真,则执行代码块1,否则执行代码块2。

    注意:

    if()后面没有分号,直接写{},else后面也没有分号,直接写{}

    分支结构之多重if-else语句

    C语言中多重if-else语句,其结构如下:

    if-else多重

    语义是:依次判断表达式的值,当出现某个值为真时,则执行对应代码块,否则执行代码块n。

    注意:当某一条件为真的时候,则不会向下执行该分支结构的其他语句。

    分支结构之嵌套if-else语句

    C语言中嵌套if-else语句。嵌套if-else语句的意思,就是在if-else语句中,再写if-else语句。其一般形式为:

    嵌套if-else

    循环结构之while循环

    反复不停的执行某个动作就是江湖人称的循环

    C语言中有三种循环结构,先看一下C语言while循环的结构

    while

    其中表达式表示循环条件,执行代码块为循环体

    while语句的语义是:计算表达式的值,当值为真(非0)时, 执行循环体代码块。

    1. while语句中的表达式一般是关系表达或逻辑表达式,当表达式的值为假时不执行循环体,反之则循环体一直执行。

    2. 一定要记着在循环体中改变循环变量的值,否则会出现死循环(无休止的执行)。

    3. 循环体如果包括有一个以上的语句,则必须用{}括起来,组成复合语句。

    循环结构之do-while循环

    C语言中的do-while循环,一般形式如下:

    do-while

    do-while循环语句的语义是:

    它先执行循环中的执行代码块,然后再判断while中表达式是否为真,如果为真则继续循环;如果为假,则终止循环。因此,do-while循环至少要执行一次循环语句

    注意:mtianyan: 使用do-while结构语句时,while括号后必须有分号。

    循环结构之for循环(一)

    c语言中for循环一般形式:

    for

    它的执行过程如下:

    1. 执行表达式1,对循环变量做初始化;
    2. 判断表达式2,若其值为真(非0),则执行for循环体中执行代码块,然后向下执行;若其值为假(0),则结束循环;
    3. 执行表达式3,(i++)等对于循环变量进行操作的语句;
    4. 执行for循环中执行代码块后执行第二步;第一步初始化只会执行一次。
    5. 循环结束,程序继续向下执行。

    注意:for循环中的两个分号一定要写

    循环结构之for循环(二)

    在for循环中:

    • 表达式1是一个或多个赋值语句,它用来控制变量的初始值
    • 表达式2是一个关系表达式,它决定什么时候退出循环;
    • 表达式3是循环变量的步进值,定义控制循环变量每循环一次后按什么方式变化。
    • 这三部分之间用分号 ; 分开。

    使用for语句应该注意

    1. for循环中的“表达式1、2、3”均可不写为空,但两个分号(;;)不能缺省。
    2. 省略“表达式1(循环变量赋初值)”,表示不对循环变量赋初始值。
    3. 省略“表达式2(循环条件)”,不做其它处理,循环一直执行(死循环)。
    4. 省略“表达式3(循环变量增减量)”,不做其他处理,循环一直执行(死循环)。
    5. 表达式1可以是设置循环变量的初值的赋值表达式,也可以是其他表达式
    6. 表达式1和表达式3可以是一个简单表达式也可以是多个表达式以逗号分割。
      6
    7. 表达式2一般是关系表达式逻辑表达式,但也可是数值表达式或字符表达式,只要其值非零,就执行循环体。
    8. 各表达式中的变量一定要在for循环之前定义

    怎么获得一个数的百位,十位和个位

    • 百位数:num/100 可以获得,因为 int 是整数型,小数部分会省略。比如 765/100 的结果是7
    • 十位数:num%100/10 。比如765%100先得到6565/10得到6
    • 个位数:num%10765%10得到5

    循环结构之三种循环比较

    while, do-while和for三种循环在具体的使用场合上是有区别的,如下:

    1. 知道循环次数的情况下更适合使用for循环;
    1. 在不知道循环次数的情况下适合使用while或者do-while循环:
      • 如果有可能一次都不循环应考虑使用while循环
      • 如果至少循环一次应考虑使用do-while循环。

    但是从本质上讲,while,do-while和for循环之间是可以相互转换的。

    循环结构之多重循环

    多重循环就是在循环结构的循环体中又出现循环结构。

    在实际开发中一般最多用到三层重循环

    因为循环层数越多,运行时间越长,程序越复杂,所以一般用2-3层多重循环就可以了。另外不同循环之间也是可以嵌套的。

    多重循环在执行的过程中,外层循环为父循环,内层循环为子循环

    **父循环一次,子循环需要全部执行完,直到跳出循环。**父循环再进入下一次,子循环继续执行…

    循环多重

    mtianyan: 打印三角形星星堆

    #include <stdio.h>
    int main()
    {
        int i, j, k;
        for(i=1; i<5; i++)
        {
            /* 观察每行的空格数量,补全循环条件 */
            for(j=i; j<5; j++)  
            {
                printf(" ");    //输出空格
            }
            /* 观察每行*号的数量,补全循环条件 */
            for( k=0;k<2*i-1;k++) 
            {
                printf("*");   //每行输出的*号
            }
            printf("\n");     //每次循环换行
        }
        return 0;
    }
    

    使用for循环打印9×9乘法表

    #include <stdio.h>
    int main() 
    { 
        // 定义相乘数字i,j以及结果result
        int i, j, result;
         for(i=9;i>=1;i--)
         {
            for(j=1;j<=i;j++)
            {
                printf("%d*%d=%d ",i,j,result=i*j);
            }
            printf("\n");
         }
        return 0;
    }
    

    结束语句之break语句

    那么循环5次的时候,需要中断不继续训练。在C语言中,可以使用break语句进行该操作.

    使用break语句时注意以下几点:

    1. 在没有循环结构的情况下,break不能用在单独的if-else语句中。
    1. 在多层循环中,一个break语句只跳出当前循环。

    结束语句之continue语句

    那么循环5次的时候,需要中断后继续训练。在C语言中,可以使用continue语句进行该操作

    continue语句的作用是结束本次循环开始执行下一次循环。

    break语句与continue语句的区别是:

    break是跳出当前整个循环,continue是结束本次循环开始下一次循环。

    分支结构之switch语句

    switch语句结构如下:

    switch

    mtianyan: switch语句时还应注意以下几点:

    1. 在case后的各常量表达式的值不能相同,否则会出现错误。
    2. 在case子句后如果没有break;会一直往后执行**一直到遇到break;**才会跳出switch语句。
    3. switch后面的表达式语句只能是整型或者字符类型
    4. 在case后,允许有多个语句,**可以不用{}**括起来。
    5. 各case和default子句的先后顺序可以变动,而不会影响程序执行结果。
    6. default子句可以省略不用。

    mtianyan: switch与if语句的应用(计算是该年的第几天)

    #include <stdio.h>
    
    int main() 
    
    { 
    
        /* 定义需要计算的日期 */
    
        int date = 0;
    
        int year = 2008;
    
        int month = 8;
    
        int day = 8;
    
        switch(month)
    
        {
    
            case 12:date+=30;
    
            case 11:date+=31;
    
            case 10:date+=30;
    
            case 9:date+=31;
        
        	case 8:date+=31;
    
            case 7:date+=30;
    
            case 6:date+=31;
    
            case 5:date+=30;
    
            case 4:date+=31;
    
            case 3:
    
            if((year%4==0&&year%100!=0)||year%400==0)
    
            {
    
                date+=29;
    
            }
    
            else
    
            {
    
                date+=28;
    
            }
        	case 2:
    
            date+=31;
    
            case 1:
    
            date+=day;
    
            printf("%d年%d月%d日是该年的第%d天",year,month,day,date);
    
            break;
    
            default:
    
            printf("error");
    
            break;
    
        }
    
        return 0;
    
    }
    

    正确: continue只能用在循环体内

    臭名远扬之goto语句

    C语言中也有这样的语句,就是goto语句,goto语句是一种无条件分支语句.

    goto 语句的使用格式为:

    goto 语句标号;
    

    mark

    自创函数

    C语言提供了大量的库函数: 比如stdio.h提供输出函数

    自定义函数的一般形式:

    自定义函数

    注意:

    1. [] 包含的内容可以省略,数据类型说明省略,默认是 int 类型函数; 参数省略表示该函数是无参函数,参数不省略表示该函数是有参函数;
    2. 函数名称遵循标识符命名规范;
    3. mtianyan: 自定义函数尽量放在 main 函数之前,如果要放在main函数后面的话, 需要在main函数之前先声明自定义函数,声明格式为:
    [数据类型说明] 函数名称([参数]);
    

    函数调用

    我们需要用到自定义的函数的时候,就得调用它,那么在调用的时候就称之为函数调用

    在C语言中,函数调用的一般形式为:

    函数名([参数]); 
    

    注意:

    1. 对无参函数调用的时候可以将[]包含的省略。
    1. []中可以是**常数,变量或其它构造类型数据及表达式,**多个参数之间用逗号分隔。

    有参与无参

    在函数中不需要函数参数的称之为无参函数,在函数中需要函数参数的称之为有参函数。

    有参和无参函数的一般形式如下:

    函数

    有参函数和无参函数的唯一区别在于:函数 () 中多了一个参数列表。

    • 有参函数更为灵活,输出的内容可以随着n的改变而随意变动,只要在main函数中传递一个参数就可以了
    • 而在无参函数中输出的相对就比较固定,当需要改动的时候还需要到自定义的方法内改变循环变量的值。

    mtianyan: 形参与实参

    函数的参数分为形参实参两种。

    • 形参是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传入的参数。

    就类似小明,说了的话而不实际行动;

    • 实参是在调用时传递该函数的参数。

    就如小刚能实际行动起来。

    函数的形参和实参具有以下特点:

    • 形参只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只有在函数内部有效。

    函数调用结束返回主调函数后则不能再使用该形参变量。

    • 实参可以是常量、变量、表达式、函数等。

    无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值,以便把这些值传送给形参。因此应预先用赋值等办法使实参获得确定值。

    • 在参数传递时,实参和形参在数量上,类型上,顺序上应严格一致,否则会发生类型不匹配的错误。

    mark

    函数的返回值

    函数的返回值是指函数被调用之后,执行函数体中的程序段所取得的并返回给主调函数的值。

    函数的返回值要注意以下几点:

    • 函数的值只能通过return语句返回主调函数。

    return语句的一般形式为:

    return 表达式   或者为:  return (表达式);
    
    • 函数值的类型和函数定义中函数的类型应保持一致。

    notes: 如果两者不一致,则以函数返回类型为准,自动进行类型转换。

    • 没有返回值的函数,返回类型void

    注意:

    void 函数中可以有执行代码块,但是不能有返回值.

    mtianyan: void函数中如果有return语句,该语句**只能起到结束函数运行的功能。**其格式为: return;

    递归函数(一)

    递归就是一个函数在它的函数体内调用它自身。

    执行递归函数将反复调用其自身,每调用一次就进入新的一层。

    注意递归函数必须有结束条件

    递归函数(二)

    5的阶乘这个例子进行一下剖析,看一看他的运算过程:

    递归

    程序在计算5的阶乘的时候,先执行递推,当n=1或者n=0的时候返回1,再回推将计算并返回。由此可以看出递归函数必须有结束条件。

    递归函数特点:

    1. 每一级函数调用时都有自己的变量,但是函数代码并不会得到复制,如计算5的阶乘时每递推一次变量都不同;
    2. 每次调用都会有一次返回,如计算5的阶乘时每递推一次都返回进行下一次;
    3. 递归函数中,位于递归调用前的语句和各级被调用函数具有相同的执行顺序;
    4. 递归函数中,位于递归调用后的语句的执行顺序和各个被调用函数的顺序相反;
    5. 递归函数中必须有终止语句。

    一句话总结递归:自我调用且有完成状态

    任务
    猴子第一天摘下N个桃子,当时就吃了一半,还不过瘾,就又多吃了一个。第二天又将剩下的桃子吃掉一半,又多吃了一个。以后每天都吃前一天剩下的一半零一个。到第10天在想吃的时候就剩一个桃子了,问第一天共摘下来多少个桃子?并反向打印每天所剩桃子数。

    #include <stdio.h>
    int getPeachNumber(int n)  
    {
        int num;    
        if(n==10)
        {
           return 1;      
        } 
        else
        {
            num = (getPeachNumber(n+1)+1)*2;  
            printf("第%d天所剩桃子%d个\n", n, num); 
        }
        return num;
    }
    int main()
    {
        int num = getPeachNumber(1);
        printf("猴子第一天摘了:%d个桃子。\n", num);
        return 0;
    }
    

    递归demo。

    有5个人坐在一起,问第5个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第3个人,又说比第2人大两岁。问第2个人,说比第1个人大两岁。最后 问第1个人,他说是10岁。请问第5个人多大?

    程序分析:
    利用递归的方法,递归分为回推和递推两个阶段。要想知道第5个人岁数,需知道第4人的岁数,依次类推,推到第1人(10岁),再往回推。

    #include <stdio.h> 
    int dfs(int n) {
        return n == 1 ? 10 : dfs(n - 1) + 2;
    }
    int main() 
    {
        
    	printf("第5个人的年龄是%d岁", dfs(5)); 
    	return 0;
    } 
    

    局部与全局

    C语言中的变量,按作用域范围可分为两种,即局部变量和全局变量。

    • 局部变量也称为内部变量。局部变量是在函数内作定义说明的。其作用域仅限于函数内, 离开该函数后再使用这种变量是非法的。在复合语句中也可定义变量,其作用域只在复合语句范围内。
    • 全局变量也称为外部变量,它是在函数外部定义的变量。它不属于哪一个函数,它属于一个源程序文件。其作用域是整个源程序。

    变量存储类别

    mtianyan: C语言根据变量的生存周期来划分,可以分为静态存储方式和动态存储方式。

    • 静态存储方式:是指在程序运行期间分配固定的存储空间的方式。静态存储区中存放了在整个程序执行过程中都存在的变量,如全局变量。
    • 动态存储方式:是指在程序运行期间根据需要进行动态的分配存储空间的方式。动态存储区中存放的变量是根据程序运行的需要而建立和释放的,通常包括:函数形式参数;自动变量;函数调用时的现场保护和返回地址等。

    C语言中存储类别又分为四类:

    • 自动(auto)、
    • 静态(static)、
    • 寄存器的(register)
    • 外部的(extern)。

    1、用关键字auto定义的变量为自动变量,auto可以省略,auto不写则隐含定为“自动存储类别”,属于动态存储方式。如:

    auto

    2、用static修饰的为静态变量,如果定义在函数内部的,称之为静态局部变量;如果定义在函数外部,称之为静态外部变量。如下为静态局部变量:

    static

    注意:静态局部变量属于静态存储类别,在静态存储区内分配存储单元,在程序整个运行期间都不释放;静态局部变量在编译时赋初值,即只赋初值一次;如果在定义局部变量时不赋初值的话,则对静态局部变量来说,编译时自动赋初值0(对数值型变量)或空字符(对字符变量)。

    3、为了提高效率,C语言允许将局部变量得值放在CPU中的寄存器中,这种变量叫“寄存器变量”,用关键字register作声明。例如:

    register

    mtianyan: 注意:只有局部自动变量和形式参数可以作为寄存器变量;一个计算机系统中的寄存器数目有限,不能定义任意多个寄存器变量;局部静态变量不能定义为寄存器变量。

    4、用extern声明的的变量是外部变量,外部变量的意义是某函数可以调用在该函数之后定义的变量。如:

    extern

    内部函数与外部函数

    • 在C语言中不能被其他源文件调用的函数称谓内部函数 ,内部函数由static关键字来定义,因此又被称谓静态函数,形式为:
      static [数据类型] 函数名([参数])
    • 这里的static是对函数的作用范围的一个限定,限定该函数只能在其所处的源文件中使用,因此在不同文件中出现相同的函数名称的内部函数是没有问题的。
    • 在C语言中能被其他源文件调用的函数称谓外部函数 ,外部函数由extern关键字来定义,形式为:
      extern [数据类型] 函数名([参数])
    • C语言规定,在没有指定函数的作用范围时,系统会默认认为是外部函数,因此当需要定义外部函数时extern也可以省略。

    静态变量只赋值一次

    外部函数练习

    hello.c

    #include <stdio.h>
    #include "test.c"   //引用test.c文件
    extern void printLine()     //这里定义的方法对吗?
    {
       printf("**************\n");   
    }
    int main()
    {
        say();
        return 0;
    }
    

    test.c

    #include <stdio.h>
    void printLine();
    static void say(){
    printLine();
    printf("I love imooc\n");
    printf("good good study!\n");
    printf("day day up!\n");
    printLine();
    }
    

    对于hello.c来说,直接引入了test.c文件。那么就可以调用testc中的static方法say()
    而对于test.c并没有引入,可以通过声明来调用另一个源文件中暴露出来的方法。

    ###综合练习

    北京市出租车打车计费规则如下:

    1. 每公里单价计费2.3元
    2. 起步价13元(包含3公里)
    3. 晚上23点(含)至次日凌晨5点(不含)打车,每公里单价计费加收20%。
    4. 每次乘车加收1元钱的燃油附加税。
      小明每天上下班都要打车,公司和家的距离为12公里,上午上班时间为9点,下午下班时间为6点。
      请编写一个小程序计算小明每天打车的总费用。
    #include <stdio.h>
    
    float taxifee(int clock,int miles)
    {
        float money;
        if(miles<=3)
        {
            money=14;
            printf("费用为14\n");
        }
        else
        {
            if(clock>=23 || clock<5)
            {
                money=13+1+2.3*(miles-3)*1.2;
                printf("夜间车费为:%f\n",money);
            }
            else
            {
                money=13+1+2.3*(miles-3);
                printf("日间车费为:%f\n",money);
            }
        }
        
        return money;    
    }
    int main()
    {
        printf("打的总费用:%.1f\n",taxifee(9,12)+taxifee(18,12));
        return 0;
    }
    

    数组初体验

    程序中也需要容器,只不过该容器有点特殊,它在程序中是一块连续的,大小固定并且里面的数据类型一致的内存空间,它还有个好听的名字叫数组。可以将数组理解为大小固定,所放物品为同类的一个购物袋,在该购
    物袋中的物品是按一定顺序放置的。

    我们来看一下如何声明一个数组:

    数据类型 数组名称[长度];
    

    数组只声明也不行啊,看一下数组是如何初始化的。说到初始化,C语言中的数组初始化是有三种形式的,分别是:

    1. 数据类型 数组名称[长度n] = {元素1,元素2…元素n};
    2. 数据类型 数组名称[] = {元素1,元素2…元素n};
    3. 数据类型 数组名称[长度n]; 数组名称[0] = 元素1; 数组名称[1] = 元素2; 数组名称[n-1] = 元素n;

    我们将数据放到数组中之后又如何获取数组中的元素呢?

    获取数组元素时: 数组名称[元素所对应下标];

    如:初始化一个数组 int arr[3] = {1,2,3}; 那么arr[0]就是元素1。

    注意:

    1. 数组的下标均以0开始
    2. 数组在初始化的时候,数组内元素的个数不能大于声明的数组长度;
    3. mtianyan: 如果采用第一种初始化方式,元素个数小于数组的长度时,多余的数组元素初始化为0;
    4. 在声明数组后没有进行初始化的时候,静态(static)和外部(extern)类型的数组元素初始化元素为0,自动(auto)类型的数组的元素初始化值不确定。

    数组的遍历

    数组就可以采用循环的方式将每个元素遍历出来,而不用人为的每次获取指定某个位置上的元素,例如我们用for循环遍历一个数组:

    循环遍历数组

    注意以下几点:

    1. 最好避免出现数组越界访问,循环变量最好不要超出数组的长度.
    2. C语言的数组长度一经声明,长度就是固定,无法改变,并且C语言并不提供计算数组长度的方法

    由于C语言是没有检查数组长度改变或者数组越界的这个机制,可能会在编辑器中编译并通过,但是结果就不能肯定了,因此还是不要越界或者改变数组的长度

    c语言获取数组长度

    int length = sizeof(arr)/sizeof(arr[0]);
    

    数组作为函数参数

    数组可以由整个数组当作函数的参数,也可以由数组中的某个元素当作函数的参数:

    1. 整个数组当作函数参数,即把数组名称传入函数中,例如:

    数组参数

    1. 数组中的元素当作函数参数,即把数组中的参数传入函数中,例如:

    数组元素函数参数

    数组作为函数参数时注意以下事项:

    1. 数组名作为函数实参传递时,函数定义处作为接收参数的数组类型形参既可以指定长度也可以不指定长度。
    2. 数组元素作为函数实参传递时,数组元素类型必须与形参数据类型一致。

    mtianyan: 数组的应用(一)[冒泡排序]

    以升序排序为例冒泡排序的思想:相邻元素两两比较,将较大的数字放在后面,直到将所有数字全部排序。就像小学排队时按大小个排一样,将一个同学拉出来和后面的比比,如果高就放后面,一直把队伍排好。

    #include <stdio.h>
    int main()
    {
        double arr[]={1.78, 1.77, 1.82, 1.79, 1.85, 1.75, 1.86, 1.77, 1.81, 1.80};
        int i,j;
        printf("\n************排队前*************\n");
        for(i=0;i<10;i++)
        {
            if(i != 9)   
                printf("%1.2f, ", arr[i]);  //%1.2f表示小数点前一位,小数点后精确到两位
            else
                printf("%1.2f", arr[i]);    //%1.2f表示小数点前一位,小数点后精确到两位
        }
        for(i=8; i>=0; i--)
        {
            for(j=0;j<=i;j++)
            {
                if( arr[j]>arr[j+1])      //当前面的数比后面的数大时
                {
                    double temp;    //定义临时变量temp
                    temp=arr[j];//将前面的数赋值给temp
                    arr[j]=arr[j+1];             //前后之数颠倒位置
                    arr[j+1]=temp;//将较大的数放在后面    
                }                 
            }                
        }
        printf("\n************排队后*************\n");
        for(i=0;i<10;i++)
        {
            if(i != 9)   
                printf("%1.2f, ", arr[i]);  //%1.2f表示小数点前一位,小数点后精确到两位     
            else
                printf("%1.2f", arr[i]);    //%1.2f表示小数点前一位,小数点后精确到两位
        }
        return 0;    
    }
    

    数组的应用(二)[数组查找功能]

    当我们购物之后,拎着购物袋回到家,会一一检查购物袋中的物品看是否缺少或者都是想购之物。

    那么应用到程序中,可以使用数组查找功能,看看是否存在该数据,如果存在并返回该元素的下标。

    #include <stdio.h>
    int getIndex(int arr[5],int value)
    {
        int i;
        int index;
        for(i=0;i<5;i++)
        {
           /* 请完善数组查询功能 */
           if(arr[i]==value)
            {
                index=i;
                break;
            }  
           index=-1;
        }
        return index;
    }
    
    int main()
    {
        int arr[5]={3,12,9,8,6};
        int value = 8;
        int index = getIndex(arr,value);      //这里应该传什么参数呢?
        if(index!=-1)
        {
            printf("%d在数组中存在,下标为:%d\n",value,index);             
        }
        else
        {
            printf("%d在数组中不存在。\n",value);    
        }
        return 0;    
    }
    

    字符串与数组

    C语言中,是没有办法直接定义字符串数据类型的,但是我们可以使用数组来定义我们所要的字符串。一般有以下两种格式:

    1. char 字符串名称[长度] = “字符串值”;
    2. char 字符串名称[长度] = {‘字符1’,‘字符2’,…,‘字符n’,’\0’};

    注意:

    1. []中的长度是可以省略不写的;
    2. 采用第2种方式的时候最后一个元素必须是’\0’,’\0’表示字符串的结束标志;
    3. 采用第2种方式的时候在数组中不能写中文。
      在输出字符串的时候要使用:printf(“%s”,字符数组名字);或者puts(字符数组名字);。

    mtianyan:字符串函数

    常用的字符串函数如下(strlen,strcmp,strcpy,strcat,atoi):

    字符串函数

    使用字符串函数注意以下事项:

    1. strlen()获取字符串的长度,在字符串长度中是不包括‘\0’而且汉字和字母的长度是不一样的。比如:

    strlen

    1. strcmp()在比较的时候会把字符串先转换成ASCII码再进行比较,返回的结果为0表示s1和s2的ASCII码相等,返回结果为1表示s1比s2的ASCII码大,返回结果为-1表示s1比s2的ASCII码小,例如:

    strcmp

    1. strcpy()拷贝之后会覆盖原来字符串且不能对字符串常量进行拷贝,比如:

    strcpy

    1. strcat在使用时s1与s2指的内存空间不能重叠,且s1要有足够的空间来容纳要复制的字符串,如:

    strcat

    多维数组

    多维数组的定义格式是:
    数据类型 数组名称[常量表达式1][常量表达式2]…[常量表达式n];

    多维数组

    定义了一个名称为num,数据类型为int的二维数组。其中第一个[3]表示第一维下标的长度,就像购物时分类存放的购物;第二个[3]表示第二维下标的长度,就像每个购物袋中的元素。

    矩阵

    多维数组的初始化与一维数组的初始化类似也是分两种:

    1. 数据类型 数组名称[常量表达式1][常量表达式2]…[常量表达式n] = {{值1,…,值n},{值1,…,值n},…,{值1,…,值n}};
    2. 数据类型 数组名称[常量表达式1][常量表达式2]…[常量表达式n]; 数组名称[下标1][下标2]…[下标n] = 值;

    多维数组初始化要注意以下事项:

    1. 采用第一种始化时数组声明必须指定列的维数。mtianyan: 因为系统会根据数组中元素的总个数来分配空间,当知道元素总个数以及列的维数后,会直接计算出行的维数;
    2. 采用第二种初始化时数组声明必须同时指定行和列的维数。

    二维数组定义的时候,可以不指定行的数量,但是必须指定列的数量

    二维数组定义的时候,可以不指定行的数量,但是必须指定列的数量。

    多维数组的遍历

    多维数组也是存在遍历的,和一维数组遍历一样,也是需要用到循环。不一样的就是多维数组需要采用嵌套循环

    注意:多维数组的每一维下标均不能越界

    综合练习:

    #include <stdio.h>
    #define N 10
    //打印分数 
    void printScore(int score[])
    {
    	int i;
    	printf("\n");
    	for(i=0;i<N;i++)
    	{
    		printf("%d ",score[i]);               
    	}
    	printf("\n");     
    }
    //计算考试总分 
    int getTotalScore(int score[])
    {
    	int sum = 0;
    	int i;
    	for(i=0;i<N;i++)
    	{
    		sum+=score[i];                
    	} 
    	return sum;
    }
    //计算平均分 
    int getAvgScore(int score[])
    {
    	return getTotalScore(score)/N;   
    }
    //计算最高分 
    int getMax(int score[])
    {
    	int max = -1;
    	int i;
    	for(i=0;i<N;i++)
    	{
    		if(score[i]>max)
    		{
    			max = score[i];              
    		}                
    	} 
    	return max;
    }
    //计算最低分 
    int getMin(int score[])
    {
    	int min =100;
    	int i;
    	for(i=0;i<N;i++)
    	{
    		if(score[i]< min)
    		{
    			min = score[i];              
    		}                
    	} 
    	return min;
    }
    //分数降序排序 
    void sort(int score[])
    {
    	int i,j;
    	for(i=N-2;i>=0;i--)
    	{
    		for(j=0;j<=i;j++)
    		{
    			if(score[j]<score[j+1])
    			{
    				int temp;
    				temp = score[j];
    				score[j] = score[j+1]; 
    				score[j+1]=temp;                  
    			}                 
    		}                   
    	}
    	printScore(score);     
    }
    
    int main()
    {
    	int score[N]={67,98,75,63,82,79,81,91,66,84};
    	int sum,avg,max,min;
    	sum = getTotalScore(score);
    	avg = getAvgScore(score);
    	max = getMax(score);
    	min = getMin(score);
    	printf("总分是:%d\n",sum);
    	printf("平均分是:%d\n",avg);
    	printf("最高分是:%d\n",max);
    	printf("最低分是:%d\n",min);
    	printf("----------成绩排名---------\n");
    	sort(score);
    	return 0;    
    }
    
    展开全文
  • CNN笔记:通俗理解卷积神经网络

    万次阅读 多人点赞 2016-07-02 22:14:50
    通俗理解卷积神经网络(cs231n与5月dl班课程笔记) 1 前言 2012年我在北京组织过8期machine learning读书会,那时“机器学习”非常火,很多人都对其抱有巨大的热情。当我2013年再次来到北京时,有...

                   通俗理解卷积神经网络(cs231n与5月dl班课程笔记)

    1 前言

        2012年我在北京组织过8期machine learning读书会,那时“机器学习”非常火,很多人都对其抱有巨大的热情。当我2013年再次来到北京时,有一个词似乎比“机器学习”更火,那就是“深度学习”。

        本博客内写过一些机器学习相关的文章,但上一篇技术文章“LDA主题模型”还是写于2014年11月份,毕竟自2015年开始创业做在线教育后,太多的杂事、琐碎事,让我一直想再写点技术性文章但每每恨时间抽不开。然由于公司在不断开机器学习、深度学习等相关的在线课程,耳濡目染中,总会顺带着学习学习。

        我虽不参与讲任何课程(我所在公司“七月在线”的所有在线课程都是由目前讲师团队的数百位讲师讲),但依然可以用最最小白的方式 把一些初看复杂的东西抽丝剥茧的通俗写出来。这算重写技术博客的价值所在。

        在dl中,有一个很重要的概念,就是卷积神经网络CNN,基本是入门dl必须搞懂的东西。本文基本根据斯坦福的机器学习公开课、cs231n、与七月在线寒老师讲的5月dl班所写,是一篇课程笔记。

        一开始本文只是想重点讲下CNN中的卷积操作具体是怎么计算怎么操作的,但后面不断补充,包括增加不少自己的理解,故写成了关于卷积神经网络的通俗导论性的文章。有何问题,欢迎不吝指正。

    2 人工神经网络

    2.1 神经元

        神经网络由大量的神经元相互连接而成。每个神经元接受线性组合的输入后,最开始只是简单的线性加权,后来给每个神经元加上了非线性的激活函数,从而进行非线性变换后输出。每两个神经元之间的连接代表加权值,称之为权重(weight)。不同的权重和激活函数,则会导致神经网络不同的输出。

        举个手写识别的例子,给定一个未知数字,让神经网络识别是什么数字。此时的神经网络的输入由一组被输入图像的像素所激活的输入神经元所定义。在通过非线性激活函数进行非线性变换后,神经元被激活然后被传递到其他神经元。重复这一过程,直到最后一个输出神经元被激活。从而识别当前数字是什么字。

        神经网络的每个神经元如下

        基本wx + b的形式,其中

    • 表示输入向量
    • 为权重,几个输入则意味着有几个权重,即每个输入都被赋予一个权重
    • b为偏置bias
    • g(z) 为激活函数
    • a 为输出

        如果只是上面这样一说,估计以前没接触过的十有八九又必定迷糊了。事实上,上述简单模型可以追溯到20世纪50/60年代的感知器,可以把感知器理解为一个根据不同因素、以及各个因素的重要性程度而做决策的模型。

        举个例子,这周末北京有一草莓音乐节,那去不去呢?决定你是否去有二个因素,这二个因素可以对应二个输入,分别用x1、x2表示。此外,这二个因素对做决策的影响程度不一样,各自的影响程度用权重w1、w2表示。一般来说,音乐节的演唱嘉宾会非常影响你去不去,唱得好的前提下 即便没人陪同都可忍受,但如果唱得不好还不如你上台唱呢。所以,我们可以如下表示:

    • :是否有喜欢的演唱嘉宾。 = 1 你喜欢这些嘉宾, = 0 你不喜欢这些嘉宾。嘉宾因素的权重 = 7
    • :是否有人陪你同去。 = 1 有人陪你同去, = 0 没人陪你同去。是否有人陪同的权重 = 3。

        这样,咱们的决策模型便建立起来了:g(z) = g( * + * + b ),g表示激活函数,这里的b可以理解成 为更好达到目标而做调整的偏置项。

        一开始为了简单,人们把激活函数定义成一个线性函数,即对于结果做一个线性变化,比如一个简单的线性激活函数是g(z) = z,输出都是输入的线性变换。后来实际应用中发现,线性激活函数太过局限,于是人们引入了非线性激活函数。

    2.2 激活函数

        常用的非线性激活函数有sigmoid、tanhrelu等等,前两者sigmoid/tanh比较常见于全连接层,后者relu常见于卷积层。这里先简要介绍下最基础的sigmoid函数(btw,在本博客中SVM那篇文章开头有提过)。

        sigmoid的函数表达式如下

        其中z是一个线性组合,比如z可以等于:b + * + *通过代入很大的正数或很小的负数到g(z)函数中可知,其结果趋近于0或1

        因此,sigmoid函数g(z)的图形表示如下( 横轴表示定义域z,纵轴表示值域g(z) ):

        也就是说,sigmoid函数的功能是相当于把一个实数压缩至0到1之间。当z是非常大的正数时,g(z)会趋近于1,而z是非常小的负数时,则g(z)会趋近于0

        压缩至0到1有何用处呢?用处是这样一来便可以把激活函数看作一种“分类的概率”,比如激活函数的输出为0.9的话便可以解释为90%的概率为正样本。

        举个例子,如下图(图引自Stanford机器学习公开课

        z = b + * + *,其中b为偏置项 假定取-30,都取为20

    • 如果 = 0  = 0,则z = -30,g(z) = 1/( 1 + e^-z )趋近于0。此外,从上图sigmoid函数的图形上也可以看出,当z=-30的时候,g(z)的值趋近于0
    • 如果 = 0 = 1,或 =1 = 0,则z = b + * + * = -30 + 20 = -10,同样,g(z)的值趋近于0
    • 如果 = 1 = 1,则z = b + * + * = -30 + 20*1 + 20*1 = 10,此时,g(z)趋近于1。

        换言之,只有都取1的时候,g(z)→1,判定为正样本;取0的时候,g(z)→0,判定为负样本如此达到分类的目的。

    2.3 神经网络

        将下图的这种单个神经元

        组织在一起,便形成了神经网络。下图便是一个三层神经网络结构

        上图中最左边的原始输入信息称之为输入层,最右边的神经元称之为输出层(上图中输出层只有一个神经元),中间的叫隐藏层。

        啥叫输入层、输出层、隐藏层呢?

    • 输入层(Input layer),众多神经元(Neuron)接受大量非线形输入讯息。输入的讯息称为输入向量。
    • 输出层(Output layer),讯息在神经元链接中传输、分析、权衡,形成输出结果。输出的讯息称为输出向量。
    • 隐藏层(Hidden layer),简称“隐层”,是输入层和输出层之间众多神经元和链接组成的各个层面。如果有多个隐藏层,则意味着多个激活函数。

        同时,每一层都可能由单个或多个神经元组成,每一层的输出将会作为下一层的输入数据。比如下图中间隐藏层来说,隐藏层的3个神经元a1、a2、a3皆各自接受来自多个不同权重的输入(因为有x1、x2、x3这三个输入,所以a1 a2 a3都会接受x1 x2 x3各自分别赋予的权重,即几个输入则几个权重),接着,a1、a2、a3又在自身各自不同权重的影响下 成为的输出层的输入,最终由输出层输出最终结果。

        上图(图引自Stanford机器学习公开课)中

    • 表示第j层第i个单元的激活函数/神经元
    • 表示从第j层映射到第j+1层的控制函数的权重矩阵 

        此外,输入层和隐藏层都存在一个偏置(bias unit),所以上图中也增加了偏置项:x0、a0。针对上图,有如下公式

        此外,上文中讲的都是一层隐藏层,但实际中也有多层隐藏层的,即输入层和输出层中间夹着数层隐藏层,层和层之间是全连接的结构,同一层的神经元之间没有连接。

    3 卷积神经网络之层级结构

       cs231n课程里给出了卷积神经网络各个层级结构,如下图

        上图中CNN要做的事情是:给定一张图片,是车还是马未知,是什么车也未知,现在需要模型判断这张图片里具体是一个什么东西,总之输出一个结果:如果是车 那是什么车

        所以

    • 最左边是数据输入层,对数据做一些处理,比如去均值(把输入数据各个维度都中心化为0,避免数据过多偏差,影响训练效果)、归一化(把所有的数据都归一到同样的范围)、PCA/白化等等。CNN只对训练集做“去均值”这一步。

        中间是

    • CONV:卷积计算层,线性乘积 求和。
    • RELU:激励层,上文2.2节中有提到:ReLU是激活函数的一种。
    • POOL:池化层,简言之,即取区域平均或最大。

        最右边是

    • FC:全连接层

        这几个部分中,卷积计算层是CNN的核心,下文将重点阐述。


    4 CNN之卷积计算层

    4.1 CNN怎么进行识别
       简言之,当我们给定一个"X"的图案,计算机怎么识别这个图案就是“X”呢?一个可能的办法就是计算机存储一张标准的“X”图案,然后把需要识别的未知图案跟标准"X"图案进行比对,如果二者一致,则判定未知图案即是一个"X"图案。

       而且即便未知图案可能有一些平移或稍稍变形,依然能辨别出它是一个X图案。如此,CNN是把未知图案和标准X图案一个局部一个局部的对比,如下图所示 [图来自参考文案25]

    而未知图案的局部和标准X图案的局部一个一个比对时的计算过程,便是卷积操作。卷积计算结果为1表示匹配,否则不匹配。

    具体而言,为了确定一幅图像是包含有"X"还是"O",相当于我们需要判断它是否含有"X"或者"O",并且假设必须两者选其一,不是"X"就是"O"。

     理想的情况就像下面这个样子:

    标准的"X"和"O",字母位于图像的正中央,并且比例合适,无变形

    对于计算机来说,只要图像稍稍有一点变化,不是标准的,那么要解决这个问题还是不是那么容易的:

    计算机要解决上面这个问题,一个比较天真的做法就是先保存一张"X"和"O"的标准图像(就像前面给出的例子),然后将其他的新给出的图像来和这两张标准图像进行对比,看看到底和哪一张图更匹配,就判断为哪个字母。

    但是这么做的话,其实是非常不可靠的,因为计算机还是比较死板的。在计算机的“视觉”中,一幅图看起来就像是一个二维的像素数组(可以想象成一个棋盘),每一个位置对应一个数字。在我们这个例子当中,像素值"1"代表白色,像素值"-1"代表黑色。

    当比较两幅图的时候,如果有任何一个像素值不匹配,那么这两幅图就不匹配,至少对于计算机来说是这样的。

    对于这个例子,计算机认为上述两幅图中的白色像素除了中间的3*3的小方格里面是相同的,其他四个角上都不同:

    因此,从表面上看,计算机判别右边那幅图不是"X",两幅图不同,得出结论:

    但是这么做,显得太不合理了。理想的情况下,我们希望,对于那些仅仅只是做了一些像平移,缩放,旋转,微变形等简单变换的图像,计算机仍然能够识别出图中的"X"和"O"。就像下面这些情况,我们希望计算机依然能够很快并且很准的识别出来:

    这也就是CNN出现所要解决的问题。

    Features

    对于CNN来说,它是一块一块地来进行比对。它拿来比对的这个“小块”我们称之为Features(特征)。在两幅图中大致相同的位置找到一些粗糙的特征进行匹配,CNN能够更好的看到两幅图的相似性,相比起传统的整幅图逐一比对的方法。

    每一个feature就像是一个小图(就是一个比较小的有值的二维数组)。不同的Feature匹配图像中不同的特征。在字母"X"的例子中,那些由对角线和交叉线组成的features基本上能够识别出大多数"X"所具有的重要特征。

    这些features很有可能就是匹配任何含有字母"X"的图中字母X的四个角和它的中心。那么具体到底是怎么匹配的呢?如下:

    看到这里是不是有了一点头目呢。但其实这只是第一步,你知道了这些Features是怎么在原图上面进行匹配的。但是你还不知道在这里面究竟进行的是怎样的数学计算,比如这个下面3*3的小块到底干了什么?

    这里面的数学操作,就是我们常说的“卷积”操作。接下来,我们来了解下什么是卷积操作。

    4.2 什么是卷积

        对图像(不同的数据窗口数据)和滤波矩阵(一组固定的权重:因为每个神经元的多个权重固定,所以又可以看做一个恒定的滤波器filter)做内积(逐个元素相乘再求和)的操作就是所谓的『卷积』操作,也是卷积神经网络的名字来源。

        非严格意义上来讲,下图中红框框起来的部分便可以理解为一个滤波器,即带着一组固定权重的神经元。多个滤波器叠加便成了卷积层。

        OK,举个具体的例子。比如下图中,图中左边部分是原始输入数据,图中中间部分是滤波器filter,图中右边是输出的新的二维数据。

        分解下上图

    对应位置上是数字先相乘后相加 =

        中间滤波器filter与数据窗口做内积,其具体计算过程则是:4*0 + 0*0 + 0*0 + 0*0 + 0*1 + 0*1 + 0*0 + 0*1 + -4*2 = -8

    4.3 图像上的卷积

        在下图对应的计算过程中,输入是一定区域大小(width*height)的数据,和滤波器filter(带着一组固定权重的神经元)做内积后等到新的二维数据。

        具体来说,左边是图像输入,中间部分就是滤波器filter(带着一组固定权重的神经元),不同的滤波器filter会得到不同的输出数据,比如颜色深浅、轮廓。相当于如果想提取图像的不同特征,则用不同的滤波器filter,提取想要的关于图像的特定信息:颜色深浅或轮廓。

        如下图所示

      

    4.4 GIF动态卷积图

        在CNN中,滤波器filter(带着一组固定权重的神经元)对局部输入数据进行卷积计算。每计算完一个数据窗口内的局部数据后,数据窗口不断平移滑动,直到计算完所有数据。这个过程中,有这么几个参数: 
      a. 深度depth:神经元个数,决定输出的depth厚度。同时代表滤波器个数。
      b. 步长stride:决定滑动多少步可以到边缘。

      c. 填充值zero-padding:在外围边缘补充若干圈0,方便从初始位置以步长为单位可以刚好滑倒末尾位置,通俗地讲就是为了总长能被步长整除。 

      这里写图片描述 

        cs231n课程中有一张卷积动图,貌似是用d3js 和一个util 画的,我根据cs231n的卷积动图依次截取了18张图,然后用一gif 制图工具制作了一gif 动态卷积图。如下gif 图所示

        可以看到:

    • 两个神经元,即depth=2,意味着有两个滤波器。
    • 数据窗口每次移动两个步长取3*3的局部数据,即stride=2。
    • zero-padding=1。

        然后分别以两个滤波器filter为轴滑动数组进行卷积计算,得到两组不同的结果。

        如果初看上图,可能不一定能立马理解啥意思,但结合上文的内容后,理解这个动图已经不是很困难的事情:

    • 左边是输入(7*7*3中,7*7代表图像的像素/长宽,3代表R、G、B 三个颜色通道)
    • 中间部分是两个不同的滤波器Filter w0、Filter w1
    • 最右边则是两个不同的输出

        随着左边数据窗口的平移滑动,滤波器Filter w0 / Filter w1对不同的局部数据进行卷积计算。

        值得一提的是:左边数据在变化,每次滤波器都是针对某一局部的数据窗口进行卷积,这就是所谓的CNN中的局部感知机制。

    • 打个比方,滤波器就像一双眼睛,人类视角有限,一眼望去,只能看到这世界的局部。如果一眼就看到全世界,你会累死,而且一下子接受全世界所有信息,你大脑接收不过来。当然,即便是看局部,针对局部里的信息人类双眼也是有偏重、偏好的。比如看美女,对脸、胸、腿是重点关注,所以这3个输入的权重相对较大。

    与此同时,数据窗口滑动,导致输入在变化,但中间滤波器Filter w0的权重(即每个神经元连接数据窗口的权重)是固定不变的,这个权重不变即所谓的CNN中的参数(权重)共享机制。

    • 再打个比方,某人环游全世界,所看到的信息在变,但采集信息的双眼不变。btw,不同人的双眼 看同一个局部信息 所感受到的不同,即一千个读者有一千个哈姆雷特,所以不同的滤波器 就像不同的双眼,不同的人有着不同的反馈结果。

        我第一次看到上面这个动态图的时候,只觉得很炫,另外就是据说计算过程是“相乘后相加”,但到底具体是个怎么相乘后相加的计算过程 则无法一眼看出,网上也没有一目了然的计算过程。本文来细究下。

        首先,我们来分解下上述动图,如下图

        接着,我们细究下上图的具体计算过程。即上图中的输出结果1具体是怎么计算得到的呢?其实,类似wx + b,w对应滤波器Filter w0,x对应不同的数据窗口,b对应Bias b0,相当于滤波器Filter w0与一个个数据窗口相乘再求和后,最后加上Bias b0得到输出结果1,如下过程所示:

    1* 0 + 1*0 + -1*

    +

    -1*0 + 0*0 + 1*1

    +

    -1*0 + -1*0 + 0*1

    +

    -1*0 + 0*0 + -1*0

    +

    0*0 + 0*1 + -1*1

    +

    1*0 + -1*0 + 0*2

    +

    0*0 + 1*0 + 0*0

    +

    1*0 + 0*2 + 1*0

    +

    0*0 + -1*0 + 1*0

    +

    1

    =

    1

        然后滤波器Filter w0固定不变,数据窗口向右移动2步,继续做内积计算,得到0的输出结果

        最后,换做另外一个不同的滤波器Filter w1、不同的偏置Bias b1,再跟图中最左边的数据窗口做卷积,可得到另外一个不同的输出。

    5 CNN之激励层与池化层

    5.1 ReLU激励层

        2.2节介绍了激活函数sigmoid,但实际梯度下降中,sigmoid容易饱和、造成终止梯度传递,且没有0中心化。咋办呢,可以尝试另外一个激活函数:ReLU,其图形表示如下

        ReLU的优点是收敛快,求梯度简单。

    5.2 池化pool层

        前头说了,池化,简言之,即取区域平均或最大,如下图所示(图引自cs231n)

        上图所展示的是取区域最大,即上图左边部分中 左上角2x2的矩阵中6最大,右上角2x2的矩阵中8最大,左下角2x2的矩阵中3最大,右下角2x2的矩阵中4最大,所以得到上图右边部分的结果:6 8 3 4。很简单不是?


    6 参考文献及推荐阅读

    1. 人工神经网络wikipedia
    2. 斯坦福机器学习公开课
    3. Neural networks and deep learning
    4. 雨石 卷积神经网络:卷积神经网络_雨石-CSDN博客_卷积神经网络
    5. cs231n 神经网络结构与神经元激励函数:CS231n Convolutional Neural Networks for Visual Recognition中译版
    6. cs231n 卷积神经网络:CS231n Convolutional Neural Networks for Visual Recognition
    7. 七月在线寒老师讲的5月dl班第4次课CNN与常用框架视频,已经剪切部分放在七月在线官网:julyedu.com
    8. 七月在线5月深度学习班第5课CNN训练注意事项部分视频:视频播放
    9. 七月在线5月深度学习班:5 月深度学习班 [国内第1个DL商业课程] - 七月在线
    10. 七月在线5月深度学习班课程笔记——No.4《CNN与常用框架》:CNN与常用框架_会思考的蜗牛-CSDN博客_cnn框架
    11. 七月在线6月数据数据挖掘班第7课视频:数据分类与排序
    12. 手把手入门神经网络系列(1)_从初等数学的角度初探神经网络:手把手入门神经网络系列(1)_从初等数学的角度初探神经网络
    13. 深度学习与计算机视觉系列(6)_神经网络结构与神经元激励函数:深度学习与计算机视觉系列(6)_神经网络结构与神经元激励函数
    14. 深度学习与计算机视觉系列(10)_细说卷积神经网络:深度学习与计算机视觉系列(10)_细说卷积神经网络
    15. zxy 图像卷积与滤波的一些知识点:图像卷积与滤波的一些知识点_zouxy09的专栏-CSDN博客_图像卷积
    16. zxy 深度学习CNN笔记:Deep Learning(深度学习)学习笔记整理系列之(七)_zouxy09的专栏-CSDN博客_深度学习 笔记
    17. Understanding Convolutional Neural Networks for NLP – WildML中译版
    18. 《神经网络与深度学习》中文讲义:Sina Visitor System
    19. ReLU与sigmoid/tanh的区别:请问人工神经网络中的activation function的作用具体是什么?为什么ReLu要好过于tanh和sigmoid function? - 知乎
    20. CNN、RNN、DNN内部网络结构区别:CNN(卷积神经网络)、RNN(循环神经网络)、DNN(深度神经网络)的内部网络结构有什么区别? - 知乎
    21. 理解卷积:如何通俗易懂地解释卷积? - 知乎
    22. 神经网络与深度学习简史:1 感知机和BP算法4 深度学习的伟大复兴
    23. 在线制作gif 动图:在线Photoshop 在线ps
    24. 支持向量机通俗导论(理解SVM的三层境界)
    25. CNN究竟是怎样一步一步工作的? 本博客把卷积操作具体怎么个计算过程写清楚了,但这篇把为何要卷积操作也写清楚了,而且配偶图非常形象,甚赞。

    7 后记

        本文基本上边看5月dl班寒讲的CNN视频边做笔记,之前断断续续看过不少CNN相关的资料(包括cs231n),但看过视频之后,才系统了解CNN到底是个什么东西,作为听众 寒讲的真心赞、清晰。然后在写CNN相关的东西时,发现一些前置知识(比如神经元、多层神经网络等也需要介绍下),包括CNN的其它层次机构(比如激励层),所以本文本只想简要介绍下卷积操作的,但考虑到知识之间的前后关联,所以越写越长,便成本文了。

        此外,在写作本文的过程中,请教了我们讲师团队里的寒、冯两位,感谢他两。同时,感谢爱可可老师的微博转发,感谢七月在线所有同事。

    以下是修改日志:

    • 2016年7月5日,修正了一些笔误、错误,以让全文更通俗、更精准。有任何问题或槽点,欢迎随时指出。
    • 2016年7月7日,第二轮修改完毕。且根据cs231n的卷积动图依次截取了18张图,然后用制图工具制作了一gif 动态卷积图,放在文中4.3节。
    • 2016年7月16日,完成第三轮修改。本轮修改主要体现在sigmoid函数的说明上,通过举例和统一相关符号让其含义更一目了然、更清晰。
    • 2016年8月15日,完成第四轮修改,增补相关细节。比如补充4.3节GIF动态卷积图中输入部分的解释,即7*7*3的含义(其中7*7代表图像的像素/长宽,3代表R、G、B 三个颜色通道)。不断更易懂。
    • 2016年8月22日,完成第五轮修改。本轮修改主要加强滤波器的解释,及引入CNN中滤波器的通俗比喻。

        July、最后修改于二零一六年八月二十二日中午于七月在线办公室。

    展开全文
  • 《王道操作系统》学习笔记总目录+思维导图

    万次阅读 多人点赞 2020-02-20 19:02:14
    本篇文章是对《2021操作系统》所有知识点的笔记总结归档,会一直更新下去 之后我也会写组成原理、计算机网络、数据结构与算法、Java、Linux等底层和应用层的技术文章,并总结目录 希望在自己可以复习的同时,也能将...
    • 本篇文章是对《2021王道操作系统》所有知识点的笔记总结归档,虽说是2021年的,但是这些都是最核心的底层基础知识,过多少年都不会有很大的变化,核心都差不多。

    • 我的武功秘籍:note.bithachi.cn,希望可以一起交流学习。

    • 学习视频:王道操作系统

    • 其它学习时总结的目录笔记,有思维导图和案例。见下图

    • 看到很多小伙伴需要课件,这里直接附上网盘链接:

    链接:https://pan.baidu.com/s/17ClnaWO2wkzBX_eX7sB66g
    提取码:8q81
    复制这段内容后打开百度网盘手机App,操作更方便哦

    在这里插入图片描述


    第 1 章 计算机系统概述

    1.1 操作系统的基本概念

             1.1.1 操作系统的概念、功能和目标(系统资源的管理者、提供接口、作为扩充机器、虚拟机)
             1.1.2 操作系统的特征(并发、共享、虚拟、异步)

    1.2 操作系统的发展和分类

             1.2.1 操作系统的发展和分类(手工、单道/多道批处理、分时、实时、网络、分布式、嵌入式、个人计算机)

    1.3 操作系统的运行机制和体系结构

             1.3.1 操作系统的运行机制和体系结构(大内核、小内核)
             1.3.2 中断和异常(内中断和外中断、中断处理过程)
             1.3.3 系统调用(执行过程、访管指令、库函数与系统调用)

    1.0.0 第一章操作系统概述错题整理

    第 2 章 进程管理

    2.1 进程与线程

             2.1.1 进程的定义、特征、组成、组织
             2.1.2 进程的状态(运行、就绪、阻塞、创建、终止)及转换(就绪->运行、运行->就绪、运行->阻塞、阻塞->就绪)
             2.1.3 原语实现对进程的控制
             2.1.4 进程之间的通信(共享通信、消息传递、管道通信)
             2.1.5 线程概念与多线程模型

    2.2 处理机的调度

             2.2.1 处理机调度的概念及层次
             2.2.2 进程调度的时机(主动放弃与被动放弃)、切换与过程(广义与狭义)、方式(非剥夺与剥夺)
             2.2.3 度算法的评价指标(cpu利用率、系统吞吐量、周转时间、等待时间、响应时间)
             2.2.4 作业/进程调度算法(FCFS先来先服务、SJF短作业优先、HRRN高响应比优先)
             2.2.5 作业/进程调度算法(时间片轮转调度算法、优先级调度算法、多级反馈队列调度算法)

    2.3 进程的同步与互斥

             2.3.1 进程的同步与互斥
             2.3.2 实现临界区进程互斥的软件实现方法
             2.3.3 实现临界区进程互斥的硬件实现方法
             2.3.4 信号量机制(整型信号量、记录型信号量P、V)
             2.3.5 信号量机制实现进程的互斥、同步与前驱关系
             2.3.6 进程同步与互斥经典问题(生产者-消费者问题、多生产者-多消费者问题、吸烟者问题、读者-写者问题、哲学家进餐问题)
             2.3.7 管程和java中实现管程的机制

    2.4 死锁

             2.4.1 死锁详解(预防、避免、检测、解除)

    第 3 章 内存管理

    3.1 内存管理的概念

             3.1.1 什么是内存?进程的基本原理,深入指令理解其过程
             3.1.2 内存管理管些什么?
             3.1.3 覆盖技术与交换技术的思想
             3.1.4 内存的分配与回收
             3.1.5 动态分区分配的四种算法(首次适应算法、最佳适应算法、最坏适应算法、临近适应算法)
             3.1.6 分页存储(页号、页偏移量等)
             3.1.7 分页存储管理的基本地址变换结构
             3.1.8 快表的地址变换结构
             3.1.9 二级页表的原理和地址结构
             3.1.10 基本分段存储管理(段表、地址变换、信息共享)
             3.1.11 段页式存储管理(段表、页表、地址转换)

    3.2 虚拟内存管理

             3.2.1 虚拟内存的基本概念(局部性原理、高速缓存、虚拟内存的实现)
             3.2.2 请求分页管理方式(请求页表、缺页中断机构、地址变换机构)
             3.2.3 页面置换算法(最佳置换算法、先进先出置换算法、最近最久未使用置换算法、普通时钟置换算法、改造型时钟置换算法)
             3.2.4 页面分配策略(驻留集、页面分配、置换策略、抖动现象、工作集)

    第 4 章 文件管理

    4.1 文件系统

             4.1.1 初识文件管理概念和功能
             4.1.2 文件逻辑结构(顺序文件、索引文件、索引顺序文件、多级索引顺序文件)关于数据库的索引如聚簇索引可以看一下索引文件例题的解析,感觉还是可以收获到东西的
             4.1.3 文件目录结构(单级-两级-多级-无环图)、索引节点FCB瘦身
             4.1.4 文件的物理结构(连续分配、链接分配[隐式-显式]、索引分配[链接方案-多层索引-混合索引])
             4.1.5 文件管理空闲磁盘块的几种算法(空闲表法、空闲链表法、位示图法、成组链接法)
             4.1.6 文件的基本操作原理(创建、删除、打开、关闭、读-写)
             4.1.7 文件共享(索引节点-硬链接、符号链接-软链接)
             4.1.8 文件保护(口令保护、加密保护、访问控制)
             4.1.9 文件系统的层次结构

    4.2 磁盘组织与管理

             4.2.1 磁盘的结构(磁盘、磁道、扇区、盘面、柱面、磁头)
             4.2.2 磁盘调度算法(FCFS、SSTF、SCAN、LOOK、S-SCAN、C-LOOK)
             4.2.3 减少磁盘延迟时间的方法(交替编号、错位命名)
             4.2.4 磁盘管理(磁盘初始化、引导块、坏块的管理)

    第 5 章 I/O管理

    5.1 I/O管理概述

              5.1.1 什么是I/O设备?有几类I/O设备?
              5.1.2 控制I/O设备的I/O控制器
              5.1.3 控制I/O设备的几种方式?(程序直接控制方式、中断驱动方式、DMA、通道控制)
              5.1.4 I/O软件的层次结构(用户层软件-设备独立性软件-设备驱动程序-中断处理程序)

    5.2 I/O核心子系统

              5.2.1 内核的I/O核心子系统及功能
              5.2.2 I/O设备假脱机技术(SPOOLing)
              5.2.3 I/O设备的分配与回收(DCT-COCT-CHCT-SDT)
              5.2.4 缓冲区管理(单缓冲-双缓冲-循环缓冲-缓冲池)

    展开全文
  • 工程伦理复习笔记(全)

    万次阅读 多人点赞 2020-01-09 19:28:31
    工程伦理第1-5章以及第10章笔记,附前五章问答题 研究生考试系列—攻城伦理复习笔记----弗兰大学 参考教材:《工程伦理》清华大学 第一章 攻城与伦理 第一章通过怒江水电开发的案例引出了工程伦理这一说法并且...

    工程伦理第1-5章以及第10章笔记,附前五章问答题

    研究生考试系列—攻城伦理复习笔记----弗兰大学
    参考教材:《工程伦理》清华大学

    第一章 攻城与伦理

    第一章通过怒江水电开发的案例引出了工程伦理这一说法并且阐释了何为工程伦理。人类的工程实践不仅仅是一种改造自然的技术活动,也是一种关涉人丶自然与社会的伦理活动。第一章重点探讨了工程与伦理的概念,分析了工程实践中可能出现的各种伦理问题,提出处理工程实践中伦理问题的基本原则。
    1.1如何理解工程? 这一小节明确了“工程”的概念,但在现代社会,人类的工程活动都要以技术为基础。因此,工程与技术密切相关。讨论工程伦理的相关问题前,厘清技术与工程之间的联系与区别。 技术与工程之间的区别表现为四个方面:第一,二者内容性质不同,技术的核心是发明,工程的核心是建造。第二,二者“成果”的性质和类型不同,技术活动成果的主要形式是发明丶专利丶技术技巧和技能,工程活动成果的主要形式是物质产品丶物质设施。第三,二者的活动主体不同。技术活动的主体是发明家,工程活动的主体是工程师以及工人丶管理者丶投资方等。第四,二者的任务丶对象和思维方式不同。技术方法都具有“可重复性”,而工程项目都具有独一无二的特征。 技术和工程的又有着紧密的联系。首先,他们都是以满足人类的某种需要为目的,都是人类在认识世界的过程中为了获得更为优质的生活而改造世界的活动。其次,工程活动都要以技术为基础,工程要对技术进行集成。同时,工程也是技术的重要载体,并使技术的本质特征得以具体化。可以说,技术是工程的手段,工程是技术的载体和呈现形式。 工程的概念最初主要用于指代与军事相关的设计和建造活动,近代以后,人们把有目的地控制和改造自然物,建造人工物,以服务于特定人类需要的行为往往都称之为工程。被广泛接受的工程的定义:认为工程是驾驭源于自然界的力量以供人类使用病为人类提供便利的艺术。在现在社会中,广义的工程概念认为,工程是由一群人为达到某种目的,在一个较长时间周期内进行协作活动的过程。狭义的工程概念则认为,工程是以满足人类语言的目标为指向,应用各种相关的知识和技术手段,调动多种自然与社会资源,通过一群人的相互协作,将某些现有实体汇聚并建造为具有预期使用价值的人造表情的过程。 一般而言,计划丶设计丶建造丶使用和结束五个环节构成了工程的完整生命周期。 任何一个工程项目整体上都是一种社会实践。一方面,工程活动本身具有社会性,它是工程共同体通过实践将工程设计和知识应用于自然的过程;另一方面,工程活动的目的是为了“好的生活”,其造福人类社会的目标具有社会性。工程实践具有不确定性和探索性。 理解工程的几个维度:哲学丶技术丶经济丶管理丶社会丶生态丶伦理。
    1.2如何理解伦理 伦理突出以之依照规范来处理人与人丶人与社会丶人与自然之间的关系。 伦理规范可分为两种:其一是制度性的伦理规范,其二是描述性的伦理规范。 伦理立场可概括为功利论丶义务论丶契约论和德行论。 伦理困境:价值标准的多元化以及现实的人类生活本身的复杂性,常常导致在具体情境下的道德判断与抉择的两难困境,即为“伦理困境”。 面对复杂的伦理问题或伦理困境时,为了更好的在工程实践中履行伦理责任,可按照以下顺序审慎地思考和处理几对重要的逻辑关系。第一,自主与责任的关系;第二。效率和公正的关系;第三,个人与集体的关系;第四,环境与社会的关系。
    1.3工程实践中的伦理问题 对工程活动的行动者网络的分析可以有两个维度。第一个维度是不同类型的行动者之间的交互作用,这构成我们通常所说的工程共同体。第二个维度是同一类型的行动者之间的交互作用,这以工程师共同体为典型代表。 主要的工程伦理问题:技术伦理问题丶利益伦理问题丶责任伦理问题丶环境伦理问题。 工程伦理问题的特点可以概括为历史性丶社会性丶复杂性,其中历史性是从时间的维度,社会性和复杂性分别是参与者和设计因素的维度来看工程伦理问题。
    1.4如何处理工程实践中的伦理问题 在一般意义上来说处理好工程实践中的诸多伦理问题,行为者首要的是需辨识工程实践场景中的伦理问题,然后通过对当下工程实践及其生活的反思和对规范的再认识,将伦理规范所蕴含的“应当”现实地转化为自愿丶积极的“正确行动”。 处理工程伦理问题的基本原则:人道主义–处理工程与人关系的基本原则,社会公正–处理工程与社会关系的基本原则,人与自然和谐发展–处理工程与自然关系的基本原则 应对工程伦理问题的基本思路:

    具体分为五个方面:⑴培养工程实践主体的伦理意识。⑵利用伦理原则丶底线原则与相关情境相结合的方式化解工程实践中的伦理问题。⑶遇到难以抉择的伦理问题时,需多方听取意见。⑷根据工程实践中遇到的伦理问题及时修正相关伦理准则和规范。⑸逐步建立遵守工程伦理准则的相关保障制度。

    第二章 攻城中的安全、风险与责任

    2.1工程风险的来源及防范
    工程风险的来源:总体而言,主要由以下三种不确定因素造成;一是工程风险的技术因素,二是工程风险的环境因素,三是工程风险的人为因素。工程风险的技术因素又可分为零部件老化丶控制系统失灵和非线性作用等因素;工程风险的环境因素又可分为意外气候条件和自然灾害等因素:工程风险的人为因素又可分为工程设计理念的缺陷丶施工质量缺陷和操作人员渎职等因素。
    工程风险的可接受性的来由:由于工程系统内部和外部各种不确定因素的存在,无论工程规范制定得多么完善和严格,仍然不能把风险的概率降为零。因此,在对待工程风险的问题上,我们只能把风险控制在人们的可接受范围之内。
    工程风险可接受性的定义:人们在生理和心理上对工程风险的承受和容忍程度。当然,其可接受性因人而异,即工程风险的可接受性是具有相对性的。这种相对性的差异在专家和普通公众之间更为明显。
    如何把风险控制在人们得了接受范围之内?这就需要对风险的可接受性进行分析丶界定安全的等级,并针对一些不可控的意外风险事先制定相应的预警机制和应急预案。
    工程风险的防范与安全:①工程的质量监理与安全:工程质量监理是真专门针对工程质量而设置的一项制度,它是保障工程安全,防范工程风险的一道有力防线。②意外风险控制与安全:工程风险是可以预防的,事故预防包括两个方面:一是对重复性事故的预防,二是对可能出现事故的预防。建立工程预警系统是预防事故发生的有效措施之一;意外风险的应对通常采取的措施包括风险回避丶风险转移丶风险遏制丶风险化解丶风险自留等手段。③事故应急处置与安全:要有效应对工程事故,应该事先就准备一套完整的事故应急预案。这是保证迅速丶有序地开展应急与救援行动,降低人员伤亡和经济损失的保障。
    制定事故应急预案的基本原则:⑴预防为主,防治结合。⑵快速反应,积极面对。⑶以人为本,生命第一。⑷统一指挥,协同联动。
    2.2工程风险的伦理评估
    工程风险评估的核心问题是“工程风险在多大程度上是可接受的”,其本身就是一个伦理问题,其核心是工程风险可接受性在社会范围的公正问题。
    工程风险的伦理评估原则: ⑴以人为本的原则;⑵预防为主的原则;⑶整体主义的原则;⑷制度约束的原则。
    工程风险的伦理评估途径:⑴工程风险的专家评估;⑵工程风险的社会评估;⑶工程风险评估的公众参与。
    工程风险的伦理评估方法:⑴工程风险伦理评估的主体,评估主体在工程风险的伦理评估体系中处于核心地位。可分为内部评估主体和外部评估主体。⑵工程风险伦理评估的程序,工程风险伦理评估的第一步是信息公开;第二步是确立利益相关者,分析其中的利益关系;第三步是按照民主原则,组织利益相关者就工程风险进行充分的商谈和对话。⑶工程风险伦理评估的效力,效力包括目标确定丶实现目标的能力以及目标实现的效果三个核心要素。
    考察工程风险伦理评估的效力,有以下几个原则要遵守:①公平原则②和谐原则③战略原则。
    2.3工程风险中的伦理责任
    工程伦理责任的主体:⑴工程师个人的伦理责任:工程师作为专业人员,具有一般人不具有的专门的工程知识,他们作为工程活动的直接参与者,工程师比其他人更了解某一工程的基本原理以及所存在的潜在风险。⑵工程共同体的伦理责任:现代工程在本质上是一项集体活动,当工程风险发生时,往往不能把全部责任归结于某一个人,而是需要工程共同体共同承担。
    工程伦理责任的类型:①职业伦理责任,可分为义务–责任丶过失–责任丶角色–责任②社会伦理责任③环境伦理责任。

    第三章 攻城中的价值、利益与公正

    工程的价值特点:(1)工程的价值导向性;⑵工程价值的多元性;⑶工程价值的综合性。 其工程价值的多元性体现在:工程的科学价值丶工程的政治价值丶工程的社会价值丶工程的文化价值丶工程的生态价值等方面。
    工程活动是一个项目一个项目进行的,项目是工程活动的基本单元,而工程项目在时空分布上是不均匀的,它只能服务于特定的人群,而不会是所有人。
    邻避设施:指能使大多数人获益,但对邻近居民的生活环境与生命财产以及资产价值带来负面影响的“危险设施”。
    邻避效应:对于邻避设施的公益性丶重要性以及建设的必要性,当地居民一般是认可的,但是由于他们承受其实实在在的或潜在的危害,所以他们的态度是,这些项目确实应该建设,但“不要建在我家后院”。
    社会成本是由于实施建设项目而造成的,但又不能归入参与项目的合同方的直接或间接成本之中。在工程全寿命周期,都有可能对社会造成不利的影响,发生社会成本。
    工程活动的社会成本主要表现在:①对环境丶资源影响所形成的社会成本;②对社会影响所形成的社会成本;③对经济影响所形成的社会成本。
    利益相关者的狭义定义:存在这样一些利益群体,如果没有他们的支持,企业就无法生存。 广义定义:那些能够影响企业目标实现,或者能够被企业实现目标过程影响的任何个人和群体。
    利益相关者必须具备的三个条件:①影响力,即某一群体是否拥有影响企业决策的地位丶能力和相应的手段;②合法性,即某一群体是否在法律和道义上被赋有对企业的所有权;③紧迫性,即某一群体的要求能否立即引起企业管理层的关注。
    工程的目标人群与攸关方(承受者)的简单对比

    公正的基本概念:每个人都应获得其应得的权益,对平等的事物平等对待,不平等的事物区别对待。公正不等于平等。
    公正的四种类型:①补偿公正,是对一个人曾经遭受的不公正待遇进行补偿;②惩罚公正,是对违法者或做坏事的人进行惩罚;③分配公正,指公正地分配福利和负担;④程序公正,规定了判决的过程丶行为或达成的协议的公正性。
    在工程活动中,公正的实现必须要考虑现实活动目标的效率。公正应该是工程实践的内在目标的有机组成部分,公正的实现应该与效率的追求相统一。效率的实现要以基本公正为条件。基本的公正既是效率合法性的前提,也是长期效率的保障。
    基本分配公正的基本实现途径是在不同利益与价值追求的个人与团体间的对话的基础上,达成有普遍约束力的分配与补偿原则。
    为了实现基本公正,需要建立和完善以下几方面机制:①进行项目社会评价。②针对事前无法准确预测项目的全部后果,以及前期未加考量的公正问题,应引入事后评估机制。③针对仅瞄准目标人群的局限,扩大关注的视域,开展利益相关者分析。
    利益相关者分析的主要内容:根据项目单位的要求与项目的主要目标,确定项目的主要利益相关者;明确各利益相关者的利息所在以及与项目的关系;分析各利益相关者之间的相互关系;分析利益相关者参与项目实施 的各种可能方式等。
    如何改善矛盾冲突:建立相关者的利益协调机制,吸收广大公众参与工程的决策丶设计和实施全过程。

    第四章 攻城活动中的环境伦理

    工业化过程中保护环境的两种思路:资源保护主义和自然保护主义。两者都强调自然资源保护的重要性,但价值观和保护目的却截然不同。资源保护主义的主张是“科学的管理,明智的利用”,目的是更好地开发利用。自然保护主义的目的是为了自然自身,而不是人类的利用。
    人类中心主义的三层涵义:生物学意义上的丶认识论意义上的丶价值论意义上的人类中心主义。
    工程环境伦理的基本思想: ①价值论意义上的人类中心主义,把人看成是自然界唯一具有内在价值的事物。 ②非人类中心主义,人类只是自然整体的一部分,他需要将自己纳入更大整体中才能客观地认识自己存在的意义和价值。 ③动物解放论和动物权利论,主张把道德关怀的对象范围扩大到一切有生命的存在,倡导一种尊重生命的态度 ④生物中心主义,生态整体主义,主张整个自然界及其所有事物和生态过程都应成为道德关怀的对象。
    环境伦理学的核心问题:是否承认自然界及其事物拥有内在价值与相关权利。
    自然界的价值:工具价值和内在价值。工具价值是指自然界对人的有用性。内在价值为自然界及其事物拥有内在价值与相关权利自身固有,与人存在与否无关。内在价值是工具价值的依据。
    工程活动中的环境影响:①消耗大量的能源和天然资源;②产生各种建筑垃圾丶废弃物丶化学品或危险品污染环境;③工地产生的污水造成水污染;④噪声和振动的影响;⑤排除有害气体或粉尘污染空气。
    工程理念是工程活动的出发点和归宿,是工程活动的灵魂。
    工程活动中的环境伦理原则:① 尊重原则,一种行为是否正确,取决于它是否体现了尊重自然这一根本性的道德态度。这是我们行动的首要选择②整体性原则,一种行为是否正确,取决于它是否遵从了环境利益与人类利益相协调。③不损害原则,一种行为,如果以严重损害自然环境的健康为代价,那么它就是错误的。④补偿选择,一种行为,当它对自然环境造成了损害,那么责任人必须作出必要的补偿,以恢复自然环境的健康状态。
    当原则出现冲突时,我们可以依据一组评价标准对何种原则具有优先性进行排序。这一组评价标准由两条原则组成:①整体利益高于局部利益原则,人类一切活动都应服从自然生态系统的根本需要。②需要性原则:在权衡人与自然利益的优先秩序上应遵循生存高于基本需要丶基本需要高于非基本需要的原则。
    工程共同体的环境伦理主要指工程过程应切实考虑自然生态及社会对其生产活动的承受性,考虑其行为是否会造成公害,是否会导致环境污染,是否浪费了自然资源,要求企业公正的对待自然,限制企业对自然资源的过度开发,最大限度地保持自然界的生态平衡。
    工程决策是避免和减少生态破坏的根本性环节。
    工程师的环境伦理责任包含了维护人类健康,使人免受环境污染和生态破坏带来的痛苦和不便;维护自然生态环境不遭破坏,避免其他物种承受其破坏带来的影响。
    工程师的环境伦理责任不只是赋予工程师责任和义务,还同时赋予他相应的权利,使得他能在必要时及时终止他的责任和义务。。

    第五章 攻城狮的职业伦理

    传统工程师“职业”的概念:一是专业技术知识,二是职业伦理。而现代赋予工程师“职业”以更多的内涵,“诸如组织丶准入标准,还包括品德和所受的训练以及除纯技术外的行为标准”。
    广义上讲,职业是提供社会服务并获得谋生手段的任何工作。但在工程领域中的意义,是指“那些涉及高深的专业知识丶自我管理和对公共善协调服务的工作形式”。
    职业共同体的形成为职业自治提供了现实条件。职业自治的实质映射了治理的概念。
    工程社团是工程职业的组织形态,也是工程职业的组织管理方式。
    工程职业制度包括职业准入制度丶职业资格制度和执业资格制度。其中,工程职业资格又分为两种:一种属于从业资格范围;另一种则属于执业资格范围工程师执业准入制度的具体内容包括高校教育及专业评估认证丶职业实践丶资格考试,注册执业管理和继续教育五个环节。职业资格制度是一种证明从事某种职业的人具有一定的专门能力丶知识和技能,并被社会承认和采纳的制度。
    公众的安全丶健康丶福祉被认为是工程带给人类利益最大的善,这使得工程伦理规范在订立之初便确认“将公众的安全丶健康和福祉放在首位”为基本价值准则,也是首要原则。
    作为职业伦理的工程伦理首先是一种预防性伦理,其次也是一种规范伦理,最后也是一种实践伦理。
    工程师的职业伦理规范:首要责任原则丶工程师的权利与责任丶工程师的职业美德,并尽可能说明在不同工程实践情境下工程师如何作出正确的伦理抉择。
    工程师的职业美德包括诚实可靠丶尽职尽责和忠实服务。
    应对职业行为中的伦理冲突的方法:①回归工程实践以应对角色冲突;②保持多方信任以应对利益冲突;③权益与变通以应对责任冲突。

    讨论题

    第一章:结合本章关于怒江水电开放的引导案例,思考并回答怒江水电开发中面临着哪些复杂的伦理问题或伦理困境?在面对以上伦理问题时,作为工程师,应如何进行伦理选择和伦理决策?

    答:面临的伦理问题或伦理困境: 因伦理意识缺失或者对行为后果估计不足导致的问题,例如,在工程设计过程中,未考虑某些环节会对环境或者其他人群造成不良影响;因工程相关的各方利益冲突所造成的伦理困境,例如,经济效益与环境保护之间,尤其是投资方的利益诉求与公众的安全、健康和福利之间的冲突;工程共同体内部意见不合,或者工程共同体的伦理准则与规范等其他伦理原则之间不一致导致的问题。除此之外,还有责任追究问题,包括事后责任、事前责任和决策责任以及如何平衡自然的承受力,避免浪费自然资源,限制过度开发,保持生态平衡的环境问题。在怒江水电开发过程中,遇到的核心问题就是反对方担心开发会对怒江生态系统造成不可挽回的影响。 2.工程师在处理伦理问题或伦理决策时,应首先遵守基本原则,其次是按照应对问题的基本思路展开。 处理伦理问题的基本原则: 处理好工程与人的关系基本原则——秉持自主、不伤害人的自身安全;安全第一,是道德底线。 处理好工程与社会的关系基本原则——尽量保证群体间的利益公正,防止因争夺利益而引发其他复杂的问题。 处理好工程与自然的关系基本原则——怒江水电的开发,要遵从自然规律,遵从自然的生态规律,才能达到人与自然和谐相处,实现利益最大化。 基本思路是首先考虑是否合法、合规,在此基础上,要结合专业价值以及公众利益方面,进行一个综合的考虑。 作为工程师,在面对伦理选择和决策时,应该首先培养其伦理意识。在此基础上,利用伦理原则、底线原则与具体情境相结合的方式化解工程实践中的伦理问题,应针对怒江水电开发过程的具体问题具体分析。而在遇到难以抉择的伦理问题时,需多方听取意见,并且要根据怒江水电开发过程中遇到的伦理问题及时修正相关伦理准则和规范,逐步建立遵守工程伦理准则的相关保障制度。多方面分析探讨并解决,怒江水电开发过程中是否会造成严重生态问题,并根据专业知识去处理解决,要平衡好反对方和投资方之间的利益诉求。

    第二章:美国东部时间2003年8月14日,美国东北部和加拿大联合电网发生大面积停电事故。事故发生的最初3分钟内,包括9座核电站在内的21座电厂停止运行。随后美国和加拿大的100多座电厂跳闸,其中包括22座核电站。负荷损失总计6180万千瓦,停电范围为9300多平方英里,涉及美国的密歇根、俄亥俄、纽约、新泽西、马萨诸塞、康涅狄格等8个州和加拿大的安大略省、魁北克省,受影响的居民约5000万人。到8月15日晚9时30分,纽约城在停电29小时后全面恢复供电。事后调查发现,美、加停电事件是一起由电网局部故障,扩大到电网稳定被破坏,电压崩溃,最后造成电网瓦解,引起大面积停电的严重恶性事故,波及面之广,影响之大,是北美继1965、1977年的两次大停电之后最为严重的停电事故,其严重程度远超前两次事故。纵观整个事故过程,起因不过是位于俄亥俄州的一处线路跳闸,接着便发生了一系列连锁反应:系统发生摇摆和震荡、局部系统电压进一步降低、发电机组跳闸、系统功率缺额增多、电压崩溃、更多发电机和输电线路跳开,从而引起大面积停电。 (1)该事故的发生主要是由哪些风险因素引起的? (2)从哪些方面入手可以防范类似工程风险的发生?

    答:1.风险因素:首先是由工程中技术因素的不确定性造成的。施工质量的好坏也是影响工程风险的重要因素。 2.若要防范类似工程风险的发生,可从以下几个方面入手:工程的质量监理与安全。工程质量是决定工程成败的关键。没有质量作为前提,就没有投资效益、工程进度和社会信誉。工程质量监理是专门针对工程质量而设置的一项制度,它是保障工程安全,防范工程风险的一道有力防线。意外风险控制与安全。工程风险是可以预防的。如果认为风险不可预防, 一个组织内从管理层到管理员工就不可能为预防风险去竭尽全力,在每个工作细节上精益求精。线路跳闸就是最好的反面案例。事故预防包括两个方面:一是对重复性事故的预防,即对已发生事故的分析,寻求事故发生的原因及其相关关系,提出预防类似事故发生的措施,避免此类事故再次发生;二是对可能出现事故的预防,此类事故预防主要针对可能将要发生的事故进行预测,即要查出存在哪些危险因素组合,并对可能导致什么事故进行研究,模拟事故发生过程,提出消除危险因素的办法,避免事故发生。

    第三章:1. 为了在工程实践中实现基本公正,需要开展利益相关方分析,请简述利益相关方分析的主要内容。
    答:利益相关者必须具备三个条件:1.影响力,即是某一群体是否拥有影响企业决策的地位,能力和相应的手段,2.合法性,即是某一群体是否在法律和道义上被赋有对企业的所有权;3.紧迫性,即是某一群体的要求能否引起企业管理层的关注。从工程伦理的角度来说更确切的是”承受者“。攸关方关注的是自身权益,关注的焦点1是担心危害、风险。

    2. 广州市花都区垃圾焚烧项目 随着社会经济快速发展,城市化不断推进,原有的城市公共设施,如交通设施、能源供给以及废物处理等,已无法满足现代化和城市化发展的要求,因此需要进行大量的改进或提升。以垃圾处理设施为例,国家“十二五”规划纲要提出“城市污水处理率和生活垃圾无害化处理率分别达到 85% 和 80%”的总体要求,其中,到2015 年全国设市城市和县城生活垃圾无害化处理率分别达到 90% 和 70% 以上,生活垃圾焚烧处理设施能力占全国城市生活垃圾无害化处理能力的35%。可见,推进垃圾处理项目既有现实的紧迫性,也有政策压力,全国各地势必掀起一股大力建设垃圾处理设施的热潮。然而,在项目选址过程中,由于民众对环境污染的担忧和相对剥夺感、政府公信力不足、决策过程不透明以及环境正义等因素,邻避型群体性事件很容易发生,继而对维护社会稳定和构建和谐社会造成极大的负面影响。 广州市花都区的垃圾处理一直是个棘手问题,其生活垃圾和工业垃圾日收运总量已近1600吨,且以年均约8%的速度增长,但只有狮岭汾水垃圾填埋场在运行,而且即将满容。所以建设花都垃圾焚烧厂(广州市第五资源热力电厂)列入了广州市建设规划。但其选址遭遇了多次波折。 花都垃圾焚烧厂在2009年公布拟选址狮岭镇汾水林场时,引起周围楼盘以及临近清远村民的强烈不满。广州市城管委每月的例行接访日经常遭到上访群众“包场”,选址工作一度停滞。 2013年6月,花都垃圾焚烧厂第二轮选址确定首选地由狮岭镇汾水林场改为狮岭镇前进村,距最近居民区1.3公里,又引起狮岭镇民众的反对。 2013 年 6 月 28 日,《广州日报》刊登了题为《花都垃圾焚烧厂首选狮岭前进村》的报道,此后信息迅速扩散。狮岭镇内居民开始大范围大规模讨论狮岭镇选址事件。7月 10 日,广州多个垃圾焚烧项目的开工时间公布,其中花都垃圾焚烧项目计划于 2014 年 6 月 18日开工。因开工时间未得到公众知情和同意,而彻底激怒了狮岭镇居民。公众通过多种信息渠道传播选址信息并集合各种力量进行反对活动,例如以建立 QQ 群、微信群、短信等方式扩大反对人数,并组织抗议活动。7 月 15 日,狮岭镇 13个经济联社共同上街游行,爆发狮岭镇上访和游行,抗议政府在垃圾焚烧这一重大项目上未曾与当地村民沟通。参加游行的居民还直斥环评专家所言选址所在地方圆数公里“荒无人烟”这一说法,称前进村几乎为狮岭镇“中心”,几十万人口将受到焚烧厂影响。当地政府承诺三天后会答复村民,暂时缓解了对峙局面。7 月 19 日,在未得到政府任何回复的情况下,也为获得更多的关注,数千市民到花都区政府再次游行示威,出现了反对垃圾焚烧项目选址的群众聚集游行活动,公众负面情绪和各类风险达到高峰。 花都区政府在此过程中向示威群众反复表态“环评、社会风险评估不通过、征地拆迁大部分群众不满意,垃圾焚烧项目绝不强行开工建设”,并于 7 月 22 日到 28日在花都区信访局开展为期一周的市、区、镇联合接访活动,报纸《今日花都》也于头版头条的位置刊发花都区政府的态度,事后花都区政府也组织了工作组进村入户,向村民宣传解释该项目的重要性和必要性,同时也保证政府将充分听取民众意见,绝不会强行开工建设。政府采取措施针对各类可能出现的风险进行防范,安抚公众情绪,引导事件向正常的方向发展。至此,花都区垃圾焚烧项目事件告一段落。 花都垃圾焚烧厂第三轮选址改为赤坭镇十八岭。2015年9月召开的广州市城市规划委员会会议上,这项规划获得通过。包括焚烧厂在内的整个循环经济产业园区占地约55.72万平方米,最终落户花都赤坭镇十八岭鲤塘村小水库旁。此次选址,政府部门特意避开了居民居住区,即使是距离垃圾焚烧厂最近的楼盘也在垃圾焚烧厂8公里之外。 问题:这个案例中的利益相关者主要有哪些?他们各自的利益诉求是什么?它们之间的矛盾是什么?如何解决利益矛盾?

    答: 利益相关者:花都区政府、狮岭镇居民、环评专家、媒体。 花都区政府的利益诉求:垃圾焚烧场周围居民:垃圾场的选址问题切身关系到周围居民的生活环境质量与生命财产安全以及资产价值等,除此之外,还有居民对危害的心理担忧和风险感知。 大众:建设垃圾处理场,有效处理城市垃圾,提高堿市里的生活质量等。与此同时,避免建造垃圾场选址距离太远,会增加运营成本等社会成本。 两者之间的矛盾:邻避效应。“邻避设施“垃圾处理场,能够使大多数人受益,但对临近居民的生活环境与生命财产以及资产价值带来负面影响。这是工程项目建设的利益一一损害承担不公正问题,即大众与周围居民之间出现利益——损失分配上的不平衡。 如何解决利益矛盾:通过采取各种措施使利益相关者的利益最大化。政府组织,宣传解释,相互协调,选址让步。案例中政府采取向村民宣传解释该项目的重要性和必要性,同时也保证充分听取民众意见,特意避开居民居住区,满足了各方的利益诉求。

    第四章:1. 工程活动中的环境伦理原则主要包括哪些?并简述其内容。
    答:整体原则,尊重原则,不损害原则,补偿原则。

    2. 阅读以下案例,请用环境伦理原则分析企业的伦理责任。如果你是该企业的工程师,你觉得自己应该怎样做? 日本骨痛病事件是世界有名的公害事件之一,1955年至1972年发生在日本富山县神通川流域。 横贯日本中部的富山平原有一条清水河叫神通川,两岸人民世世代代喝的是这条河的水,并用这条河的水灌溉两岸肥沃的土地,使这一带成为日本主要粮食产地。后来三井金属矿业公司在这条河的上游设立了神冈矿业所,建成炼锌工厂,把大量污水排入神通川。 1952年,这条河里的鱼大量死亡两岸稻田大面积死秧减产,该公司不得不赔偿损失300万日元。 1955年以后,在河流两岸如群马县等地出现一种怪病。患者一开始是腰、手、脚等各关节疼痛,延续几年之后,身体各部位神经痛和全身骨痛,使人不能行动,以至呼吸都带来难以忍受的痛苦,最后骨胳软化萎缩,自然骨折,一直到饮食不进,在衰弱疼痛中死去有的甚至因无法忍受痛苦而自杀。由于病人经常痛苦地呻吟且不知道原因,故称“痛痛病”。经尸体解剖,骨痛病患者有的骨折多达73处,身长缩短了30厘米,病态十分凄惨。 直到1968年,经调查才证实富山骨痛病是三井金属公司排出镉造成的。该公司把炼锌过程中未经处理净化的含镉废水连年累月地排放到神通川中,两岸居民引水灌溉农田,使土地含镉量高达7-8μg/g,居民食用的稻米含镉量达1-2μg/g。饮用含镉的水,久而久之体内积累大量的镉而生骨痛病。此后日本骨痛病患区已远远超过神通川,而扩大到黑川、铅川、二迫川等7条河的流域,其中除富山县的神通川之外,群马县的碓水川、柳濑川和富山的黑部川都已发现镉中毒的骨痛病患者。截至1968年5月,共确诊患者258例,其中死亡128例,到1977年12月,又死亡79例。

    答:身为工程师,首先要有人道主义关怀,在实施工程时要从各方面进行考虑。是否会损害人类与自然环境的整体利益,要遵循尊重原则,我们要有尊重自然,保护自然,顺应自然的道德观念。当个人利益或企业利益与社会整体利益发生冲突时,要遵循整体性原则,以整体利益为主。在项目的设计、实施过程中,要从始至终保证不损害原则。当损害不可避免时,我们应当采取事后补偿原则。

    第五章:1. 请简要回答工程职业正式兴起的标志有哪些?

    答:工程职业社团的形成、职业标准的设立以及强调职业道德使命、“侍奉道德理想”目的伦理章程的建立,标志着工程职业的正式兴起和工程职业伦理的确立。

    2. 请简要回答解决工程师角色冲突问题的方法有哪些?
    答:(1)审慎地选择要处理的冲突问题。 (2)评估冲突当事人。 (3)分析冲突原因和根源。

    3. 请简要回答“回避”利益冲突的方式有哪些?
    答:有五种“回避”利益冲突的方式:①拒绝,比如拒收卖主的礼物;②放弃,比如出售在供应商那里所持有的股份;③离职,比如辞去公共委员会中的职务,因为公司的合同是由这个委员会加以鉴定的;④不参与其中,比如不参加对与自己有潜在关系的承包商的评估;⑤披露,即向所有当事方披露可能存在的利益冲突的情形。前四种方式都归于“回避”的方法。回避利益冲突的方法就是放弃产生冲突的利益。通过回避的方法来处理利益冲突总是有代价的,即有个人损失的发生。其中不同的是,“拒绝”是被动地失去可获得的利益,而“放弃”是主动放弃个人的已有利益。而“披露”能够避免欺骗,给那些依赖于工程师的当事方知情同意的机会,让其有机会重新选择是找其他工程师来代替,还是选择调整其他利益关系。

    4. 铲车手(参见《工程伦理:概念和案例》245页) 工程学学生布赖恩•斯普林格(Bryan Springer)有一份薪水很高的暑期工作,他的工作是当铲车司机。这份工作使得他不用贷款就可以继续大学学业。现在他正盯着一只装满50加仑用过的机器冷冻剂的桶,不知他该怎么办。 就在不久前,布赖恩的上司马克斯•莫里森(Max Morrison)叫他把半桶废冷冻剂倒入下水道中。布赖恩知道冷冻剂是有毒的,并且向马克斯说明了这一情况,但马克斯并没有动摇。 马克斯:毒素沉淀在桶的底部。如果倒掉半桶,并且一边倒,一边用水稀释它,那么就不会有什么问题。 布赖恩:我认为这不管用。还有,这么做是否违反了法律? 马克斯:瞧,小家伙。我可没有时间来闲聊那些愚蠢的法律。如果我把时间都花在担忧冒出来的每一件小事情上,那么我将寸步难行——你也一样。按常规办事是我的原则。我刚才已经告诉过你了——毒素沉在底部,而且其中的大部分仍然会留在那里。多年来我们都是这么做的,从未发生过什么事。 布赖恩:你的意思是说,并没有人对此说些什么吗?但这并不意味着环境没有受到损害。 马克斯:你不会是环保人士吧,是吧?你们这些大学生整天钻在象牙塔。现在是回到现实的时候了——继续工作。小家伙,你知道,你能得到这么高薪水的工作,完全是运气。3个月以后,你就可以回到你那舒适的大学生活中去了。你知道,有多少大学生正在担心他们没钱付学费——这些家伙对你现在的工作羡慕呢。 马克斯随后离开了,他充满希望地期待布赖恩倒掉废冷冻剂。布赖恩一边盯着桶,一边在沉思。你认为他有什么样的选择?他应该怎么办?
    答:不能简单随意地倾倒废液,工程不能只着眼于当前的物质和经济的需要,而是应该站在为人类的幸福、安全和福祉的基础上着眼于全面发展、生态良好、生态富裕和社会和谐的未来。职业伦理章程中的可持续发展观也要求工程师应主动承担起节约资源、保护环境的责任。

    第十章 信息与大数据的伦理问题

    信息技术所带来的伦理性问题:①人际关系虚拟化;②正当的网络行为;③平等与公正;④知识产权争议;⑤全球化信息交互与治理困境。
    大数据时代对社会伦理的新挑战:①身份困境;②隐私边界;③数据权利;④数据治理。
    大数据伦理的相关内容: ⑴鉴别数据的获取丶处理丶分发(发布)过程中涉及哪些不同利益主体; ⑵发现大数据实践中对相关利益主体的伦理原则造成威胁的风险类型丶程度大小。 ⑶确定数据伦理的价值准则和哲学依据; ⑷指导形成正当行动的行为规范。
    数字身份的定义:一组独一无二地描述一个主体或实体的数据,是有关一个人的所有在数字上可得的信息的总和。
    数字身份的特点:①多样性,②可变性,③允许匿名和假名。
    常见的用户身份管理技术:①用户名+密码+校验码;②第三方认证;③预存的个性化问题;④生物特征。
    “双盲”原则:网络应用服务提供方只需通过以上特征判定正在登录的与系统记载的是“同一个人”,而无须确认在真实社会里他的身份。
    保护数据隐私面临的挑战:①可信性与可靠性;②快速扩散性与放大器效应;③挖掘技术与关联发现;④身份盗窃与冒用;⑤恶意攻击。
    数据权属价值判断原则:①尊重原则,②诚信原则,③公平交易原则。
    数据伦理责任的特点:数据伦理责任具有伦理责任的一般特征;同时,又有自己的特殊性,表现为:自律性丶广泛性和实践性。
    大数据创新科技人员的伦理责任:①尊重个人自由;②强化技术保护;③严格操作规范;④加强行业自律;⑤承担社会责任。
    大数据创新科技人员的行为规范:①尊重他人;②公平待人;③避免伤害他人丶财物丶名誉或聘用关系;④克制而不报复;⑤遵守与IEEE有业务往来的各国适用法律及IEEE的政策和流程。

    注意:部分内容整理自知乎@ZL的文章

    展开全文
  • git笔记git笔记git笔记git笔记git笔记git笔记git笔记git笔记git笔记git笔记git笔记git笔记git笔记git笔记git笔记git笔记git笔记git笔记git笔记git笔记git笔记git笔记git笔记git笔记git笔记git笔记git笔记git笔记git...
  • javaScript学习笔记(一)js基础

    万次阅读 多人点赞 2018-09-21 10:07:18
    ================================= 公众号 关注一波 (一叶知秋博客) 不定期分享视频资料 一、简介 1、概述: ...JavaScript是目前web开发中不可缺少的脚本语言,js不需要编译即可运行,运行在客户端,需要...
  • 《王道计算机网络》学习笔记总目录+思维导图

    万次阅读 多人点赞 2020-03-07 21:47:00
    本篇文章是对《2021王道计算机网络》所有知识点的笔记总结归档,会一直更新下去 之后我也会写操作系统、计算机网络、数据结构与算法、Java、Linux等底层和应用层的技术文章,并总结目录 希望在自己可以复习的同时,...
  • 网络安全-自学笔记

    万次阅读 多人点赞 2020-06-16 17:29:55
    目录 WEB(应用)安全 前端安全 xss攻击 后端安全 文件上传漏洞 WebShell 解析安全 ...网络安全-sqlmap学习笔记 通信安全 网络-http协议学习笔记(消息结构、请求方法、状态码等) ...
  • docker update redis --restart=always
  • Java从零基础到精通详细笔记高清完整PDF版

    千次下载 热门讨论 2014-01-07 10:47:03
    本文档为详细笔记,doc格式,共173页。包含内容: Unix,Java 基础,数据库(Oracle jdbc Hibernate pl/sql),web,JSP,Struts,Ajax,Spring,Ejb,Java和模式。另附学习视频链接地址,欢迎下载。
  • 工作笔记工作笔记工作笔记工作笔记工作笔记工作笔记工作笔记工作笔记工作笔记工作笔记工作笔记工作笔记工作笔记工作笔记工作笔记工作笔记工作笔记工作笔记工作笔记工作笔记工作笔记工作笔记工作笔记工作笔记
  • 几款笔记软件的优缺点

    万次阅读 多人点赞 2018-07-27 18:19:37
    现在笔记软件出现了好多,我也已经使用过好几种,如印象笔记,有道,为知,onenode。它们是各有千秋,而我也时常在它们之间挑来挑去。下面让我以一个程序员的角度,来说说他们的优缺点吧!(当然这个对比掺杂了我的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,351,964
精华内容 1,340,785
关键字:

笔记