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

本系列博客用于记录学习浙江大学翁恺老师的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-链表


一、计算机和编程语言

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

1.1 计算机和编程语言

计算机如何解决问题

举个例子,现在我在一个餐馆,想喝一杯水,我就可以直接告诉服务员:“请给我一杯水”。服务员是个人,他就知道该怎么做,他就会去厨房然后倒一杯水递给我。而对于计算机,它没有那么高的自动化程度,你需要一步步地告诉它该怎么做:
①转身走到厨房;
②找到⼀个杯子;
③找到⼀个水壶;
④在杯子中倒入一些水;
⑤拿着杯子走回桌子。
面对人,我们告诉他:What to do
面对计算机,我们告诉它:How to do
因此,我们不是和计算机交谈,而是描述要求它如何做事情的过程或⽅法。程序就是用特殊的编程语言写出来向计算机表达如何解决问题的步骤。


计算机语言、编程语言、算法的关系

下面是一段计算机能够懂的语言,这些语言放在我们面前我们都不懂是什么意思,因为这些语言是通过另外一个软件或工具从我们能够懂的东西转换过来的。
在这里插入图片描述
它原来的样子是这样的:
在这里插入图片描述
当然,在学习编程前,上面这些东西对于我们来说也像天书一样。而实际上这些东西做的事情就是通过辗转相除的方法求32和26的最大公约数。看到这段程序,我们应该去理解它,它的含义就是下方的这些文字,这些文字就是算法。
①如果v等于0,计算结束,u就是最⼤公约数;
②如果v不等于0,那么计算u除以v的余数,让u等于v,而v等于那个余数;
③回到第⼀步。


计算机解决问题的步骤

①构思出算法的内容
②将算法的内容转化为具体的编程语言
③通过一些软件或工具将编程语言转化为计算机能够看懂的语言
④计算机做计算


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、C++、Python、Java…。为什么我们要学习C语言呢,主要有以下原因:
原因一:我们首先看一家国外网站(链接:编程语言情况调查分析)针对各种编程语言在企业中的使用情况做的一个调查分析。可以看出C语言与排名第一名的Python的使用比例几乎相同。
在这里插入图片描述
我们也可以看各门语言从2002年开始占比的变化情况。可以看出C语言在很多场合都是唯一的选择,如嵌入式系统、操作系统。因此,C语言在企业有大量应用,我们没理由不去研究。
在这里插入图片描述
原因二:现代的编程语言(C语言稳定成熟以后,80年代后)在语法上的差异很小。现在很多语言都可以叫做C-likely语言,它们的一些基础功能如定义变量、函数等基本和C接近。以下三段代码分别由C、Java、Python编写,他们均实现打印Hello World。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
原因三:现在我们说一们编程语言很好用,很厉害,往往不是由于语言本身的特点所决定的,而是由于这个语言别人为它写的库(对于面向对象语言,就是类库。对于C语言这种语言,就是函数库)能够针对一些应用做非常强的事情。比如一个很复杂的事情可以通过调用某一门语言中的一个库就能解决。当你学会一门语言后,你也能够很快地学会其它语言,而C语言处于一个很基础的位置。


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


2.3 编程软件

C语言的应用

①C语言的应用很广泛,如下所示:
操作系统
嵌入式系统
驱动程序
底层驱动
图形引擎、图像处理、声音效果
②对于C语言的应用,我们举些具体的例子
----当你把U盘插入电脑,操作系统需要一个程序来驱动你的U盘,这就是驱动程序。
----我们也会去做一些底层驱动,比如你在玩游戏时,你的游戏引擎如何把这个三维的视频播放给你看,这些底层的东西用C在写。
----但是上层的东西:比如你现在在访问一个网站,网站背后的代码不是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的中文翻译是什么?
答案:集成开发环境


三、第一个程序

3.1 第一个程序

我们先写第一个C文件。

#include <stdio.h>

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

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

3.2 详解第一个程序

代码框架

刚才的代码中,这一段叫程序框架。我们还没开始学C语言,所以不用担心这些东西,只用记住:我们所有程序都必须有这几行。直到学函数之前,我们的代码都只是在这个框架中间。
在这里插入图片描述

输出格式

在上面打印Hello World的程序中,我们用 printf("Hello World!\n");做输出。
----双引号""里面的内容叫做字符串printf会把其中的内容原封不动地输出。
----\n表示需要在输出的结果后面换一行。

编译错误

编译的时候发现的错误所在的地方会以红色的底表示出来。对于C语言来说,有用的需要做事情的那些句子最后都得有分号。假如我现在漏了这个分号。
在这里插入图片描述
运行时会出现以下错误提示。它不会直接告诉我们printf那一行末尾缺少分号,而会执行到return那里了发现前面一行不是以分号结尾。因此,C的编译器给出的错误提示往往不那么好猜。
在这里插入图片描述

空行

我们也可以把代码写成这样,因为换行对于C语言不意味着任何事情。
在这里插入图片描述

中文输入

中国学生还有一个极其常见的低级错误,就是用了中文输入法来输入程序。那些标点符号,在中文英文可能看上去相似,但是对于计算机是完全不同的符号,如果你还开了全角标点的话,问题就更严重了。现在我们将printf后面的英文分号换成中文分号。
在这里插入图片描述
运行时报错,它提示我们缺少分号,说明我们的中文分号它并不认识。
在这里插入图片描述


3.3 做点计算

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

#include <stdio.h>

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

运行结果如下图,可以看出打印结果为46,正确。
在这里插入图片描述
在printf中,除了%d,我们还可以加入一些让它原封不动输出的内容,比如这里我们将12+32=也输出。

#include <stdio.h>

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使用的编译器可以)

  • 6
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

知初与修一

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值