Skip to content

Latest commit

 

History

History
304 lines (232 loc) · 15.7 KB

File metadata and controls

304 lines (232 loc) · 15.7 KB

#新生群小课堂 知识总结(一) 来自Lulu学姐的整理和补充~

开篇废话:

各位可爱的小鲜肉萌,欢迎来到浙大2015级新生群~

恩~我们这个群呢,有一点点不一样……学长学姐萌希望把这里打造成一个可以相互学习、交流和成长的地方呢^ ^

所以你们会看到一些学长们(主要是某个粉红色的学长)不定期地出现说一些奇怪的话……科普一些奇奇怪怪的知识0.0……一开始也许会觉得有点难以理解,但其实仔细看还是可以明白哒。

这份文档就是对群里各种神出鬼没的学术(大雾)话题的总结辣,觉得错过了群聊的或者后来的小伙伴萌可以参考一下哟~有问题的话可以随时在群里提出。

基础普及向为主^ ^主要是群聊时提到过的内容,不作系统性的讲解。一些不作解释的概念会标粗,需要大家自己去查~

欢迎校错。

粗体字自己去查!粗体字自己去查!粗体字自己去查!重要的事情说三遍。

查不到再问。

##1 正确的学习姿势 ###1.1 !!!实践 计算机是实践的科学,动手去做是非常紧要的事情,看到代码去跑一跑,有运算就算一算^ ^

###1.2 搜索 在学习的过程中,大家会不停地看到新名词,也会遇到绕不过去的地方,因而自学的能力非常重要,需要善于使用搜索引擎,寻找自己需要的信息。编程方向的知识,网络上有大量的资源。

但在这个过程中也要注意筛选掉一些不靠谱的东西,比如一些比较陈旧的文章,有可能并不起作用。一般来说比较新的、英文的文档会更加靠谱(所以要好好学英语哦)。能够使用Google的话尽量使用Google(需要科学上网:翻墙)。 ###1.3 科学上网 由于墙的存在,会导致我们无法或者比较难以使用一些墙外的资源,因此最好是学会翻墙。翻墙有很多种途径,使用代理如shadowsocks(需要VPS),或使用VPN等,具体可以自己查找网上的教程。 VPS是虚拟服务器,注意VPN是搭设在其上的一种服务。 ###1.4 MOOC 大型开放式网络课程,即MOOC(massive open online courses).许多学校都在网上开设了网络学习平台,或者共享了课程资源,比较出名的站点如国外的coursera、edx、udacity,国内的网易云课堂等。

浙大计算机学院的一些老师在网上开设了相关课程,例如翁恺(即学长们所说的fm,这是他的昵称)的C程序设计等,很受欢迎。 ###1.5 一些提到的常用站点 Stackoverflow:一个在线编程问答社区,很多既有的问题都可以在上面搜索到,如果查不到也可以自己提问。全英文。

Github:一个代码托管平台,在上面可以找到各种开源的项目和其他人的代码。全英文。 ##2 编译器、编辑器和IDE 编译器将用某种编程语言写成的源代码(原始语言),转换成另一种编程语言(目标语言)。它主要的目的是将便于人编写,阅读,维护的高级计算机语言所写作的源代码程序,翻译为计算机能解读、运行的低阶机器语言的程序,也就是可执行文件。

程序的源代码及其配置文件通常以纯文本形式储存,因而常常用到文本编辑器编辑程序。

IDE,即集成开放环境,是辅助开发的软件,一般包括编辑器、调试器、自动建立文件的工具等,有的还包含编译器。

如C程序的开发需要安装C的编译器如GCC等,或使用包含C编译器的IDE。 ###2.1 Emacs 一个文本编辑器家族,具有强大的可扩展性。最广泛使用的两种是GNU Emacs和XEmacs。它们都使用Emacs Lisp来扩展功能。因此我们说学会Lisp就可以学会Emacs。 ##3 语言及参考书 我们提到的诸如C、C++、Java、Python等都是编程语言中的高级语言。它们是开发程序的工具。

