CS50笔记 笔记整理

CS50笔记 笔记整理

——哈佛大学CS50《计算机导论》课程(2019) 学习平台:哔哩哔哩

学习大概50天了,笔记有点乱,稍微整理了一下

(一)第一集 引言

1.什么是计算机科学?

计算机科学是指:解决问题的过程;input→〖一系列计算〗→output

2.如何表示input和output?

二进制(0/1)表示input和output,二进制可以表示数字、文字、图片、视频、音乐

3.如何从input到output?

算法实现从input到output,算法有优劣

4.如何开始运行?

通过伪代码翻译算法后运行

5.一些概念

函数、条件、布尔表达式、循环、变量、线程、事件、编程语言(C、Python、Scratch)

(二)第二集 C语言

1.如何使用C语言平替scratch语言的格式?

printf:print表示打印,f表示格式,即:打印格式化文本;<stdio.h>:printf等功能的保存位置;引号、分号要注意

C语言可以获取输入内容、设置变量、使用if······else······条件、使用while循环、for循环

2.C语言如何运行程序?

(1)思路:

input→〖一系列计算〗→output源代码→〖编译〗→机器代码

(2)工具:

源代码编辑器:VScode、CS50 IDE等

编译器:MingW64

编译指令:Clang、ls、rm、mkdir、rmdir

3.一些概念

数值类型:bool、char、double、float、int、long、string

CS50提供的函数:get_char、get_double、get_float、get_int、get_long、get_string

占位符:%c、%f、%i、%li、%s

数字溢出

4.实践小妙招

①如果是在文件夹里面,编译时,需要带上文件夹的名字,用/分隔

②利用 .+数字+f 可以保留小数,保留几位数字填几

③ %是取余运算符;cd 可以转移到想要去的目录;//后面是注释

④cd 后面不加任何东西会返回最开始的目录;pwd 可以显示处于哪个目录下

⑤在终端按向上的箭头,可以复制之前输入的代码指令;字符引用采用单引号;||表示或

⑥for后面使用分号隔开,两个for循环的使用构成二维

⑦最开始的声明就是复制标题,告诉C,你见过这个函数了,可以编译了

(三)第三集 代码原理与优化

1.汇编底层原理是什么?

预处理编译组装链接

2.如何调试代码错误?

help50、 printf 、断点调试debug50、check50、style50

3.如何优化代码?

数组、字符串、命令行参数优化

PS:main函数的输入与返回值,文件名称存储于argv[0]中,第一个输入存储在为argv[1]

(四)第四集 算法

1.算法的种类有哪些?

线性搜索、二进制搜索

2.如何描述算法?

(1)O最差解

O):冒泡排序,选择排序

O):合并排序

O(n):线性搜索(linear search)

O):二进制搜索(binary search)

O(1)

(2)Ω:最优解

Ω):选择排序

Ω):合并排序

Ω(n):冒泡排序(当无交换就停止时)

Ω

Ω(1):线性搜索(linear search)、二进制搜索(binary search)

(3)θ:最优解与最差解相同的算法

):选择排序

):合并排序

(n)

(1)

3.如何用编程实现算法?

(1)线性搜索

可能失败,因为字符串不是数据类型,而是一个数组,既然是数组,就可能有多个char,在C语言中,需要比较每一个字符相同,字符串才会相同,python语言倒是可以直接比较;可以用string.h文件中的strcmp去比较字符串,两个字符串相同时,返回0

可以自己定义数据类型

关键词:typedef(定义一个类型)、struct(可以放置多种数据类型的容器)

(2)二进制搜索:二进制搜索需要先排序

①冒泡排序

遍历次数:(n-1)*(n-1)

时间:最差:O);最好:Ω(

如果规定:没有交换就停止,那么最好的是:Ω(n)

②选择排序

遍历次数:n(n+1)/2=n²/2+n/2

时间:最差:O);最好:Ω(

(3)递归与合并排序

①递归

②合并排序

分成2半的时间需要:(如上面的3行)

每次合并需要读取所有元素,即所需时间为n(如上面的8列)

时间:最差:O);最好:Ω(