CS50 C

演讲思路

二进制代码是机器唯一能理解的语言。

我们人来对计算机的唯一输入就是电:有电或者没电,0,1

计算机从这些简单的输入到运算出最后的答案,经过的就是算法的处理。

如上节课的查找电话号码(一种伪代码),你一步步按这个指示来,就能找到最后的答案。

以下是主持人听观众的指令(演示算法命令)来吃早饭
1:打开面包的包装袋
2:把面包拿出来
3:撕成一片一片
4:拧开果酱盖
5:把盖子放在一边
6:拿起刀子
。。。。。。

上节课,我们运用scratch图像化编程语言(里面MIT为你做了许多模块,你只需要去组装他们,就能实现一个个图片,动画。。,比如咳嗽,你可以控制咳嗽几下,而不用明白是如何让他咳嗽的),但它只适用于绝大部分青少年儿童。而今天我们介绍一种基于文本,更古老,更晦涩, 更强大的语言

---C。

c语言举例
#include<stdio.h>
int main(void)
{
	printf("hello world!");
	return 0;
}

刚开始学c的时候,你可能因为一些句法结构(没有分号,括号放错位置)而沮丧,其实这些可以不用过度纠结,程序原理才是最重要的(不同计算机语言语法可能不同,但只是换个方法向计算机表达相同的意思罢了)。

如:

  • scratch的say就是c的printf()

  • scratch的 set counter to 0可以告诉couter是变量,而在c中可以直接写counter = 0;但此时必须要在前写个int,告诉计算机你要储存什么类型的数据。

  • scratch和c的条件(condition):

CS50  C

在c中给计算机的指令要更加具体,如使它的光标移动到下一行,必须使用‘\n’。(这也说明,和计算机的交流并不只是一个个模块,而是要更加明确的指令)

并且其实c语言的代码风格,换行,前面的空格 和为什么不把所有的代码写在同一行,这些仅仅是为了方便人类阅读。

  • 更复杂的条件语句:

CS50  C

其中我们发现,c语言的等于里有两个等于号,原因是为了区分与赋值的区别。还有,这个程序其实可以优化,在第三个条件可以直接些else,这样可以节省计算机判断一个条件的时间。

  • 循环语句(loop):

CS50  C

while后加(),只要括号里面的判断语句是对的(true or 1),则可以执行循环。而我们可以在while语句添加变量(variable)利用它的值会变化的特性,使这个循环语句按照自己的意愿进行循环。

  • 读入用户的输入

CS50  C

此程序可以读入用户的输入。下面会讲到

PS:‘\‘在编程里,被称为转义字符(escape character)。所以如果需要要展示\n给别人看,就要在前面在加一个\,告诉计算机第二个\意义特殊。

%s,%c这些是占位符,用来告诉计算机输入的变量是什么数据类型。

接下来run C语言

因为每个人都有自己的电脑,都有不同编译代码的环境,为了更好的协调管理,cs50要求所有人都在cs50 sandbox (Sandbox.CS50.io)进行操作(利用虚拟云,访问同一台服务器)。

cs50 sandbox是一款很简单的代码编辑器,可以在页面选择各种语言。只有两部分组成:操作界面和终端(Terminal)。终端是用来显示你代码运行后的最终效果的。它具有代码高亮的操作(给不同用途的代码语句不同的颜色),方便了人们的阅读。

选择c语言

CS50  C

.c是编写c语言文件的文件扩展名。

我们在操作界面输入的c语言代码(如之前的hello world),被称为--源代码(source code)。而如何把它们转化为为电脑可以读懂的机器语言(0,1)呢?这就要运用编译器。

PS:

那么我们怎么去翻译源代码呢?

在终端界面有个$一般表示提示符,我们可以在这输入命令(命令行环境),告诉编译器我们想让他做的所有事。

这是因为cs50 sandbox基于Linux操作系统,没图形化界面,里面没有任何按钮,

(为什么我们放弃了现代电脑图形化的便利呢?其实直接用指令能更具体更快速的向电脑表达我们的意思)

CS50  C

clang hello.c (clang是一个C,C++的编译器)
---此时源代码已经转换为机器语言,它被储存了在了一个文件拓展名为.out的文件里。
怎么运行.out?
输入./a.out(相当于windows的双击文件,.代表这个文件就在此文件夹内)
敲击回车,就会输出结果。
假如ut文件’而是想取个像样的名字(如hello)
clang -o hello hello.c
./hello