下面主要是对我们提到过的一些语言提供简单说明,并列出学长萌提到过的参考书籍,具体的内容还请大家自己去搜索哟。

TIOBE是一个编程语言排名,反映它们的流行程度,但并不代表优劣。有时候一门语言的流行是因为被大公司采纳了。 ###3.1 C 通用的编程语言,是许多人开始编程的第一门语言。

参考书:

  • C primer plus
  • C programming language(K&R)

一般我们认为读完第一本或者有一定基础时阅读第二本比较好哦。 ###3.2 C++ 通用的编程语言,一开始作为C的加强版出现,此后不断增加新特性。 ###3.3 JAVA 一个广泛用于企业级web应用开发和移动应用开发的编程语言。也是相当通用和重要的语言。 (群主13-计科-张海是JAVA大触哦)

参考书:

  • Thinkin in Java

###3.4 Python 一种相对简单和易于理解的编程语言,被认为对新手十分友好。

参考书:

  • Learning Python
  • Programming Python

###3.5 Rust 一个今年五月发布的新语言,是系统级编程语言,被认为有相当良好的前景。

###3.6 HTML+CSS+Javascript 这三者被广泛用于编写网页,前两者都不是实际上的编程语言。

HTML即超文本标记语言,规定文档的结构,并在一定程度上描述其外观和语义(通俗地说,它指出了页面中哪里是标题,哪里是段落,等等的结构信息);

CSS即层叠样式表,为结构化的文档添加样式(例如颜色、字号等);

JavaScript是一种广泛用于浏览器客户端脚本语言,给HTML网页增加动态功能,现在也可以用在网络服务器,如Node.js(注意:它跟Java其实没有什么关系,类似于雷锋跟雷锋塔吧)。 ###3.7 Haskell 一门标准化的、通用的纯函数编程语言。 ###3.8 Lisp 一个电脑编程语言家族,第一个函数式编程语言。它有许多方言,例如我们提到过的SchemeClojure,都是它的主要现代版本之一。 ####3.8.1 Scheme 遵循极简主义哲学。著名的教材《计算机程序的构造和解释》(SICP)利用Scheme来解释程序设计。MIT等曾使用它教授计算机科学的入门课。

经典的、被称为最好的计算机科学教科书之一的是《计算机程序的构造和解释》。

另外还有一些用于铺垫的入门系教材(有的可能还没有翻译完)如:

####3.8.2 Clojure 也是一种简单的Lisp方言。 我们可以提供一些简单的范例。

(defn addOne [x] (+ 1 x))
  • 在这段代码中,defn表示定义(一个函数),addOne就是这个函数的名字,它的参数在[ ]中,是x,它的返回值在( )里,是+ 1 x,+1 x在这里就是1+x,只是把运算符前置了;
  • 定义这个函数后,在Clojure中输入(addOne 3),即调用这个函数,并传入参数3,会得到返回值4.(不要忘了函数外面的括号哦)

(do prog1 prog2 prog3)

  • 这是在Clojure里顺次执行多条语句的方法。

###3. 9 Scala 一门有着复杂的类型的函数式编程语言。运行于JAVA平台。目前被twitter、coursera、瑞银集团、wattzon等采纳。

然后这里有一个参考教程: X分钟速成Y

##4 编程方法 ###4.1 递归 一个常用的概念,指在函数的定义中使用函数自身的方法。递归指由一种(或多种)简单的基本情况定义的一类对象或方法,并规定其他所有情况都能被还原为其基本情况。

典型如斐波那契数列:

F(0)=0;
F(1)=1; /****以上是初始值****/
F(n)=F(n-1)+F(n-2).(n>=2)/****这一部分就是递归定义****/

再比如阶乘:

0!=1;
1!=1/****以上为初始值****/
n!=n*(n-1)!(n>=2)./****递归定义****/

然后,让我们用Clojure来实现一个简单的阶乘:

