第一章 程序设计和C语言
1.1什么是计算机程序
计算机的每一个操作都是根据事先指定的指令进行的。所谓程序,就是一组计算机能识别和执行的指令。计算机的本质是程序的机器。
1.2什么是计算机语言
计算机语言是一种计算机和人都能识别的语言。
计算机语言的发展阶段:
1).机器语言
机器指令:计算机能直接识别和接受的二进制代码
机器语言:机器指令的集合
2).汇编语言(符号语言)
汇编语言(符号语言)用一些英文字母和数字表示一个指令
汇编语言的指令对应转换为机器指令的过程称为汇编。该过程由汇编程序完成
3).高级语言
不同型号的计算机的机器语言和汇编语言是互不通用的。机器语言和汇编语言是完全依赖于具体机器特性的,是面向机器的语言。它们都是计算机低级语言。
第一个计算机高级语言——FORTRAN语言。这种语言不依赖具体机器,由它写出的程序对任何型号的计算机都适用,故称为高级语言。
编译程序把高级语言程序转换为机器指令程序。高级语言的一个语句往往对应多条机器指令。
高级语言发展阶段:由非结构化的语言发展成为结构化语言,再发展为面向对象的语言。
非结构化语言和结构化语言都是基于过程的语言,适宜于规模较小的程序。
1.3C语言的发展及其特点
1)语言简洁,紧凑,使用方便,灵活(37个关键字、9种控制语句)
2)运算符丰富(34种),数据类型丰富
3)结构化的控制语句
4)语法限制不太严格,程序设计自由度大
5)允许直接访问物理地址,能进行位(bit)操作
6)编写的程序可移植性好
7)生成目标代码质量高,系统执行效率高
1.4最简单的C语言程序
几点说明:
1)main函数由操作系统调用
2)#include是编译预处理指令,若用到标准函数库中的输入输出函数,应在本文件模块开头写上一行:#include<stdio.h>
3)程序预编译处理时将每个注释替换为一个空格
4)单行注释用“//”,多行注释用“/*”
5)函数定义在调用后,需要在调用前声明。
C语言程序的结构有以下特点:
1)一个程序由一个或多个源程序文件组成。在一个源程序文件中可以包括三个部分:预处理指令、全局声明、函数定义。在进行编译时是以源程序文件为对象进行的。在分别对各源程序文件进行编译得到目标文件后,再将这些目标程序连接为一个统一的二进制的可执行文件。
2)函数是C程序的主要组成部分。
3)一个函数可以包括两个部分:函数首部和函数体。函数体一般包括声明部分(变量声明和函数声明)和执行部分(指定函数进行的操作)
4)函数总是从main函数开始执行
5)C语言本身不提供输入输出语句,输入输出操作由库函数完成
6)程序应该包含注释,增强可读性。
1,5运行C程序的步骤与方法
1)上机输入和编辑程序
2)对源程序进行编译,先用C编译系统提供的“预编译器”对程序中的预处理指令进行编译预处理。由预处理得到的信息与程序其他部分一起,组成一个完整、可以用来进行正式编译的源程序,然后由编译系统对该源程序进行编译。编译的作用是对源程序进行语法检查,编译成功形成目标程序(.obj)。编译系统进行编译自动包括了预编译和正式编译两个阶段。
3)进行连接处理
可执行程序:目标程序与函数库等相连接形成的一个可供计算机执行的目标程序(.exe)
- 运行可执行程序,得到运行结果
- 程序设计的任务
程序设计是指从确定任务得到结果、写出文档的全过程。一般分为以下几个工作阶段:
- 问题分析
- 设计算法 即设计出解题的方法和具体步骤。一般用流程图来表示解题的步骤
- 编写程序
- 对程序进行编辑、编译和连接
- 运行程序,分析结果
调试的过程就是通过上机发现和排除程序中故障的过程。
测试:设计多组测试数据,检查程序对不同数据的运行情况,从中尽量发现程序中存在的漏洞,并修改程序,使之能适用于各种情况,作为产品提供使用的程序,是必须经过严格的测试的。
- 编写程序文档
正式提供给用户使用的程序·,必须向用户提供程序说明书(用户文档)。内容应该包括:用户名称、程序功能、运行环境、程序装入和启动、需要输入的数据、以及使用注意事项等。程序文档是软件的一个重要组成部分,软件是计算机程序和文档的总称。
- 算法——程序的灵魂
一个程序主要包括以下两方面的信息:
- 对数据的描述。即数据结构
- 对操作的描述。即要求计算机进行操作的步骤,也就是算法。
算法、数据结构、程序设计方法和语言工具是一个程序设计人员应具备的知识。算法是灵魂,数据结构是加工对象,语言是工具,编程需要采用合适的方法。
2.1 什么是算法
广义的说,为解决一个问题而采取的方法步骤就称为算法。一般来说,为了有效进行解题,不仅需要保证算法正确,还要考虑算法的质量,选择合适的算法。
计算机算法可以分为两大类别:数值运算算法(有现成的模型,可以运用数值分析方法)和非数值运算算法(例如排序算法、查找算法)
2.2 简单的算法举例
考虑算法时,应当仔细分析所需判断的条件,如何一步一步缩小检查判断的范围。对有的问题,判断的先后次序是无所谓的,而有的问题,判断条件的先后次序是不能任意颠倒的。
连续整除法检测素数n,只需检测到最后一个不大于sqrt(n)的整数即可。
2.3 算法的特性
不要以为任意写出的一些执行步骤就构成一个算法。一个有效的算法应该具有以下的特点:
- 有穷性 算法应包含有限的步骤。有穷往往指的是合理的限度之内。
- 确定性 算法每一个步骤的含义应当是确定的,是唯一的,而不应该产生歧义。所谓歧义是指可以被理解为多重含义。
2.4 怎样表示一个算法
1)用自然语言表示
2)用流程图表示 流程图符号名:起止框、输入输出框、判断框、处理框、流程线、连接点和注释框等。一个流程图包括以下几个部分:①表示相应操作的框②带箭头的流程线③框内外必要的文字说明④注意:开始框要有!
3)三种基本结构和改进的流程图
基本结构:顺序结构、分支结构和循环结构(当型(while型)循环结构、直到型(until型)循环结构)
特点:①只有一个入口②只有一个出口(一个判断框有两个出口而一个选择结构只有一个出口)③结构内的每一部分都有机会被执行到④结构内不存在“死循环”
4)用N-S流程图表示算法
去掉流程线的流程图,又称为盒图
一个结构化的算法是由一些基本结构顺序组成;在基本结构之间不存在向前或向后的跳转,流程的转移只存在于一个基本结构范围之内(如循环中流程的跳转);一个非结构化的算法可以用一个等价的结构化算法代替,其功能不变。如果一个算法不能分解为若干个基本结构,则它必然不是一个结构化的算法。
- 用伪代码表示算法
流程图适于表示一个算法,但是在设计算法过程中使用不是很理想(尤其是当算法比较复杂、需要反复修改时)。为了设计算法,常用一种称为伪代码的工具。
伪代码是介于自然语言和计算机语言之间的文字和符号来描述算法。
- 用计算机语言表示算法
2.5 结构化程序设计方法
结构化程序设计方法的基本思路:把一个复杂问题的求解过程分阶段进行,每个阶段处理的问题都控制在人们容易理解和处理的范围内。具体来说,采用以下方法保证得到结构化的程序:①自顶向下②逐步细化③模块化设计④结构化编码
- 最简单的C程序设计——顺序程序设计
3.1 顺序程序设计举例
有些C编译系统如Visual C++把所有实数都作为双精度数处理。因此在初始化时把一个双精度常量赋给一个float型变量会显示“警告”信息。如果用GCC编译系统,则不会出现警告。
3.2 数据的表现形式及其运算
1) 常量和变量
常量
分类:整型常量、实型常量(十进制小数形式和指数形式)和字符常量(普通字符和转义字符)。其中字符以其代码(一般采用ASCII码)存储,C语言并没有指定使用哪一种字符集,由各编译系统自行决定,只是规定基本字符集中的每个字符必须用一个字节表示。此外还有字符串常量和符号常量
符号常量:用一个符号名代表一个常量。符号常量不占用内存,只是一个临时符号,在预编译后这个符号就不存在了,故不能对符号常量赋以新值。习惯上符号常量用大写字符表示。好处:见名知意、一改全改。
变量
变量代表一个有名字的、具有特定属性的一个存储单元。必须先定义后使用
变量名实际上是以一个名字代表的一个存储地址。在对程序编译连接时由编译系统给每一个变量名分配对应的内存地址。
常变量
常变量是有名字的不变量。如:const int a = 3; const float pi = 3.14159;常变量比符号变量更有优点。
标识符
用来对变量、符号常量名、函数、数组、类型等命名的有效字符序列统称为标识符。
2) 数据类型
3) 整型数据
3.3 C语句
3.4 数据的输入输出
- 选择结构程序设计
- printf的返回值为输出的字符的个数
- &&和||运算符都是短路运算符,即编译器一旦发现与整体表达式无关,那么求值立刻终止。
- sizeof是一个关键字,而非函数!i++在编译器看来是可以在运行前也就是编译的时候就确定了的。故sizeof(i++)其实就是i所占内存。
第七章 用函数实现模块化程序设计
7.1 为什么要用函数
可以事先编写一批常用的函数来实现各种不同的功能,将他们保存在函数库中。较大程序分为若干程序模块,每一模块包括一个或多个函数,每个函数事先一个特定功能。
善于利用函数可以减少重复编写程序段的工作量,也更便于实现模块化的程序设计。
7.2 怎样定义函数
7.3 调用函数
7.4 对被调用函数的声明和函数原型
7.5 函数的嵌套调用
7.6 函数的递归调用
7.7 数组作为函数参数
7.8 局部变量和全局变量
7.9 变量的存储方式和生存期
7.10 关于变量的声明和定义
7.11 内部函数和外部函数