C程序设计
第1章--第8章
第 1章 C语言概述
,高级语言,
汇编语言:优点:可以充分发挥机器硬件的功
能, 并提高质量 。 缺点:必须熟悉机器的指令系统,
而指令系统又是和具体机器的内部结构密切相关的,
所以所编写的程序依赖于计算机硬件, 可读性和可
移植性比较差 。
一般高级语言:优点:可读性和可移植性比较
好 。 缺点:难以对硬件进行操作, 如内存地址, 位
操作等 。
1.1 介绍,
C语言:具有一般高级语言的特性,也具有汇编
语言的优点,所以有人称为, 中级语言,
高级语言有的,高级语言没有的:
?算术运算
?关系运算
?逻辑运算
?位运算
?单目、三目运算
?复合运算
1、语言简洁、紧凑,使用方便、灵活。 32个关键
字,9种控制语句。
2,运算符丰富 34种运算符
3,数据类型和数据结构丰富 。
基本类型 ( 整型, 字符型, 实型 )
构造类型 ( 数组, 结构体, 共用体 )
指针, 文件, 空类型
数据结构 ( 链, 表, 树, 栈等 )
1.2 C语言的特点
4、具有结构化控制语句
5、语法不严格松散结构,即语法检查不严格,编
程时必须控制好。
6,C语言允许直接访问物理地址,能进行位操作。
7、目标代码质量高,程序执行效率高。
8、输入输出采用函数而无输入输出语句,可移植
性好
1.3 用 C库函数组装程序
用库函数必须注意包含相应的头文件
#include <stdio.h>
#include <math.h>
#include <string.h>
1.4 程序格式和特点
1,main()函数必须有且唯一
2、函数是 C语言程序的基本单位
3、大小写敏感
4、无行概念 ( 1)、语句以分号结束
( 2)、以#号开头的编译预处理语句无分号
( 3),/*… */加在 C语言任何部分作注释说明
采用小写,大写有特殊意义(宏,常量等)
1.5 程序执行从 main函数开始
Turbo C 是一个集成环境,编辑、编译、连接、
执行。
1、源程序扩展名,c
2,Turbo C 的使用
TC 选择工作目录 建立工作环境 建立工
作环境 F9编译、连接。运行 Alt+R.
3、建立工作环境
例题 例 1-例 3
讲解、说明
上机题:
1、建立一个自己的工作环境
2、熟悉 Turbo C环境
3、输入并调试运行例 1-例 3
4、自己编写 C程序 习题 1.5,1.6
第 2章 数据描述和基本操作
程序
2.1 C的数据类型,
对数据的描述 (数据结构)
对操作的描述 (算法)
1、不同的数据占用的空间不同
2、对应的运算不同
数据类型( P38)
2.2 基本数据类型,
1、整型
shout 2字节
int 机器字长 (2字节) -215~(215-1)
long 4字节
2、无符号类型
只对整型;也包含字符型,存放正数的范围扩大一倍
Unsigned 整型 x;
2.2 基本数据类型,
3、实型
float 单精度 4字节
double 双精度 8字节
long double 长双精度 16字节
2.2 基本数据类型,
4、字符型
?存贮形式,按 ASCII码值 ;
?占一字节 ;
?与整型通用,相当一个字节整数。
2.2 基本数据类型,
5、类型长度运算符 sizeof(类型 )
用途:测试动态分配存贮空间
例如 A= sizeof(int);
2.3 常量和变量,
1、常量
( 1)、数值常量
整型常量
实型常量
十进制 自然表示
八进制 零打头
十六进制 ox打头
指数形式 E(e)前面有数,后
面是整数
小数形式,必须有,,”
( 2)、字符型常量
用单引号包围的单一字符 ‘ a’ ‘A’
字符常量没有结束标志
( 3)、字符串型常量
用双引号包围的 0个或多个字符序列
,china” 有结束标志
( 4)、特殊常量
(一)符号常量 如:宏定义
#define PI 3.14
(二)转义 字符 (换码序列) \字母 表示动作
见 P(48)
2、变量
( 1)、变量的定义 int x,y;
?先定义
?每个变量被指定为一确定类型
?便于编译系统检查 如 a%b
( 2)、变量标识符
C语言规定标识符只能由字母、数字和
下划线三种字符组成,且第一个字符必
须是字母或下划线。
用来标识变量名、符号常量名、函数名、数组名、
类型名、文件名的有效字符序列。
?保留关键字
?预定义标识符
?用户自定义
( 3)、变量的初始化
定义变量的同时给变量赋值
如:
int x=3,y=5;
2.4 表达式运算,
1、说明
例如 表达式 b=(a=x)*5
?运算符的功能
?与运算量的关系
?优先级
?结合方向
?结果类型
2、算术运算符 双目运算符
5%3=2
-5%3=? 5%-3=?
+、-、*,/、%(模运算符或求余运算符)
a%b 这里 a,b必须是整型数
5/3=1 -5/3=-1(-2)舍入的方向不因定,“向零取整原
则”
符号同左边的操作数
3、算术表达式
用算术运算符和括号将运算对象(也称操作数)
连接起来,符合 C语法规则的式子称 C算术表达式。
如,a*b/c-1.5+’a’
同级时“从左到右”的结合原则
4、复合的赋值运算
+=,-=,*=,/=,%=,<<=,>>=,&=,^=,|=
只要有赋值号优先级较低,只比逗号运算符高
如,a+=b a=a+b 累加器,注意 a一定是变量 b可
以是表达式或变量,结合规律从右到左
A+=3 a=a+3
X*=y+8 x=x*(y+8)
5、自增减运算
++,--
a++,++a 自增 a=a+1
a--,--a 自减 a=a-1
后置运算、前置运算
只能用于变量,不能用于常量或表达式;结合方向
是从右至左
6、关系运算
< <= > >= == !=
If(x==y) 真(非 0为真) 假( 0为假)
7、逻辑运算
&&(与) ||(或) !(非)
( 1)实型数不比较相等的
1.0/3.0*3.0==1.0
x=-y<ε 就是小到一定形式就行了
ε = 10- 6或 ε = 10- 8
e1?e2:e3 (e为表达式)
8、条件运算(三目)
3+ 3,6+ 8 逗号表达式,又称顺序求值运算符
9、逗号运算符和逗号表达式
2.5 类型转换,
1、隐式转换
(1)必然转换
(2)由低向高转换,一次到位转换 P54
(3)赋值转换
2、显示转换
强制类型运算 (类型)
第 3章 简单的 C程序设计
-顺序结构
3.1 C语句,
1、表达式语句
2、控制语句
3、函数调用语句
4、空语句
5、复合语句
3.2 格式化输入输出函数,
(一)、格式输出
Printf(“格式控制,,输出项序列);
(二)、格式输入
scanf(“格式控制,,地址序列);
3.3 字符输入输出函数,
(一)、输入字符
getchar()
(二)、输出一个字符
Putchar(c);
3.4 顺序结构程序设计举例
第 4章 逻辑运算和判断选取控