(defn factorial [x] (if (< x 2) 1 (* x (factorial (- x 1)))))

我们可以先把它格式化:

(defn factorial [x] 
	(if (< x 2) 
		1 
		(* x (factorial (- x 1)))
	)
)

这是一个函数的定义,来观察这个函数:

  • 最外面一层,是函数的定义(defn factorial [ ] ( )),在这里,x是参数,而if (< x 2) 1 (* x (factorial (- x 1)))这一部分则是返回值;
  • 返回值部分,是一个条件判断:
    • if (< x 2) 1表示当x < 2,这一部分的运算结果是1,则返回值为1;
    • (* x (factorial (- x 1)))表示当不满足条件x < 2即x >=2时的情况,这时返回值即运算结果是x*(factorial (- x 1)),需要调用factorial自身,实现了一个递归;
    • 翻译成数学语言就是,我们首先设当x < 2时,f(x)=1,当x >= 2时,f(x)=x*f(x-1),这就是一个递归。

我们还可以看看Haskell:

myProduct :: [Int] -> Int
myProduct (x:xs) = x * (product xs)
myProduct [] = 1

这也是一段函数的定义。

  • 第一行:::表示下面要定义的函数类型,[Int]是整数列表,Int是整数,->类似映射。在这里,myProduct就是一个函数,整行代码表示这个函数表示接收一个整数列表,给出一个整数。 第二、三行是它的规则,给出的整数由这些规则决定。
  • 第二行: (x:xs)里,x表示一个整数,xs表示整数列表,它的意思是把x加到xs前面形成一个新的整数列表;而后面的(product xs)则表示对xs求乘积;第二行的意思是,如果一个列表可以分解为[a,b,…],那么它的乘积等于a*([b,…])的乘积。这里也是一个递归定义。
  • 第三行:空列表的乘积为1。
  • 然后调用这个函数如myProduct [3,2,1],就可以得到3,2,1的乘积6。 ##5 位运算 ###5.1 基本概念:bit和byte Bit:位,即二进制位,指二进制中的一位,是信息的最小单位。

Byte:字节,计算机信息计量单位,不分数据类型;八位为一字节。

Bit可缩写为b,Byte可缩写为B。 ###5.2 计算机中数的表示 ####5.2.1 无符号数 首先大家都知道十进制和二进制的转换规则(忘了的快去查),将一个十进制数3转为二进制,则3=11(2^1+2^0)。

在一般的计算机系统里,一个类型的数字是定长的。假如某个系统规定某一类型的数的长度为8位,那么我们就用0补齐位数,则3=00000011。

但这只适用于无符号数。 ####5.2.2 负数 #####第一位表示正负 为了区分正数和负数,我们规定第一位表示正负,0为正,1为负。那么,3=00000011,-3=10000011。

但是在这种情况下,正负数相加会产生问题,例如:00000011+10000011=10000110,转化为十进制是-6,而实际上,在十进制系统里,3+-3=0。 #####能够参与位运算的二进制负数的表示 由于这个系统是8位的,因此9位的100000000实际上在这个系统里等于00000000。

所以我们可以这样假设:

如果(十进制下)a+b=0,为了使得八位二进制的a+b=00000000,我们先把a、b放到九位二进制系统下,使得二进制的a+b'=100000000,即(十进制下)a+b'=2^8;那么当我们回到八位二进制的系统,b'在运算中就能够形同一个负数参与运算。

举例:

00001111=15;
11110000=15*2^4=240(左移一位相当于十进制数乘以2);
11110001=241;

于是15+241=256=2^8;00001111+11110001=10000000=(8位)00000000。

这样,在实际的运算中,我们就可以假装11110001=241=-15。 ####5.3.3 取值范围 那么,在这个系统下11111111=-1(因为11111111+00000001=00000000);所以11111111不是最大数,01111111=127才是最大数。 最小的则是10000000,因为10000000+10000000=100000000=(8位)00000000;在当前这种表示方法下,10000000=-128。

