1.1 什么是计算机程序
程序 = 算法 + 数据结构
程序就是一组计算机能识别和执行的指令。每一条指令使计算机执行特定的操作。
1.2 什么是计算机语言
计算机语言:计算机和人都能识别的语言
经历了以下发展阶段:机器语言,汇编语言,高级语言
1.2.1 计算机语言的发展
高级语言的发展经历以下阶段:非结构化语言,结构化语言,面向对象的语言
1.2.2 计算机语言的特点
机器语言的特点:
机器语言是用二进制代码表示的语言,是计算机唯一可以直接识别和执行的语言。
它具有计算机可以直接执行、简洁、运算速度快等优点,
它直观性差,非常容易出错,程序的检查和调试都比较困难,此外对机器的依赖型也很强。
汇编语言的特点:
汇编语言是面向机器的程序设计语言,它是为了解决机器语言难以理解和记忆的缺点,用易于理解和记忆的名称和符号表示机器指令中的操作码。
使用汇编语言编写的程序,机器不能直接识别,要由一种程序将汇编语言翻译成机器语言,这种起翻译作用的程序叫汇编程序,汇编程序把汇编语言翻译成机器语言的过程称为汇编。
高级语言的特点:
高级语言的数据结构要比汇编和机器语言丰富
与具体机器结构的关联没有汇编以及机器语言密切
更接近自然语言更容易掌握
编写的程序要经过编译或解释计算机才能执行
1.3 C语言的发展及其特点
1.3.1 C语言的发展
1972年,美国贝尔实验室的D.M.Ritchie在B语言的基础上设计出了C语言。最初的C语言只是为描述和实现UNIX操作系统提供一种工作语言而设计的。
1973年,KenThompson和 D.M. Ritchie合作把UNIX的90%以上用C语言改写,即 UNIX第5版。随着UNIX的日益广泛使用,C语言也迅速得到推广。
1978年以后,C语言先后移植到大、中、小和微型计算机上。C语言便很快风靡全世界,成为世界上应用最广泛的程序设计高级语言之一。 以UNIX第7版中的C语言编译程序为基础,1978年,Brian W.Kernighan和 DennisM.Ritchie合著了影响深远的名著The C Programming Language,这本书中介绍的C语言成为后来广泛使用的C语言版本的基础,它是实际上第一个C语言标准。
1983年,美国国家标准协会(ANSI) ,根据C语言问世以来各种版本对C语言的发展和扩充,制定了第一个C语言标准草案(’83 ANSI C)。
1989年,ANSI公布了一个完整的C语言标准:ANSI X3.159—1989(常称为 ANSI C 或 C 89)。
1990年,国际标准化组织ISO(International Standard Organization)接受C 89作为国际标准ISO/IEC 9899:1990,它和ANSI的C 89基本上是相同的。 1999年,ISO又对C语言标准进行了修订,在基本保留原来的C语言特征的基础上,针对应用的需要,增加了一些功能,尤其是C+中的一些功能,并在2001年和2004年先后进行了两次技术修正,它被称为C 99,C 99是C 89的扩充。
1.3.2 C语言的特点
C语言是一种用途广泛、功能强大、使用灵活的过程性(procedural)编程语言,既可用于编写应用软件,又可用于编写系统软件。
C语言有以下一些主要特点:
语言简洁、紧凑,使用方便、灵活。
一共只有37个关键字,9种控制语句,主要用小写字母表示。
C是一个很小的内核语言,只包括极少的与硬件有关的成分,C语言不直接提供输入和输出语句、有关文件操作的语句和动态内存管理的语句等(这些操作是由编译系统所提供的库函数来实现的),C的编译系统相当简洁。
运算符丰富。
共有34种运算符,把括号、赋值和强制类型转换等都作为运算符处理。
数据类型丰富。
C语言提供的数据类型包括整型、浮点型、字符型、数组类型、指针类型、结构体类型和共用体类型等,C 99又扩充了复数浮点类型、超长整型(long long)和布尔类型(bool)等。
具有结构化的控制语句
(如 if…else语句, while语句,do…while语句, switch语句和for语句)。
用函数作为程序的模块单位,便于实现程序的模块化。C语言是完全模块化和结构化的语言。
语法限制不太严格,程序设计自由度大
例如,对数组下标越界不进行检查。对变量的类型使用比较灵活。例如,整型量与字符型数据以及逻辑型数据可以通用。
C语言允许直接访问物理地址,能进行位(bit)操作,能实现汇编语言的大部分功能,可以直接对硬件进行操作。
因此,C语言既具有高级语言的功能,又具有低级语言的许多功能,可用来编写系统软件。
C语言的这种双重性,使它既是成功的系统描述语言,又是通用的程序设计语言。
用C语言编写的程序可移植性好。
由于C的编译系统相当简洁,因此很容易移植到新的系统。而且C编译系统在新的系统上运行时,可以直接编译“标准链接库”中的大部分功能,不需要修改源代码,因为标准链接库是用可移植的C语言写的。因此,几乎在所有的计算机系统中都可以使用C语言。
生成目标代码质量高,程序执行效率高。
目前C的主要用途之一是编写嵌入式系统程序。由于具有上述优点,使C语言应用面十分广泛,许多应用软件也用C语言编写。
1.4 C语言程序
1.4.1 C语言程序的构成
一个C语言程序由一个或多个源程序文件组成。
一个C语言程序不论由多少个源文件组成,都有一个且只能有一个main函数,即主函数。
函数是C程序的基本单位。
在一个源程序文件中可以包括3个部分:
预处理指令,如#include <stdio.h>
所有的#开头的行,都代表预编译指令,预编译指令行结尾是没有分号的
全局声明
函数定义
1.4.2 C语言程序的结构特点
C语言程序的结构具有以下特点:
一个程序由一个或多个源程序文件构成。
在一个源程序文件中可以包括3个部分:
预处理指令,如#include <stdio.h>
全局声明
函数定义
函数是C程序的主要组成部分
一个C语言程序是由一个或多个函数组成的,其中必须包含一个main函数(且只能有一个main 函数)。
为了便于调试和管理,可以使一个程序包含若干个源程序文件,每个源程序文件又包含若干个函数。一个源程序文件就是一个程序模块,即将一个程序分成若干个程序模块。 在进行编译时是以源程序文件为对象进行的。在分别对各源程序文件进行编译并得到相应的目标程序后,再将这些目标程序连接成为一个统一的二进制的可执行程序。 C语言的这种特点使得容易实现程序的模块化。
一个函数包括两个部分
函数首部。即函数的第1行,包括函数类型、函数名、函数参数(函数参数类型、参数名)。
一个函数名后面必须跟一对圆括号,括号内写函数的参数名及其类型。
如果函数没有参数,可以在括号中写void,也可以是空括号,如:int main(void) 或 int main()
函数体。即函数首部下面的花括号内的部分。
如果在一个函数中包括有多层花括号,则最外层的一对花括号是函数体的范围。 函数体一般包括以下两部分: (1)声明部分。声明部分包括:定义在本函数中所用到的变量,对本函数所调用函数进行声明。 (2)执行部分。由若干个语句组成,指定在函数中所进行的操作。 在某些情况下也可以没有声明部分,甚至可以既无声明部分也无执行部分。也就是空函数,是合法的。
程序总是从 main函数开始执行的,在main函数结束
main函数是程序的入口
不论main函数在整个程序中的位置如何(main函数可以放在程序最前头,也可以放在程序最后,或在一些函数之前、另一些函数之后)。
程序中要求计算机的操作是由函数中的C语句完成的。
如赋值、输入输出数据的操作都是由相应的C语句实现的。
C程序书写格式是比较自由的。一行内可以写几个语句,一个语句可以分写在多行上。
但为清晰起见,习惯上每行只写一个语句。
在每个数据声明和语句的最后必须有一个分号
分号是C语句的必要组成部分。
语句最后加分号,标志这条语句的结束。
C语言本身不提供输入输出语句
输入和输出的操作是由库函数scanf和 printf等函数来完成的。C语言对输入输出实行“函数化”。
程序应当包含注释
一个好的、有使用价值的源程序都应当加上必要的注释,以增加程序的可读性。
1.4.3 典型的源程序书写格式
头文件:#include <stdio.h>,它包含了输入输出相关的函数
主函数(main函数)
必要的注释
/*最简单的C语言程序*/
# include <stdio.h>
int main(){
/*第一个C语言程序*/
printf("Hello,world! \n");
return 0;
}
1.4.4 C语言的注释
C语言支持两种注释方式:
单行注释
从//开始,以换行符结束,不可跨行。
注释内容可以单占一行,也可以在一行代码的右侧。
//我是一个单行注释
多行注释
以/*开始,以*/结束的块注释,可以跨行。
/* 我是一个可以 跨行的注释 */
1.4.5 头文件
C语言中的头文件是扩展名为.h的文件,包含了C函数声明和宏定义,被多个源文件中引用共享。
有两种类型的头文件:程序员编写的头文件和编译器自带的头文件。
在程序中要使用头文件,需要使用C预处理指令#include来引用它。
头文件的作用是为了方便管理和重用代码,它可以被多个源文件共享,从而实现代码的重用和模块化。
#include< > 与 #include ""的区别:
< > 编译系统从存放C编译系统的子目录中去找所要包含的文件。表示系统直接按系统指定的目录检索,这种是标准方式
“” 表示系统先在 “” 指定的路径(没写路径代表当前路径)查找头文件,如果找不到,再按系统指定的目录检索
常用的头文件:
#include <assert.h> //设定插入点
#include <ctype.h> //字符处理
#include <errno.h> //定义错误码
#include <float.h> //浮点数处理
#include <fstream.h> //文件输入/输出
#include <iomanip.h> //参数化输入/输出
#include <iostream.h> //数据流输入/输出
#include <limits.h> //定义各种数据类型最值常量
#include <locale.h> //定义本地化函数
#include <math.h> //定义数学函数
#include <stdio.h> //定义输入/输出函数
#include <stdlib.h> //定义杂项函数及内存分配函数
#include <string.h> //字符串处理
#include <strstrea.h> //基于数组的输入/输出
#include <time.h> //定义关于时间的函数
#include <wchar.h> //宽字符处理及输入/输出
#include <wctype.h> //宽字符分类
1.5 C语言程序的运行
1.6 程序设计的任务
问题分析
设计算法:一般使用流程图
编写程序
对源程序进行编辑、编译和连接,得到可执行文件
运行程序,分析结果
对程序进行测试。通过设计多组测试数据,检查程序对不同数据的运行情况,从中尽可能发现程序中存在的漏洞,并修改程序,使之能适用于各种情况。
编写程序文档
提供给用户使用的程序,必须向用户提供程序说明书(也称为用户文档)。内容应包括程序名称,程序功能、运行环境、程序的装入和启动、需要输入的数据,以及使用注意事项等。 程序文档是软件的一个重要组成部分,软件是计算机程序和程序文档的总称。
1.7 程序 = 算法+数据结构
一个程序主要包括以下两个方面的信息:
对数据的描述。在程序中要指定用到哪些数据,以及这些数据的类型和数据的组织形式。这就是数据结构(data structure)。
对操作的描述。要求计算机进行操作的步骤,也就是算法(algorithm)。
数据是操作的对象,操作的目的是对数据进行加工处理,以得到期望的结果。
作为程序设计人员,必须认真考虑和设计数据结构和操作步骤(即算法)。
著名计算机科学家沃思(Nikiklaus Wirth)提出一个公式:程序 = 算法 + 数据结构
实际上,一个过程化的程序除了以上两个主要要素之外,还应当采用结构化程序设计方法进行程序设计,并且用某一种计算机语言表示
因此算法﹑数据结构、程序设计方法和语言工具4个方面是一个程序设计人员所应具备的知识。在这4个方面中,算法是灵魂,数据结构是加工对象,语言是工具,编程需要采用合适的方法。
算法是解决“做什么”和“怎么做”的问题。程序中的操作语句,实际上就是算法的体现。