CS50笔记 第八集
——哈佛大学CS50《计算机导论》课程(2019) 学习平台:哔哩哔哩
目录
CS50笔记 第八集
(一)第一集 引言
1.什么是计算机科学?
2.如何表示input和output?
3.如何从input到output?
4.如何开始运行?
5.一些概念
(二)第二集 C语言
1.如何使用C语言平替scratch语言的格式?
2.C语言如何运行程序?
3.一些概念
(三)第三集 代码原理与优化
1.汇编底层原理是什么?
2.如何调试代码错误?
3.如何优化代码?
(四)第四集 算法
1.算法的种类有哪些?
2.如何描述算法?
3.如何用编程实现算法?
(五)第五集 内存与指针
1.内存地址怎么表示?
2.内存地址(指针)有什么用?
(六)第六集 数据结构
1.数据结构有那些?
2.数据结构能解决哪些问题?
(七)第七集 python
1.python语法是怎样的?
2.python有什么用?
3.python有何独特之处?
二、SQL(Structured Query Language 结构化查询语言)
(一)SQL基础
1..csv文件
2.sqlite3库
(二)关系型数据库(relational databases)
1.C\R\U\D
2.SQL数据类型
3.SQL特有语法实践
(三)数据处理
1.数据下载
2.数据提取
(1)用python提取数据
(2)用SQL提取数据
①格式转换
②提取数据
三、CS50听课感想
(一)第一集 引言
1.什么是计算机科学?
计算机科学是指:解决问题的过程;input→〖一系列计算〗→output
2.如何表示input和output?
用二进制(0/1)表示input和output,二进制可以表示数字、文字、图片、视频、音乐
3.如何从input到output?
用算法实现从input到output,算法有优劣
4.如何开始运行?
通过伪代码翻译算法后运行
5.一些概念
函数、条件、布尔表达式、循环、变量、线程、事件、编程语言(C、Python、Scratch)
(二)第二集 C语言
1.如何使用C语言平替scratch语言的格式?
C语言可以获取输入内容、设置变量、使用if······else······条件、使用while循环、for循环
2.C语言如何运行程序?
(1)思路:input→〖一系列计算〗→output源代码→〖编译〗→机器代码
(2)工具:
源代码编辑器:VScode、CS50 IDE等
编译器:MingW64
编译指令:Clang、ls、rm、mkdir、rmdir、pwd(显示处于哪个目录下)
3.一些概念
数值类型:bool、char、double、float、int、long、string
占位符:%c、%f、%i、%li、%s
数字溢出
(三)第三集 代码原理与优化
1.汇编底层原理是什么?
预处理、编译、组装、链接
2.如何调试代码错误?
help50、 printf 、断点调试debug50、check50、style50
3.如何优化代码?
用数组、字符串、命令行参数优化
PS:main函数的输入与返回值,文件名称存储于argv[0]中,第一个输入存储在为argv[1]
(四)第四集 算法
1.算法的种类有哪些?
线性搜索、二进制搜索
2.如何描述算法?
O:最差解;Ω:最优解;θ:最优解与最差解相同的算法
3.如何用编程实现算法?
(1)线性搜索
自己定义数据类型(typedef、struct)
(2)二进制搜索
冒泡排序、选择排序、递归与合并排序
(五)第五集 内存与指针
1.内存地址怎么表示?
用16进制(0x)表示指针(计算机内存中的地址),(用数据类型+*来表示)
&:地址是什么
*:前往地址
2.内存地址(指针)有什么用?
(1)string 的底层原理与指针关联
①string 的底层原理原理
没有string s="EMMA";只有char *s="EMMA";这表示存储emma首字母e的地址
使用malloc分配空间,进行字符的复制;使用free释放内存,结果不受影响
将输入传给函数时,实际传递的是值的副本;副本被称为a,b;所以swap函数交换了a,b;没有交换x,y
分配内存自上而下,堆栈(调用函数)自下而上
缓冲区溢出
heap overflow:堆溢出(malloc分配空间太多)
stack overflow:堆栈溢出(调用函数太多)
②指针替换get_string
选择传递地址而不是变量给scanf的原因与swap()函数是一样的,如果只传递值,那么只会得到一个副本
NULL表示没有指针,也就是说,实际上,没有给要输入的值分配任何内存,需要给自己分配一个数组,并传递到函数
string = char *,字符串string=字符数组;所以:char * =字符数组,即:指针=数组
(2)文件的读写(文件指针)
.csv格式属于用逗号分隔值的简单电子表格格式
(3)检查文件名是否通过
(六)第六集 数据结构
可以利用sizeof分配int、float等的内存;每次分配内存之后,都必须要检查是否已经正确分配内存
1.数据结构有那些?
(1)数组(arrays)
数组必须预先声明大小;如果没有事先知道并分配好内存,或者想要临时增加内存,用数组会很麻烦:重新分配内存+复制或使用realloc重新分配内存;移动一个数组,需要O(n)的时间
PS:malloc位于stdlib.h文件中
(2)链表(linked lists)
链表只是一个包含多个内存块的数据结构以某种方式联系在一起:使用2个内存空间,一个存储值,一个存储第二个值的地址;NULL是一个指针,只是底层全是0
sruct node * :指向节点node结构的指针
数字的下面,是一个指针,这个指针将指向第二个指针(地址),而不是就是第二个数组的地址(指针)本身,也就是说:数字的下面,是存储的是节点的地址
typedef:更改结构体的名称,并没有创造新的结构
如:typedef char * string:将char * 重命名为string
struct:创建新的结构体
断开链接及插入节点后再次链接需要拥有一个临时指针tmp
插入1节点,必须先链接1和2,而不是list和1,因为这样才不会丢失2-4-5这三个节点
链表无法直观地看到存储的值,所以链表失去了随机访问的权限;在链表中插入和搜索,时间复杂度都是O(n)
(3)二叉搜索树(binary search trees)
通过树搜索的时间复杂度为
(4)哈希表(hash tables)
哈希值的时间复杂度需要与空间复杂度衡量考虑,如果使用大量空间,最终可以实现O(1),但是这样明显得不偿失;最合适的,应该是O(n)
(5)检索(tries)
遵循花费一种资源,节省另外一种资源的模式;它是一棵树,每个节点本质上都是一个数组
完全牺牲空间去存储值,tries搜索和插入的时间是恒定的,时间的复杂度是O(k),k是一个常数,即实际可以使用O(1)表示
2.数据结构能解决哪些问题?
(1)队列(queues)
先进先出的FIFO数据结构
enqueue:入队
dequeue:出队
后进先出的LIFO数据结构
堆栈
推push:将元素推入堆栈
弹出pop:删除顶部元素
(2)字典(dictionaries)
(七)第七集 python
1.python语法是怎样的?
用python实现输入、设置变量、if……elif……else……条件、while循环、for循环与range()函数
python的说明文档http://docs.python.orghttp://docs.python.org/
2.python有什么用?
python可以用简洁的代码处理复杂的事情,但相对于C语言来说,它所需的时间要更多
and 替代&&、or替代|| 使用数组
定义函数及参数输入:命名参数设置
input代替get_string:
input:只能代替get_string,也就是说,它返回的永远是一个字符串,如果想要整数等其他类型,需要强制转换数据类型
3.python有何独特之处?
正则表达式(regular expressions)
. 任何字符
.* 0个或多个字符
.+ 1个或多个字符
? 可选内容
^ 开始输入
$ 结束输入
re.search、|表示或、?表示可选择内容、lower()或IGNORECASE强制转换大小写;^$固定头尾
二、SQL(Structured Query Language 结构化查询语言)
(一)SQL基础
1..csv文件
注意这里没有调用f函数,只是传递它的名称
2.sqlite3库
(二)关系型数据库(relational databases)
1.C\R\U\D
CREATE(创建)
READ(读取)
UPDATE(更新)
DELETE(删除)
映射关键字
insert(增加)
select(选择)
update(更新)
delete(删除)
2.SQL数据类型
①BLOB:二进制
②INTEGER(整数)
smallint
integer:32bits
bigint:64bits
③NUMERIC:数字类
boolean
date
datetime
numeric(scale,precision)
time
timestamp
④REAL:类似于浮点数
real:实数,32bits
double precision:双精度,64bits
⑤TEXT:文本
char(n)
varchar(n)
text
3.SQL特有语法实践
CREAT TABLE table(column type, ...); //创建表格
INSERT INTO table (colum, …) VALUES(value, …); //添加数据到表格
SELECT colums FROM table WHERE condition; //选择满足条件的数据
UPDATE table SET column=value WHERE condition; //满足条件时,更新表格列名
DELETE FROM table WHERE condition; //满足条件时,删除数据
DROP TABLE favorites; //删除整个表格
函数:
AVG //平均数
COUNT //统计计数
DISTINCT //去重
MAX //最大
MIN /最小
……
WHERE :当,后面加条件
LIKE :像,模糊取值,后面有%%,属于通配符相当于搜索一切带有%%中间词的词
LIMIT:取值范围限定,后面跟数字(如取10个,就是LIMIT 10)
GROUP BY :组织
ORDER BY:排序
JOIN
ORDER BY:排序
(三)数据处理
1.数据下载
IMDB说明链接https://developer.imdb.com/non-commercial-datasets/
IMDB数据下载链接https://datasets.imdbws.com/
2.数据提取
(1)用python提取数据
(2)用SQL提取数据
①格式转换
②提取数据
PRIMARY KRY:主键
FOREIGN KEY:外键
UNIQUE:唯一键
INDEX:索引
BEGIN TRANSACTION
COMMIT
ROLLBACK
三、CS50听课感想
1.这简直是天书,整堂课听得我那叫一个昏昏欲睡,尤其是道最后讲用户不配合输入那里,开始完全更不上了
2.没什么基础直接听英文版的果然还是太过勉强了一些,不过无妨,这个课主要用来训练一下思维即可,最开始的几门课对人的思维影响往往是最深刻的,所以哪怕花费了大量的时间去学习也未可厚非,反正现在,我唯一拥有的资源就是时间!
3.累计疑惑:
①Unsigned和fread()函数用法
②链表的指针实现:list->next = m;list->next->next = x;
③循环打印列表的自增:tmp=tmp->next
④链表内存的释放:
while(list !=NULL) { node *tmp =list->next; free(list); list = tmp; }⑤传递函数名称与调用函数有什么不同?
⑥怎么强制转换list类型为int?
⑦SQL如何实现:凡是逗号分隔就用多行显示的效果?
⑧用户不配合输入的原因和解决方法是什么?