在原先的简单系统中,8位能够表示2^8=256个不同的数,即0255;而在这个系统中,它的范围变成了-128127。

为了避免混淆,在实际应用中会加以区分,如C语言中默认使用后一种方式表示整型数字int,如果要使用前一种方式,就是unsigned int。

温馨提醒:可以查查看计算机中符号数的三种表示方法,原码、反码和补码。上述可以认为是补码的推导过程。 ###5.4 逻辑运算 逻辑运算可以联想到真假命题判断,我们假设1为真,0为假。

逻辑运算是逐位运算(一位一位看)。 ####5.4.1 not not的表示是~;~1=0,~0=1。

例如: 3=00000011,那么~3=11111100。 ####5.4.2 and 即“与”;and的表示是&;1&1=1,0&0=0,0&1=0。

0&1=0就是假且真=假。

例如: 3&3=00000011&00000011=00000011;

3&4=00000011&00000100=00000000 ####5.4.3 or 即“或”;or的表示是|;1 | 1=1,1 | 0=1,0 | 0=0。 ####5.4.4 xor 即“异或”;xor的表示是^;1^1=0,0^0=0,1^0=1,0^1=1。

例如: 3^4=00000011^00000100=000000111 ###5.5 移位运算 <<

  • 左移;a<<b,就是把a朝左移动b位,剩下的用0补齐;
  • 例如:3<<5 3=00000011,3<<5=01100000

<<和>>原理类似 ,>>是右移。

例:

00000001=1
1<<5=00100000=32
1>>5=00000000=0
00000010=2
2<<1=000000100=4
2>>1=000000001=1

观察可得,向左移动n位就是乘2的n次,向右移动n位就是除2的n次。

此外,是带余除法。

##6 软件 ###6.1 浏览器 Chrome和Firefox拥有比较健壮的开发者工具,对于对网站开发感兴趣的同学比较有用。此外,相对IE,它们对HTML、JavaScript等的新标准、新特性支持较好,能够比较优雅地显示网页,也较为安全。Chrome还有着十分丰富的扩展。

使用了新技术的网站可能会不支持IE8以下的版本。

一些“国产”浏览器如360、腾讯等,一般是使用了IE的内核(或者双核),总体上也是比较陈旧的。 ###6.2 Putty PuTTY是一个Telnet、SSH、rlogin、纯TCP以及串行接口连接软件。(这些名词自己查^ ^)主要用于Windows平台。 ##7 笔记本 ###7.1 系统 如果你的专业需要大量编程,Windows平台可能不是一个好的开发环境。可以另装Linux,一般新手入门的如Ubuntu(自己玩推荐装比较新的版本如15.04,不要中国版的麒麟),但毫无Linux经验者,可以先尝试在虚拟机内使用。也可以直接购买Macbook,它自带的OS X很不错,省去了很多麻烦。

  • UNIX痛恨者手册:用惯了UNIX系统的人对它的吐槽合辑。

##8.其他一些奇怪的东西 ###8.1王垠的40行代码 据说是学长想要学通的东西(啊窝暂时是没有办法看懂……)。他的目标是:搞清楚Scheme的语法;读懂垠40行;搞清楚的Clojure的语法;把垠40行翻译成Clojure。

这段代码主要干了两件事:一个是CPS,即自动尾递归;另一个是用Scheme语言写了一个Scheme的解释器。

关于王垠以及他的这40行代码,还有CPS是什么……可能理解起来会有一些困难,可参阅:

知乎:王垠的「40 行代码」真如他说的那么厉害吗? ###8.2Matrix67 一个文科生、科普作家、程序员和数学爱好者,也是一个争议人物。欢迎详查。 知乎问题,仅供参考:

###8.3 antlr 用JAVA编写的基于LL算法实现的语法解析器生成器。

##9. 下期预告:

  • Haskell递归求素数列表
  • 正则表达式
  • JDK的安装与环境变量设置
  • Clojure的安装与基本使用