C语言程序设计学习笔记:P1-程序设计与C语言

本系列博客用于记录学习浙江大学翁恺老师的C语言程序设计,课程链接为:C语言程序设计—翁恺


一、计算机和编程语言

学习本课程的主要目的是通过学习编程,来理解计算机是如何解决问题的,理解计算机的能与不能,擅长与非擅长。

1.1 计算机和编程语言

计算机如何解决问题呢?举个例子,现在我在一个餐馆,想喝一杯水,我就可以直接告诉服务员:“请给我一杯水”。服务员是个人,他就知道该怎么做,他就会去厨房然后倒一杯水递给我。而对于计算机,它没有那么高的自动化程度,你需要一步步地告诉它该怎么做:

1、转身走到厨房;
2、找到⼀个杯子;
3、找到⼀个水壶;
4、在杯子中倒入一些水;
5、拿着杯子走回桌⼦

面对人,我们告诉他: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的最大公约数。看到这段程序,我们应该去理解它,它的含义就是下方的这些文字,这些文字就是算法。

1、如果v等于0,计算结束,u就是最⼤公约数;
2、如果v不等于0,那么计算u除以v的余数,让等于v,而v等于那个余数;
3、回到第⼀步

因此,让计算机解决问题的步骤便是:

1、构思出算法的内容
2、将算法的内容转化为具体的编程语言
3、通过一些软件或工具将编程语言转化为计算机能够看懂的语言
4、计算机做计算

1.2 计算机的思维方式

现在我们要求一个方程式的解, 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语言

2.1 为什么是C

编程语言有很多种:C、C++、Python、Java…。为什么我们要学习C语言呢,我们首先看一家国外网站(链接:编程语言情况调查分析)针对各种编程语言在企业中的使用情况做的一个调查分析。可以看出C语言与排名第一名的Python的使用比例几乎相同。
在这里插入图片描述

我们也可以看各门语言从2002年开始占比的变化情况。可以看出C语言在很多场合都是唯一的选择,如嵌入式系统、操作系统。因此,C语言在企业有大量应用,我们没理由不去研究。
在这里插入图片描述

我们不去选择其它语言还有另外一些原因:
原因一:现代的编程语言(C语言稳定成熟以后,80年代后)在语法上的差异很小。现在很多语言都可以叫做C-likely语言,它们的一些基础功能如定义变量、函数等基本和C接近。以下三段代码分别由C、Java、Python编写,他们均实现打印"Hello World“的功能,可以看出语法很相似。

#include <stdio.h>
int main()
{
    
    
	printf("Hello World!\n");
	return 0;
}
class Hello
{
    
    
	public static void main(String[] arg){
    
    
		System.out.println("Hello World!");
	}
}
print "Hello World!\n"

原因二:现在我们说一们编程语言很好用,很厉害,往往不是由于语言本身的特点所决定的,而是由于这个语言别人为它写的库(对于面向对象语言,就是类库。对于C语言这种语言,就是函数库)能够针对一些应用做非常强的事情。比如一个很复杂的事情可以通过调用某一门语言中的一个库就能解决。当你学会一门语言后,你也能够很快地学会其它语言,而C语言处于一个很基础的位置。

2.2 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了

2.3 编程软件

2.3.1 C语言的应用

C语言的应用很广泛,如下所示:
• 操作系统
• 嵌入式系统
• 驱动程序
• 底层驱动
• 图形引擎、图像处理、声音效果

举个例子,当你把U盘插入电脑,操作系统说需要一个驱动程序来驱动你的U盘,这就是驱动程序。我们也会去做一些底层驱动,比如你在玩游戏时,你的游戏引擎如何把这个三维的视频播放给你看,这些底层的东西用C在写。但是上层的东西:比如你现在在访问一个网站,网站背后的代码不是C语言写的,但是网站服务器是用C语言写的操作系统。网站的服务器软件是用C语言写的,但是直接给你提供数据的那些代码不是C语言写的。

