Posted on 2008-04-19 23:41
silentneil 阅读(409)
评论(0) 编辑 收藏 引用
第1章 C语言概述
1.1 C语言出现的历史背景
C语言是国际上广泛流行的计算机高级语言,即可用来写系统软件,也可用来写应用软件。
C语言是在B语言的基础上发展起来的。
早期的C语言运行在UNIX操作系统上,后来运行在DOS操作系统上,现在的C语言可运行在Windos操作系统上。
C语言有许多版本,我们使用的是Turbo C 2.0。
P1,说明。
1.2 C语言的特点
C语言有许多优于其它语言的特点:
(1)语言简洁、紧凑,使用方便、灵活。
C语言一共只有32个关键字,9个控制语句,书写形式自由。
P2,表1.1。
(2)运算符丰富。
C共有34种运算符,如+、-等。
P2,说明。
(3)数据结构丰富。
C有整型、实型等多种数据结构。
P3,说明。
(4)具有结构化的控制语句。
C有if…else、while等多种结构化的控制语句。
P3,说明。
(5)语法限制不太严格,程序设计自由度大。
如对数组下标越界不作检查等。
P3,说明。
(6)C语言可进行位运算。
这是C区别于其它高级语言的主要特点。
P3,说明。
(7)生成目标代码质量高。
这也是C的优于其它高级语言之处。
P3,说明。
(8)C程序可移植性好。
即C程序可基本不做修改移到不同的计算机上运行。
P3,说明。
1.3 简单的C程序介绍
P4,例1.1,见ex1-1.c。
程序功能:打印一个字符串,并输出一个换行符。
P4,例1.2,见ex1-2.c。
程序功能:求两个数之和。
P5,例1.3,见ex1-3.c。
程序功能:求两个数的较大者。
分析这三个例子的执行过程。
说明:
4
C程序是由函数组成的。在上面的例子中的函数有:main、printf、scanf和max。其中main是主函数,printf、scanf是库函
数,max是自定义函数。一个C程序一定要有一个主函数。库函数是放在*.h的库函数文件中,只要直接调用就可。自定义函数要由用户先定义后调用。
5 认识一下C函数
C函数定义的一般格式为:
函数类型 函数名(形参类型 形式参数,…)
{
数据声明部分;
函数执行部分;
}
C函数调用的一般格式为:
函数名(实际参数,…)
(3)一个C程序总是从main主函数开始执行的,而不论main函数在程序中的位置如何。主函数可以调用子函数,子函数还可以调用子子函数。因此C程序是层次结构的。
(4)C程序一行可以写多个语句,每个语句以“;”结束。C程序是区分大小写字母的。C程序本身没有输入输出语句,其输入输出是由库函数printf和scanf来完成的。/*…*/是C的注释语句。
1.4 C程序的上机步骤
C程序编写好后,要经过编辑、编译、连接与运行四个步骤,这四个步骤的作用分别是:
编辑:把C语言源程序输入计算机并进行修改存盘,生成*.c的源程序文件。
编译:用C编译程序对*.c的源程序文件进行编译,生成*.obj的二进制文件。
连接:把*.obj的二进制文件与系统标准模块进行连接,生成*.exe的可执行文件。
运行:执行*.exe的可执行文件,输出执行结果。
以上步骤均可在Turbo C的工作平台上进行,启动Turbo C,就可以进行编辑,打命令Ctrl+F9,就可以进行编译、连接和运行,打命令Alt+F5,就可看到执行结果。
举例说明,见ex1-1.c。
1.5 Turbo C常用命令简介
1. 启动和退出
启动:在DOS下打TC,或在Windows下创建快捷命令执行。
退出:Alt+X
2. 程序的编辑
简单编辑:Ins:插入/改写 Backspace:删除前一字符
Del:删除当前字符 Ctrl+Y:删除一行
块操作:Ctrl+KB、Ctrl+KK:定义块首、尾
Ctrl+KC、Ctrl+KV、Ctrl+KY:块复制、块移动、块删除
Ctrl+KH:取消块定义
3. 程序载入与存盘
F3:载入程序 F6:切换窗口
F2:存盘 Alt+FN:新建程序
4. 编译和运行
Ctrl+F9:编译连接执行程序 Alt+F5:查看执行结果
Ctrl+F7:添加监视表达式 F7:进入子函数单步执行
F8:越过子函数单步执行 Ctrl+F2:取消单步执行
举例说明,见ex1-1.c。
第2章 程序的灵魂-算法
一个程序应包括两个方面的内容:
3 对数据的描述:即程序中的数据要指定它的类型和组织形式,也称数据结构。
4 对操作的描述:即程序中对要做的事要指明它的操作步骤,也称算法。
算法是程序的灵魂,也就是说,要计算机解决实际中的问题,“怎么解”是程序设计的关键。
2.1 算法的概念
(1)算法的定义
计算机算法:就是要计算机解决问题的操作步骤。
P13,例。
(2)算法的分类
计算机算法可分为两类:数值算法和非数值算法。
P14,例。
2.2 简单算法举例
P14,例2.1。
注意:解决同一问题可有不同的算法,算法有优劣之分。
P15,例2.2。
注意:循环是算法中常用的手段。
2.3 算法的特性
算法具有如下特性:
(1)有穷性
即经过有限步就能够完成。
P14,例2.1。P15,例2.2。
(2)确定性
即每一步都是确定的。
P14,例2.1。P15,例2.2。
(3)有零个或多个输入
即一个算法必须输入的数据可以是零个或多个。
P14,例2.1。P15,例2.2。
(4)有一个或多个输出
即一个算法可以输出一个或多个数据。
P14,例2.1。P15,例2.2。
(5)有效性
即算法中每一步骤都能有效地执行,并得到确定的结果。
P14,例2.1。P15,例2.2。
2.4 怎样表示一个算法
算法的表示法有多种,叙述如下:
(1)用自然语言表示
即把算法用人们日常使用的语言表示出来。
P14,例2.1。P15,例2.2。
特点:常常具有不确定性,不宜采用。
(2)用流程图表示
即把算法用一些特定的符号和图形表示出来。
P20,例2.6,例2.7。
特点:这是一种较好的表示法,经常采用。
(3)用N-S图表示
即把算法用一些特定的符号和图形表示出来。
P26,例2.11,例2.12。
特点:这也是一种较好的表示法,经常采用。
(4)用伪代码表示
即把算法用一些称为伪代码的文字和符号表示出来。
P29,例2.16,例2.17。
特点:这也是一种较好的表示法,经常采用。
(5)用计算机语言表示
即把算法用某种计算机语言符号表示出来。
P31,例2.20,例2.21。
特点:这当然是一种很好的表示法,可以输入计算机执行。
2.5 结构化程序设计方法
算法有三种基本结构,它们是:
(1)顺序结构:即算法的执行是按顺序一步接着一步的执行。
(2)选择结构:即算法的执行是对某些步骤可有选择的执行。
(3)循环结构:即算法的执行是对某些步骤可有限次的重复执行。
这三种基本结构的流程图见P23,图2.14,图2.15,图2.16,图2.17。用这三种基本结构设计程序称为结构化程序设计。
结构化程序设计的方法指的是:
1 自顶向下
2 逐步细化
3 模块化设计
4 结构化编码
P32,例。
第3章 数据类型、运算符与表达式
3.1 C的数据类型
数据是程序的必要组成部分,也是程序处理的对象。C规定,在程序中使用的每一个数据必须属于某一数据类型。
C语言中所有的数据类型见P38。
3.2 常量与变量
在程序运行过程中,值保持不变的量称为常量,值可能发生变化的量称为变量。
3.2.1 常量与符号常量
1. 常量
常量是日常所说的常数、字符、字符串等。
P38,例。
2. 符号常量
用#define定义的用标识符来表示的常量。
格式:#define 常量名 常量
功能:定义一个符号常量
P38,例3.1。
说明:常量名必须是一个标识符。
3.2.2 变量
1. 标识符
标识符是用来表示符号常量、变量、数组、函数、过程、类型及文件的名字的。
标识符的命名规则:
(1)以字母或下划线开头,由字母、数字和下划线组成;
(2)不能与关键字同名,最好不要与库函数名同名;
(3)长度无限定,但不同版本的C编译时有自己的规定;
(4)区分大小写。
P40,例。
2. 变量的声明
格式:类型名 变量名,… ;
功能:声明变量。
说明:(1)变量名必须是一个标识符,变量必须先声明后使用;
(2)变量一旦声明,系统就为它开辟一个相应类型的存储空间;
(3)变量所占用的存储空间的首地址称为该变量的地址。
P40,例。
3. 变量的赋值
格式:变量名=表达式;
功能:把=号右边表达式的值赋给=号左边的变量。
P40,例。
3.3 整型数据
3.3.1 整型常量的表示方法
整型常量常用三种形式表示:
(1)十进制:直接写;
(2)八进制:前加0;
(3)十六进制:前加0X或0x。
P41,例。
3.3.2 整型变量
1. 整型数据在内存中的存放形式
整型数据在内存中采用定点表示。
定点表示有原码、反码、补码之分,一般在机内使用补码。
原码:最高位为符号位,小数点定在最低位之后,数值用二进制表示。
反码:正数的反码与原码一样,负数的反码除符号位外各位取反。
补码:正数的补码与原码一样,负数的补码是反码加1。
例1:整数10的16位定点表示
因:(10)10=(1010)2
故:整数10的16位定点表示为
原码:
0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0
反码:
0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0
补码:
0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0
例2:整数-10的16位定点表示
因:(-10)10=(-1010)2
故:整数-10的16位定点表示为
原码:
1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0
反码:
1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1
补码:
1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 0
现代计算机一般用补码表示。
2. 整型变量的分类
(1)有三种整型变量
整型: int
短整型:short [int]
长整型:long [int]
(2)整型变量的分类
每种整型变量都可以是无符号的,无符号前加unsigned,有符号前加signed或省缺,于是可有6类整型变量。
P42,例。
(3)整型变量占用的存储空间及取值范围
P43,表3.1。
3. 整型变量的声明
格式:[unsigned] int|short|long 变量名,…;
功能:声明整型变量。
P44,例,例3.2。
4. 整型数据的溢出
int型的取值范围为-32768~32767(-215~215-1),超出这个范围称为溢出,此时可能输出难以理解的结果。
P44,例,例3.3。
3.3.3 整型常量的类型
整型常量一般按整型数据的取值范围自动划定,但也可强制规定它是什么类型,规则是:
无符号整型后加u或U;
长整型后加l或L。
P45,(1)~(5)
3.4 实型数据
3.4.1 实型常量的表示方法
实型常量常用二种形式表示:
(1)十进制小数形式:直接写,要有小数点,前或后至少要有一个数;
(2)指数形式:用e或E的前后加数据表示,前面是一个小数,后面是一个整数。
P45,例。
3.4.2 实型变量
1. 实型数据在内存中的存放形式
实型数据在内存中采用浮点表示
方法:设总位数为16,高12位为尾数,低4位为阶码。尾数与阶码最高位为符号位,尾数小数点定在最高位之后,阶码小数点定在最低位之后。
例1:实数10.0的16位浮点表示
因:(10.0)10=(0.1)10×10(2)10=(0.1)2×10(10)2
故:实数10.0的16位浮点表示为
0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0
例2:实数-10.0的16位浮点表示
因:(-10.0)10=(-0.1)10×10(2)10=(-0.1)2×10(10)2
故:实数-10.0的16位浮点表示为
1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0
注意:(1)位数一般实数是32位,表示法类似;
(2)阶码与尾数的位数不同的计算机有不同的规定。
(3)数据进行转化表示时,尾数表示为±0.a…的形式,且a不为0,故表示是唯一的。
(4)以上阶码与尾数是原码表示,实际上应转成补码。
2. 实型变量的分类
(1)有三种实型变量
单精度: float
双精度: double
长双精度:long double
(2)占用的存储空间及取值范围
P46,表3.2。
(3)实型变量的声明
格式:float | double |long double 变量名,…;
功能:声明实型变量。
P46,例。
3. 实型数据的舍入误差
由于单精度实型只保留7位有效数据,故实型数据超出7位时会造成舍入误差。
P47,例3.4。
3.4.3 实型常量的类型
实型常量一般按双精度double来处理,但也可强制规定它是什么类型,规则是:
单精度后加f或F;
双精度后加l或L。
P47,例。
3.5 字符型数据
3.5.1 字符常量
(1)一般字符常量
是用单撇号括起来的一个字符。
P48,例。
(2)特殊字符常量
是以反斜扞“\”开头后跟一些字母或数字组成的字符。
P48,表3.3。
P49,例3.5。
3.5.2 字符变量
只有一种类型:char
声明格式:char变量名,…;
字符变量可以用来存放一个字符。
P49,例。
3.5.3 字符数据在内存中的存放形式
字符型数据在计算机内以ASCII码的形式存放,每个字符占用一个字节。
方法:查ASCII码表,最高位填0。
例:字符’a’的存储形式
因:(a)字符=(97)10进ASCII码=(1100001)2进ASCII码
故:字符’a’的存储形式为
0 1 1 0 0 0 0 1
P50,例3.6,例3.7。
注意:一般字符的ASCII码值范围为0~127,无符号字符的ASCII码值范围为0~255。
3.5.4 字符串常量
(1)字符串常量
是用双撇号括起来的若干个字符。
P52,例。
(2)字符串常量的存储
字符串常量的存储是每个字符占用一个字节,尾部再加一个\0作为结束符。于是长度为n的字符串占用n+1个字节的存储空间。
P52,例。
3.6 变量赋初值
格式:类型名 变量名=常量表达式,… ;
功能:声明变量并赋初值。
P53,例。
3.7 各类数值型数据间的混合运算
各类数值型数据间的混合运算时会自动进行转换。
规则:(1)char,short型转为int型;
(2)float型转为double型;
(3)不同类型由低向高转换,即int →unsigned →long →double
P54,图3.10。
P54,例。
3.8 算术运算符与算术表达式
3.8.1 C的运算符简介
C语言的运算符有13类,P55。
学习运算符注意如下几点:
(1)运算符的功能:如+号运算的意义。
(2)与运算量的关系:如单目、双目,运算量的类型等。
(3)运算的优先级:如先* /后+-。
(4)结合方向:如算术运算从左到右,赋值从右到左。
(5)结果的类型:如两个整型数相加还是整型数。
3.8.2 算术运算符和算术表达式
1. 基本的算术运算符
基本的算术运算符有:+、-、*、/、%
P55,例。
注意:(1)+、-可作单目运算符,也可作双目运算符。
(2)/ 运算对整形是封闭的,如5/3的值是1。
2. 算术运算符的优先级和结合方向
(1)优先级:①单目+、-②*、/、%③双目+、-
(2)结合方向:从左到右
P55,例。
3. 强制类型转换运算符
格式:(类型标识符)表达式
功能:把表达式强制为类型标识符指定的类型。
优先级:与单目+-相同。
注意:(1)强制转换是一种单目运算;
(2)被强制转换变量本身并未转换。
P56,例,例3.8。
4. 自增、自减运算符
(1)运算符:+ +、--
(2)优先级:与单目+、-相同。
(3)结合方向:从右到左
P57,例。
注意:(1)自增与自减运算符只能用于变量;
(2)前+ +、--:先增值后引用;
后+ +、--:先引用后增值。
5. 有关表达式使用中的问题说明
表达式是把常量、变量、函数用各种运算符连接起来的合法的式子。C中的表达式简练、高效,但有时会出现岐义性,使得程序理解有一定的困难,不同版本的C对表达式的解释也有所不同。
P58,(1)~(3)
3.9 赋值运算符和赋值表达式
1. 赋值运算符
(1)运算符:=
(2)优先级:仅高于逗号“,”运算,低于其它运算。
(3)结合方向:从右到左
P59,例。
2. 类型转换
当赋值运算两边的类型不一致,且都是数值类型或字符型时,会自动发生类型转换,转换以左边变量的类型为准。
转换规则:
(1)实型赋给整型:舍去小数。
(2)整型赋给实型:值不变。
(3)双精度赋给单精度:取其前7位有效数字,反之值不变。P59,例。
(4)字符型赋给整型:低8位照搬,高8位视符号位补0或1。P60,例。
(5)整型赋给字符型:低8位照搬,高8位丢失。P60,例。
(6)整型赋给长整型:值不变,反之低16位照搬。P60,例。
(7)无符号型赋给有符号型:长度相同时最高位变为符号位,长度不同时高位补0或截去高位。P61,例。
(8)有符号型赋给无符号型:长度相同时最高位失去符号位,长度不同时高位补0或截去高位。P61,例。
P61,例3.9。
3. 复合的赋值运算
(1)运算符:+=、-=、*=、/=、%= 等
(2)优先级:与赋值运算“=”相同;
(3)结合方向:从右到左。
P62,例。
4. 赋值表达式
由赋值语句购成的表达式称为赋值表达式,这种表达式还可以嵌套,从右到左逐一进行赋值运算,表达式的值是最后一次赋值的值。
P63,例。
注意:(1)结合方向是从右到左的;
(2)复合的赋值运算也可购成赋值表达式;
(3)赋值表达式可出现在输出的语句中。
3.10 逗号运算符和逗号表达式
1. 逗号运算符
(1)运算符: ,
(2)优先级:最低;
(3)结合方向:从左到右。
P63,例。
2. 逗号表达式
格式:表达式1,表达式2,… ,表达式n
求解过程:从左到右逐一求表达式的值,整个表达式的值为最后一个表达式的值。
P64,例。