程序设计入门——C语言(翁恺)
笔记来源:中国大学MOOC
# 第1周 程序设计与C语言 | ||
## 1. 计算机和编程语言 - 计算思维:理解计算机是如何解决问题。 人:what to do 计算机:how to do - 计算机语言 编程语言不是与计算机交谈,而是告诉计算机做事情得过程与方法。 计算(计算机能懂得语言及任务)——程序(人根据算法编写得计算机语言)——算法(人处理任务得方法) 计算机的思维方式:计算机最擅长得是重复 - 算法 我们要让计算机做计算,就需要找出计算的步骤,然后用编程语言写出来计算机做的所有的事情都叫做计算。 - 程序的执行 解释:借助一个程序,那个程序能试图理解你的程序,然后按照你的要求执行 编译:借助一个程序,就像一个翻译,把你的程序翻译成计算机真正能懂的语言——机器语言——写的程序,然后,这个机器语言写的程序就能直接执行了。 程序执行方式:解释语言 vs. 编译型语言* - 语言本身无编译/解释之分 - 常用的执行方式而已 - 解释型语言有特殊的计算能力 - 编译型语言有确定的运算性能 | ||
- 常见问题 Q:编译执行与解释执行 有的编程语言,源代码经过编译后形成目标代码,但是这样的目标代码不能直接在CPU上执行,而是需要由一个仿真器程序来解释执行。这样的执行方式是编译的还是解释的? A1: 语言本身没有解释/编译之分,我们不能说它是编译型语言或者解释型语言,只是编译或者解释是我们常用的方式。如Java是需要编译的,但是没有直接编译成机器语言,而是编译成字节码,然后在Java虚拟机上用解释的方式执行字节码,Python也是使用了类似的方式。 A2: 任何一种程序都没有绝对的类型,此处是先编译后解释。 A3: 有人认为我们不能将一种编程语言绝对化,比如C语言,不能就说他是编译型语言,也有人曾经做过C语言的解释器,这样C语言就可以解释运行。同理,也有人做过python的编译器。只是我们平时比较常用某种方式而已。老师题目中说的情况让我想起了Java语言。Java语言是先通过javac.exe进行编译,编译后生成一个.class的文件,但是计算机不能直接执行.class文件,所以需要用java命令调用Java虚拟机JVM(题中的仿真程序)来解释执行。而我们都知道,Java被大家称作解释型语言,所以我觉得这道题的语言是解释型语言,执行方式是先编译后解释。另外,我认为编译型语言更多倾向于将高级语言直接编译成二进制可执行文件的语言,比如C语言。 | ||
- 知识拓展 - 计算机语言分类: 机器语言:计算机执行的二进制命令,都是0和1表示的 汇编语言:用助记符代替机器指令的操作码(如:ADD表示加法) 高级语言:更简单,符合人们的习惯,也更容易理解和修改。高级语言经过编译器编译之后可以得到目标程序。(如:C++、JAVA) - 机器语言、汇编语言、高级语言的区别: 依次接近人类自然语言的表达方式、代码效率依次变低、语言越来越高级 - 机器语言、汇编语言、高级语言的联系: 高级语言要通过编译程序翻译成汇编代码,汇编语言要通过汇编得到机器语言,计算机才能执行。 | ||
## 2. C语言 - 为什么是C?
在操作系统和嵌入式等领域的应用很难被其它语言替代。 -
现代的编程语言在语法上的差异很小 几乎都是C-like语言
语言的能力/适用领域主要是由 库和 传统所决定的 it was the summer of 69 -
C语言 -
C语言是从B语言发展而来的,B语言是从BCPL发展而来的,BCPL是从FORTRAN发展而来的
- BCPL和B都支持指针间接方式,所以C也支持了 -
C语言还受到了PL/I的影响,还和PDP-I1的机器语言有很大的关系 -
1973年3月,第三版的Unix上出现了C语言的编译器 -
1973年11月,第四版的Unix(System
Four)发布了这个版本是完全用C语言重新写的 - C的发展与版本-K & R -
经典C - 又被叫做“K & R the C” - The C Programming Language,by Brian
Kernighan and Dennis Ritchie,2nd Edition,Prentice Hall -
C的发展与版本-标准 - 1989年ANSI发布了一个标准——ANSI C -
1990年ISO接受了ANSI的标准——C89 -
C的标准在1995年和1999年两次更新——C95和C99 - 所有的当代编译器都支持C99了
- C语言用在哪里? - 操作系统 - 嵌入式系统 - 驱动程序 - 底层驱动 -
图形引擎、图像处理、声音、效果 - C语言是一种工业语言 -
开发效率>>学习过程 开发效率>>开发乐趣
日常应用很少直接用C语言编写 学习C的过程主要是写练习代码 而非真实软件 -
编译 → 运行 - 编辑器 + 编译器 / IDE(集成开发环境) - 编程软件 -
推荐的编程软件——Dev
C++ - 免费、安装简单、不用建工程 - 其他选择 - MS Visual Studio
Express(Windows) - Xcode(Mac OS X) - Eclipse-CDT -
Geany(和MinGW一起) - Sublime(和MinGW-起) - vim/emacs(和MinGW-起) -
Visual C++、Turbo
C和DEV-C++都是C语言的IDE,即集成开发环境,没什么实质上的区别,只是开发商不一样,UI界面不一样。
- GCC(GNU Compiler
Collection,GNU编译器套件)是由GNU开发的编程语言译器。GNU编译器套件包括C、C++、Objective-C、Fortran、Java、Ada和Go语言前端,也包括了这些语言的库(如libstdc++++,libgcj等。)
- 采用VS code软件进行C语言编程 - VS Code是轻量级文本编辑器 -
安装Microsoft C / C ++扩展,相当于C语言的编辑器,C / C ++扩展不包括C
++编译器或调试器。“扩展C/C++”可以做语法的高亮,认识C语言的一些语法。 -
安装C语言的编译器,MinGW。MinGW,是Minimalist GNU for Windows的缩写。 -
安装code runner扩展,运行代码。 - C语言编译器发展历史 - "UNIX is simple
and coherent, but it takes a genius (or at any rate, a programmer) to
understand and appreciate its simplicity."-Dennis Ritchie
Unix是20世纪70年代初出现的一个操作系统,除了作为网络操作系统之外,还可以作为单机操作系统使用。Unix作为一种开发平台和台式操作系统获得了广泛使用,主要用于工程应用和科学计算等领域。
- C语言是和UNIX一起成长起来的。Edition 3 introduced the
C Programming Language, in February of 1973. - Edition 4,
973. - C was derived from B which was derived from BCPL, which
was derived from FORTRAN. - Both BCPL and B (and therefore C) contained
the notion of pointer indirection. - In November of 1973, the fourth
edition (System Four) was released, and Unix itself was rewritten
entirely in C, thus making the operating system highly portable to new
machine hardware. - The C. - The C programming language
was designed by Dennis Ritchie at Bell Laboratories in the early 1970s.
- Traditionally used for systems programming, though this may be
changing in favor of C++. - Traditional C: - The C Programming Language,
by Brian Kernighan and Dennis Ritchie, 2nd Edition, Prentice Hall -
Referred to as K&R -
CC编译器(UNIX机器自带的)→GCC(新兴的在UNIX,90年代在LINUX)→MSVC(DOS上,微软的,后面VC
6和VS 20xx都是微软的cc,但GCC更强大) - GCC的发展![]() ![]() ![]() |
||
## 3. 第一个程序 | ||
- 初学C的困惑 - 用什么软件好? -
选择太多有时候是个麻烦 - 当代语言往往只有一个编程软件可用 - 那就Dev C++
5.6.3吧 - 第一个程序
|
||
1. C语言运行时出现黑黑的窗口:命令行、终端、控制台。 2. .c文件一定要保存再编译执行 | ||
- 程序框架
|
||
- 做计算
|
||
- 格式化输入函数
|
||
- scanf()函数是从标准输入流stdio中读取内容的通用子程序,可以读入全部固有类型的数据并自动转换成机内形式。简单来说就是格式化输入函数,一般是从标准输入设备(即键盘) 读取输入的信息。 | ||
- scanf函数的基本格式:scanf(“格式符”,输入参数) | ||
- scanf注意事项: | ||
1. 在scanf 的“输入参数”中,变量前面的取地址符&不要忘记。 | ||
2. scanf 中双引号内,除了“输入控制符”外什么都不要写。 | ||
3. “输出控制符”和“输出参数”无论在“顺序上”还是在“个数上”一定要一一对应。 | ||
4. “输入控制符”的类型和变量所定义的类型一定要一致。对于从键盘输入的数据的类 型,数据是用户输入的,程序员是无法决定的,所以在写程序时要考虑容错处理。 | ||
5. 使用scanf之前先用printf提示输入。 | ||
- VS Code中文输出乱码 系统的区域设置里面的全球语言支持。 参考:VS code(Visual Studio Code)乱码解决 | ||
- VS Code单个.c文件和多个.c文件(多文件的管理能力) - VS Code里面多文件的管理叫workspace,中文叫工作区。 - 一个工程中有多个.c文件,方法一可以运行所有文件;方法二makefile。 |
第2周 计算
1. 变量
- 变量:一个保存数据的地方,当我们需要在程序里保存数据时,就需要一个变量来保存它。
- 赋值和初始化:在C语言中区别不大,在C++中区别较大。C语言中并没有强制要求所有变量都在定义的地方做初始化,但是所有的变量在第一次被使用(出现在赋值运算符的右边)之前应该被赋值一次。每一个变量单独赋值。
- 变量类型:C是一种有类型的语言,所有的变量在使用之前必须定义或声明,所有的变量必须具有确定的数据类型。C99可以边定义变量边计算,而ANSI C只能在代码开头的地方定义变量。
- 读整数:scanf();printf()输出
- 常量:定义常量的目的是可以通过定义名知道数字所代表的含义。直接写在程序里的数字我们称为直接量(literal)。定义常量的好处,容易知道常量的意义,另外容易修改。 ## 2. 数据类型 int double
3. 表达式