CS50  C

如果你想翻译源代码,还可以使用一个方便的命令,make(它是人们写的一个程序,使用clang以自动化的方式达到同样目的的输出)。
make hello(这就代替了clang -o hello hello.c)
会搜索一个文件,默认为hello.c。甚至会出现更多的配置文件(以后了解)

如果我们想在代码里加入用户的输入呢?

CS50  C

注意,这里cs50自己在sandbox写了一个库(cs50.h)这在c里面是没有的,它引用这个的原因是为了更好的入门。库里储存了各个函数的意思,只用包含了这个库,编译器才能知道你这个函数想表达什么。(如printf,这个函数储存在stdio.h里面,而向用户获取字符串--get_string和string这个定义其为字符串类型类型都不是c语言内置的,它包含在cs50里)
.h代表是一个头文件,一个包含c语言代码的文件。这些头文件储存了执行函数所需要的所有0和1

函数可以接受输入(输入被称为变量或参量),也可以返回东西。

printf
他的输入就是hello world,输出不常用到
get_string
输入:想让人看到的提示词 输出:answer

整数的例子:

CS50  C

这是另一个例子,get_int,获取整数。
接下来操作:
./int
(其实在这种Linux环境下,我们可以使用上下箭头,来切换曾经在终端使用过的命令,来做到节约时间)
浮点数的例子:

CS50  C

遮挡的代码:
float f = get_float("Float: ")
printf("hello,%f\n",f)

make float
我们发现现在计算机有了存储更高精度的能力。
简单的运算:

CS50  C

输出:
x:2
y:10
x + y =12
x - y =-8
x * y =20
x / y =0
x mod y =2
我们发现除法输出的是2.这是因为我们让计算机输出整数,是没有小数点的,计算机自动省略可小数部分。(其实%i只不过是方便cs50用户观看,在c里面,我们使用的是%d来表示整数.)
要输出小数,必须使用%f。而%f默认保留六位小数,加入我们要得到第七位,需要%.7f。
但此时要是你写了%30f,你会发现答案不是0.2000000000000000而是0.20000000001231233124(随便举个例子,告诉大家后面20位不全都是0)。这是为什么呢?

因为我们的计算机里面其实是这个

CS50  C

它是随机储存器,也叫内存。用来储存文件,音乐,视频。。。硬盘是永久储存的,但它不是。当你的电脑手机在调用某款app时都是在调用内存。打开某个文件,他会暂时存在内存里,但他永久存在硬盘里。

它只有几厘米,装下有限数量的零件和有限数量的晶体管。那么在有限的内存下如何表达数量无限的数字呢?这个时候,计算机就会选择走捷径

---计算机有个最大精度。

计算机只会精确计算一定位数的数值,超过了这个位数,就会产生误差。float一般只有32位,接下来会介绍更精确的double类型。(虽然它的精确位数更高,但代价是占用更多的处理能力,也就是更占内存。因为每次用的位数增加了)

自定义函数
#include <stdio.h>
void cough(void); 
it main()
{
	for(int i=0;i<3;i++)
	cough();
}
void cough(void)
{
	printf("cough\n");
}
//方便起见,就不复制照片了
这里我们自定义了一个函数,此函数不用返回值给main函数,所以cough前写void。在#include下面的那个是函数声明,先告诉c语言我们在下面自创了一个函数没有这句的化,会报错,因为c里面本来就没有cough这个函数。
要是我们本来就想循环三次(输出三次cough),可以不用循环语句,写成cough(3)
    自定义函数部分写成:
    void cough(int n)
{
    for(int i=0;i<n;i++)
        printf("cough\n");
}
整数上溢or下溢

假如一台计算机最多只能储存三位(十进制来看的话) ,那么最大储存数就是999,此时如果再+1,则一切都会归0.而二进制的话,最大是111,再加1,也会变0。而在我们生活中,电子产品虽然不是只有3位,但都是有容量限制的.

曾经有一款游戏,里面人能储存的最大金币数是40亿,为什么是这个值?因为这是由32位来储存的。

CS50  C

CS50  C

最后变成了一个负数(最高位决定正负),之后就一直报0.
这就是上溢

而下溢的话,0001-2后会一下子变到最大值。

CS50 C

上一篇:C#中如何在Excel工作表创建混合型图表


下一篇:Confluence 6 中样式化字体