4.1 条件分支,
1,if语句的三种形式
( 1),if(表达式)语句
( 2),if(表达式) 语句 1;
else 语句 2;
( 3) if(表达式 1) 语句 1;
else if(表达式 2)语句 2;
else if(表达式 3)语句 3;
……
if语句的说明:
( 1)表达式一般为逻辑表达式或关系表达式,但
可以是任意表达式,是任意的数值类型(整型、实
型、字符型、指针型数据)
( 2) else 前面的分号不可缺少,它是 if语句内嵌
语句所要求的,缺少时语法错误。
( 3) if和 else后面可以是一个操作语句,也可以
是多个操作语句,若为多个语句必须用复合语句。
2,if语句的嵌套:
if语句中又包含一个或多个 if语句。
if(表达式 1)
if(表达式 2)语句 1;
else 语句 2;
else
if(表达式 3)语句 3;
else 语句 4;
3、条件运算符:
在 if语句中执行一个赋值语句且给同一个变量。
(1)条件运算符?,
(2)条件运算符优先于赋值运算符,低于关系运算符
和算术运算符。
(3)条件运算符的结合方向, 从右至左,
(4)条件运算符不能取代一般的 if语句
(5)表达式 1的类型可以与表达式 2和表达式 3的类型
不同。
4.2 开关分支 switch语句,
是多分支选择语句
格式:
Switch(表达式)
{ case 判断值 1:语句组 1; break;
case 判断值 2:语句组 2; break;
……
default,语句组 n; break;
}
switch语句的说明:
( 1) switch后面的表达式应是整型、字符型或是
枚举。
( 2)若表达式的值与某个 case后面的判断值相等
时就执行 case后面的语句组,没有匹配值时执行
default后面的语句组。
( 3) case后面的判断值不能重复。
( 4) case和 default出现的次序不影响执行结果。
( 5)执行完一个 case后面的语句,则转到下一个
case继续执行,所以必须用 break语句跳出。
第 5章 循环控制
5.1 循环结构,
循环结构是结构化程序设计的三种基本结构之一
( 1)当型循环结构,当条件成立时反复执行操作,
直到条件为假时才停止循环。
( 2)直到型循环结构:先执行操作,再判断条件
是否为假,若条件为假,再执行。如此反复,直到
条件为真为止。
5.2 C语言中循环语句,
1.while
2.for
3.do …… while
当型循环,先判断后执行
直到型循环,先执行后判断
1.while和 do …… while语句
( 1) while(条件)
{
语句;
}
如:
?
?
?
100
1i
is
1.while和 do …… while语句
( 2) do
{
语句;
} while(条件) ;
如:
?
?
?
100
1i
is
需要注意,
( 1)循环前的初始值
( 2)循环体内必须改变循环条件,使其趋于结束
( 3)循环体如果包含一个以上语句,应以复合语句出现
( 4)当 while后面的表达式第一次值为真时,二者等价,
否则二者不同。