所以,C语言是一种工业语言,是做一些非常基础性的工作的人在用C语言。
在这里插入图片描述

2.3.2 C语言的运行环境

C需要被编译才能运行,所以你需要

• 编辑器
• 编译器
• 或者,IDE(集成开发环境),它包含了编辑器、编译器、调试器等工具。

课程推荐的编程软件为Dev C++(4.9 for Win7, 5.0 for Win8)。它的特点是免费、安装简单、不用建工程。我的电脑安装了Visual Studio,所以我就使用VS开发。

除了Dec 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的中文翻译是什么?  
答案:集成开发环境

三、第一个程序

3.1 第一个程序

我们先写第一个C文件。

#include <stdio.h>

int main()
{
    
    
	printf("Hello World!\n");
	
	return 0;
}

然后点击运行,出现以下窗口。这个黑色窗口有很多种叫法:命令行、终端、控制台。我们叫它终端,它是程序运行给你看结果的地方。
在这里插入图片描述

3.2 详解第一个程序

#include <stdio.h>

int main()
{
    
    	
	return 0;
}

刚才的代码中,这一段叫程序框架。我们还没开始学C语言,所以不用担心这些东西,只用记住:我们所有程序都必须有这几行。直到学函数之前,我们的代码都只是在这个框架中间。在这个程序中,我们用 printf(“Hello World!\n”); 做输出。双引号("")里面的内容叫做字符串,printf会把其中的内容原封不动地输出。\n表示需要在输出的结果后面换一行。

编译的时候发现的错误所在的地方会以红色的底表示出来。对于C语言来说,有用的需要做事情的那些句子最后都得有分号。假如我现在漏了这个分号。

#include <stdio.h>

int main()
{
    
    
	printf("Hello World!\n")	
	
	return 0;
}

运行时会出现以下错误提示。它不会直接告诉我们printf那一行末尾缺少分号,而会执行到return那里了发现前面一行不是以分号结尾。因此,C的编译器给出的错误提示往往不那么好“猜”。
在这里插入图片描述


我们也可以把代码写成这样,因为换行对于C语言不意味着任何事情。

#include <stdio.h>

int main()
{
    
    
	printf("Hello World!\n")
	;
	
		return 0;
}

中国学生还有一个极其常见的低级错误,就是用了中文输入法来输入程序。那些标点符号,在中文英文可能看上去相似,但是对于计算机是完全不同的符号,如果你还开了全角标点的话,问题就更严重了。现在我们将printf后面的英文分号换成中文分号。

#include <stdio.h>

int main()
{
    
    
	printf("Hello World!\n")return 0;
}

运行时报错,它提示我们缺少分号,说明我们的中文分号它并不认识。
在这里插入图片描述

3.3 做点计算

我们如果想让printf为我们做一些更多的东西,比如输出一些数值,我们可以用这个写法:printf("%d\n", 23+43); 本来printf的功能是双引号里面有什么就输出什么,但是%d就是要在它所在的地方填一个值进去,具体的值在它的后面,用逗号隔开。

#include <stdio.h>

int main()
{
    
    
	printf("%d", 12+34);
	
		return 0;
}

运行结果如下图,可以看出打印结果为46,正确。
在这里插入图片描述


在printf中,除了%d,我们还是可以加入一些让它原封不动输出的内容。

#include <stdio.h>

int main()
{
    
    
	printf("12+34=%d", 12+34);
	
		return 0;
}

运行结果如下图所示:
在这里插入图片描述


除了能够做加法,还能做四则运算和取余。注意这个取余(%)不是在字符串里面的那个百分号,是在逗号后面做计算的符号。取余表示取两个数相除后的余数。

四则运算 C符号 意义
+ +
- -
* *
÷ /
% 取余
() () 括号

Guess you like

Origin blog.csdn.net/InnerPeaceHQ/article/details/121152288