1 /80
C语言程序设计总复习
2 /80
第一章 程序设计基础知识一,计算机工作原理存储程序,程序控制 。
二,计算机的机器语言和高级语言
机器语言:用 0和 1组成的机器指令编写的程序,就是机器语言源程序 。
汇编语言:用符号代替后的指令,就叫汇编语言,又称符号语言 。
高级语言:用接近人的自然语言和数学表达式的一种语言 。
高级语言源程序经过编译,转换为机器指令目标程序 。
3 /80
三,算法与程序设计
算法的概念程序设计 =算法 +数据结构
算法,解决一个问题而采取的方法和步骤 。 是解题方法的精确描述 。
算法的特点,输入性,输出性,有限性,确定性,可行性 。
表示方法,自然语言,传统流程图,N-S流程图,伪代码 。
考核要求:
1,了解计算机的工作原理
2,了解计算机语言的发展
3,掌握算法的概念及表示方法
4 /80
第二章
C 语言简介
5 /80
一、C语言发展简史
1969 ~ 1971年贝尔实验室的 Ken Thompson设计了 UNIX操作系统 。
1972~ 1973年贝尔实验室的 Dennis M Rilchie BCPL基础上设计了 C语言 。
1971977年出现不依赖于具体机器的 C语言便宜文本,C迅速推广 。
1983年美国 ANSI制定 C语言标准,称为 ANSI C。
6 /80
二,C语言的特点
C语言同时具有汇编语言和高级语言的优势 。
( 1) 语言简洁,紧凑,使用方便,灵活 。
32个关键字,9种控制语句,构成了 C语言的全部指令
( 2) 运算符极其丰富 。
34种运算符,表达式类型多样化,可以实现其他高级语言难以实现的运算 。
( 3) 生成的目标代码质量高,程序执行效率高 。 程序可移植性好 。
( 较之汇编语言 ) 。
( 4) 数据结构类型丰富 。
整型,实型,字符型,数组,结构体,共用体,指针等 。
( 5) 结构化控制语句 。
顺序,条件,循环结构,结构化设计的理想语言 。
7 /80
( 6) 语法限制不严格,程序设计自由度大 。
如书写形式自由,运行时不做数组边界检查;类型使用灵活;
允许几乎所有类型转换 。
( 7) 允许直接访问物理地址,进行位操作,操纵硬件 。
实现汇编语言的大部分功能,可以写系统软件 。
在 C语言中,除实现 顺序,选择 和 循环 三种基本结构等的 9条控制语句外,输入输出操作均由标准库函数 ( 不是
C语言的组成部分 ) 来实现 。
8 /80
考核要求
1,了解 C语言的发展;
2,理解 C语言的特点及 C程序的基本结构;
3,掌握 printf()函数和 scanf()函数的使用方法 。
9 /80
第三章
C 基本数据类型及表达式
10 /80
标识符,关键字
标识符:编程时用来标志识别的符号由字母或下划线开头,后跟字母,数字或下划线 。
任意组合的字符序列 。
可用作:变量名,数组名,函数名,标号等 。
关键字:有专门作用,不能用作各种标识符,32个关键字 。 12个标识符作为编译预处理的命令单词,使用时前面应加,#”:
11 /80
数据类型基本类型,char,int,float,double,void
数据类型 构造类型:数组,结构体,共用体,枚举指针
12 /80
1.常量的概念在程序运行过程中,其值不能被改变的量称为常量。
2.常量的分类
( 1)整型常量:例 123
( 2) 实型常量:例 -45.6
( 3) 字符常量:例 ‘ a’,‘ +’,‘ \n’等
( 4) 字符串常量,例,string”,,a”等 。
( 5) 符号常量:
不带参数宏定义,#include宏名 字符串带参数宏定义,#include宏名 ( 参数表 ) 字符串常量的类型,可通过书写形式来判别 。
常量
13 /80
1.变量的概念在程序运行过程中,其值可以被改变的量称为变量 。
2.变量的两个要素
( 1) 变量名 。 每个变量都必须有一个名字 ──变量名,变量命名遵循标识符命名规则 。
( 2) 变量值 。 在程序运行过程中,变量值存储在内存中 。
在程序中,通过变量名来引用变量的值 。
变量的定义:数据类型 变量名 ;
变量初始化:数据类型 变量名 =常数;
注意:所有变量应先定义后使用。
变量
14 /80
1,算术运算符 + - * / % ++ --
2,关系运算符 < > <= >= == !=
3,逻辑运算符 ! && ||
4,位运算符 << >> ~ | ^ &
5,赋值运算符 =及其扩展赋值运算符
6,条件运算符?,
7,逗号运算符,
运算符
15 /80
8,指针运算符 * &
9,求字节数运算符 sizeof
10,强制类型转换运算符 (类型 )
11,分量运算符,->
12,下标运算符 [ ]
13,圆括号运算符 ( )
注意:各运算符的含义、限制、优先级和结合方向
16 /80
优先级:从高到底
! → 算术运算符 → 关系运算符 → 逻辑运算符 → 赋值运算符 → 逗号运算符结合方向:
从右到左:单目运算符,赋值运算符和条件运算符其余均从左到右 。
17 /80
表达式概念:由运算符和运算量组成的式子就是表达式 。
表达式类型:算术表达式,关系表达式,逻辑表达式,赋值表达式,逗号表达式 。
注意:运算时的优先级,结合方向 。
类型转换:
1,类型转换从低到高自动转换 。
2,可进行强制类型转换,( 类型 ) 表达式 。
表达式
18 /80
考核要求
1,熟练掌握标识符的构成规则及关键子的基本作用 。
2,熟练掌握各种基本类型的特点及使用 。
3,掌握不带参和带参数宏定义和的使用,按要求写出替换 。
4,熟练掌握运算符表达式,并能进行正确的计算 。
19 /80
第四章控制结构
20 /80
结构化程序的设计思想及标准设计思想:自顶向下,逐步细化,模块化 。
标准:清晰第一,效率第二;具有良好特性 ( 只有一个入口,一个出口,无死语句,无死循环 )
三种基本结构顺序,分支 ( 选择 ),循环
21 /80
分支选择结构的 C程序设计单分支选择结构的 if语句形式,if( 表达式 ) 语句 1
执行:如果表达式为 真 执行语句 1
假 执行下一语句双分支选择结构的 if语句形式,if( 表达式 ) 语句 1
else 语句 2
执行:如果表达式为 真 执行语句 1
假 执行语句 2
22 /80
嵌套的 if语句
if( 表达式 1)
if( 表达式 2) 语句 1
else 语句 2
else 语句 3
注意:嵌套结构中 if和 else的配对原则,else与它上面最近的,未曾配对的 if配对 。
if(表达式 1) 语句 1
else if(表达式 2)语句 2
else if(表达式 3)语句 3
………
else if(表达式 n)语句 n
else 语句 n+1
23 /80
switch语句形式:
switch( 表达式 )
{ case 常量 1:语句组 1
case 常量 2:语句组 2

default:语句组 n
}
注意:当仅执行一个开关时,该 case后必须跟 break,让其跳出
switch语句 。
执行,计算表达式的值,同 case后的常量比较:找到相等的 case常量执行相应语句组至结束,否则执行 default后面的语句组直到结束 。
24 /80
考核要求
1,熟练掌握 if语句,利用 if语句实现单分支,双分支和多分支结构的程序设计 。
2,熟练掌握 switch语句,利用 switch语句实现多分支结构的程序设计 。
25 /80
循环结构的 C程序设计
while循环语句形式,while( 表达式 )
语句执行,真 执行语句部分,重复计算并判断计算表达式的值假 结束循环
26 /80
do while循环语句形式,do
语句
while( 表达式 )
执行,真 执行语句部分,并重复执行语句部分,计算表达式值假 结束循环先执行,后判断
27 /80
for循环语句形式,for( 表达式 1;表达式 2;表达式 3)
执行语句;
即,for( 循环变量赋初值;循环条件;循环变量增值 )
执行语句 ;
执行:
① 求解表达式 1;
② 求解表达式 2,若为真执行循环体,转置 ③ 。 若为假,结束循环 。
③ 求解表达式 3,转置 ② 。
注意:
① 循环结构中表达式的正确描述 。
② 三种循环语句的执行过程,特点及区别 。
28 /80
多重循环在循环体内包含另一个完整的循环结构 。
注意:
外层循环应完整包含内层循环,不能交叉 。
break语句和 continue语句
break语句:跳出 switch结构或循环结构;只能跳出所在循环,而不能终止多层循环 。
continue语句:结束本次循环,进行下一次循环的判定 。
29 /80
考核要求
1,熟练掌握 while语句,do while语句及 for语句的使用,
能够利用相应的语句实现循环结构的程序设计 。
2,能够实现双重循环结构程序的设计 。
3,掌握 break语句和 continue语句的使用
30 /80
第五章 数组
31 /80
一维数组定义:类型标识符 数组名 [常量表达式 ]。
引用:数组名 [下标表达式 ]
初始化:可在定义数组时直接赋初值 。 可部分赋初值 。
例如,int s[5]={78,87,77,91,60};
int s[ ]={1,2,3,4,5}
注意:
( 1) 常量表达式应为正的整型常量表达式 。
( 2) 数组元素的下标不能越界 。
32 /80
二维数组定义:类型标识符 数组名 [常量表达式 ][常量表达式 ];
引用:数组名 [下标表达式 ][下标表达式 ]
初始化:分行赋初值 。 可部分赋初值 。
例如,int s[3][2]={{1,2},{3,4},{5,6}};
int s[ ][2]={1,2,3,4,5,6};
33 /80
字符数组与字符串定义,char 数组名 [常量表达式 ];
注意:
① 字符串是用一维字符数组处理的 。
② 字符串有串结束标志,\0”。
③ 并非所有的字符数组的最后一个字符一定是 ‘ \ 0’。
④ 字符串的长度不计 ‘ \ 0’。
⑤能直接对字符串赋值,比较大小。
34 /80
常用字符串处理函数
gets 字符串输入函数
puts 字符串输出函数
strcpy 字符串拷贝函数
strcat 字符串连接函数
strclp 字符串比较函数
strlen 字符串长度测试函数
35 /80
考核要求:
1,熟练掌握一维数组的定义,引用及初试化 。
2,熟练掌握二维数组的定义,引用及初试化 。
3,熟练掌握字符数组及字符串的使用 。
4,掌握以下常用字符姓理函数的使用方法 。
gcts,puts,strcmp strcpy,strcat,strlen
5,能根据具体问题,利用数组来设计相应的程序 。
36 /80
第六章函数及变量存储类别
37 /80
C程序的结构
1,由一个或多个函数构成 。
2,有且只有一 main函数 。
3,C程序总是从 main函数开始执行 。
4,函数的类型:无参函数,有参函数:
标准函数 。 自定义函数
38 /80
函数的定义形式:存储类型标识符 类型标识符 函数名 ( 形式参数表 )
{说明部分语句部分
}
static只能由在同一文件中定义的函数调用 。 extern可被任何函数调用 。
39 /80
例如:
int max(int,int y)
{ int z;
if(x>y) z=x;
else z=y;
return z;
}
40 /80
函数声明的一般形式存储类型标识符 类型标识符 函数名 ( 形参表 )
注意:
以下情况不需作函数声明
① 被调函数的定义出现在主调函数定义之前 。
② 被调函数为标准函数,但在函数调用前应包含相应的头文件 。
41 /80
函数的调用一般形式:函数名 ( 实际参数表 )
具体形式:
① 把函数调用作为一个语句函数名(实际参数表);常用于调用一个可以忽略返回值或没有返回值的函数。
② 函数调用出现在表达式中。例如,c=max( a,b);
变量名 =函数表达式;常用于调用带返回值的函数,函数的返回值将参加表达式的运算
③ 函数调用作为一个函数的实参。
例如:
m=max(a,max(b,c));
42 /80
注意:
( 1) 实参和形参的个数相等,类型一致;
( 2) 实参与形参的传递:单向值传递 。
( 3) 实参和形参占用不同的存储单元 。
( 4)在函数调用时形参才被分配内存单元。调用结束后,
单元既被释放。
43 /80
函数的返回值
1、函数的返回值是通过 return语句获得的,若不需要返回值可不要 return语句。
2、定义函数时应指定函数值类型(返回值即此类型)。
3、若函数值类型与 return类型不一致,以函数类型为准。
4、对无返回值的函数,可将其类型定义为 void。
44 /80
函数的嵌套调用不能嵌套定义函数,但可以嵌套调用函数 。
函数嵌套调用是指在调用一个函数的过程中,该函数又调用另一个函数。
函数的递归调用函数的递归调用是指一个函数在程序运行过程中直接或简接地调用自己。
函数的嵌套调用和递归调用
45 /80
动态存储区和静态存储区内存中供用户使用的存储空间可分为程序区、动态存储区和静态存储区。
动态存储区:存放数据,生存期为运行中某个阶段。
静态存储区:存放数据,生存期为整个运行过程。
注意:
1、存放区域的不同,其生存期就不同。
2、数据存放的区域是由存储类型标识符和变量定义位置决定的。
46 /80
变量的存储类别完整的变量说明形式:
存储类型标识符 类型标识符 变量名其中存储类型标识符为:
auto( 自动 ),extern( 全局 )
static( 静态 ),register( 寄存器 )
47 /80
局部变量局部变量 是 函数 内 定义的变量,只在本函数内有效 。
1,自动变量
auto 类型名 变量名
2,静态变量
static 类型名 变量名注意:
① 自动变量存放在动态区,静态变量存放在静态区 。
② 静态变量仅初始化一次,在程序的整个运行中占用内存单元 。 在其所在的函数被调用时,它才可被使用,而在函数调用结束后,不可被使用 。
③ 形式参数也是局部变量 。
48 /80
全局变量全局变量 是 函数外部定义的变量 。 有效范围:从定义位置到本源文件结束 。
外部 静态变量的定义:
static 类型名 变量名;
49 /80
l
静态全局变量的存储方式、作用域、生存期等概念。
50 /80
考核要求
1,熟练掌握函数的定义和调用,及函数调用中数据传递的方式 。
2,能按要求设计函数 。
3,掌握动态存储和静态存储的概念,以及局部变量和全局变量的存储方式,作用域,生存期等概念 。
51 /80
第八章结构体与共用体
52 /80
结构体类型的定义形式,struct 结构体名
{成员表列 };
结构体变量的定义:
( 1) 先声明结构体类型再定义变量名
struct 结构体名
{
成员表列
};
struct 结构体名 变量名表列 ;
53 /80
( 2) 变量和结构体同时定义:
struct 结构体名
{
成员表列
}变量名表列 ;
struct { int num; char sex; int age; }student1,student2;
( 3) 直接定义结构类型变量:
struct
{
成员表列
}变量名表列 ;
54 /80
结构体成员的引用方法结构体变量名,成员名注意:
结构体成员变量可整体引用来赋值,如 stu1=stu2;
但不可整体的输入输出,如 printf(” %d”,stu1); ×
结构体变量的地址及成员的饿地址均可引用。
如 scanf(“%d”,&stu1.num );
printf(,0x%x”,&stu1);
结构体变量的初始化,即以初值的表的形式赋值。
例如,struct student stu2={9806,,liu li”,‘ f’,20,90};
55 /80
结构体型数组定义形式:
只需说明数组类型为结构体 。 如:
struct student stu[5];
scanf(“%d”,&stu[2].num );
56 /80
共用体概念:将几种不同类型的变量存放到同一段内存单元中 。
定义形式:
union 共用体名
{ 成员表列 ;
};
57 /80
共用体变量定义也有三种,
1,union 共用体名
{ 成员表列 ;
};
union 共用体名 变量表列 ;
2,union 共用体名
{ 成员表列 ;
}变量表列 ;
58 /80
3,union
{ 成员表列 ;
}变量表列 ;
注意:
①共用体变量中起作用的成员是最后一次存放的成员。
②共用体变量的地址和它的成员地址都是同一地址
③不能对共用体变量名赋值,也不能企图引用变量名来得到一个值,不能在定义共用体变量时进行初始化。
59 /80
考核要求:
1、掌握结构体型变量的定义和使用方法。
2、学会结构体数组定义、赋值及使用。
3、了解共用体的定义、共用体变量的定义和引用。
60 /80
第九、十章指针指针与函数
61 /80
一、指针的基本概念指针的概念:变量的地址 。
指针变量:存放变量地址的变量 。
指向:当把变量的地址存入指针变量后,我们可以说这个指针指向了该变量 。
指针的定义:
类型标识符 *标识符例,int *p;
与指针有关的数据定义形式
62 /80
二、指针的运算
1,指针运算符:取地址运算符 &
指针运算符 *
2,指针变量加 ( 减 ) 一个整数例如,p++,p--,p+i,p-i等
63 /80
3,指针变量赋值将一个变量地址赋给一个指针变量 。 如:
p=&a 将变量 a的地址赋给 p
p=array 将数组 array首地址赋给 p
p=&array[i] 将数组 array第 i个元素的地址赋给 p
p=max max为已定义的函数,将 max的入口地址赋给 p
p1=p2 p1和 p2都是指针变量,将 p2的值赋给 p1
64 /80
4、两个指针变量可以相减如果两个指针变量指向同一个数组的元素,则两个指针变量值之差是两个指针之间的元素个数 。
p1+p2无实际意义
5,两个指针变量比较如果两个指针变量指向同一个数组的元素,则可以进行比较 。
,p1<p2”的值为 1( 真 ),p2<p1”的值为 0( 假 )
65 /80
三、指针与数组
数组元素的引用:
( 1) 下标法,如 a[i];
( 2) 指针法,如 *(p+i)或 *(a+i)。
指向多维数组的指针若 int a[2][4];
则 a 代表整个二维数组的地址,即第 0行首地址
a+1 代表第 1行首地址 。
66 /80
二维数组的列地址
a[0] a[0]+0 &a[0][0] 第 0行第 0列元素的地址
… … …………
a[i]+j &a[i][j] 第 i行第 j列元素的地址元素 a[i][j]的地址
a[i]+j *(a+i)+j &a[i][j]
67 /80
四、指针与函数关系
1,可作函数参数 ;
2,可指向函数 ( 指针存放函数的入口地址 ) ;
定义形式:类型标识符 (*指针名 )( );
给函数指针变量赋值:只需给出函数名,而不必给参数。 p=max;
调用:可通过函数名,也可通过函数指针。 c=(*p)(a,
b);
3、函数的返回值可是一地址(某种类型的指针)。
定义类型:类型标识符 *函数名(参数表) {…}
68 /80
考核要求:
1,理解指针的概念,掌握指针变量的基本使用方法 。
2,学会利用指针变量来处理一维数组和二维数组 。
3,掌握利用指针来处理字符串的方法 。
4,学会指针数组的基本使用 。 尤其是利用指针数组来处理字符串 。
5、掌握指针作函数参数的使用方法。
69 /80
第十一章指针与结构体
70 /80
一,指向结构体型变量的指针定义形式:
结构体类型说明符 *指针变量名;
如,struct student stu1,*p;
引用方式
( 1) 结构体变量,成员名
( 2) ( *指针变量名 ),成员名
( 3) 指针变量名 → 成员名 ( → 为指向运算符 )
71 /80
二,指向结构体型数组的指针定义形式,struct student stu[3];
三,用指向结构体型的指针做函数参数 。
用指向结构体变量 ( 或数组 ) 的指针作实参,将结构体变量
( 或数组 ) 的地址传递给形参 。 则形参,实参共用一段存储空间 。 ( 节省空间,时间,带回处理结果 )
考核要求:
1,学会结构体变量,结构体数组指针的定义,赋值及使用
2,学会用指向结构体型的指针做函数参数的方法 。
72 /80
第十三章文件
73 /80
一,文件的概念文件是由磁盘文件和设备文件组成的。
磁盘文件是存储在外部介质上的程序和数据的集合,
是一批逻辑上有关系的数据。
每个磁盘文件都有文件名来标识二,文件的分类按数据的组织形式,数据文件可分为文本文件和二进制文件 。
从对文件处理方法上分为:“缓冲文件系统”和“非缓冲文件系统”。
74 /80
三,文件指针对文件的操作都是通过文件指针进行的 。
定义,FILE *fp;
四:缓冲文件操作步骤:
打开文件?文件读或写操作?关闭文件
75 /80
文件的打开与关闭例如,FILE *fP;
fp=fopen ( 文件名,使用文件方式 )
关闭文件
fclose ( fP)
76 /80
文件的读写
1,字符读写函数
fputc( ch,fp) ; 将字符 ( ch的值 ) 输出到 fp所指的文件上,成功返回 ch,否则返回 EOF。
ch=fgetc( fp) ; 从指定文件读入一个字符,成功返回字符,否则返回 EOF。
77 /80
字符串读写函数
fgets( str,n,fp);从指定文件读入长度不超过 n-1个字符串,并放到字符数组 str中。
fputs( str,fp);将字符串 str的内容写入文件
3、格式读写函数
fscanf (文件指针,控制字符串,参量表 );
按格式从文件读取数据,并赋给参量表 。
fprintf(文件指针,控制字符串,参量表 );
将参量表中的内容按格式写入文件 。
78 /80
4,数据块读写函数
fwrite(void *ptr,unsigned size,unsigned n,FILE *fp);将 ptr处的数据写入文件中
fread(void *ptr,unsigned size,unsigned n,FILE *fp); 从文件中读取数据,放至起始地址为 ptr处
79 /80
文件的定位
1,rewind(文件类型指针 ) 强制使当前工作指针指向文件的开头。
2,fseek(文件类型指针,位移量,起始点 ) 控制文件位置指针,以进行随机读写
3,ftell(文件类型指针 ); 得到文件位置指针的当前位置,
用相对文件开头的位移量表示。
80 /80