2.for语句
“灵活, —循环次数确定或不确定(只给结束条件)
for(初值表达式;条件;修正表达式)
{
语句;
}
如:
?
?
?
100
1i
is
s=0;
for(i=1;i<=100;i++)
s+=i;
for语句的说明:
( 1)条件为真,则执行 for语句中指定的内嵌语句
( 2)初值表达式和修正表达式可以是逗号表达式
( 3) e1,e2,e3 均可缺少,但分号保留
( 4)可以取代 while语句
( 5)初值表达式可以和循环变量无关
5.3 辅助控制,
1.break语句
(1)跳出 switch结构
(2)用于循环体内,结束本层循环,一次退
出一层循环
2.continue语句
仅用于循环体内,使本次循环结束
3.goto语句
goto 语句标号;
标号:用标识符表示,规则同变量
退出多重循环,从内到外
5.4 循环的嵌套,
一个循环体内又包含另一个完整的循环结构
三种循环结构可以互相嵌套。
例题分析:
例题分析:
例 1 输入字符显示之。
#include <stdio.h>
Main()
{
char c;
while((c=getchar())!=EOF)
putchar(c);
}
例题分析:
例 2 打印 ASCII码 0-255的字符。
第 6章 数组
6.1 一维数组的定义和引用,
1 定义
类型说明符 数组名 [常量表达式 ]
如 int a[10];
说明,( 1)数组名
( 2)用方括号
( 3)数组长度,元素个数
( 4)不能含变量
数组:是有序数据的集合,数组中的元素应是同一类型。
2 引用
先定义,后使用的原则
C规定:逐个引用数组元素,不能一次引用整个数组
数组元素的表示形式:数组名 [下标 ]
规定:下标是整型常量或整型表达式
如 a[5] 或 a[2*3]等
3 初始化
( 1)在定义数组时对数组元素赋以初值
规定:只有静态存贮数组和外部存贮数组才能初始化
static ---静态 extern---外部
( 2)只给部分元素赋值
( 3)使数组中全部元素为 0
( 4)在对全部数组元素初始化时,可以不指定数组
长度。
6.2 二维数组的定义和引用,
1 定义
类型说明符 数组名 [常量表达式 ] [常量表达式 ]
如 int a[3][4];
是特殊的一维数组
存贮顺序:按行存贮,多维数组同理
2 引用
数组元素的表示形式:
数组名 [下标 ][下标 ]
如 a[0][0] 或 a[0][1]等
3 初始化
6.3 字符数组,
用来存放字符数据的数组是字符数组,字符数组中每个
元素存放一个字符。
1 定义
类型说明符 数组名 [常量表达式 ]
如,char a[10];
int a[10];
2 初始化
static char c[5]={?c?,?h?,?i?,?n?,?a?};
注 ( 1) 如果字符个数大于数组长度则语法错
( 2)如果字符个数小于数组长度则将字符赋给数组前
面的元素,其余元素为空格
( 3)字符个数等于数组长度时可以省略数组长度
3 引用
可以引用字符数组中的一个元素,得到一个字符。
4 字符串和字符串结束标志
字符数组长度:实际长度 \0;有效长度
字符串结束标志 ‘ \0?表示
,china” 共有 5个字符,但占 6个字节
可以用字符串常量来初始化字符数组
Static char c[]={“china”};
也可写成 static char c[]=“china”;
在 C中将字符串作为字符数组来处理,为了测定字符串
的实际长度 ‘ \0?作为结束标志。
5 字符数组输入、输出
(1)getchar()/putchar()
(2)用格式符 %c输入、输出
(3)将整个字符串一次输入、输出,用格式符 %s
如 Static char c[]=“china”;
Printf(“%s”,c);
注 (1)输出字符不包括结束符 \0;
(2) 用 %s时输出项是数组名;
(3) 长度大于实际长度时也到,\0结束;
(4)用 scanf函数输入一个字符串,利用一
个 scanf函数输入多个字符串时,以空格
分隔。
static char c[6];
scanf(“%s”,c);
printf(“%s”,c);
所以一维字符数组可以看作是, 字符串变量,
6 字符串输入、输出
(1)gets(str)
输入一个字符串到字符数组
(2)puts(str)
可以包含转义字符,如 ’ \0?,?\n?等
7 字符串函数 #include <string.h>
(1)拷贝 strcpy(str1,str2);
目的 源
注,str1长度 ≥ str2长度
str1是数组名形式,str2可以是字符串常量,不能用赋值
语句将字符串常量或字符数组赋给一个字符数组。
如,str1={“china”};
str1=str2;
(2)字符串连接
strcat(str1,str2);
目的 源
注:作用是把字符 2连到字符 1后面,结果放在字符数组
1中,所以字符数组 1必须足够大,初始化时不能省略长
度;连接时第一个 \0取消。
( 3)字符串比较 strcmp(str1,str2);
( 4)测试字符串长度函数 strlen(str)
( 5)将字符串中大写字母转成小写字母函数 strlwr(str)
( 6)将字符串中小写字母转成大写字母函数 strupr(str)
第 8章 模块化程序设计
8.1 函数定义,
在 C中子程序的作用是由函数来完成的,
使用的角度函数有两种 ( 1)系统函数( 2)用
户定义函数;从函数的形式上分( 1)无参函数( 2)
有参函数
格式,函数类型 函数名(形式参数)
{
函数体;
}
模块化设计;结构化编程。
说明:
函数类型 ---返回值的类型
如,float aver(成绩表)
void---无返值 main() 就应是 void类型
默认时为 int型
形参,(int a,int b,……,float r)
或 (a,b,……,r)
int a,b;
float r;
函数类型 函数名()
{ } 称为, 空函数,
8.2 函数参数和函数值,
1、形式参数和实际参数
定义函数时函数名后面括号中的变量 —形参
调用函数时函数名后面括号中的表达式 —实参
通过函数调用使两个函数中的数据发生联系
说明:
( 1)形参变量在函数调用前无分配存贮空间
( 2)实参可以是常量、变量、表达式或数组名
( 3)在被定义的函数中,必须指定形参类型
( 4)实参和形参类型应一致,否则类型不匹配错误
( 5)形参和实参间的传递是单向的, 值传递,,不同
单元。
2、函数的返值
( 1)函数的返值是通过 return语句获得的,return后
面可以是一个表达式。
( 2)函数值的类型,在定义函数时指定函数值类型,
如果不指定,按整型处理,函数类型决定返值类型。
( 3)如果被调函数中没有 return语句,则返值不确定。
( 4)如果不带回值,应将函数定义为 void类型。
8.3 函数的调用,
1、函数调用的一般形式
函数名(实参表列);
说明:
对实参表的求值顺序并不是确定的,一般是从右至
左,这种情况在 printf函数中也同样存在如:
i=2;
Printf(“%d %d\n”,i,++i);
结果,3 3
2、函数的调用方式
函数在程序中出现的位置;
( 1)函数语句
( 2)函数表达式
( 3)函数参数
3、被调函数的说明
在一个函数中调用另一个函数所具备的条件是:
( 1)被调函数是已经存在的函数(库函数、自定义)
( 2)如果是库函数则 #include 命令相关头文件
( 3)如果是用户自定义函数,在主调函数中对被调函数声
明:
函数类型 函数名(参数表);
特例:
( 1)函数的返值是整型或字符型
( 2)被调函数的定义在主调函数之前
( 3)在所有函数定义之前,说明了函数类型
8.4 函数的嵌套调用,
关系:自身可调用,相互之间可调用,即在调用一个函
数的过程中,又调用另一个函数。如图 8.5
函数 1 函数 2 函数 3
例 8.6 P155
8.5 函数的递归调用,
1、直接递归
2、间接递归
函数 A
函数 A 函数 B
8.6 数组作为函数参数,
数组元素作参数同变量相同,数组名作为参数时传
递整个数组。
当用数组名作函数参数时,实参和形参都应用数组
名(或指针变量)。
例 8.11 P165
说明
( 1)主调函数和被调函数分别定义数组
( 2)实参数组和形参数组类型应一致
( 3)实参数组和形参数组大小可以不一致,C编译对形参数
组大小不作检查,只是将实参首址传递给形参数组。
如:例 8.12
( 4)不是, 传值, 而是, 传址,
例,8.13
( 5)也可以用多维数组名作函数参数,同上。
例,8.14
8.7 局部变量和全局变量,
1、局部变量
在函数内定义的变量
例,float f1(int a)
{
int b,c;
……,
}
说明
( 1)主函数 main中定义的变量只在主函数中有效
( 2)不同函数中可以使用相同的变量
( 3)形参也是局部变量
( 4)在一个函数内部,可以在复合语句中定义变量,这些
变量只在复合语句中有效,离开复合语句该变量就无效。
8.7 局部变量和全局变量,
2、全局变量
在函数之外定义的变量称为外部变量,外部变
量是全局变量,全局变量可以为本文件中其它函数所共
用,它的有效范围为, 从定义的位置开始到文件结束, 。
例,8.15
说明
( 1)设全局变量的作用是增加了函数间数据联系,可以从
函数得到一个以上的返值,是, 双向传递的, 。
( 2)不要轻易使用全局变量
在程序执行过程中都占用存贮单元;通用性降低;不
清晰。
( 3)在定义点之前引用外部变量要用关键字 extern作, 外
部变量说明,
( 4)在同一源文件中,外部变量与局部变量同名,则在局
部变量的作用范围内,外部变量不起作用。
8.8 动态存贮变量与静态存贮变量,
1、变量的存贮类别
以上是从变量的作用域角度分;从变量值生存期角
度分静态存贮变量和动态存贮变量。
静态存贮区存放:全局变量
动态存贮区存放:
( 1)函数形参变量
( 2)局部变量(未加 static说明的)
( 3)函数调用时的现场保护和返回地址
程序区
静态存贮区
动态存贮区
用户区
说明
C语言中每个变量和函数有两个属性,数据类型和数据存贮
类别,一般形式。
存贮类别 数据类型 变量表;
存贮类别,auto(隐含) 自动
static 静态
register 寄存器
extern 外部
8.8 动态存贮变量与静态存贮变量,
2、局部变量的存贮方式
( 1)不作专门说明都是动态分配存贮空间的,存贮
在动态存贮区中,编译系统自动处理。
( 2)有时希望函数中的局部变量值在函数调用结束
后不消失这时就应该指定该局部变量为, 局部静态变量,
用 static说明
例 8.17 P174
说明
C语言中每个变量和函数有两个属性,数据类型和数据存贮
类别,一般形式。
存贮类别 数据类型 变量表;
存贮类别,auto(隐含) 自动
static 静态
register 寄存器
extern 外部
局部静态主变量说明
( 1)局部静态变量属于静态存贮类别,在静态存贮区内分配,
存贮单元在程序整个运行期间都不释放
( 2)在编译时赋初值,只赋初值一次,并保留上次函数调用
时的值
( 3)不赋值时编译时自动赋初值勤 0
( 4) C规定只有全局变量和局部静态变量时才能对数组初始

( 5)局部静态变量在函数调用结束后仍然存在,但其它函数
是不能引用它的
( 6)对使用频繁的局部自动变量或形参,可以作为寄存器变
量,用关键字 register说明 例 8.19
( 7)全局变量和局部静态变量不能定义为寄存器变量
8.8 动态存贮变量与静态存贮变量,
3、全局变量的存贮方式
( 1)允许其它文件中的函数引用
( 2)只能被本文件中的函数引用时,用 static说明
例 static int a;
存贮类别小结,P180
8.9 内部函数和外部函数
1、内部函数
函数只能被本文件中其它函数所调用。
static int fun(int a,int b)
2、外部函数
extern int fun(int a,int b)
属于, 隐含,
例 8.22
3、如何运行一个多文件的程序
建立一个, 项目文件,