C语言,赋值运算符,赋值也是运算,也有结果。即“=”也是运算符。 嵌入式赋值,可读性不好。
复合赋值:“+=”;“*=”;“/=”;
递增递减运算符: a++ a+= a=a+1
a++原来的值
++a以后的值 可以单独使用,但不建议组合使用
运算符 算子 单目运算符 双目运算符
4. 在线评判系统
第3周 判断与循环
判断
一个基本的if语句由一个关键字if开头,跟上在括号里的一个表示条件的逻辑表达式,然后是一对大括号“{}”之间的若干条语句。如果表示条件的逻辑表达式的结果为true,那么就执行后面跟着的这对大括号中的语句,否则就跳过这些语句不执行,而继续下面的其他语句。
强调if和else后面要用{},如果不用,只能跟单句。
C语言提供了六个关系运算符: 1
2
3
4
5
6== 相等
!= 不相等
> 大于
>= 大于或等于
< 小于
<= 小于或等于
“== 相等”和“!= 不相等”的优先级比其他低。
注释comment 单行注释//,C99代码独有的 多行注释/* */
流程图
循环
if语句可以判断条件是否满足,满足时才做相应的动作,而循环语句可以在满足条件时,不断地重复执行一些动作。
重复执行的语句(循环语句)可以多次执行其他语句,它检查一个逻辑条件是否满足,只在满足的时候执行它的循环体。
while语句是一个循环语句,它会首先判断一个条件是否满足,如果条件满足,则执行后面紧跟着的语句或语句括号,然后再次判断条件是否满足,如果条件满足则再次执行,直到条件不满足为止。后面紧跟的语句或语句括号,就是循环体。
do-while循环和while循环很像,唯一的区别是我们在循环体执行结束的时候才来判断条件。也就是说,无论如何,循环都会执行至少一遍,然后再来判断条件。与while循环相同的是,条件满足时执行循环,条件不满足时结束循环。
计算机描述的是步骤,不是关系也不是说明。
调试过程,可以在程序中间加入printf()函数进行验证。 1
for (初始条件;循环条件;循环每一轮要做的事情) {循环体}
for循环像一个计数循环:设定一个计数器,初始化它,然后在计数器到达某值之前,重复执行循环体,而每执行一轮循环,计数器值以一定步进进行调整。
for(count=10;count>0;count--) 就读成:“对于一开始的count=10,当count>0时,重复做循环体,每一轮循环在做完循环体内语句后,使得count--。”
如果有固定次数,用for 如果必须执行一次,用do_while 其他情况用while
第4周 进一步的判断与循环
逻辑类型 bool 1
逻辑运算
单目运算的优先级高于双目运算的优先级
短路:逻辑与运算,如果前面的条件不满足,后面的条件将不会执行。不建议将赋值或复合赋值组合进逻辑运算的表达式。
条件运算 1
count = (count >20) ? count -10 : count +10; //条件,条件满足时的值和条件不满足时的值。等价于“if () {} else {}”,是编程语言早期留下来的格式,太过复杂,特别是在嵌套的时候。
由于语言会出现级联和嵌套,语句复杂了就比较难判断,所以建议:在if或else后面总是用{},即使只有一条语句时。
级联if else:逐条运算,计算时间久
多路分支 switch case:根据条件选择,case是入口,break是出口。而且控制表达式需要是整数型。
难的是把问题转化为程序。 计数循环
算平均数:变量→算法→流程图→程序
猜数游戏
随机数:rand()
整数的分解:整数%10得到个位数;/10去掉个位数;(/10)%10得到原来的十位数。
判断和循环常见错误: if的{},形成代码块。 if后面没有; if ()里面=和== 代码风格