admin 管理员组文章数量: 1086019
2024年12月31日发(作者:计算机编程基本代码)
《程序设计基础》教案
第一章 程序设计和C语言
课 题
教 学
目 的
教 材
分 析
C语言概述
1、了解C语言出现的历史背景
2、掌握C语言程序的结构、书写格式和上机步骤
教案号
1
课时安排
教学重
点
教学难
点
2
C语言程序的结构
上机步骤
教学方
法
讲授与演示法相结
合
教具
计算机、投影仪
教
学
内
容
及
过
程
设
计
一 新课引入
从计算机应用基础中学过的计算机语言及语言处理系统引出C语言。
二 讲授新课
一、
C语言出现的背景
二、
C语言的特点
1。
语言简洁、紧凑,使用方便、灵活;
2。
运算符丰富
3.
数据类型多(整型、实型、字符型、数组类型、指针类
型、结构体类型、共用体类等)
4.
具有结构化的控制语句
5.
语法不太严格,自由度大
6.
既是高级语言,又具有低级语言的功能
7.
成目标代码质量高,程序执行效率
8.
可移植性好
三、C语言程序构成(采用程序实例加以说明,并提倡良好的程序设计
书写风格)
1.
C语言是由函数构成的,至少有一个main()函数;
2.
每个函数由函数首部和函数体组成;函数体由说明语
句、执行语句组成;
3.
每个C程序从main()函数开始执行,并在main()中结
束;
4.
每个语句和数据定义的最后必须加分号;
5.
C程序无输入、输出语句:输入功能由scanf()函数完
成;输出功能由printf()函数完成;
6.
可加注释/*……*/
四、上机步骤(上机环境:Turbo C 2.0)
1。
进入环境 2。
编辑源程序 3.
保存源程序 4。
编
译源程序
5。
执行程序,查看结果 6。 退出C环境
三 课堂小结
1、
C语言的构成要素,main函数在程序中的作用
2、 上机操作的过程
备注
安排上机实验,熟悉TC环境及简单的C语言程序构成
页码
1
第二章 算法——程序的灵魂
课 题
教 学
目 的
教 材
分 析
算法
1、了解算法的概念
2、掌握结构化程序的三种基本结构,及算法的表示方法
教案号
2
课时安排
教学重
点
教学难
点
2
算法的表示方法
结构化程序的三种基本结构
教学方
法
讲授与演示法相结
合
教具
计算机、投影仪
教
学
一 复习引导
从C程序的构成到C程序的设计过程
二 讲授新课
一个程序包括以下两方面内容:
1.
对数据的描述.在程序中要指定数据的类型和数据的组织形
式,即数据结构;
2。
对操作的描述。即算法,为解决一个问题而采取的方法和
步骤。
著名计算机科学家Wirth提出一个公式:数据结构+算法=程序
内
容
及
一、简单的算法举例
例1:设有两个杯子A和B,分别盛放酒和醋,要求将它们互换.
S1:C ← A S2:A ← B S3:B ← C
例2:求1~100的和
S1:sum←0,t←1; S2:sum←sum+t
S3:t←t+1 S4:若t 〈= 100,则转到S2,否则转
到S5;
S5:输出sum,结束。
过
程
二、算法的特征
1、有穷性; 2、确定性; 3、
有零个或多个输入;
4、
有一个或多个输出; 5、
有效性;
设
计
三、算法的表示
1、
用自然语言表示算法–通俗易懂,但有“歧义”。
2、
用传统流程图表示算法–直观、易懂。
程序的三种基本结构:顺序结构、选择结构、循环结构
A
P
P P
A
P
B
A B A
A
备注
页码
2
第二章
算法——程序的灵魂
课 题
教 学
目 的
教 材
分 析
算法
教案号
2
1
、了解算法的概念
2、掌握结构化程序的三种基本结构,及算法的表示方法
教学重
算法的表示方法
课时安排
点
教学难
点
2
结构化程序的三种基本结构
教学方
法
讲授与演示法相结
合
教具
计算机、投影仪
3、N—S流程图表示算法
P
A
当P成立
T F
B
当P成立
A
B
A
4、
用伪代码表示算法
5、
用计算机语言表示算法(即实现算法)
A
教
学
内
容
四、结构化程序设计方法结构化程序设计方法强调:
程序设计风格和程序结构的规范化,提倡清晰的结构:
①自顶向下 ②逐步细化
③模块化设计 ④结构化编码
及
过
三、课堂小结
1、
程序的三种基本结构:顺序、选择、循环
2、
5种描述算法的方法,关键是N-S图
3、
灵活运用三种基本结构,学会结构化的程序设计方法
程
设
四、布置作业
用N-S图表示求解以下问题的算法:
1、求10!
2、将100~200之间的素数打印出来
3、求两个数m ,n的最大公约数
计
备注
安排上机实验
页码
3
第三章
最简单的C程序设计-——顺序程序设计
课 题
教 学
目 的
教 材
分 析
数据类型
1、掌握C的数据类型
2、掌握整型、实型、字符型数据的常量及变量
教案号
3
课时安排
教学重
点
教学难
点
2
各种基本数据类型的常量和变量
不同类型的数据在内存中的物理存储形式
教学方
法
讲授与演示法相结
合
教具
计算机、投影仪
教
一 复习引导
上次课我们已经学习了程序的一个方面算法,现在来学习另一方面数
据结构。
二 讲授新课
C有四种基本数据类型,分别是整型、字符型、实型、枚举型
学
内
容
及
过
程
设
计
一、常量与变量
1、
常量:在程序运行过程中,其值不能被改变的量。
两种形式:一般常量和符号常量
1。 直接常量(字面常量):
整型常量:如12、0、—3等
实型常量:如4.5、-1。234等
字符常量:如‘a’、‘1'等,用单引号表示;
字符串常量:如“a”、“abc"、“1”,用双引号表示。
2。 符号常量:
符号常量即是用一个标识符来代替一个常量;符号常借助于预处
理命令#define来实现;
定义形式:#define 标识符 字符串
如:#define PI 3。1415926535
说明:
① 习惯上,符号常量用大写字母表示;
② 定义符号常量时,不能以“;”结束;
③ 一个#define占一行,且要从第一列开始书写;
④ 一个源程序文件中可含有若干个define命令,不同的
define命令中指定的“标识符”不能相同;
2、变量:在程序运行过程中,其值会发生变化。
1.每个变量必须有一个名字,变量名是标识符.
2.标识符是用来标识数据对象,是一个数据对象的名字。
3.命名规则:以字母或下划线开始,后跟字符、数字或下划线.
例:x1,_average,lotus_1_2_3,#abc,1fs,
4.变量名不能是关键字(即保留字,是C编译程序中保留使用的标
识符。 如:auto、break、char、do、else、if、int等)
5.变量必须先定义再使用
备注
页码
4
第三章
最简单的C程序设计---顺序程序设计
课 题
教 学
目 的
教 材
分 析
数据类型
1、掌握C的数据类型
2、掌握整型、实型、字符型数据的常量及变量
教案号
3
课时安排
教学重
点
教学难
点
2
各种基本数据类型的常量和变量
不同类型的数据在内存中的物理存储形式
教学方
法
讲授与演示法相结
合
教具
计算机、投影仪
教
学
内
容
及
过
程
设
计
备注
二、整型数据
1、整型常量的表示方法
1)
十进制 如:123,-456,0
2)
八进制数 如:0123,-011 (以0开头的
数)
3)
十六进制数 如:0x123,-0x12,0xABC (以0x
开头的)
2、整型变量
1)
整型数据在内存中以二进制形式存放,每一个整型变量在
内存中占2个字节。
例:定义整型变量i=10 和j= —10的存放形式。
2) 整型变量的分类:基本型int、短整型short、长整型long、无
符号型unsigned
3)
整型变量的定义
对变量的定义,一般放在函数体开头部分的声明部分(也可放
在函数中某一分程序内)
例:#include
main( )
{ int a, b, c, d; unsigned u;
a=12; b=-24; u=10;
c=a+u; d=b+u;
printf(“a+u=%d, b+u=%dn”,c,d); }
4)
整型数据的溢出
一个int 型变量的最大允许值为32767,如果再加1,其结果不是
32768,而是-32768。即“溢出"。
三、实型数据
1、实型常量的表示方法
(1) 十进制浮点数
如:0。123,.456,0.0,123.,123。0
整数部分和小数部分都可省,但不能同时省
(2) 指数形式
3
如:123e3,123E3代表123×10
指数部分为整常数; 尾数部分可以是整常数,也可以是实常
数;尾数部分和指数部分均不可省。E10, 100。e15。2, 。
e5均为不合法的浮点数。
页码
5
第三章 最简单的C程序设计——-顺序程序设计
课 题
教 学
目 的
教 材
分 析
数据类型
1、掌握C的数据类型
2、掌握整型、实型、字符型数据的常量及变量
教案号
3
课时安排
教学重
点
教学难
点
2
各种基本数据类型的常量和变量
不同类型的数据在内存中的物理存储形式
教学方
讲授与演示法相结
教具
计算机、投影仪
法
合
教
学
内
容
及
过
程
设
计
备注
2、实型变量
(1)实型数据在内存中的存放形式
一个实型数据一般在内存中占4个字节(32位)。实型数据是按
照指数形式存储的。
(2)实型变量的分类:单精度float、双精度double、长双精度long
double
四、字符型数据
1、字符常量
1)
括在一对单引号中的一个字符(单引号仅作界限符),如:
‘a’ 、‘X’
2
)
一个字符常量占1个字节,存放的是字符的ASCII码值.
3)
转义字符:
以‘ ’开头,后跟一个约定的字符或所要表示字符的十六进
制(或者八进制)的编码;
2、字符变量: 字符变量用来存放字符常量,只能放一个字符。
例:char c1=‘a', c2=‘A’; 一个字符变量在内存中占一个字
节.
五、字符串常量
1。 括在一对双引号中的0个或多个字符组成的序列;双引号仅作界限
符;如:
“C language programming”、“an”、“#123”、“ ”等为字符
串常量;
2.字符串常量的实际存储:在存储完字符串中的有效字符后还应存
储字符串结束标志‘0’。
六、变量赋初值
在定义变量时对变量进行赋值称为变量的初始化;
格式:类型说明符 变量1=值1,变量2=值2,……;
如: int a=3, b=4, c=5;
float x=3.4, y=0。75;
char ch1=‘K', ch2=‘P’;
三 课堂小结
1、C的基本数据类型int、float、double、char
2、
基本数据类型的常量表示、变量定义,及不同类型的数据在内存
中的存储形式
四、布置作业
练习P82:课后习题
页码
6
第三章 最简单的C程序设计---顺序程序设计
课 题
教 学
目 的
运算符与表达式
1、掌握C语言中的各种运算符
2、掌握运算符的优先级与结合性
教案号
4
教 材
分 析
课时安排
教学重
点
教学难
点
2
C语言中各种运算符的使用
混合表达式中运算符的运算顺序
教学方
法
讲授与演示法相结
合
教具
计算机、投影仪
教
学
内
容
及
过
程
设
计
一、讲授新课
用运算符和括号将运算对象(数据)连接起来的、符合C语法规则的句子
称为表达式。
优先级是指表达式中包含多个运算符时,先进行优先级高的运算符操
作,然后在进行优先级低的运算符操作;
当表达式中包含的几个运算符的优先级全相同时,由运算符的结合性来
决定他们的运算顺序。1)
从左至右 2)
从右至左
一、算术运算符与算术表达式
1、基本的算术运算符: + – * / %
优先级: * / % 高于 + –
结合性:左结合性
2、算术表达式:用算术运算符和括号将运算对象(操作数)连接起来
的、符合C语法规则的式子称为算术表达式。
3、强制类型转换运算符:(类型名)(表达式)
4、自增、自减运算符:+ + – –
作用是使变量的值增一或减一。
二、赋值运算符与赋值表达式
1、
简单的赋值运算符:= 除逗号表达式外,优先级最低
2、
复合赋值运算符: += *= %=等
3、
赋值表达式: <变量〉〈赋值运算符〉〈 表达式/值>
4、
嵌套的赋值表达式
三、逗号运算符与逗号表达式
1、
逗号运算符: , 所有运算符中优先级最低
2、
逗号表达式: 表达式1,表达式2,……,表达式n
求解过程:先求表达式1,再求表达式2,依次求下去,直到求出表达
式n,整个逗号表达式的值就是表达式n的值
四、各类数值型数据间的混合运算(P54)
二、 课堂小结
1、
++、——运算
2、
各种运算符的优先级 3、表达式值的求解
三、 布置作业
练习:P83 习题
备注
安排上机实验
页码
7
第三章 最简单的C程序设计--—顺序程序设计
课 题
教 学
目 的
教案号
1、了解C语句的概念及种类、掌握C语言常用的输入/出方式
顺序程序设计
2、学会简单的顺序程序设计
5
教 材
分 析
课时安排
教学重
点
教学难
点
2
C语言常用的输入/出方式
格式输入输出
教学方
法
讲授与演示法相结
合
教具
计算机、投影仪
教
学
内
容
及
过
程
设
计
一、复习引导
上一章介绍的常量、变量、运算符、表达式等都是构成程序的基本成
分.本章将介绍为编写简单程序所必需的一些内容。
二、讲授新课
一、C语句概述
1、C语句分类:
①控制语句:二个分支语句(if—else、switch),三个循环语句(for、
while、do—while),四个转移语句(continue、break、
goto、return)
②函数调用语句 如:printf(“Hello, world!”);
③表达式语句 如: x+y; i++; a=2; a=3*5, 40 ;
④空语句 ;
⑤复合语句 { 语句序列 }
二、赋值语句:赋值语句是由赋值表达式加上一个分号构成,如:
b=3;
三、 数据输入输出的概念及在C语言中的实现
1、
所谓输入输出是以计算机主机为主体而言的。
2、
C语言本身不提供输入输出语句,输入输出操作是通过函数调用
实现的。
3、
要使用C语言库函数,应用“#include"将有关头文件包括到用
户源程序中。
四、字符数据的输入输出
1、字符输出函数——putchar
语法:putchar(c)
语义:(向stdout终端)输出一个字符;
2、字符输入函数--getchar
语法:getchar ( ),是一个无参函数;
语义:(从stdin终端上) 输入一个字符,函数的值就是从输入
设备得到的字符。
五、格式输入输出
1、格式输出函数——printf
语法:printf (“格式控制”, 输出表列);
格式控制:是用双引号括起来的字符串,包含两种信息:
⑴ 普通字符和转义字符(这类字符总是原样输出)⑵格式说明:
由%和格式控制符组成.如:%d, %f等;(P77)如:printf(“a=%d,
b=%d”,a,b); 若a、b的值分别为2和3,则输出结果为: a=2, b=3
备注
页码
8
第三章 最简单的C程序设计—-—顺序程序设计
课 题
教 学
目 的
教 材
分 析
教案号
1、了解C语句的概念及种类、掌握C语言常用的输入/出方式
顺序程序设计
2、学会简单的顺序程序设计
5
课时安排
教学重
点
教学难
点
2
C语言常用的输入/出方式
格式输入输出
教学方
法
讲授与演示法相结
合
教具
计算机、投影仪
教
学
内
容
及
2、格式输入函数 scanf
语法:scanf(“格式控制”,地址表列);
格式控制:包含三类符号
⑴ 空白字符:(空格、Tab或t、n),输入时不必一一
对应;
⑵ 普通字符:(非格式转换说明符、非空白符、非%),输入
时必须一一对应;
⑶
格式转换说明符:
注意:scanf函数规定,组成输入项表的输入对象须是地址量;如:
scanf(“%d,%d,%d”,&a,&b,&c);
scanf(“a=%d,b=%d,c=%d”,&a,&b,&c);
①第一个输入语句,正确的输入数据流为:123,456,789
〈enter〉,处理的结果为: 123→a,456→b,789→c
②同理对第二个输入语句,正确的输入数据流应
是:a=123,b=456,c=789 123,456,789被赋给相应变量外,其余都被丢弃 过 程 设 计 六、顺序结构程序设计举例 例1:输入三角形的三边长,求三角形面积。 2 分析:三边为a,b,c,面积area=s(s-a)(s—b)(s—c),其中 s=(a+b+c)/2 程序: #include main() { float a,b,c,s,area; sacnf(%f,%f,%f”,&a,&b,&c); s=1。0/2*(a+b+c); area=sqrt(s*(s—a)*(s—b)*(s-c)); printf(“a=%7.2f,b=%7。2f,c=%7.2f,s=%7。2fn”,a,b,c,s); printf(“area=%7.2fn”,area); } 上机实验,学习简单的C程序设计。 备注 页码 9 第四章 选择结构程序设计 课 题 教 学 目 的 教 材 分 析 选择结构程序设计 1、掌握实现选择结构的两种语句、两个运算符 2、学会编写选择结构的程序 教案号 6 课时安排 教学重 点 教学难 点 2 关系运算符、if—else语句 嵌套if—else语句中的if与else匹配问题 教学方 法 讲授与演示法相结 合 教具 计算机、投影仪 教 学 内 容 及 过 程 设 计 备注 一、复习引导 上一次课已经介绍了程序基本结构之一,但在大多数情况下都要用到选择 结构。 二、讲授新课 一、关系运算符与关系表达式 1、关系运算符:〈 〈= > >= = = ! = 优先级:< 〈= > >= 高于 = = != 关系运算符低于算术运算符,高于赋值运算符 2、关系表达式:用关系运算符将两个表达式连接起来的式子。 关系表达式求值:关系成立,值为1;关系不成立,值为0 二、双分支选择语句 1、if语句的三种形式 语法1:if (表达式)语句; 语法2:if (表达式) 语句1;else 语句2; 语法3:if (表达式1) 语句1; else if (表达式2) 语句2; else if (表达式3) 语句3; …… else 语句n+1; 说明: 1。 if 关键字后均为表达式(逻辑表达式、关系表达式、赋值表 达式、变量等); 如:if (a=5) 语句; if (b) 语句; 2。 条件表达式必须用括号括起来,在语句后必须加分号; 3. 满足条件需执行一组语句时,该组语句必须用{ }括起来; 4. if 语句嵌套时,else 总是与它最靠近的未配对的if 匹配; 5.因为if 语句执行时总是简单地测试其中作为条件的“表达式”的值 是0还是非0,便可利用这种特性来简化程序设计。如对于: if (expression!=0) 完全可用 if (expression) 来 代替; 同理: if(!exp)语句;等价于:if(exp= =0) 语句; 三、课堂小结 1、关系运算符与关系表达式 2、if—else语句的应用。 页码 10 第四章 选择结构程序设计 课 题 教 学 目 的 教 材 分 析 选择结构程序设计 1、掌握实现选择结构的两种语句、两个运算符 2、学会编写选择结构的程序 教案号 7 课时安排 教学重 点 教学难 点 2 switch语句、条件运算符 嵌套if-else语句中的if与else匹配问题 教学方 法 讲授与演示法相结 合 教具 计算机、投影仪 教 学 内 容 及 过 程 设 计 备注 一、教授新课 一、三目条件运算符及其表达式 1、条件运算符:?: 2、格式:e1?e2:e3 3、语义:判e1的值,为1时计算e2,否则计算e3; 如:max=(a>b)?a:b 等价于 if (a>b) max=a; else max=b; 4、说明: 1) 条件运算符的结合方向自右至左 如:a>b?a:c〉d?c:d 等价于 a〉b?a:(c>d?c:d) 若int a=1,b=2,c=3,d=4;则表达式的值为________ 2) 条件运算符的优先级仅高于逗号运算符与赋值运算符; 3) 只有当if语句的真假均只执行一个赋值语句且给同一变量赋 值时,才能用条件表达式取代;如:if (a〉b) max=a; else max=b; 二、switch 语句 语法1: switch (表达式) { case C 1 :语句序列1; case C 2 :语句序列2; …… case C n :语句序列n; default:语句序列n+1; } 语法2:switch (表达式) { case C 1 :语句序列1;break; case C 2 :语句序列2;break; …… case C n :语句序列n;break; default: 语句序列n+1;break; } 说明:(1)switch后面的()内的表达式,ANSI标准允许他为任何类型 (2) case后的常量表达式一般不可以为实型数据。 (3) 当表达式的值与某个case后面的常量表达式的值相等时,就 执行此case后面的语句,若所有case中的常量表达式的值都 与表达式的值不相等,执行default后面语句. 页码 11 第四章 选择结构程序设计 课 题 教 学 目 的 教 材 分 析 选择结构程序设计 1、掌握实现选择结构的两种语句、两个运算符 2、学会编写选择结构的程序 教案号 7 课时安排 教学重 点 教学难 点 2 switch语句、条件运算符 嵌套if-else语句中的if与else匹配问题 教学方 法 讲授与演示法相结 合 教具 计算机、投影仪 教 学 内 (5) 每个case后面的常量表达式的值必须互不相同。 (6) 各个case与default出现次序不影响结果。 (7) break的使用(P99) (8) 多个case可以共用一组语句 三、选择结构程序举例 2 例:求ax+bx+c=0方程的根。 分析: (1)a=0,不是二次方程。 2 (2)b-4ac=0,有两个相等的实根。 2 (3)b-4ac>0,有两个不等的实根。 2 (4)b—4ac<0,有两个共轭的复根. N—S图:P102 容 及 过 二、课堂小结 1、 switch语句 2、 在编写程序过程中,注意分支的作用范围,及复合语句的运用。 三、布置作业 1、上机作业(P112):6、8 2、书面作业(P111)3、7 程 设 计 备注 上机实验,学习选择结构的程序设计 页码 12 第五章 循环结构程序设计 课 题 教 学 目 的 教 材 分 析 循环结构程序设计 1、掌握三种循环语句的语法结构 2、灵活运用循环语句 教案号 8 课时安排 教学重 点 教学难 点 2 三种循环语句while、do-while、for 三种循环语句的区别 教学方 法 讲授与演示法相结 合 教具 计算机、投影仪 教 学 内 容 及 过 程 设 计 一、引入新课 问题1:假如全班41人,欲从键盘上输入每人的数学成绩,然后计算出平 均成绩; 问题2: 编程计算n!. 重复执行一组语句是程序设计要求的基本功能之一。在C语言中可以用 以下语句来实现循环:(1)if 和 goto (2)while (3)do-while (4)for 二、讲授新课 一、goto语句及用goto构成循环 语法:goto label; 其中:label是语句标号,它命名的规则同变量名; 语义:使程序无条件地转向标号为label的语句去执行; 二、while语句 语法:while (exp) 循环体语句; 语义:当exp为真时,执行循环体;为假时,执行循环语句的后续语句; 如:用while语句构成循环,求sum=1+2+…+100 程序如下:main() { int i=1, sum=0; while (i〈=100) { sum+=i; i++; } printf(“%d",sum); } 说明:1) 循环体可以用复合语句; 2) 在while语句前应有为测试表达式(exp)中的循环控制变量赋 初值的语句,以确保循环的正常开始; 3)循环体内应有改变循环控制变量的语句,以确保循环进行有限次 后正常结束; 如:i=1;while (i〈=100) sum=sum+1; (死循环) 4) while 循环的特点是先判断后执行,故循环有 可能一次都不被执行; 如: i=3; while (i〈3) printf(“i=%dn”,i); 备注 页码 13 第五章 循环结构程序设计 课 题 教 学 目 的 教 材 分 析 循环结构程序设计 1、掌握三种循环语句的语法结构 2、灵活运用循环语句 教案号 8 课时安排 教学重 点 教学难 点 2 三种循环语句while、do—while、for 三种循环语句的区别 教学方 法 讲授与演示法相结 合 教具 计算机、投影仪 教 学 内 容 及 过 程 设 计 三、do-while语句 语法:do 循环体语句; while (exp); 语义:当exp为真时,执行循环体;为假时,执行循环语句的后续 语句; 如:用do—while语句构成循环,求 sum=1+2+…+100 程序如 下:main() { int i=1,sum=0; do { sum+=i; i++; } while (i<=100); printf(“%d",sum); } 说明: 1) 循环体可以用复合语句; 2) 循环控制变量在执行do前必须赋初值;循环体内应有改 变循环控制变量的语句; 3) do-while 循环的特点是先执行后判断,故循环至少被 执行一次; 如:i=3; do { sum+= i; i++; } while (i〉10); 三、课堂小结 1、 while、do—whilr语句的语法结构 2、 whie与do—while区别 3、 注意循环控制的范围 备注 页码 14 第五章 循环结构程序设计 课 题 教 学 目 的 教 材 分 析 循环结构程序设计 1、掌握三种循环语句的语法结构 2、灵活运用循环语句 教案号 9 课时安排 教学重 点 教学难 点 2 三种循环语句while、do—while、for 三种循环语句的区别 教学方 法 讲授与演示法相结 合 教具 计算机、投影仪 教 学 内 容 及 过 程 设 计 一、复习引导 从while和do—while语句中引入新的循环语句:for 语句 二、讲授新课 一、for 语句 语法:for(表达式1;表达式2;表达式3) 循环体语句; 语义: 1、先求表达式1; 2、求解表达式2,若其值为真,则执行第三步;若为假,则结束循环; 3、执行循环体中的语句; 4、求解表达式3; 5、转回第二步继续执行 如: for( i=1; i<=100; i++) sum=sum+i;可看成: for(循环变量赋初值;循环条件;循环变量增值)语句; 说明: (1)显然for循环更简洁,更灵活; (2)循环体可以是复合语句; (3)for语句中的三个表达式均可以是逗号表达式,故可同时对多个 变量赋初值及修改。如:for(i=0, j=1; j〈n && i j++) … (4)for语句中三个表达式可省: 二、几种循环的比较 (1)可以相互代替使用 (2)while, do—while循环,在while后面指定循环条件,在循 环体中应包含使循环趋向于结束的语句 (3)凡是在while中能完成的,在for 语句中也能完成. 三、break和continue语句 1、 break语句:可以用于switch语句中,也可以用于循环语句中,当 用于循环语句中时,用于在满足条件情况下,跳出本层循环。 2、 continue语句:用于循环语句中,在满足条件情况下,跳出本次循 环.即跳过本次循环体中下面尚未执行的语句,接着进行下一次的 循环判断。 备注 页码 15 第五章 循环结构程序设计 课 题 教 学 目 的 教 材 分 析 循环结构程序设计 1、掌握三种循环语句的语法结构 2、灵活运用循环语句 教案号 9 课时安排 教学重 点 教学难 点 2 三种循环语句while、do—while、for 三种循环语句的区别 教学方 讲授与演示法相结 教具 计算机、投影仪 法 合 四、循环结构程序设计 教 学 内 容 例1:用公式求π的近似值,直到最后一项的绝对值小于10为止。π /4≈ 1—1/3+1/5-1/7+…… # include main( ) { int s=1; float n=1.0, t=1, pi=0; while((fabs(t))>1e-6) { pi=pi+t; n+=2; s=—s; t=s/n; } pi=pi*4; printf(“pi=%10.6fn”,pi); } -6 及 过 程 三、课堂小结 1、 for语句的语法结构,特别是for语句中三个表达式的作用 2、 注意循环控制的范围 四、布置作业 上机练习:(P141)12、16 书面练习:(P140)3、5 设 计 备注 上机实验,学习循环结构程序设计 页码 16 第六章 利用数组处理批量数据 课 题 教 学 目 的 教 材 分 析 数组 1、掌握一维数组的定义和引用 2、掌握二维数组的定义和引用 教案号 10 课时安排 教学重 点 教学难 点 2 一维、二维数组的定义、引用、初始化 数组的存储形式,数组的首地址 教学方 讲授与演示法相结 教具 计算机、投影仪 法 合 教 学 内 容 及 过 程 设 计 一、 引入新课 数组是有序数据的集合,数组中每一个元素都属于同一个数据类型. 二、讲授新课 一、一维数组的定义和引用 定义数组,就是要: (1)规定数组的名称,其取名规则与变量名相同; (2)规定数组的类型,包括其数据类型和存储类型; (3)规定数组的大小,即数组的维数及包含的数组元素的个数。数组 元素就是包含在数组中的变量。 1、一维数组的定义: 类型说明符 数组名[常量表达式] 例如:int data[10], number[5]; 2、一维数组元素的引用 数组名[下标] 例如:a[0]=a[5]+a[7]-a[2*3] 3、 一维数组在内存中占一段连续的存储空间,其首地址:a或&a[0] 4、 一维数组的初始化 1。 在定义数组时对数组元素赋以初值;int a[10]={0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; 2. 可以只给一部分元素赋值; int a[10]={0, 1, 2, 3, 4}; 3。 如果想使一个数组中全部元素值为0,可简便实现; int a[10]={0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; 其实,对static数组不赋初值,系统会对所有数组元素自动赋 以0值,即上句等价于: static int a[10]; 4. C允许通过所赋初值的个数来隐含定义一维数组的大 小;int a[]={0,1,2,3,4,5,0}; 相当于 int a[7]={0, 1,2,3,4,5,0}; 二、二维数组的定义和引用 1、二维数组的定义 类型说明符 数组名[常量表达式1][常量表达式2]; 如:int number[5][4]; 数组的存储结构:以行为主序的连续空间 2、二维数组的引用: 二维数组元素的表示形式为:数组名[下标][下 标] 备注 页码 17 第六章 利用数组处理批量数据 课 题 教 学 目 的 教 材 分 析 数组 1、掌握一维数组的定义和引用 2、掌握二维数组的定义和引用 教案号 10 教学重 点 一维、二维数组的定义、引用、初始化 课时安排 教学难 点 2 数组的存储形式,数组的首地址 教学方 法 讲授与演示法相结 合 教具 计算机、投影仪 教 学 内 容 及 过 程 3、二维数组的初始化 1. 分行给二维数组赋初值:如 static int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}; 2. 可以将所有数据写在一个花括号内,按数组排列的顺序 对元素赋初值;如: static int a[3][4]={1,2,3,4,5,6,7, 8,9,10,11,12}; 3. 如果花括号内的初值个数少于每行中的数组元素个数, 则每行中后面的元素自动赋初值0;也允许代表给每行元素赋初 值的花括号的数目少于数组的行数,这时,后面各行的元素也自 动赋0值。 4.C语言规定,可以用初始化的方法来隐含定义二维数组第一维的大 小,即可以省略数组定义中第一个方括号中的表达式,但不能省 略第二个方括号中的表达式。如:static int a[3][4]={1,2,3, 4,5,6,7,8,9,10,11,12}; 等价于 static int a[ ][4]={1,2,3,4,5,6,7,8,9,10,11,12}; 在定义时也可以只对部分元素赋初值而省略第一维长度,但应分 行赋初值。如: static int a[ ][4]={{0,0,3},{0},{0,10}}; 4、二维数组的输入与输出 用二重循环,以a[m][n]为例 for(i=0;i〈m;i++) for(j=0;j {……} 三、课堂小结 1、 一维数组、二维数组的定义、引用及初始化 2、 一维数组、二维数组的存储形式 四、布置作业 上机练习:(P168)2 书面练习:(P168)5 设 计 备注 上机练习 页码 18 第六章 利用数组处理批量数据 课 题 教 学 目 的 教 材 分 析 字符数组 1、掌握字符数组的定义、初始化、引用,及输入与输出 2、掌握字符串处理函数 教案号 11 教学重 点 字符数组的输入与输出 课时安排 教学难 点 2 字符串处理函数 教学方 法 讲授与演示法相结 合 教具 计算机、投影仪 教 学 内 容 及 过 程 设 计 备注 一 复习引导 从一般的一维数组、二维数组到特殊的字符数组 二 讲授新课 一、字符数组的定义 char 数组名[exp]; 如:char c[10]; 二、字符数组的初始化 1。 给每一个字符型数组元素依次赋给一个单字符。如:char str [6]={‘C’, ‘h’, ‘i', ‘n’, ‘a’, ‘0’}; 2。 直接在赋值号右边给出字符串常量。如: char str[6] =“China"; 注意:a) 字符数组的长度可以通过赋初值的方式隐含定 义;如: char str[ ]={‘C', ‘h’, ‘i’, ‘n’, ‘a’, ‘0’}; char str[ ]=“China"; b) 如果括号中提供的初值个数(即字符个数)大于数 组长度,则作语法错误处理.如果初值个数小于数组长度, 则只将这些字符赋给数组中前面那些元素,其余的元素自 动定义为空字符(即‘0’). 三、字符串和字符串结束标志 字符串结束标志是“0”,如: char ch[]=”China”; “China”在存储器中实际占用6个字节: 四、字符数组的输入和输出 1、字符数组的输出 (1)用格式符“%c"控制的 printf(),逐个字符输出 (2)用格式符“%s”控制的 printf();字符数组值整体输出 (3)puts (字符数组名);字符数组值整体输出 注意: (1)puts用字符数组名,而不用数组元素名; (2)输出的字符串中可含转义字符;如: static char str[]=“ChinanBeijing”; puts(str); (3)如果数组长度大于字符串实际长度,也只输出到遇‘0'时结束(即 若一个字符数组中包含一个以上的‘0’,则遇到第一个时输出就结 束)。如:printf(“%sn”,“ABCD0EFGH”); 只输出ABCD 页码 19 第六章 利用数组处理批量数据 课 题 教 学 目 的 字符数组 教案号 11 1、掌握字符数组的定义、初始化、引用,及输入与输出 2、掌握字符串处理函数 教 材 分 析 课时安排 教学重 点 教学难 点 2 字符数组的输入与输出 字符串处理函数 教学方 法 讲授与演示法相结 合 教具 计算机、投影仪 教 学 内 容 及 过 程 设 计 备注 2、字符数组的输入 (1)用格式符“%s”控制的scanf(); 如: static char str1[5],str2[5],str3[5]; scanf(“%s%s%s", str1,str2,str3); /*不能写成 &str1*/ 若输入数据流为:How are you? str1、str2、str3分别接 收到“How”、“are"、“you?”,且在各个字符串的最后自 动加‘0’。 如果利用一个scanf函数输入多个字符串时,则以空格分 隔; (2)用gets( );如:char ch[16]; gets(ch); 注意: ①gets一次只能输入一个字符串; ②自变量应是数组名,而不能是数组元素名; ③要求从键盘上输入一个字符串直到遇到换行符为止,系统会自 动把换行符换成“0”加在字符串末尾. 与scanf不同,输入字符串中的空格也会被接收。 五、字符串处理函数 1、puts(字符数组) 功能:将一个以‘0’结束的字符序列输出到终端; 如: static char str[ ]=“China";puts(str); 说明:输出的字符串中可含转义字符. 2、gets(字符数组) 功能:从终端输入一个字符串到字符数组中,并得到一个函数值, 该函数值是字符数组的起始地址; 如: gets(str); 说明:gets与puts只能输入或输出一个字符串。 3、strcat(字符数组1,字符数组2) 功能:将字符串2接到字符串1的后而且去掉字符串1的尾空; 如: static char str1[30]=“YangZhou ”, str2[ ]=“China”; printf(“%sn”,strcat(str1,str2)); 说明: ①字符数组1的长度需足够大; ②去掉字符串1的尾空。 4、strcpy(字符数组1, 字符串2) 功能:将字符串2拷贝到字符数组1中去; 如: static char str1[10],str2[ ]=“China”; strcpy (str1,str2); 页码 20 第六章 利用数组处理批量数据 课 题 字符数组 教案号 11 教 学 目 的 教 材 分 析 1、掌握字符数组的定义、初始化、引用,及输入与输出 2、掌握字符串处理函数 课时安排 教学重 点 教学难 点 2 字符数组的输入与输出 字符串处理函数 教学方 法 讲授与演示法相结 合 教具 计算机、投影仪 教 学 内 容 及 过 程 5、strcmp(字符串1,字符串2) 功能:比较字符串1和字符串2,返回:①串1= 串2,返回0; ②串1>串2,返回正整数;③串1<串2,返回负整数。 6、strlen(字符数组) 功能:测试字符串的长度; 如: static char str1[10]=“China”; printf(“%dn",strlen(str)); 说明:不包含‘0’在内。特殊字符%%、’、、n代表一个字 符. 7、strlwr(字符串) 功能:将字符串中的大写字母转换成小写字母; 8、strupr(字符数组) 功能:将字符串中的小写字母转换成大写字母. 三、课堂小结 1、 字符串的结束标记 2、 字符串的输入与输出,gets、puts 3、 字符串处理函数 四、 布置作业 作业:(P169)13 设 计 备注 页码 21 第六章 利用数组处理批量数据 课 题 数组 教案号 12 教 学 目 的 教 材 分 析 学习用数组解决一些问题 课时安排 教学重 点 教学难 点 2 数组应用 数组应用 教学方 法 讲授与演示法相结 合 教具 计算机、投影仪 教 学 内 容 及 过 程 设 一、复习举例 我们已经学习了数组这种数据结构,但还要学会用数组来解决具体问题。 [习题7。2]:利用选择法对10个整数进行由小到大排序. 分析:选择排序的基本思想如下:第i趟排序选出第i小的元素,将其与 第i位上的元素进行交换,n个元素共需进行n-1趟。 main() { int i, j, min, temp, a[11]; printf(“Enter data:n”); for(i=1; i<=10; i++) { printf(“a[%d]=”, i); scanf(“%d”, &a[i]); } printf(“n”); for(i=1; i〈=10; i++) printf(“%d”, a[i]); printf(“n”); 二、课堂小结 1、 三种排序方法:冒泡排序、选择排序、插入排序 2、 字符数组或字符串的处理 三、布置作业 上机作业:(P168)4、6 书面作业:(P169)8 计 备注 上机练习数组的应用 页码 22 第七章 用函数实现模块化程序设计 课 题 函数的定义、调用 教案号 13 教 学 目 的 教 材 分 析 1、掌握函数定义的一般形式 2、掌握函数调用的一般形式 课时安排 教学重 点 教学难 点 2 函数定义、调用的一般形式 形式参数和实际参数 教学方 法 讲授与演示法相结 合 教具 计算机、投影仪 教 学 内 容 及 过 程 设 计 一、复习引导 一个C语言源程序可由一个主函数和若干个其他函数组成.由主函数调用 其他函数,其他函数也可以互相调用。 二、讲授新课 一、概述 1、一个源程序文件由一个或多个函数组成。 2、一个C程序由一个或多个源程序文件组成.这样可以分别编写、分别 编译,提高调度效率. 3、 序的执行从main 函数开始,在main函数中结束整个程序的运行。 4、 有函数都是平行的,即函数不能嵌套定义,函数可以互相调用,但不 能调用main函数。 5、 用户使用的角度看,函数有两种:标准函数(库函数)和用户自己定义 的函数 6、 从函数的形式看,函数分为两类:无参函数和有参函数 二、函数定义的一般形式: 1、 无参函数的定义 [类型说明符] 函数名() { 变量声明部分; 执行部分;} 2、 有参函数的定义形式 [类型说明符] 函数名(形式参数列表) { 变量声明部分; 执行部分;} 3、 空函数 [类型说明符] 函数名() { } 三、函数参数和函数的值 1、 形式参数和实际参数: (1) 形式参数:函数定义时函数名后括号中的变量 (2) 实际参数:函数调用时函数名后括号内的变量名 (3) 关于形式参数和实际参数的说明: ⒈形式参数只有在函数被调用时才分配存储单元,调用结束就 释放。 ⒉实际参数可以是变量、常量或表达式,但要求有确定值。 ⒊在被定义的函数中,必须指明形参类型。 ⒋实际参数与形式参数的类型应相同或赋值兼容 备注 页码 23 第七章 用函数实现模块化程序设计 课 题 教 学 目 的 教 材 分 析 函数的定义、调用 1、掌握函数定义的一般形式 2、掌握函数调用的一般形式 教案号 13 课时安排 教学重 点 教学难 点 2 函数定义、调用的一般形式 形式参数和实际参数 教学方 法 讲授与演示法相结 合 教具 计算机、投影仪 教 学 内 容 及 过 程 设 计 ⒌实参变量对形参变量的数据传递是“单向值传递”,即只由实 参传递给形参,而不能由形参传回给实参。 2、函数返回值 a) 函数的返回值是通过函数中的return语句获得的。 b) 函数返回值类型:定义函数时应予以指定,若不加指定,则当作 int处理,并且, 定义函数时,对函数返回值类型的说明一般应 和return语句中表达式的类型保持一致。 c) 若函数值类型与return语句中的表达式类型不一致,以函数值 类型为准进行类型转换。 d) 函数中若没有return语句,带回的是一个不确定的、无用的值。 e) 可以用“void”定义“无类型” 四、函数的调用 1、 函数调用的一般形式: (1) 无参函数的调用形式 函数名(); (2) 有参函数的调用:函数名(实际参数列表); 2、 函数调用方式 (1) 函数语句:不要求函数有返回值 (2) 函数表达式:函数出现在一个表达式中,函数会带回某一确定 值. (3) 函数参数:函数调用作为另一个函数的参数. 3、 对被调用函数的声明和函数原型 (1) 在一个函数中调用另一个函数的条件: 第一,被调用函数必须存在且允许调用; 第二,必须给出满足函数运行时要求的参数; 第三,在调用一个函数之前一般应该对被调用函数进行声 明。 (2) 函数说明 函数类型 函数名(参数类型1,参数类型2, …, 参数类 型n); 或:函数类型 函数名(参数类型1 参数名1,参数类型 2 …); 三、课堂小结 1、 函数的定义形式 2、 形参和实参的区别 3、 函数的声明和调用 四、布置作业 书面作业:(P218)2 备注 上机练习简单的函数的功能实现 页码 24 第七章 用函数实现模块化程序设计 课 题 教 学 目 的 教 材 分 析 函数的嵌套调用和递归调用 1、掌握函数的嵌套调用和递归调用 教案号 14 教学重 点 嵌套和递归调用 课时安排 教学难 点 2 递归调用 教学方 法 讲授与演示法相结 合 教具 计算机、投影仪 教 学 一、教授新课 一、函数的嵌套调用 1、 函数间可以相互调用 主函数可以调用其他函数,其他函数也可以调用除主函数以外的任 何函数(含自身) 2、 函数的嵌套调用:在调用一个函数的过程中有调用了另一函数 3、 函数嵌套调用执行过程(书本P155) 4、 举例: 例1:采用弦截发求方程根(P155~156) 内 容 及 过 程 设 计 二、函数的递归调用:直接或间接调用自身的函数为递归函数。 一个问题采用递归方法来解决时必须符合以下条件: (1)可将一个问题转化为具有同样解法的规模较小的问题; (2)必须有明确的结束条件。 [例8。7]:有5个人坐在一起,问第5个人多少岁,他说比第4个人大 2岁,问第4个人的岁数,他说比第3个人大2岁,问第3个人的岁数,他 说比第2个人大2岁,问第2个人,他说比第1个人大2岁,问第一个人, 他说是10岁。请问第5个人的岁数?(P158) 程序: age(int n) { int c; if(n= =1) c=10; else c=age(n—1)+2; return (c); } main( ) { printf(“%d",age(5));} 二、课堂小结 1、 函数的嵌套调用 2、 函数的递归调用 备注 页码 25 第七章 用函数实现模块化程序设计 课 题 教 学 目 的 教 材 分 析 数组作为函数参数 教案号 15 1、掌握数组作为函数参数的应用(虚实结合) 教学重 点 数组名作为函数参数 课时安排 教学难 点 2 虚实结合 教学方 法 讲授与演示法相结 合 教具 计算机、投影仪 教 学 内 容 及 过 程 设 计 一、讲授新课 一、数组元素作为函数实际参数 单向值传递:用赋值的方法,把实在参数的值赋给被调函数对应的 形式参数. 不希望破坏调用函数中作为实际参数对象的值时,使用“值传递"方 式; 注意:数组元素作为函数实参时如同简单变量。 二、数组名作为函数参数 1、 此时,应分别在主调函数和被调用函数中定义数组. 2、 实参数组应与形参数组类型保持一致 3、 实参数组与形参数组大小可以不一值 4、 型参数组可以不指定大小,再定义数组时,在数组名后面跟一个空 的方括号,有时为了在被调用函数中处理数组元素的需要,可以另 设一个参数,传递需要处理的数组元素的个数。 5、 用数组名作为函数实际参数时,不是把数组元素的值传递给形式参 数数组,而是把实参数组的起始地址传递给形参数组,这样两个数 组就共用同一段存储单元。这种参数传递有时也可以称为“地址传 递” [例8.13]:用选择法对数组中10个整数按由小到大排序。 main() { int a[10],i; printf(“enter the arrayn”); for(i=0; i<10; i++) scanf(“%d",&a[i]); sort(a,10); printf(“the sorted array:n”); for(i=0; i〈10; i++) printf(“%d",a[i]); printf(“n”); } 二、课堂小结 数组作为函数参数有两种情况:传递数组元素的值、传递数组名 三、 布置作业 书面作业:(P218)4、5 上机作业:(P218)3、 6 备注 上机练习 页码 26 第七章 用函数实现模块化程序设计 课 题 教 学 目 的 全局与局部变量、动态与静态变量 1、掌握局部变量和全局变量的作用范围 2、掌握变量的存储类别,了解内部函数和外部函数 教案号 16 教 材 分 析 课时安排 教学重 点 教学难 点 2 局部变量和全局变量、变量的存储类别 变量的作用域和生存期 教学方 法 讲授与演示法相结 合 教具 计算机、投影仪 教 学 内 容 及 过 程 设 计 备注 一、复习引导 在函数调用过程中,不仅要注意实参和形参的数据结合,而且要注意各个 变量的作用域和生存期。 二、讲授新课 一、局部变量和全局变量 1、局部变量 在一个函数内部定义的变量是内部变量,它只在本函数范围内有 效。 2、全局变量 在函数之外定义的变量称为外部变量,即全局变量(全程变量). 全局变量可以为本文件中其他函数所共用。它的有效范围为从定 义变量的位置开始到本源文件结束. 使用全局变量可以增加函数间的数据联系; 在同一源文件中,如果外部变量与局部变量同名,则在局部变量的 作用范围内外部变量不起作用; [例8.16]:外部变量与局部变量同名 int a=3,b=5; /*a,b外部变量*/ max(int a, int b); /*a,b局部变量*/ { int c; c=a〉b?a:b; return(c); } main() { int a=8; /*a局部变量*/ printf(“%d”,max(a,b));} 二、变量的存储类别 从变量值存在的(生存期)时间来分,可以分为:动态存储方式与静态 存储方式 静态存储方式:指在程序运行期间分配固定的存储空间的方式. 动态存储方式:在程序运行期间根据需要进行动态的分配存储空间的 方式。 1、auto变量 调用函数时系统自动分配存储空间,在函数调用结束时自动释放 这些存储空间,称这类局部变量为自动变量. 自动变量用关键字auto作存储类别的声明。它也可省。 页码 27 第七章 用函数实现模块化程序设计 课 题 全局与局部变量、动态与静态变量 教案号 16 教 学 目 的 教 材 分 析 1、掌握局部变量和全局变量的作用范围 2、掌握变量的存储类别,了解内部函数和外部函数 课时安排 教学重 点 教学难 点 2 局部变量和全局变量、变量的存储类别 变量的作用域和生存期 教学方 法 讲授与演示法相结 合 教具 计算机、投影仪 2、用static声明局部变量 函数中变量的值在函数调用结束后不消失而保留原值,在下次该函 数调用时,该变量已有值,即为上一次函数调用结束时的值.该局部 变量为静态局部变量。 说明: 1、静态局部变量属于静态存储类别,在静态存储区内分配存储单元。 在程序整个运行期都不释放.自动变量属于动态存储类别,占动态存 储区空间,函数调用结束后即释放。 2、对静态局部变量在编译时赋初值,程序运行时,它已有初值,以 后每次调用函数时不再重新赋初值而只是保留上次函数调用结束时 的值。对自动变量赋初值,不是在编译时进行的,而是在函数调用时 进行,每调用一次函数重新给一次初值。 3、对静态局部变量来说,如不赋初值,编译时自动赋初值0或空字符。 对自动变量来说,如不赋初值,它的值是一个不确定的值。 4、虽然静态局部变量在函数调用结束后仍然存在,但其他函数不能引 用。 3、register变量 将局部变量的值放在CPU中的寄存器中,需要用时直接从寄存器取出参 加运算,不必再到内存中去存取.这种变量称为寄存器变量。 4、用extern声明外部变量 1、在一个文件内声明外部变量 2、在多文件的程序中声明外部变量 5、用static声明外部变量 在定义外部变量时,加一个static声明,可以使此变量只能用于本文 件中. 注:对外部变量加或不加static声明,都是静态存储,只是作用范围不 同,都是在编译时分配内存的。 三、内部函数和外部函数 1、内部函数 一个函数只能被本文件中其他函数所调用. 即:static 类型标识符 函数名(形参表) 如:static int fun( int a,int b) 教 学 内 容 及 过 程 设 计 备注 页码 28 第七章 用函数实现模块化程序设计 课 题 全局与局部变量、动态与静态变量 教案号 16 教 学 目 的 教 材 分 析 1、掌握局部变量和全局变量的作用范围 2、掌握变量的存储类别,了解内部函数和外部函数 课时安排 教学重 点 教学难 点 2 局部变量和全局变量、变量的存储类别 变量的作用域和生存期 教学方 法 讲授与演示法相结 合 教具 计算机、投影仪 2、外部函数 一个函数可供其他文件调用,称为外部函数 定义时声明或调用时声明,即: extern int fun(int a, int b ) 定义时 或 extern fun(int a, int b ) 调用时 在定义时,也可省写extern ,即为外部函数 教 学 内 容 三、课堂小结 1、 局部变量和全局变量的作用域 2、 变量的存储类别有动态存储方式和静态存储方式 3、 关键字有auto、static、register、extern 四、布置作业 书面作业:(P219)17 及 过 程 设 计 备注 页码 29 第八章 善于利用指针 课 题 变量的指针与指针变量 教案号 17 教 学 目 的 教 材 分 析 1、了解指针与地址的概念 2、掌握指针变量的定义、引用及指针变量作为参数 课时安排 教学重 点 教学难 点 2 指针变量的定义、引用及指针变量作为参数 指针变量作为参数 教学方 法 讲授与演示法相结 合 教具 计算机、投影仪 教 学 内 容 及 过 程 设 计 一、讲授新课 一、地址与指针的概念 二、变量的指针与指针变量 变量的指针就是变量的地址. 指针变量是一种特殊类型的变量,它是用于专门存放地址的. 1、 指针变量的定义 定义形式:基类型 *指针变量名; 注意: a) 指针变量前的“*”,表示改变量的类型为指针型变量, “*”后的才是指针变量名。 b) 在定义指针变量时必须指定基类型 2、 指针变量的引用 指针变量只能存放地址,不要将一个整型量(或其他任何非地址类 型的数据)赋值给一个指针变量。 (1) 两个相关运算符: 1 &:取地址运算符。可以获取某个变量的地址 2 *: 指针运算符,获取某个指针变量所值向的变量的值 3 关于&和*运算符的说明: 假设已执行 pointer_1=&a; 1、&*pointer_1含义是什么? &*pointer_1与&a相同,即变量a的地址。 2、*&a的含义是什么? 先进行&a运算,得a的地址,再进行*运算. *&a、*pointer_1及变量a等价。 3、(*pointer_1) + + 相当于a + +。 它与*pointer_1 + + 不同。 4、*pointer_1 + + 等价于*(pointer_1 + +),即先进 行*运算,得到a的值,然后使pointer_1的值改变,这样 pointer_1不再指向a了。 3、 指针变量作为函数参数 函数的参数不仅可以是整型、实型、字符型等数据,还可以是指针 类型,它的作用是将一个变量的地址传送到另一个函数中。 例10.3对输入的两个整数按大小顺序输出。 先考察如下程序,看是否能得到预期的结果 备注 页码 30 第八章 善于利用指针 课 题 变量的指针与指针变量 教案号 17 教 学 目 的 教 材 分 析 1、了解指针与地址的概念 2、掌握指针变量的定义、引用及指针变量作为参数 课时安排 教学重 点 教学难 点 2 指针变量的定义、引用及指针变量作为参数 指针变量作为参数 教学方 法 讲授与演示法相结 合 教具 计算机、投影仪 教 学 内 容 及 过 swap(int p1, int p2) { int temp; temp = p1; p1 = p2; p2 =temp; } main() { int a, b; scanf(“%d, %d", &a, &b); if(a〈b) swap(a, b); printf(“n%d,%dn”,a,b); } 不能得到预期的结果. 改为: swap(int *p1,int *p2) { int temp; temp = *p1; *p1 = *p2; *p2 =temp;} main() { int a,b; int *pointer_1,*pointer_2; scanf(“%d,%d”,&a,&b); pointer_1=&a; pointer_2=&b; if(a printf(“n%d,%dn”,a,b); } 注:如果想通过函数调用得到n个改变的值,可以: 1、在主调函数中设n 个变量,用n个指针变量指向它们; 2、然后将指针变量作实参,将这n 个变量的地址传给所调用的函 数的形参; 3、通过形参指针变量,改变该n个变量的值; 4、主调函数中就可以使用这些改变了值的变量。 二、 课堂小结 本课介绍了指针与地址的概念,指针变量的定义、引用及作为参数的 使用。 指针:就是地址,即内存单元的编号。 指针变量:用来存放另一变量的地址(即指针)的变量。 例如:int a=5, *p=&a; printf ( “%d”, *p ); 注意:运算符*和&的用法,指针变量的自加自减运算. 程 设 计 备注 页码 31 第八章 善于利用指针 课 题 教 学 目 的 教 材 分 析 数组与指针 掌握指针与数组的知识 教案号 18 课时安排 教学重 点 教学难 点 2 指向数组的指针变量 指向二维数组的指针 教学方 法 讲授与演示法相结 合 教具 计算机、投影仪 一、复习引导 上节课介绍了指针变量的定义及其赋值。一个变量有地址,一个数组 包含若干元素,每个数组元素都在内存中占用存储单元,它们都有相应的 地址。指针变量既然可以指向变量,当然也可以指向数组和数组元素(把 数组起始地址或某一元素的地址放到一个指针变量中)。 教 学 内 容 及 过 程 设 计 二、 讲授新课 所谓数组的指针是指数组的起始地址,数组元素的指针是数组元素的 地址。 引用数组元素可以用下标法(如a[3]),也可以用指针法,即通过指 向数组元素的指针找到所需的元素。使用指针法能使目标程序质量高(占 内存少,运行速度快)。 一、指向一维数组的指针 定义形式: int a[10]; int *p; p=&a[0]; 或 p=a; 含义:把数组的首地址赋给指针变量p。 也即: int *p=&a[0]; 或 int *p=a; 二、通过指针引用数组元素 按C的规定:如果指针变量p已指向数组中的一个元素,则p+1指向 同一个数组中的下一个元素(而不是简单地加1)。 如果p的初值为&a[0],则: p+i « a+i « &a[i],即指向a数组的第i个元素。 *(p+i) « *(a+i) « a[i]。 指向数组的指针变量也可以带下标,如p[i]与*(p+i)等价 引用数组元素时,可以用: 1、下标法,如:a[i] 2、指针法,如:*( a+i ) 或 *( p+i ) 其中,a是数组名,p是指向数组的指针 备注 页码 32 第八章 善于利用指针 课 题 教 学 目 的 教 材 分 析 数组与指针 掌握指针与数组的知识 教案号 18 课时安排 教学重 点 教学难 点 2 指向数组的指针变量 指向二维数组的指针 教学方 法 讲授与演示法相结 合 教具 计算机、投影仪 教 学 内 容 及 过 程 设 计 注意指针变量的运算。如果p指向数组a的首个元素,则: ⑴ p++ (或 p+=1 ),使p指向下一元素a[1]。 ⑵ *p++ 等价 *(p++)。作用是先得到p指向的变量的值(即*p), 然后再使p+1→p。 ⑶ *(p++)与*(++p) 不同.前者为a[0],后者为a[1] ⑷ (*p)++表示p指向的元素值加1,即(a[0])++ ⑸ 如果p当前指向a数组中第i个元素,则: *(p— -)相当于a[i- -],先对p进行*运算,再使p自减; *(+ + p)相当于a[+ +i],先使p自加,再作*运算. *(— - p)相当于a[— —i],先使p自减,再作*运算。 三、数组名作函数参数 用数组名作实参,在调用函数时是把数组的首地址传送给形参。即实 参数组与形参数组共占同一段内存。 如果有一个实参数组,想在函数中改变此数组的元素的值,实参与 形参的对应关系有以下4种情况: 1、形参和实参都用数组名; main() { int a[10]; f (a,10);…… } f ( int x[],int n ){ …… } a和x指的是同一个数组 2、实参用数组名,形参用指针变量; main() { int a[10]; f( a, 10 ); …… } f( int *x, int n ) { …… } 开始时,x指向a[0] 备注 页码 33 第八章 善于利用指针 课 题 数组与指针 教案号 18 教 学 目 的 教 材 分 析 掌握指针与数组的知识 课时安排 教学重 点 教学难 点 2 指向数组的指针变量 指向二维数组的指针 教学方 法 讲授与演示法相结 合 教具 计算机、投影仪 教 学 内 容 及 过 程 设 计 3、实参形参都用指针变量; main() { int a[10], *p; p = a; f ( p, 10 ); …… } f ( int *x, int n ) { …… } 实参p和形参x都指向数组a 4、实参为指针变量,形参为数组名。 main() { int a[10], *p; p = a; f( p, 10 ); …… } f ( int x[], int n ) { …… } p指向数组a,x和a共用同一段内存单元 四、指向二维数组的指针和指针变量 1、二维数组的地址 int a[3][4]; 一级指针:(二维数组某一个元素的指针) a[i], *(a+i) , &a[i][0] 都是元素a[i][0]的地址。 a[i]+j , *(a+i)+j , &a[i][j] 都是元素a[i][j]的地址. 二级指针:(二维数组某一行的地址) a+i , &a[i] 是二维数组中第I行的地址(行号从0计算) 二维数组元素的引用: (1) 下标法:a[i][j] (2) 指针法: *(a[i]+j) , *(*(a+i)+j) 2、二维数组与指针 (1) 指向二维数组元素的指针变量(一级指针变量) 定义: 二维数组元素类型 *指针变量名; 使用过程与指向一维数组元素的指针变量基本相似,只是要 注意数组越界情况。 (2) 指向二维数组某一行的指针变量(二级指针变量) 备注 页码 34 第八章 善于利用指针 课 题 数组与指针 教案号 18 教 学 目 的 教 材 分 析 掌握指针与数组的知识 课时安排 教学重 点 教学难 点 2 指向数组的指针变量 指向二维数组的指针 教学方 法 讲授与演示法相结 合 教具 计算机、投影仪 教 学 内 容 及 过 程 定义形式:数组元素类型 (*指针变量名)[常量表达式]; 含义:定义了一个指针变量,该指针变量指向一个长度为常量表 达式值的一维数组 例如:int (*q)[4]; 定义了一个指针变量q,他指向一个长度为4的整型数组,此时, q的值是该一维数组的起始地址,而不是该一维数组的第一个元素 的地址。 有二维数组: int a[3][4]; 若有:int (*q)[4]; 使q指向二维数组第0行的赋值语句是:q = a;或q=&a[0]; 使q指向二维数组第i行的赋值语句是:q = a+i;或q=&a[i]; 在此前提下:二维数组元素a[i][j]可以采用 *(*q+j)引用。 若有:int *q ; 使q指向二维数组第一行第一个元素的赋值语句是q = a[0];或 q = *a; 三、课堂小结 本课介绍了指向数组的指针,主要是指向一维数组的指针。用指针变 量p指向数组a,指针变量p可以++、-—,表示指向数组的上一元素或下 一元素。但C编译程序不作下标越界检查。使用指针既方便有灵活,但初 学者容易搞错。还介绍了指针与二维数组,指向二维数组的指针有指向元 素的指针和行指针,使用时应注意它们的区别。 设 计 四、布置作业 《C语言习题集》同步练习 备注 页码 35 第八章 善于利用指针 课 题 指针与字符串 教案号 19 教 学 目 的 教 材 分 析 在掌握指针与数组的知识基础上,掌握字符串的指针与指向字符串的指针 变量 教学重 指向字符串的指针变量 课时安排 点 教学难 点 2 用指针处理字符串 教学方 法 讲授与演示法相结 合 教具 计算机、投影仪 教 学 内 容 及 过 程 设 计 一、讲授新课 一、多维数组的指针作函数参数 一维数组的地址可以作为函数参数传递,多维数组的地址也可作 函数参数传递。在用指针变量作形参以接受实参数组名传递来的地址 时,有两种方法: 1、用指向变量的指针变量; 2、用指向一维数组的指针变量。 二、字符串的指针和指向字符串的指针变量 1、字符串的表示形式 (1)用字符数组存放一个字符串。 如:main() { char string[ ]=“I love China!”; printf(“%sn", string); } (2)用字符指针指向一个字符串。 如:main() { char *string=“I love China!”; printf(“%sn", string); } 2、字符串指针作函数参数 3、字符指针变量和字符数组的讨论 (1)字符数组由若干个元素组成,每个元素中放一个字符,而字 符指针变量中存放的是地址,决不是将字符串放到字符指针变量 中。 (2)赋值方式。对字符数组只能对各个元素赋值,不能用以下 办法对字符数组赋值;char str[14]; str=“I love China."; 对字符指针变量,可以采用下面方法赋值: char *a; a= “I love China。"; /*赋给a 的是串的首地址*/ (3)对字符指针变量赋初值: char *a=“I love China。"; 等价于 char *a; a=“I love China。"; 而对数组的初始化: char str[14]={“I love China.”}; 不等价于 char str[14]; str[]=“I love China.”; 即数组可以在变量定义时整体赋初值,但不能在赋值语句中整 体赋值。 备注 页码 36 第八章 善于利用指针 课 题 教 学 目 的 教 材 分 析 指针与字符串 教案号 19 在掌握指针与数组的知识基础上,掌握字符串的指针与指向字符串的指针 变量 教学重 指向字符串的指针变量 课时安排 点 教学难 点 2 用指针处理字符串 教学方 法 讲授与演示法相结 合 教具 计算机、投影仪 教 学 内 容 及 过 程 设 计 (4)如果定义了一个字符数组,在编译时为它分配内存单元, 它有确定的地址。 而定义一个字符指针变量时,给指针变量分配 内存单元,在其中可以放一个地址值,也就是说,该指针变量可 以指向一个字符型数据,但如果未对它赋一个地址值,则它并未 具体指向一个确定的字符数据。这很危险. 如: char str[10]; scanf(“%s”,str); 是可以 的 char *a; scanf(“%s",a); 能运行,但危险,不提倡, 在a单元中是一个不可预料的值.应当 char *a,str[10]; a=str; scanf(“%s”,a); (5)指针变量的值是可以改变的,数组名虽然代表地址,但它 的值是不能改变的。可以下标形式引用所指的字符串中的字符。 如:main() {char *a=“I love China。”; a=a+7; printf(“%s”,a); } 又如:char str[]={“I love China.”}; str=str+7; printf(“%s”,str); 是错的 (6)用指针变量指向一个格式字符串,可以用它代替printf 函数中的格式字符串。也可以用字符数组实现,但由于不能采用 赋值语句对数组整体赋值。 如:char *format; format=“a=%d,b=%fn”; printf(format,a,b); 等价于:printf(“a=%d,b=%fn",a,b); 也可以:char format[ ]=“a=%d,b=%fn”; printf(format, a,b); 二、课堂小结 本课介绍了指针与二维数组、指针与字符串,指向二维数组的指针有 指向元素的指针和行指针,使用时应注意它们的区别。我们既要掌握用数 组处理字符串,也要掌握用指针变量处理字符串.要区分这两种方法的不 同之处。 三、布置作业 《C语言习题集》同步练习 备注 上机实验 页码 37 第八章 善于利用指针 课 题 教 学 目 的 教 材 分 析 指针与函数、指针数组 1、了解指针与函数的概念 2、掌握指针数组,二级指针等知识 教案号 20 教学重 点 教学难 点 掌握指针数组,二级指针等知识 指针数组,二级指针 课时安排 2 教学方 法 讲授与演示法相结 合 教具 计算机、投影仪 教 学 内 容 及 过 程 设 计 一、复习引导 前面介绍了指针与维数组、指针与字符串,我们可以用指针变量指向 整型变量、字符串、数组,也可以指向一个函数。 二、 讲授新课 一、函数的指针和指向函数的指针变量 函数的地址:函数存储区域的首地址就是该函数的入口点,其函数名 表示了入口地址。 1、函数指针变量的定义: 存储类型 数据类型 (*函数指针名)( ); 例:static int (*p)( ); 说明: (1)函数的调用可以通过函数名调用,也可以通过函数指针调用。 (2)(*p)() 表示定义一个指向函数的指针变量,它不是固定指向哪 一个函数的,而只是表示定义了这样一个类型的变量,它是专门用来 存放函数的入口地址的。 (3)在给函数指针变量赋值时,只需给出函数名而不必给出参数, 如:p=max; 。 (4)用函数指针变量调用函数时,只需将(*p)代替函数名即可(p为 指针变量名),在(*p)之后的括号中根据需要写上实参。如:c= (*p)(a,b); f) 对指向函数的指针变量,像p+n、p++、p——等运算是无意义的。 2、返回指针值的函数 一个函数可以带回一个整型值、字符值、实型值等,也可以带回指针 型的数据,即地址.其概念与以前类似,只是带回的值的类型是指针类 型而已。 格式: 类型名 *函数名(参数表); 例: int *a(int x, int y); a是函数名,调用它以后能得到一个指向整型数据的指针(地 址)。 关于函数的返回值是指针的情况,程序设计时应注意: 1、因数组名是地址常量,用于接受这种返值的对象不能是数组名, 这与把数组名作为实在参数传递给形式参数的情况不同(作为形 式参数的数组名总被视为指针)。 备注 页码 38 第八章 善于利用指针 课 题 教 学 目 的 指针与函数、指针数组 1、了解指针与函数的概念 2、掌握指针数组,二级指针等知识 教案号 20 教 材 分 析 课时安排 教学重 点 教学难 点 2 掌握指针数组,二级指针等知识 指针数组,二级指针 教学方 法 讲授与演示法相结 合 教具 计算机、投影仪 教 学 内 容 及 过 程 设 计 2、不应将局部于被调用函数的指针作为返值返回给调用者,理由是 局部于被调用函数的数据对象执行返回语句离开被调用函数后,原 来分配的被调用函数的所有局部对象的存储空间立即被收回(释 放),虽然调用者已经获得了正确的地址值,但此时它指向的存储区 域的内容可能已经发生了变化,或许已经分配给其他函数了。如果 调用函数中仍然使用这个指针去存取那个区域中的数据,得到的可 能并非原先的数据.对于这种情况的正确做法是应该把所处理的对 象定义成全局对象或static型对象。 二、指针数组和指向指针的指针 1、指针数组的概念 一个数组中的元素均为指针类型,称为指针数组. 形式: 存储类型 类型名 *数组名[数组长度] 例如: static int *p[4] 定义指针数组时也可以进行初始化,如: static char ch[][20]={“Beijing",“Nanjing”, “Shanghai",“Guangzhou"}; char *p[ ]={ch[0],ch[1],ch[2],ch[3]}; 该例也可以等价定义为: char *p[ ]={“Beijing”,“Nanjing”,“Shanghai”, “Guangzhou”}; 2、指向指针的指针 在本章开头已提到“间接访问”变量的方式。利用指针变量访问 另一个变量就是“间接访问”。 如果在一个指针变量中存放一个目标变量的地址,这就是“单级 间址".指向指针的指针用的是“二级间址”方法。从理论上讲,间址 方法可以延伸到更多的级.但实际上在程序中很少有超过二级间址的。 级数愈多,愈难理解,容易产生混乱,出错机会也多. 二级指针的定义: char **p; 含义:表示指针变量p是指向一个字符指针变量(即指向字符型数据 的指针变量)的。 三、 课堂小结 本课介绍了指针数组、二级指针、指针与函数。要搞清它们的定义及 应用; 注意区分: char a[5]; 与 char (*a)[5]; int *p(int x); 与 int (*p)( ); 备注 页码 39 第八章 善于利用指针 课 题 指针数组作main函数的形参、掌握指针的应用 教案号 21 教 学 目 的 教 材 分 析 1、了解指针数组作main函数的形参 2、掌握指针的应用 课时安排 教学重 点 教学难 点 2 掌握指针的应用 指针的应用 教学方 法 讲授与演示法相结 合 教具 计算机、投影仪 教 学 内 容 及 过 程 设 计 一 复习引导 上节课介绍了二级指针、指针数组,而指针数组的一个重要应用是作 为main函数的形参。main()函数是我们C语言程序必不可少的,以往使 用时main()是不带参数的。实际上是可带参数的,如:main(argc, argv) . 二 讲授新课 一、指针数组作main函数的形参 带参数的main原型: main( int argc, char *argv[ ] ) { …… } 说明: 第1个参数是指命令行中参数的个数,含文件名本身。 第2个参数是一个指向字符串的指针数组. main函数是由系统调用的。当处于操作命令状态下,输入main所 在的文件名(经过编译、连接后得到的可执行文件名),系统就调用main 函数.参数应和命令一起给出。 命令形式: 命令名 参数1 参数2 ……参数n 例如:有一个目标文件名file1,今想将两个字符串“China”, “Beijing”作为传送给main函数的参数。可写成: file1 China Beijing 例:编写一程序echo。c,实现将命令行上除程序名之外的所有给出 的其他参数都回显到显示器上。 main(int argc, int *argv[ ]) { while(argc>1) { ++argv; printf(“%s”, *argv); —— argc; }} 若将该程序编译、连接、装配成echo。exe,则在命令行上输入: echo hello, world!〈enter〉 则通过虚实结合后得:argc=3,argv[0]指向echo,argv[1]指向hello, argv[2]指向world! 结果为:hello, world! 备注 页码 40 第八章 善于利用指针 课 题 指针数组作main函数的形参、掌握指针的应用 教案号 21 教 学 目 的 教 材 分 析 1、了解指针数组作main函数的形参 2、掌握指针的应用 课时安排 教学重 点 教学难 点 2 掌握指针的应用 指针的应用 教学方 法 讲授与演示法相结 合 教具 计算机、投影仪 教 学 内 容 及 过 程 设 计 二、有关指针的数据类型和指针运算的小结 1、有关指针的数据类型的小结 见书中的表 2、指针运算小结 (1)指针变量加(减)一个整数 例:p++、p—-、p+i、p—=i等 (2)指针变量赋值 将一个变量地址赋给一个指针变量。p=&a; p1=p2; (3)指针变量可以有空值,即该指针变量不指向任何变量.如 : p=NULL; (4)两个指向同一数组元素的指针变量可以相减 (5)两个指向同一数组的指针变量可作关系运算 三、习题举例: 习题10.5 有n个人围成一圈,顺序排号。从第一个人开始报数(从 1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。 程序: main() { int i, k, m, n, num[50], *p; printf(“Input number of person:n=”); scanf(“%d”,&n); p=num; for( i=0; i i=0; k=0; m=0; while ( m { if( *(p+i)!=0) k++; if(k==3) { *(p+i)=0; k=0; m++; } i++; if( i= =n) i=0; } while(*p==0) p++; printf(“The last one is NO.%dn”,*p); } 三、布置作业 《C语言习题集》同步练习 备注 页码 41 第九章 用户自己建立数据类型 课 题 教 学 目 的 教 材 分 析 结构体类型与变量的定义及使用 1、结构体类型的定义 2、结构体变量的定义、初始化及引用 教案号 22 课时安排 教学重 点 教学难 点 2 结构体变量的定义、初始化及引用 结构体变量的使用 教学方 法 讲授与演示法相结 合 教具 计算机、投影仪 一、引入新课: 到目前为止,已介绍了基本类型的变量,也介绍了一种构造类型的数据 --—数组。但是只有这些数据类型是不够的,有时需要将不同类型的数据 组合成一个有机的整体,以便与应用.这些组合在一个整体里的数据要求 相互关联,这就是我们所要介绍的———结构体。 教 学 内 容 及 过 程 设 计 二、讲授新课 一、结构体概述 1、C语言没有提供现成的结构体数据类型,需要用户在程序中根据需要 定义。 2、结构体类型定义的一般形式: struct 结构体名 { 成员列表 }; 其中,结构体名用作结构体类型的标志,成员表列的定义形式如下: 类型名 成员名; 二、定义结构体类型变量的方法 1、结构体类型定义只是指定了一个结构体数据的模型,其中并无具体 数据,系统也不为它分配内存单元。为了能在程序中使用结构体类型的数 据,应当定义结构体类型的变量,并在其中存放具体数据。 2、结构体变量定义方法: (1) 先声明结构体类型再定义变量名 形式:struct 结构体名 { 成员列表 }; struct 结构体名 变量名1,变量名2; (2) 声明结构体类型的同时定义变量名 形式:struct 结构体名 { 成员列表 }变量名1,变量名2; (3) 直接定义结构体类型变量 形式:struct { 成员列表 }变量名1,变量名2; 其中以第一种方式最常用。 说明:(1)类型与变量是不同的含义,不要混淆。 (2)对结构体变量中的成员,可以单独使用。 (3)成员也可以是一个类型已定义的结构体变量。 备注 页码 42 第九章 用户自己建立数据类型 课 题 结构体类型与变量的定义及使用 教案号 22 教 学 目 的 教 材 分 析 1、结构体类型的定义 2、结构体变量的定义、初始化及引用 课时安排 教学重 点 教学难 点 2 结构体变量的定义、初始化及引用 结构体变量的使用 教学方 法 讲授与演示法相结 合 教具 计算机、投影仪 教 学 内 容 及 过 程 设 3、结构体变量的引用 结构体变量的引用应遵守以下规则: (1) 不能将一个结构体变量作为一个整体进行输入输出。只能对该 结构体变量的各个成员分别进行输入输出.引用结构体变量的 成员的方法是:结构体变量名.成员名,其中的“."是成员运 算符 (2) 如果成员本身又属于一个结构体类型,则要用若干个成员运算 符,一级一级的找到最低的一级的成员,只能对最低级的成员 进行赋值或存取以及运算。 (3) 对结构体变量的成员可以像普通变量一样进行各种运算. (4) 可以引用结构体变量成员的地址,也可以引用结构体变量的地 址。 4、 结构体变量的初始化 例如: main() { struct student { long num; char name[20]; char sex; int age; }a={89032,”liling”,’M’,21}; …… } 三、课堂小结 1、 结构体类型定义 2、 结构体变量定义 3、 结构体变量引用 4、 结构体变量初始化 注意区别结构体类型与结构体变量,并且要知道结构体类型不是惟 一的,是可以根据不同的需求来建立不同的结构体类型的 计 备注 四、布置作业 书面作业:(P330)1 页码 43 第九章 用户自己建立数据类型 课 题 教 学 目 的 教 材 分 析 结构体数组、结构体类型数据与指针 1、结构体数组的应用 2、指向结构体类型数据的指针的应用 教案号 23 课时安排 教学重 点 教学难 点 2 指向结构体类型数据的指针 指向结构体类型数据的指针 教学方 法 讲授与演示法相结 合 教具 计算机、投影仪 一、复习引导 一个结构体变量的指针就是该结构体变量所占据的内存段的起始地 址.可以设一个指针变量,指向一个结构体变量,此时指针变量的值就是结 构体变量的起始地址。指针变量也可以用来指向结构体数组中的元素。 教 学 内 容 及 过 程 设 二、讲授新课 一、 指向结构体变量的指针定义及赋初始值 定义结构体类型:struct 结构体名{ 成员列表 }; 定义结构体变量:struct 结构体名 结构体变量名; 定义指向结构体变量的指针变量: struct 结构体名 *指针变量 名; 指针变量名= & 结构体变量名; 二、引用结构体变量中的成员 (1) 结构体变量名.成员名 (2) (*指针变量名).成员名 注意,这里的()不能省略,因为 “.”运算符的优先级高于“*”运算符 (3) 指针变量名 -〉 成员名,其中“ -〉” 称为指向运算符。 注意分析以下几种运算:(p是指向结构体变量的指针变量,n式结 构体变量的成员名) p ->n 得到p指向的结构体变量的成员n的值 p —>n++ 得到p指向的结构体变量的成员n的值,用完该值后再 将它加1 ++ p ->n 得到p指向的结构体变量的成员n的值加1,然后再使 用它。 计 三、指向结构体数组的指针 例如:指向结构体数组的指针的应用。 struct student{ int num; char name[20]; char sex; int age;}; struct student stu[3]={{10101,”Li Lin",’M’,18}, {10102,”Zhang Fun”,’M’,19}, {10104,”Wang Min”,'F’,20}}; 备注 课 题 教 学 目 的 教 材 分 析 页码 教案号 44 23 第九章 用户自己建立数据类型 结构体数组、结构体类型数据与指针 1、结构体数组的应用 2、指向结构体类型数据的指针的应用 课时安排 教学重 点 教学难 点 2 指向结构体类型数据的指针 指向结构体类型数据的指针 教学方 法 讲授与演示法相结 合 教具 计算机、投影仪 教 学 内 容 及 过 程 设 计 main( ) { struct student *p; for(p=stu; p printf(“%5d%—20s%2c%4dn",p->num,p—〉name, p->sex,p->age); } 对“->”、“."、“[ ]”、“()”的进一步说明 (1) 上述运算符具有相同的运算优先级和结合性; (2) ++p->num的执行效果等价于: ++(p->num); (3) (+ +p)->num的执行效果是:先执行p=p+1, 然后再 执行p->num(注意p的值已经改变); (4)(p+ +)->num的执行效果是:先存取p->num,然后 再执行p=p+1; (5) p+ +->num的执行效果同( p + +)->num; 与定义指向普通数组的指针一样,C语言允许定义指向结构数组 的指针.如果p是指向结构数组的指针,那么p将指向该结构数组 的起始地址(第0个元素的地址)、p+1将指向这个结构数组的第 一个元素的地址、p+2将指向该结构数组的第三个元素的地址、…, 依此类推。下例展示了本节所讨论的两种指针在程序中的实际应 用. 例如: int x[3]={4, 5, 6}; struct ss{int *y; char c; }stu[3]={{&x[0],’1'},{&x[1],’2'}, {&x[2],’3’}}; sturct ss *p=stu; (6) *p->y即*(p->y),意味着p->y获得的一个地址量,故 *(p->y)实际上是获取p->y内容的内容; (7) *p->y+ +应理解为:先存取p->y的内容,再使p-> y的内容增1; (8) (*p->y)+ +是先取出p->y,再将取出的内容加1; (9) *p+ +->y是取出p->y内容的内容,再使p加1。 四、用结构体变量和指向结构指针作函数参数 1、用结构体变量的成员作参数 2、用结构体变量作实参 备注 页码 45 第九章 用户自己建立数据类型 课 题 教 学 目 的 教 材 分 析 结构体数组、结构体类型数据与指针 1、结构体数组的应用 2、指向结构体类型数据的指针的应用 教案号 23 教学重 点 指向结构体类型数据的指针 课时安排 教学难 点 2 指向结构体类型数据的指针 教学方 法 讲授与演示法相结 合 教具 计算机、投影仪 教 学 说明:用结构体变量作实参时,采取的是“值传递”的方式,将结 构体变量所占的内存单元的内容全部顺序传递给形参。形参也必须 是同类型的结构体变量。在函数调用期间形参也要占用内存单元。 这种传递方式在空间和时间上开销较大,如果结构体的规模很大 时,开销也是可观的。此外,由于采用值传递方式,如果在执行被 调用函数期间改变了形参(也是结构体变量)的值,该值不能返回 主调函数,这往往造成使用上的不便,因此一般较少使用这种方法. 3、用指向结构体变量(或数组)的指针作实参 三、课堂小结 本课主要学习了结构变量与指针的应用,利用指针引用结构成员。 内 容 四、布置作业 (P330)3、4 及 过 程 设 计 备注 页码 46 第九章 用户自己建立数据类型 课 题 教 学 目 的 教 材 分 析 用指针处理链表 领会存储动态分配和释放,领会链表的基本概念. 教案号 24 教学重 点 存储动态分配和释放,链表的概念 课时安排 教学难 点 2 存储动态分配和释放,链表的概念 教学方 法 讲授与演示法相结 合 教具 计算机、投影仪 教 学 内 容 及 一、讲授新课 一、链表概述 在讨论结构变量定义时曾指出,组成结构的成员项可以是任何数据类 型。一个结构中的成员项可以是另一个结构类型的变量,或指向另一个结 构类型的结构指针,甚至还可以是指向本结构类型的一个结构指针。如果 一个结构中的一个成员是另一个结构变量,这样的结构称之为嵌套结构; 如果一个结构的成员项是指向本结构类型的结构指针,这样的结构称之为 “自引用结构”。 1。 若一结构的成员项是指向本结构类型的结构指针,这样的结构称之为 “自引用结构”.例如: struct node { int data; struct node *next; }; 便是一个典型的自引用结构。该结构的结构名为node,它由两个成员 项组成:一个是int变量data,另一个是结构指针且是一个指向node类 型对象的指针。 过 2. 下图是node的直观表示: 程 设 计 这是一种单向链表数据结构,链中的元素(也称“结点”)个数可以 有任意多个(动态地进行存储分配的一种结构)。 二、链表结构可用于实现动态存储分配 1.动态数据结构与结构数组的区别 动态数据结构相当于结构数组,但比结构数组优越 (1)结构数组中的元素必须连续存放,而链表不必; (2)数组中的元素个数确定,而链表中的元素个数没有限制,在实际使用 中如果元素个数不确定,特别是需要动态增加元素的情况,使用链表 更合适; 备注 页码 47 第九章 用户自己建立数据类型 课 题 教 学 目 的 教 材 分 析 用指针处理链表 领会存储动态分配和释放,领会链表的基本概念。 教案号 24 教学重 点 存储动态分配和释放,链表的概念 课时安排 教学难 点 2 存储动态分配和释放,链表的概念 教学方 法 讲授与演示法相结 合 教具 计算机、投影仪 教 学 内 容 及 过 程 设 计 (3)C编译程序必须给数组分配存放其全部元素的存储空间,而对链表不必 也不可能预先分配全部存储空间,因为C编译程序元法确定链表中的 元素的个数. 2.用自引用结构实现链表结构需要解决三个问题 (1)必须指出链表第一个结点的位置,否则无法存取该链表中的结点 实现方法:定义一个指向该结构对象的指针,或定义一个该结构类型 的变量,使其指向链表的第一个结点即可。如: struct node *head; (2)在建立一链表时,如何获得下一个新的结点的存放空间。 实现方法:用C编译系统提供的库函数malloc(size)动态分配存储空 间得到. 除此之外,还可用calloc函数.如: struct node *p1, *p2; … p2=(struct node *) malloc(size(struct node)); 或: p2=(struct node *) calloc(1, size(struct node)); if (p2= =NULL) exit(0); p1->next=p2; /*此处设p1指向新结点的上一结点*/ 另外:free函数可用于释放内存区。 如:free(p); 表示释放由p指向的内存区,使这部分内存区能被其他 变量使用。 (3)要明确指出链表的链尾. 实现方法:通常把最后结点中的成员项next置为空指针NULL即可。 三、简单链表 例:建立一个如下图所示的简单链表,并输出各结点中的数据。 备注 页码 48 第九章 用户自己建立数据类型 课 题 教 学 目 的 教 材 分 析 用指针处理链表 领会存储动态分配和释放,领会链表的基本概念。 教案号 24 教学重 点 存储动态分配和释放,链表的概念 课时安排 教学难 点 2 存储动态分配和释放,链表的概念 教学方 法 讲授与演示法相结 合 教具 计算机、投影仪 教 学 内 容 及 #define NULL 0 struct strudent { long num; float score; struct student *next; }; main( ) { struct student a,b,c, *head, *p; head=&a; a。num=99101; =89。5; =&b; =99103; =90; b。next=&c; =99107; =85; =NULL; p=head; do{ printf(“%ld%5.1fn”, p—〉num, p—〉score); p=p—〉next; } while(p!=NULL); } 四、链表的建立 五、链表的输出 例11.9 编写一个输出链表的函数print。 void print( struct student *head ) { struct student *p; printf(“nNow, These %d records are :n”,n); p = head; if ( head!=NULL) do { printf(“%ld %5.1fn”,p—>num,p-〉score); p=p-〉next; } while (p!=NULL); 过 程 设 计 备注 上机练习 页码 49 第九章 用户自己建立数据类型 课 题 教 学 目 的 教 材 分 析 用指针处理链表 领会存储动态分配和释放,领会链表的基本概念。 教案号 24 教学重 点 存储动态分配和释放,链表的概念 课时安排 教学难 点 2 存储动态分配和释放,链表的概念 教学方 法 讲授与演示法相结 合 教具 计算机、投影仪 六、链表的删除操作 教 学 内 容 及 过 七、链表的插入操作 例11.11 写一个函数insert插入一结点。 分析:插入点可能有以下三种情况:在链表中间、表头、表尾. struct student *insert(struct student *head, struct student *stud ) { struct student *p0, *p1, *p2; p1=head; p0=stud; if(head= =NULL) {head=p0; p0—>next=NULL;} else { while((p0—〉num〉p1—〉num)&&(p1—〉next !=NULL)) { p2=p1; p1=p1—>next;} if(p0-〉num<=p1-〉num) if(head= =p1) {head=p0; p0-〉next=p1; } else { p2-〉next=p0; p0—〉next=p1; } else {p1->next=p0; p0->next=NULL;} } return(head);} 程 设 计 三 课堂小结 本课主要学习了结构变量与指针的应用,利用指针引用结构成员;并介 绍了链表的概念,作为链表结点的结构类型,及存储动态分配与释放的使 用,静态链表的建立及其他操作,同学们在对链表操作时,应分析可能的 情况,并画出链表的示意图。本章我们只学习了单向链表,在后续课程中 还将学习其他类型的链表.。 四 布置作业 (P330) 9 备注 上机练习 页码 50 第九章 用户自己建立数据类型 课 题 教 学 目 的 教 材 分 析 共用体、枚举类型和typedef 教案号 25 1、掌握共用体类型的说明、共用体变量的定义、成员的引用 2、领会枚举类型变量的定义,了解typedef的作用 教学重 点 掌握共用体类型的说明、共用体变量的定义、成员的引用 课时安排 教学难 点 2 共用体变量的赋值及所占存储空间、成员的引用 教学方 法 讲授与演示法相结 合 教具 计算机、投影仪 一 复习引导 结构体变量所获得的存储空间是各成员项所占空间之和。 教 学 内 容 及 过 程 设 计 二 讲授新课 一、共用体(联合) 联合(共同体)也是一种构造类型的数据结构.在一个“联合”内可 以定义多种不同的数据类型,因为有时我们需要使几种不同类型的变量放 到同一内存单元中。允许利用同一存储区域来存储、处理不同类型的数据。 使几个不同的变量共占同一段内存的结构,称为“联合”(共同体)类型 的结构。 1、共用体的概念 使几个不同类型的变量共占同一段内存的结构。 共用体类型的定义形式: union 共用体名 { 数据类型1 变量名1; 数据类型2 变量名2; … … 数据类型n 变量名n; }; 例如: union data { int i; char ch; float f; }a,b; 其中,变量a,b的成员i,ch,f共用一段空间。变量a,b的空间分 别为4字节。 2、共用体变量的引用 共用体变量名.成员名 如: a.i 或 a.f 3、共用体变量的特点 (1) 同一内存段瞬时只能存放成员表中的一种,此时其他成员不起 作用; (2) 共用体变量的地址及各成员的地址相同; 即 &a、&a。i、&a。ch、&a。f 均是同一地址。 备注 页码 51 第九章 用户自己建立数据类型 课 题 教 学 目 的 共用体、枚举类型和typedef 教案号 25 1、掌握共用体类型的说明、共用体变量的定义、成员的引用 2、领会枚举类型变量的定义,了解typedef的作用 教 材 分 析 课时安排 教学重 点 教学难 点 2 掌握共用体类型的说明、共用体变量的定义、成员的引用 共用体变量的赋值及所占存储空间、成员的引用 教学方 法 讲授与演示法相结 合 教具 计算机、投影仪 教 (3)不能用共用体变量名进行赋值、初始化等操作;如: union { int i; char ch; float f; }a={1,’a',1.5}; × (4)共用体与结构体可以嵌套使用。 (5)不能用共用体变量作为函数参数,也不能使函数带回共用体 变量,但可用指向共用体变量的指针作函数的参数. 学 二、枚举类型 1、枚举类型的概念 列举出所有可能的取值的一种数据结构。 2、枚举类型的定义 enum 枚举名 { 枚举值表 }; 例:enum weekday{sun, mon, tue, wed, thu, fri, sat}; enum weekday week_end, workday; 或 enum weekday{sun,mon,tue,wed,thu,fri,sat}workday; 或 enum {sun,mon,tue,wed,thu,fri,sat}week_end; 3、枚举类型变量的赋值和使用 1. 枚举值是常量,不是变量;sun=5; mon=2; sun=mon; × 2. 枚举类型是有序数据类型,枚举元素是有值的; 例:main( ) { enum weekday {sun, mon, tue, wed, thu, fri, sat } a,b,c; a=sun; b=mon; c=tue; printf(“%d,%d,%d",a,b,c); } 运行结果为:0,1,2 可改变枚举元素的值。 enum weekday{sun=7, mon=1,tue,wed,thu,fri,sat} day; 内 容 及 过 程 设 计 备注 页码 52 第九章 用户自己建立数据类型 课 题 教 学 目 的 共用体、枚举类型和typedef 教案号 25 1、掌握共用体类型的说明、共用体变量的定义、成员的引用 2、领会枚举类型变量的定义,了解typedef的作用 教 材 分 析 课时安排 教学重 点 教学难 点 2 掌握共用体类型的说明、共用体变量的定义、成员的引用 共用体变量的赋值及所占存储空间、成员的引用 教学方 法 讲授与演示法相结 合 教具 计算机、投影仪 3. 枚举元素可比较;例:默认时,mon〉sun 4 。 只能将枚举值赋予枚举变量; 例:a=sun; b=mon; 是正确的 而 a=0; b=1; 是错 误的 但 b=(enum weekday)1; 是正确的 5. 枚举元素不是字符串常量,使用时不要加引号。 6。 由于C编译程序将枚举量作为整型数来处理,所以可使用常数的 地方,都可以使用枚举常量。 教 学 内 容 及 过 程 设 计 三、 用typedef定义类型 C语言不仅提供了丰富的数据类型,而且还允许用户自己定义类型说 明符,即允许用户为数据类型取别名。类型定义符typedef可用来完成此 项功能。 typedef 可完成为类型取别名. typedef 的一般形式: typedef 旧类型名 新类型名; 如:typedef float real; real a, f ; 再如:typedef char *pointer ; pointer p, string =“example”; 但我们必须明白:首先,定义的新名只是原名的一个别名,并不是建 立一个新的数据类型;其次,新名和原名同时存在并有效,即原名并不失 去效用,在程序中仍可使用;最后,用新名和原名定义的对象具有相同的 性质和效果。 三 课堂小结 本课主要学习了共用体、枚举类型及用typedef定义类型。在使用共 用体变量时,要和结构体变量做好区分。 四 布置作业 做《C语言习题集》同步练习第9章习题 备注 页码 53 第十章 对文件的输入输出 课 题 文件 教案号 26 教 学 目 的 教 材 分 析 1、掌握标准设备输入/输出函数的使用 2、掌握缓冲文件系统的使用 课时安排 教学重 点 教学难 点 2 标准设备输入/输出函数(部分)的使用,文件的使用 文件的使用 教学方 法 讲授与演示法相结 合 教具 计算机、投影仪 教 学 内 容 及 过 程 设 计 一、讲授新课 C语言把文件看成是一个字符(字节)的序列.按数据的组织形式,分为 ASCII文件和二进制文件。前者每一个字节存放一个ASCII字符,后者把 内存中的数据按其在内存中的存储形式输出到磁盘上存放.前者占空间 多,需要转换,后者节省空间和转换时间,但一个字节不对应一个字符,不 能直接输出字符形式. C语言中可利用高级I/O库函数来存取文件,存取文件的过程与其他 语言中的处理过程类似。通常按如下顺序进行: … 打开文件 … 读写文件(若干次) … 关闭文件 这个处理顺序表明:一个文件被存取之前首先要打开它,只有文件被 打开后才能进行读/写操作,文件读/写完毕后必须关闭. 一、文件的打开 在操作系统中,每一个文件都有一个名字以供识别,如存储在磁盘上 的C源程序文件file1.c,file2.c等.文件名是文件的外部名,通过它 可以找到文件的实际存储设备、位置、大小、特性等诸如此类的相关信息. 这些信息只能由操作系统的文件管理系统掌握与管理,因此要存取文件必 须通过操作系统的文件系统.这意味着一个C语言程序没有直接通过文件 的外部名存取一个外部文件的能力,程序中要存取文件必须与文件系统取 得联系,把要存取文件的有关信息和要求,诸如文件的名字、读文件还是 写文件、以何种方式读/写等告诉文件系统,由文件系统在设备中建立、 寻找、定位文件,分配存取文件的缓冲区,做好存取文件要求的一切准备 工作。 上述存取文件的有关信息和要求都由程序通过I/O库函数fopen告诉 操作系统。 fopen函数的一般调用形式是: FILE *fp; fp=fopen(文件名,存取方式); 备注 页码 54 第十章 对文件的输入输出 课 题 文件 教案号 26 教 学 目 的 教 材 分 析 1、掌握标准设备输入/输出函数的使用 2、掌握缓冲文件系统的使用 课时安排 教学重 点 教学难 点 2 标准设备输入/输出函数(部分)的使用,文件的使用 文件的使用 教学方 法 讲授与演示法相结 合 教具 计算机、投影仪 教 学 内 容 及 二、文件的关闭 在使用完一个文件后应该关闭它,以防止它再被误用。“关闭”就是 使文件指针变量不指向该文件,也就是文件指针变量与文件“脱钩",此后 不能再通过该指针对其相连的文件进行读写操作,除非再次打开,使该指 针变量重新指向该文件。用fclose函数关闭文件。 fclose函数调用的一般形式为: fclose (文件指针); 例如: fclose(fp); 三、文件的读写 1。 读/写字符函数(fputc函数和fgetc函数)或(putc函数和getc函 数) fputc函数──把一个字符写到磁盘文件上去。 一般形式为: fputc(ch,fp); fgetc函数──从指定文件读入一个字符.该文件必须是以读或读写 方式打开的。调用形式为:ch=fgetc(fp); 过 程 设 二 课堂小结 本课讲解文件指针的说明,并用指针指向文件。利用fopen()和 fclose()函数打开、关闭文件,注意:需要用文件时,要打开;不用后, 立刻关闭。另外,还学习了两个读写文件的函数fgetc()、fputc(),用 于读写字符. 三 布置作业 (P354)第3题 计 备注 页码 55
版权声明:本文标题:(完整word版)c语言电子教案 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/p/1735698777a1682868.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论