本系列博客用于记录学习浙江大学翁恺老师的C语言程序设计,系列笔记链接如下:
C语言程序设计学习笔记:P1-程序设计与C语言
C语言程序设计学习笔记:P2-计算
C语言程序设计学习笔记:P3-判断
C语言程序设计学习笔记:P4-循环
C语言程序设计学习笔记:P5-循环控制
C语言程序设计学习笔记:P6-数据类型
C语言程序设计学习笔记:P7-函数
C语言程序设计学习笔记:P8-数组
C语言程序设计学习笔记:P9-指针
C语言程序设计学习笔记:P10-字符串
C语言程序设计学习笔记:P11-结构类型
C语言程序设计学习笔记:P12-程序结构
C语言程序设计学习笔记:P13-文件
C语言程序设计学习笔记:P14-链表
学习本课程的主要目的是通过学习编程,来理解计算机是如何解决问题的,理解计算机的能与不能,擅长与非擅长。
计算机如何解决问题呢?
举个例子,现在我在一个餐馆,想喝一杯水,我就可以直接告诉服务员:“请给我一杯水”。服务员是个人,他就知道该怎么做,他就会去厨房然后倒一杯水递给我。而对于计算机,它没有那么高的自动化程度,你需要一步步地告诉它该怎么做:
①转身走到厨房;
②找到⼀个杯子;
③找到⼀个水壶;
④在杯子中倒入一些水;
⑤拿着杯子走回桌⼦
面对人,我们告诉他:What to do
面对计算机,我们告诉它:How to do
因此,我们不是和计算机交谈,而是描述要求它如何做事情的过程或⽅法。程序就是用特殊的编程语言写出来向计算机表达如何解决问题的步骤。
下面是一段计算机能够懂的语言,这些语言放在我们面前我们都不懂是什么意思,因为这些语言是通过另外一个软件或工具从我们能够懂的东西转换过来的。
它原来的样子是这样的:
int u = 32;
int v = 26;
while ( v!= 0 ) {
int temp = u%v;
u = v;
v = temp;
}
printf("%d",u)
当然,在学习编程前,上面这些东西对于我们来说也像天书一样。而实际上这些东西做的事情就是通过辗转相除的方法求32和26的最大公约数。看到这段程序,我们应该去理解它,它的含义就是下方的这些文字,这些文字就是算法。
①如果
v
等于0
,计算结束,u
就是最⼤公约数;
②如果v
不等于0
,那么计算u
除以v
的余数,让等于v
,而v
等于那个余数;
③回到第⼀步
因此,让计算机解决问题的步骤便是:
①构思出算法的内容
②将算法的内容转化为具体的编程语言
③通过一些软件或工具将编程语言转化为计算机能够看懂的语言
④计算机做计算
假设现在我们要求一个方程式的解, 2 x + 2 = 20 2x+2=20 2x+2=20。
人:对于我们人来说,可以通过公式直接计算。
计算机:对于计算机来说,要让它来解这样的方程式不容易。但是计算机有另外的办法来做这样的事,可以来凑这个数。将所有的可能列举出来,直到找到正确的解,这种方法我们称之为枚举。
枚举的问题:而枚举速度很慢,比如当正确答案是70000时,需要枚举上万次。因此,为了让计算机算得快,我们就会有各种各样的算法。比如对于上面那个方程,假设现在我们知道正确答案的范围是 1 1 1至 10 10 10之间。我们首先拿中间的5去试,发现小了,然后在5和10中间取一个数再去试。如果我们取7,则直接得到正确答案。因此这种方法叫做二分法。
我们的程序写出来都是一些类似于英文、数字、符号之类的东西,而计算机实际懂的都是一些16进制的都是数字的东西。这两个东西之间是有差异的,那么计算机去执行你写的程序就有两种方案:
解释:借助一个程序,那个程序能试图理解你的程序,然后按照你的要求执行。
编译:借助一个程序,就像一个翻译,把你的程序翻译成计算机真正能懂的语言(机器语言写的程序),然后这个机器语言写的程序就能直接执行了。
注意:语⾔言本无编译/解释之分,常用的执行方式而已。解释型语言有特殊的计算能力,编译型语言有确定的运算性能。
1、计算机本身最擅长的能力是
A. 推理
B. 想象
C. 重复
D. 分析
答案:C
2、编程语言是和计算机交谈的语言 (错误)
3、计算机(CPU)可以直接运行人类编写的程序 (错误)
编程语言有很多种:C、C++、Python、Java…。为什么我们要学习C语言呢,主要有以下原因:
原因一:我们首先看一家国外网站(链接:编程语言情况调查分析)针对各种编程语言在企业中的使用情况做的一个调查分析。可以看出C语言与排名第一名的Python的使用比例几乎相同。
我们也可以看各门语言从2002年开始占比的变化情况。可以看出C语言在很多场合都是唯一的选择,如嵌入式系统、操作系统。因此,C语言在企业有大量应用,我们没理由不去研究。
原因二:现代的编程语言(C语言稳定成熟以后,80年代后)在语法上的差异很小。现在很多语言都可以叫做C-likely语言,它们的一些基础功能如定义变量、函数等基本和C接近。以下三段代码分别由C、Java、Python编写,他们均实现打印Hello World。
原因三:现在我们说一们编程语言很好用,很厉害,往往不是由于语言本身的特点所决定的,而是由于这个语言别人为它写的库(对于面向对象语言,就是类库。对于C语言这种语言,就是函数库)能够针对一些应用做非常强的事情。比如一个很复杂的事情可以通过调用某一门语言中的一个库就能解决。当你学会一门语言后,你也能够很快地学会其它语言,而C语言处于一个很基础的位置。
C语言是从B语言发展而来的,B语言是从BCPL发展而来的,BCPL是从 FORTRAN发展而来的。
BCPL和B都支持指针间接方式,所以C也支持了
C语言还受到了PL/I的影响,还和PDP-II的机器语言有很大的关系
1973年3月,第三版的Unix上出现了C语言的编译器
1973年11月,第四版的Unix(System Four)发布了,这个版本是完全用C语言重新写的
C的发展与版本-标准
1989年ANSI发布了一个标准----ANSI C
1990年ISO接受了ANSI的标准----C89
C的标准在1995年和1999年两次更新----C95和C99
所有的当代编译器都支持C99了
C语言的应用很广泛,如下所示:
操作系统
嵌入式系统
驱动程序
底层驱动
图形引擎、图像处理、声音效果
对于C语言的应用,我们举些具体的例子
当你把U盘插入电脑,操作系统需要一个程序来驱动你的U盘,这就是驱动程序。我们也会去做一些底层驱动,比如你在玩游戏时,你的游戏引擎如何把这个三维的视频播放给你看,这些底层的东西用C在写。但是上层的东西:比如你现在在访问一个网站,网站背后的代码不是C语言写的,但是网站服务器是用C语言写的操作系统。网站的服务器软件是用C语言写的,但是直接给你提供数据的那些代码不是C语言写的。
所以,C语言是一种工业语言,是做一些非常基础性的工作的人在用C语言。
C需要被编译才能运行,所以你需要
编辑器
编译器
或者,IDE(集成开发环境),它包含了编辑器、编译器、调试器等工具。
课程推荐的编程软件为Dev C++(4.9 for Win7, 5.0 for Win8)。它的特点是免费、安装简单、不用建工程。我的电脑安装了Visual Studio
,所以我就使用VS开发。除了Dev C++,还有很多编程软件,如:
MS Visual Studio Express(Windows)
Xcode(Mac OS X)
Eclipse-CDT
Geany(和MinGW⼀一起)
Sublime(和MinGW⼀一起)
vim/emacs(和MinGW⼀一起)
注意:其中,Geany、Sublime、vim/emacs都是轻量级的开发工具,它们只包含编辑器,但可以调用外部的编译器(比如你在外部装了一个GNU编译器)。这些开发工具的编辑器功能比较丰富,如语法高亮、自动对齐等。注:MinGW的全称是Minimalist GNU for Windows。
1、关于C语言,以下说法错误的有
A. C语言是和Unix操作系统一同发展起来的
B. C语言不能写图形界面的软件
C. C语言一般是编译执行的
D. C语言诞生于1970年代
答案:B
2、轻量级的编程软件,如Geany+MinGW或Sublime Text+MinGW,与专门的IDE如Dev C++相比,什么功能没有了?
A.单步调试
B.源代码编辑时的语法高亮
C.编译程序
D.运行程序
答案:A
3、IDE的中文翻译是什么?
答案:集成开发环境
我们先写第一个C文件。
#include
int main()
{
printf("Hello World!\n");
return 0;
}
然后点击运行,出现以下窗口。这个黑色窗口有很多种叫法:命令行、终端、控制台。我们叫它终端,它是程序运行给你看结果的地方。
代码框架
刚才的代码中,这一段叫程序框架。我们还没开始学C语言,所以不用担心这些东西,只用记住:我们所有程序都必须有这几行。直到学函数之前,我们的代码都只是在这个框架中间。
#include
int main()
{
return 0;
}
输出格式
在上面打印Hello World的程序中,我们用 printf("Hello World!\n");
做输出。双引号""
里面的内容叫做字符串
,printf
会把其中的内容原封不动地输出。\n
表示需要在输出的结果后面换一行。
编译错误
编译的时候发现的错误所在的地方会以红色的底表示出来。对于C语言来说,有用的需要做事情的那些句子最后都得有分号。假如我现在漏了这个分号。
#include
int main()
{
printf("Hello World!\n")
return 0;
}
运行时会出现以下错误提示。它不会直接告诉我们printf
那一行末尾缺少分号,而会执行到return
那里了发现前面一行不是以分号结尾。因此,C的编译器给出的错误提示往往不那么好猜
。
空行
我们也可以把代码写成这样,因为换行对于C语言不意味着任何事情。
#include
int main()
{
printf("Hello World!\n")
;
return 0;
}
中文输入
中国学生还有一个极其常见的低级错误,就是用了中文输入法来输入程序。那些标点符号,在中文英文可能看上去相似,但是对于计算机是完全不同的符号,如果你还开了全角标点的话,问题就更严重了。现在我们将printf后面的英文分号换成中文分号。
#include
int main()
{
printf("Hello World!\n");
return 0;
}
运行时报错,它提示我们缺少分号,说明我们的中文分号它并不认识。
我们如果想让printf为我们做一些更多的东西,比如输出一些数值,我们可以用这个写法:printf("%d\n", 23+43);
。本来printf的功能是双引号里面有什么就输出什么,但是%d
就是要在它所在的地方填一个值进去,具体的值在它的后面,用逗号
隔开。
#include
int main()
{
printf("%d", 12+34);
return 0;
}
在printf中,除了%d,我们还可以加入一些让它原封不动输出的内容,比如这里我们将12+32=
也输出。
#include
int main()
{
printf("12+34=%d", 12+34);
return 0;
}
除了能够做加法,还能做四则运算和取余。注意这个取余(%
)不是在字符串里面的那个百分号在逗号后面做计算。取余表示取两个数相除后的余数。
四则运算 | C符号 | 意义 |
---|---|---|
+ | + | 加 |
- | - | 减 |
* | * | 乘 |
÷ | / | 除 |
% | 取余 | |
() | () | 括号 |
这些问题的回答来源于网上搜索,不太详细和准确,欢迎各位朋友进行补充。
问题:我们是在学习GCC吗?
常听到有人说他学的是Visual C,有人学的是Turbo C,不是我们学的什么Dev C,是他们的比我们的高级吗?还有GCC到底是什么?
回答:最初GCC指的是GNU C Compiler,是GNU操作系统的官方编译器,现已被大多数操作系统采纳为标准的编译器。现在的GCC包含了很多语言的的编译器,如C++、Go、Fortran等,故改为GNU Compiler Collection(GNU编译器套件)。Visual C,Turbo C,Dev C是不同的集成开发环境,内置了不同的C语言编译器,其对C标准的实现不同。
问题:main()的样子
为什么看到有的书上的main()是void main(),而我们课件上是int main()?还有main()里面那句return 0;是必须的吗?
回答:return(0)是为了检验main函数是否已经正常执行。main函数的值是返回给调用main函数的操作系统的,操作人员可以检查main函数的返回值 从而进行判断。同时,使用void main()对于现在的GCC是不能通过编译的。(Visual Studio使用的编译器可以)