为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

C语言程序设计教案

2017-09-18 50页 doc 160KB 120阅读

用户头像

is_842972

暂无简介

举报
C语言程序设计教案C语言程序设计教案 吉 林 大 学 (2012 ~ 2013 学年第 一 学期) 课程名称, C语言程序设计 年 级, 2011 教 研 室, 计算机 任课教师, 段云娜 吉林大学农学部教务处制 1 教 案 课程名称:C语言程序设计 授课教师 段云娜 授课对象 2011农林经济管理 授课时间 2学时 授课题目 第一章 C语言概述 课 型 理论 使用教具 计算机、投影仪 教学目的 1、掌握C语言程序的结构、编程过程和上机步骤 C语言程序的结构 教学重点和难点 上机步骤 《C语言程序设计》 参考教材 清华大...
C语言程序设计教案
C语言程序设计 吉 林 大 学 (2012 ~ 2013 学年第 一 学期) 课程名称, C语言程序设计 年 级, 2011 教 研 室, 计算机 任课教师, 段云娜 吉林大学农学部教务处制 1 教 案 课程名称:C语言程序设计 授课教师 段云娜 授课对象 2011农林经济管理 授课时间 2学时 授课目 第一章 C语言概述 课 型 理论 使用教具 计算机、投影仪 教学目的 1、掌握C语言程序的结构、编程过程和上机步骤 C语言程序的结构 教学重点和难点 上机步骤 《C语言程序设计》 参考教材 清华大学出版社 教学内容 时间分配及备注 一 新课引入 从计算机应用基础中学过的计算机语言及语言处理系统引出C语言。 二 讲授新课 C语言程序构成,采用程序实例加以说明,并提倡良好的程序设计书写风格, 1. C语言是由函数构成的,至少有一个main()函数; 2. 每个函数由函数首部和函数体组成;函数体由说明语句、执行语句 组成; 3. 每个C程序从main()函数开始执行,并在main()中结束; 4. 每个语句和数据定义的最后必须加分号; 5. C程序无输入、输出语句:输入功能由scanf()函数完成;输出功能 由printf()函数完成; 6. 可加注释/*……*/ 2 C语言的编程过程: 分析问题----数据及算法----代码编写----编译及调试 三、上机步骤(上机环境:VC++ 6。0) 1. 进入环境 2. 编辑源程序 3. 保存源程序 4. 编译源程序 5. 执行程序,查看结果 6. 退出C环境 1、 C语言的构成要素,main函数在程序中的作用 2、 上机操作的过程 课 后 小 结 3 教 案 课程名称:C语言程序设计 授课教师 段云娜 授课对象 2011农林经济管理 授课时间 3学时 授课题目 第三章 数据类型 课 型 理论 使用教具 计算机、投影仪 1、掌握C的数据类型 教学目的 2、掌握整型、实型、字符型数据的常量及变量 各种基本数据类型的常量和变量 教学重点和难点 不同类型的数据在内存中的物理存储形式 参考教材 教学内容 时间分配及备注 一 复习引导 上次课我们已经学习了程序的一个方面算法,现在来学习另一方面数据结构。 二 讲授新课 C有四种基本数据类型,分别是整型、字符型、实型、枚举型 一、常量与变量 1、 常量:在程序运行过程中,其值不能被改变的量。 两种形式:一般常量和符号常量 1. 直接常量(字面常量): 整型常量:如12、0、-3等 实型常量:如4.5、-1.234等 4 字符常量:如„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,M.D.Jhon 4(变量名不能是关键字(即保留字,是C编译程序中保留使用的标识符。 如:auto、break、char、do、else、if、int等) 5(变量必须先定义再使用 1、 关于变量与常量的说明及定义 2、 主要是能够按照变量及常量的要求在程序设计中正确使用 课 后 小 结 5 教 案 课程名称:C语言程序设计 授课教师 段云娜 授课对象 2011农林经济管理 授课时间 2学时 授课题目 第三章 数据类型 课 型 理论 使用教具 计算机、投影仪 1、掌握C的数据类型 教学目的 2、掌握整型、实型、字符型数据的常量及变量 各种基本数据类型的常量和变量 教学重点和难点 不同类型的数据在内存中的物理存储形式 《C语言程序设计》 参考教材 清华大学出版社 教学内容 时间分配及备注 二、整型数据的 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 6 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=%d\n”,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均为不合法的浮点数。 1、 关于整型与实型数据的说明及使用 2、 注意在程序设计中正确使用 课 后 小 结 7 教 案 课程名称:C语言程序设计 授课教师 段云娜 授课对象 2011农林经济管理 授课时间 2学时 授课题目 第三章 数据类型 课 型 理论 使用教具 计算机、投影仪 1、掌握C的数据类型 教学目的 2、掌握整型、实型、字符型数据的常量及变量 各种基本数据类型的常量和变量 教学重点和难点 不同类型的数据在内存中的物理存储形式 《C语言程序设计》 参考教材 清华大学出版社 教学内容 时间分配及备注 2、实型变量 (1)实型数据在内存中的存放形式 一个实型数据一般在内存中占4个字节(32位)。实型数据是按照指 数形式存储的。 (2)实型变量的分类:单精度float、双精度double、长双精度long double 四、字符型数据 1、字符常量 1) 括在一对单引号中的一个字符(单引号仅作界限符),如:‘a’ 、‘X’ 2 ) 一个字符常量占1个字节,存放的是字符的ASCII码值。 3) 转义字符: 以‘ \ ’开头,后跟一个约定的字符或所要表示字符的十六进制 8 (或者八进制)的编码; 2、字符变量: 字符变量用来存放字符常量,只能放一个字符。例: char c1=‘a’, c2=‘A’; 一个字符变量在内存中占一个字节。 五、字符串常量 1. 括在一对双引号中的0个或多个字符组成的序列;双引号仅作界限符;如: “C language programming”、“a\\n”、“#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、 基本数据类型的常量表示、变量定义,及不同类型的数据在内存中的存 储形式 课 后 小 结 9 教 案 课程名称:C语言程序设计 授课教师 段云娜 授课对象 2011农林经济管理 授课时间 2学时 授课题目 第四章 顺序程序设计 课 型 理论 使用教具 计算机、投影仪 1、了解C语句的概念及种类、掌握C语言常用的输入/出方式 教学目的 2、学会简单的顺序程序设计 C语言常用的输入/出方式 教学重点和难点 格式输入输出 《C语言程序设计》 谭浩强编 第二版 参考教材 清华大学出版社 教学内容 时间分配及备注 一、复习引导 上一章介绍的常量、变量、运算符、表达式等都是构成程序的基本成分。 本章将介绍为编写简单程序所必需的一些内容。 上机实验,学习简二、讲授新课 单的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; 10 三、 数据输入输出的概念及在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 课 后 小 结 11 教 案 课程名称:C语言程序设计 授课教师 段云娜 授课对象 2011农林经济管理 授课时间 2学时 授课题目 第四章 顺序程序设计 课 型 理论 使用教具 计算机、投影仪 1、了解C语句的概念及种类、掌握C语言常用的输入/出方式 教学目的 2、学会简单的顺序程序设计 C语言常用的输入/出方式 教学重点和难点 格式输入输出 《C语言程序设计》 谭浩强编 第二版 参考教材 清华大学出版社 教学内容 时间分配及备注 2、格式输入函数 scanf 语法:scanf(“格式控制”,地址表列); 格式控制:包含三类符号 上机实验,学习简 ? 空白字符:(空格、Tab或\,、\,),输入时不必一一对应; 单的C程序设计 ? 普通字符:(非格式转换说明符、非空白符、非%),输入 时必须一一对应; ? 格式转换说明符: 注意:scanf函数规定,组成输入项表的输入对象须是地址量;如: scanf(“%d,%d,%d”,&a,&b,&c); scanf(“a=%d,b=%d,c=%d”,&a,&b,&c); ?第一个输入语句,正确的输入数据流为:123,456,789, 处理的结果为: 123?a,456?b,789?c ?同理对第二个输入语句,正确的输入数据流应是: a=123,b=456,c=789 该输入数据流中除123,456,789 被赋给相应变量外,其余都被丢弃 12 六、顺序结构程序设计举例 例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.2f\n”,a,b,c,s); printf(“area=%7.2f\n”,area); } 课 后 小 结 13 教 案 课程名称:C语言程序设计 授课教师 段云娜 授课对象 2011农林经济管理 授课时间 2学时 授课题目 第五章 选择结构程序设计 课 型 理论 使用教具 计算机、投影仪 1、掌握实现选择结构的两种语句、两个运算符 教学目的 2、学会编写选择结构的程序 关系运算符、if-else语句 教学重点和难点 嵌套if-else语句中的if与else匹配问题 《C语言程序设计》 谭浩强编 第二版 参考教材 清华大学出版社 教学内容 时间分配及备注 一、复习引导 上一次课已经介绍了程序基本结构之一,但在大多数情况下都要用到选择结 构。 二、讲授新课 一、关系运算符与关系表达式 1、关系运算符:< <= > >= = = ! = 优先级:< <= > >= 高于 = = ~= 关系运算符低于算术运算符,高于赋值运算符 2、关系表达式:用关系运算符将两个表达式连接起来的式子。 关系表达式求值:关系成立,值为1;关系不成立,值为0 二、双分支选择语句 1、if语句的三种形式 语法1:if (表达式)语句; 语法2:if (表达式) 语句1;else 语句2; 语法3:if (表达式1) 语句1; else if (表达式2) 语句2; 14 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语句的应用。 课 后 小 结 15 教 案 课程名称:C语言程序设计 授课教师 段云娜 授课对象 2011农林经济管理 授课时间 2课时 授课题目 第五章 选择结构程序设计 课 型 理论 使用教具 计算机、投影仪 1、掌握实现选择结构的两种语句、两个运算符 教学目的 2、学会编写选择结构的程序 关系运算符、if-else语句 教学重点和难点 嵌套if-else语句中的if与else匹配问题 《C语言程序设计》 谭浩强编 第二版 参考教材 清华大学出版社 教学内容 时间分配及备注 (5) 每个case后面的常量表达式的值必须互不相同。 (6) 各个case与default出现次序不影响结果。 (7) break的使用(P99) (8) 多个case可以共用一组语句 三、选择结构程序举例 例:求ax2+bx+c=0方程的根。 分析: (1)a=0,不是二次方程。 (2)b2-4ac=0,有两个相等的实根。 (3)b2-4ac>0,有两个不等的实根。 (4)b2-4ac<0,有两个共轭的复根。 N-S图:P102 16 1、 switch语句 2、 在编写程序过程中,注意分支的作用范围,及复合语句的运用。 课 后 小 结 17 教 案 课程名称:C语言程序设计 授课教师 段云娜 授课对象 2011农林经济管理 授课时间 2课时 授课题目 第五章 选择结构程序设计 课 型 理论 使用教具 计算机、投影仪 1、掌握实现选择结构的两种语句、两个运算符 教学目的 2、学会编写选择结构的程序 关系运算符、if-else语句 教学重点和难点 嵌套if-else语句中的if与else匹配问题 《C语言程序设计》 谭浩强编 第二版 参考教材 清华大学出版社 教学内容 时间分配及备注 (5) 每个case后面的常量表达式的值必须互不相同。 上机实验,学习选(6) 各个case与default出现次序不影响结果。 择结构的程序设计 (7) break的使用(P99) (8) 多个case可以共用一组语句 三、选择结构程序举例 布置作业 例:求ax2+bx+c=0方程的根。 1、上机作业 分析: (P104):5.5、5.6 (1)a=0,不是二次方程。 2、书面作业 (2)b2-4ac=0,有两个相等的实根。 (P104)5.3、5.9 (3)b2-4ac>0,有两个不等的实根。 (4)b2-4ac<0,有两个共轭的复根。 N-S图:P102 18 1、 switch语句 2、 在编写程序过程中,注意分支的作用范围,及复合语句的运用。 课 后 小 结 19 教 案 课程名称:C语言程序设计 授课教师 段云娜 授课对象 2011农林经济管理 授课时间 2课时 授课题目 第六章 循环控制 课 型 理论 使用教具 计算机、投影仪 1、掌握三种循环语句的语法结构 教学目的 2、灵活运用循环语句 教学重点 三种循环语句while、do-while、for 教学重点和难点 教学难点 三种循环语句的区别 《C语言程序设计》 谭浩强编 第二版 参考教材 清华大学出版社 教学内容 时间分配及备注 一、引入新课 问题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 20 程序如下: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=%d\n”,i); 课 后 小 结 21 教 案 课程名称:C语言程序设计 授课教师 段云娜 授课对象 2011农林经济管理 授课时间 2课时 授课题目 第六章 循环控制 课 型 理论 使用教具 计算机、投影仪 1、掌握三种循环语句的语法结构 教学目的 2、 灵活运用循环语句 三种循环语句while、do-while、for 教学重点和难点 三种循环语句的区别 《C语言程序设计》 谭浩强编 第二版 清华大学出版社 参考教材 22 教学内容 时间分配及备注 复习引导 从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 6.2 main( ) 书面练习:(P120){ int s=1; float n=1.0, t=1, pi=0; 6.3、6.5 while((fabs(t))>1e-6) { pi=pi+t; n+=2; s=-s; t=s/n; } pi=pi*4; printf(“pi=%10.6f\n”,pi); } 24 for语句的语法结构,特别是for语句中三个表达式的作用 1、 2、 注意循环控制的范围 课 后 小 结 25 教 案 课程名称:C语言程序设计 授课教师 段云娜 授课对象 2011农林经济管理 授课时间 2课时 授课题目 第六章 循环控制 课 型 理论 使用教具 计算机、投影仪 1、掌握三种循环语句的语法结构 教学目的 2、灵活运用循环语句 三种循环语句while、do-while、for 教学重点和难点 三种循环语句的区别 《C语言程序设计》 谭浩强编 第二版 参考教材 清华大学出版社 教学内容 时间分配及备注 三、do-while语句 2 语法: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); } 说明: 26 1) 循环体可以用复合语句; 2) 循环控制变量在执行do前必须赋初值;循环体内应有改变循环控制 变量的语句; 3) do-while 循环的特点是先执行后判断,故循环至少被执行一次; 如:i=3; do { sum+= i; i++; } while (i>10); 1、 while、do-whilr语句的语法结构 2、 whie与do-while区别 3、 注意循环控制的范围 课 后 小 结 27 教 案 课程名称:C语言程序设计 授课教师 段云娜 授课对象 2011农林经济管理 数组 授课时间 2课时 授课题目 课 型 理论 使用教具 计算机、投影仪 1、掌握一维数组的定义和引用 教学目的 2、掌握二维数组的定义和引用 重点:一维、二维数组的定义、引用、初始化 教学重点和难点 难点:数组的存储形式,数组的首地址 《C语言程序设计》 谭浩强编 第二版 参考教材 清华大学出版社 教学内容 时间分配及备注 一、 引入新课 数组是有序数据的集合,数组中每一个元素都属于同一个数据类型。 二、讲授新课 一、一维数组的定义和引用 定义数组,就是要: (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,可简便实现; 28 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、二维数组的引用: 二维数组元素的表示形式为:数组名[下标][下标] 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标准
函数(库函数)和用户自己定义的 函数 4、 从函数的形式看,函数分为两类:无参函数和有参函数 二、函数定义的一般形式: 1、 无参函数的定义 [类型说明符] 函数名() { 变量声明部分; 执行部分;} 2、 有参函数的定义形式 35 [类型说明符] 函数名(形式参数列表) { 变量声明部分; 执行部分;} 3、 空函数 [类型说明符] 函数名() { } 三、函数参数和函数的值 1、 形式参数和实际参数: (1) 形式参数:函数定义时函数名后括号中的变量 (2) 实际参数:函数调用时函数名后括号内的变量名 (3) 关于形式参数和实际参数的说明: ?形式参数只有在函数被调用时才分配存储单元,调用结束就释 放。 ?实际参数可以是变量、常量或表达式,但要求有确定值。 ?在被定义的函数中,必须指明形参类型。 ?实际参数与形式参数的类型应相同或赋值兼容 ?实参变量对形参变量的数据传递是“单向值传递”,即只由实参 传递给形参,而不能由形参传回给实参。 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 …); 36 函数的定义形式 2、 形参和实参的区别 1、 3、 函数的声明和调用 课 后 小 结 37 教 案 课程名称:C语言程序设计 授课教师 段云娜 授课对象 2011农林经济管理 授课时间 2课时 授课题目 第八章 函数的嵌套调用和递归调用 课 型 理论 使用教具 计算机、投影仪 教学目的 掌握函数的嵌套调用和递归调用 嵌套和递归调用 教学重点和难点 递归调用 《C语言程序设计》 谭浩强编 第二版 参考教材 清华大学出版社 教学内容 时间分配及备注 一、教授新课 一、函数的嵌套调用 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) 38 { int c; if(n= =1) c=10; else c=age(n-1)+2; return (c); } main( ) { printf(“%d”,age(5));} 1、 函数的嵌套调用 2、 函数的递归调用 课 后 小 结 39 教 案 课程名称:C语言程序设计 授课教师 段云娜 授课对象 2011农林经济管理 授课时间 2课时 授课题目 数组作为函数参数 课 型 理论 使用教具 计算机、投影仪 教学目的 掌握数组作为函数参数的应用(虚实结合) 数组名作为函数参数 教学重点和难点 虚实结合 《C语言程序设计》 谭浩强编 第二版 参考教材 清华大学出版社 教学内容 时间分配及备注 一、讲授新课 一、数组元素作为函数实际参数 单向值传递:用赋值的方法,把实在参数的值赋给被调函数对应的形式参数。 不希望破坏调用函数中作为实际参数对象的值时,使用“值传递”方式; 注意:数组元素作为函数实参时如同简单变量。 二、数组名作为函数参数 1、 此时,应分别在主调函数和被调用函数中定义数组。 2、 实参数组应与形参数组类型保持一致 3、 实参数组与形参数组大小可以不一值 4、 型参数组可以不指定大小,再定义数组时,在数组名后面跟一个空的方 括号,有时为了在被调用函数中处理数组元素的需要,可以另设一个参 数,传递需要处理的数组元素的个数。 5、 用数组名作为函数实际参数时,不是把数组元素的值传递给形式参数数 组,而是把实参数组的起始地址传递给形参数组,这样两个数组就共用 同一段存储单元。这种参数传递有时也可以称为“地址传递” [例8.13]:用选择法对数组中10个整数按由小到大排序。 40 main() { int a[10],i; printf(“enter the array\n”); 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”); } 数组作为函数参数有两种情况:传递数组元素的值、传递数组名 课 后 小 结 41 教 案 课程名称:C语言程序设计 授课教师 段云娜 授课对象 2011农林经济管理 授课时间 2课时 授课题目 全局与局部变量、动态与静态变量 课 型 必修 使用教具 计算机、投影仪 1、 掌握局部变量和全局变量的作用范围 教学目的 2、 掌握变量的存储类别,了解内部函数和外部函数 局部变量和全局变量、变量的存储类别 教学重点和难点 变量的作用域和生存期 《C语言程序设计》 谭浩强编 第二版 参考教材 清华大学出版 教学内容 时间分配及备注 42 一、复习引导 在函数调用过程中,不仅要注意实参和形参的数据结合,而且要注意各个变量的作用域和生存期。 二、讲授新课 一、局部变量和全局变量 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作存储类别的声明。它也可省。 2、用static声明局部变量 函数中变量的值在函数调用结束后不消失而保留原值,在下次该函数调 用时,该变量已有值,即为上一次函数调用结束时的值。该局部变量为 静态局部变量。 说明: 1、静态局部变量属于静态存储类别,在静态存储区内分配存储单元。在 程序整个运行期都不释放。自动变量属于动态存储类别,占动态存储区 空间,函数调用结束后即释放。 2、对静态局部变量在编译时赋初值,程序运行时,它已有初值,以后每 43 次调用函数时不再重新赋初值而只是保留上次函数调用结束时的值。对 自动变量赋初值,不是在编译时进行的,而是在函数调用时进行,每调 用一次函数重新给一次初值。 3、对静态局部变量来说,如不赋初值,编译时自动赋初值0或空字符。 对自动变量来说,如不赋初值,它的值是一个不确定的值。 4、虽然静态局部变量在函数调用结束后仍然存在,但其他函数不能引用。 3、register变量 将局部变量的值放在CPU中的寄存器中,需要用时直接从寄存器取出参加运算,不必再到内存中去存取。这种变量称为寄存器变量。 4、用extern声明外部变量 1、在一个文件内声明外部变量 2、在多文件的程序中声明外部变量 5、用static声明外部变量 在定义外部变量时,加一个static声明,可以使此变量只能用于本文件中。 注:对外部变量加或不加static声明,都是静态存储,只是作用范围不同, 都是在编译时分配内存的。 三、内部函数和外部函数 1、内部函数 一个函数只能被本文件中其他函数所调用。 即:static 类型标识符 函数名(形参表) 如:static int fun( int a,int b) 2、外部函数 一个函数可供其他文件调用,称为外部函数 定义时声明或调用时声明,即: extern int fun(int a, int b ) 定义时 或 extern fun(int a, int b ) 调用时 在定义时,也可省写extern ,即为外部函数 1、 局部变量和全局变量的作用域 2、 变量的存储类别有动态存储方式和静态存储方式 3、 关键字有auto、static、register、extern 课 后 小 结 44 教 案 课程名称:C语言程序设计 授课教师 段云娜 授课对象 2011农林经济管理 授课时间 2课时 授课题目 第九章 编译预处理 课 型 必修 使用教具 计算机、投影仪 1、了解预处理的概念及特点 教学目的 2、掌握有参宏与无参宏的定义及使用,领会文件包含的使用及效果 掌握宏的使用,文件包含 教学重点和难点 有参宏与无参宏的使用 《C语言程序设计》 谭浩强编 第二版 参考教材 清华大学出版社 教学内容 时间分配及备注 一、复习引导 一般C程序的开发执行过程: 编辑 ? 编译 ? 连接 ? 执行 含有预处理命令的C程序: 编辑 ? 预处理 ? 编译 ? 连接 ? 执行 二、讲授新课 C提供的预处理功能主要有以下三种: 宏定义、文件包含、条件编译。 分别用宏定义命令、文件包含命令、条件编译命令来实现。为了与一般C 语句相区别,这些命令以符号“ #” 开头 一、宏定义 宏: 代表一个字符串的标识符。 宏名:被定义为“宏”的标识符。 宏代换(展开):在编译预处理时,对程序中所有出现的 “宏名”,用宏定义 中的字符串去代换的过程。 1、不带参数的宏定义 一般形式: #define 标识符 字符串 45 例如:由键盘输入y值,求表达式: 3(y2+3y)+ 4(y2+3y)+ y(y2+3y) #define M (y*y+3*y) main() { int s, y; printf( “Input a number :”); scanf (“%d”,&y); s=3*M+4*M+y*M; printf(“s=%d\n”,s); } 先宏展开:s=3*(y*y+3*y) +4*( y*y+3*y) + y*(y*y+3*y) 再与源程序合并 说明: ?宏名一般用大写表示,以便与变量名区分。 ?使用宏名使程序易读,易修改。 ?只作简单的置换,不作正确性检查。 ?宏定义不是C语句,不必在行末加分号。 ?宏名的作用域一般从自定义命令到本源文件结束。 ?可以用# undef命令终止宏定义的作用域。 ?宏定义允许嵌套,允许层层置换。 ?宏名在源程序中用双引号括起来,则TC中预处理不对其作宏代换。 例: printf(“L=%f”, L); 中双引号内L不替换。 ?宏定义与定义的变量不同,宏只作字符替换,不分配内存空间。 ?对“输出格式”进行宏定义,可以减少书写麻烦 2、带参数的宏定义 格式:#define 宏名(参数表) 字符串 例:#define s(a,b) a*b {…… area =s(3,2); ……} 对带参的宏展开后,为area=3*2; 说明: ?对带参数的宏展开只是将宏名后括号内的实参字符串代替#define 命令行中的形参。 ?宏定义时,在宏名与带参数的括号之间不应加空格,否则将空格 以后的字符都作为替代字符串的一部分。 ?带参宏与函数的区别: 1、函数调用时,先求实参表达式值,后代入。而带参的宏只是进 行简单的字符替换。 2、函数调用是在程序运行时处理的,分配临时的内存单元。而宏 展开则是在编译时进行的,不分配内存单元,不进行值的传递, 也无“返回值”。 3、对函数中的实参和形参都要定义类型,类型应一致。而宏不存 在类型问题,宏名和参数无类型,只是一个符号代表,展开时 代入指定的字符即可。 4、调用函数只可得到一个返回值,而用宏可以设法得到几个结果。 46 5、使用宏次数多时,宏展开后使源程序增长,而函数调用不使源 程序变长。 6、宏替换不占运行时间,只占编译时间。而函数调用则占用运行 时间( 分配单元、保留现场、值传递、返回)一般用宏代表简短 的表达式比较合适。 二、 “文件包含”处理 “文件包含”处理是指将指定的被包含文件的全部内容插到该控制行的位 置处,使其成为源文件的一部分参与编译。因此,被包含的文件应该是源 文件。 通常置于源程序文件的首部,故也称为“头文件”。 C编译系统提供的头文件扩展名为“.h”,但设计者可根据实际情况,自行 确定包含文件的后缀、名字及其位置。 一般形式,#include “文件名” 或 #include <文件名> 二者的区别: 用尖括号时称为标准方式,系统到存放C库头文件所在的目录中寻找要 包含的文件。 用双引号时,系统先在用户当前目录中寻找要包含的文件,若找不到,再按标准方式查找。 课 本课主要讲解了宏定义、“文件包含”处理。对带参数的宏的使用,及与函数的后 使用的区别。搞清经常使用的头文件。 小 结 47 教 案 课程名称:C语言程序设计 授课教师 段云娜 授课对象 2011农林经济管理 授课时间 2课时 授课题目 第十章 变量的指针与指针变量 课 型 理论课 使用教具 电脑、投影仪 1、了解指针与地址的概念 教学目的 2、掌握指针变量的定义、引用及指针变量作为参数 指针变量的定义、引用及指针变量作为参数 教学重点和难点 指针变量作为参数 《C语言程序设计》 谭浩强编 第二版 参考教材 清华大学出版社 教学内容 时间分配及备注 一、讲授新课 一、地址与指针的概念 二、变量的指针与指针变量 变量的指针就是变量的地址。 指针变量是一种特殊类型的变量,它是用于专门存放地址的。 1、 指针变量的定义 定义形式:基类型 *指针变量名; 注意: a) 指针变量前的“*”,表示改变量的类型为指针型变量, “*”后的才是指针变量名。 b) 在定义指针变量时必须指定基类型 2、 指针变量的引用 指针变量只能存放地址,不要将一个整型量(或其他任何非地址类型 的数据)赋值给一个指针变量。 (1) 两个相关运算符: 1 &:取地址运算符。可以获取某个变量的地址 2 *: 指针运算符,获取某个指针变量所值向的变量的值 3 关于&和*运算符的说明: 48 假设已执行 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对输入的两个整数按大小顺序输出。 先考察如下程序,看是否能得到预期的结果 swap(int p1, int p2) { int temp; temp = p1; p1 = p2; p2 =temp; } main() { int a, b; scanf(“%d, %d”, &a, &b); if(a1) { ++argv; printf(“%s”, *argv); -- argc; }} 若将该程序编译、连接、装配成echo.exe,则在命令行上输入: echo hello, world! 则通过虚实结合后得:argc=3,argv[0]指向echo,argv[1]指向hello,argv[2] 指向world! 结果为:hello, world! 二、有关指针的数据类型和指针运算的小结 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成员名,其中“->”称为指向运算符。 66 注意分析以下几种运算:(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}}; main( ) { struct student *p; for(p=stu; pnum,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。 四、用结构体变量和指向结构指针作函数参数 67 1、用结构体变量的成员作参数 2、用结构体变量作实参 说明:用结构体变量作实参时,采取的是“值传递”的方式,将结构体变量所占的内存单元的内容全部顺序传递给形参。形参也必须是同类型的结构体变量。在函数调用期间形参也要占用内存单元。这种传递方式在空间和时间上开销较大,如果结构体的规模很大时,开销也是可观的。此外,由于采用值传递方式,如果在执行被调用函数期间改变了形参(也是结构体变量)的值,该值不能返回主调函数,这往往造成使用上的不便,因此一般较少使用这种方法。 3、用指向结构体变量(或数组)的指针作实参 本课主要学习了结构变量与指针的应用,利用指针引用结构成员。 课 后 小 结 68 教 案 课程名称:C 语言程序设计 授课教师 段云娜 授课对象 2011农林经济管理 授课时间 2 课时 授课题目 第十一章 用指针处理链表 课 型 理论 使用教具 计算机、投影仪 教学目的 领会存储动态分配和释放,领会链表的基本概念。 教学重点和难点 存储动态分配和释放,链表的概念 《c 程序设计》 参考教材 清华大学出版社 谭浩强 教学内容 时间分配及备注 一、讲授新课 一、链表概述 在讨论结构变量定义时曾指出,组成结构的成员项可以是任何数据类型。一个结构中的成员项可以是另一个结构类型的变量,或指向另一个结构类型的结构指针,甚至还可以是指向本结构类型的一个结构指针。如果一个结构中的一个成员是另一个结构变量,这样的结构称之为嵌套结构;如果一个结构的成员项是指向本结构类型的结构指针,这样的结构称之为“自引用结构”。 1. 若一结构的成员项是指向本结构类型的结构指针,这样的结构称之为“自引用结构”。例如: struct node { int data; struct node *next; }; 便是一个典型的自引用结构。该结构的结构名为node,它由两个成员项组成:一个是int变量data,另一个是结构指针且是一个指向node类型对象的 69 指针。 2. 下图是node的直观表示: 这是一种单向链表数据结构,链中的元素(也称“结点”)个数可以有任意多个(动态地进行存储分配的一种结构)。 二、链表结构可用于实现动态存储分配 1(动态数据结构与结构数组的区别 动态数据结构相当于结构数组,但比结构数组优越 (1)结构数组中的元素必须连续存放,而链表不必; (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即可。 三、简单链表 例:建立一个如下图所示的简单链表,并输出各结点中的数据。 70 #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; a.score=89.5; a.next=&b; b.num=99103; b.score=90; b.next=&c; c.num=99107; c.score=85; c.next=NULL; p=head; do{ printf(“%ld%5.1f\n”, 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.1f\n”,p->num,p->score); p=p->next; } while (p!=NULL); 六、链表的删除操作 七、链表的插入操作 例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)) 71 { 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);} 本课主要学习了结构变量与指针的应用,利用指针引用结构成员;并介绍了 链表的概念,作为链表结点的结构类型,及存储动态分配与释放的使用,静态链 表的建立及其他操作,同学们在对链表操作时,应分析可能的情况,并画出链表课 的示意图。本章我们只学习了单向链表,在后续课程中还将学习其他类型的链后 表。。 小 结 72 教 案 课程名称:C 语言程序设计 授课教师 段云娜 授课对象 2011农林经济管理 授课时间 2 课时 授课题目 第十一章 共用体、枚举类型和typedef 课 型 理论 使用教具 计算机、投影仪 1、掌握共用体类型的说明、共用体变量的定义、成员的引用 教学目的 2、领会枚举类型变量的定义,了解typedef的作用 掌握共用体类型的说明、共用体变量的定义、成员的引用 教学重点和难点 共用体变量的赋值及所占存储空间、成员的引用 《c 程序设计》 参考教材 清华大学出版社 谭浩强 教学内容 时间分配及备注 一 复习引导 结构体变量所获得的存储空间是各成员项所占空间之和。 二 讲授新课 一、共用体(联合) 联合(共同体)也是一种构造类型的数据结构。在一个“联合”内可以定义多种不同的数据类型,因为有时我们需要使几种不同类型的变量放到同一内存单元中。允许利用同一存储区域来存储、处理不同类型的数据。使几个不同的变量共占同一段内存的结构,称为“联合”(共同体)类型的结构。 1、共用体的概念 使几个不同类型的变量共占同一段内存的结构。 共用体类型的定义形式: union 共用体名 { 数据类型1 变量名1; 数据类型2 变量名2; … … 73 数据类型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) 同一内存段瞬时只能存放成员表中的一种,此时其他成员不起作 用; 共用体变量的地址及各成员的地址相同; 即 &a、&a.i、&a.ch、&a.f 均是同一地址。 (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; 74 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定义类型。在使用共用体变量 时,要和结构体变量做好区分。 课 后 小 结 75 教 案 课程名称:C 语言程序设计 授课教师 段云娜 授课对象 2011农林经济管理 授课时间 2 课时 授课题目 第十二章 位运算 课 型 理论 使用教具 计算机、投影仪 教学目的 掌握位运算符及表达式的运算规则 位运算符的运算规则及用途 教学重点和难点 位运算表达式的含义 《c 程序设计》 参考教材 清华大学出版社 谭浩强 教学内容 时间分配及备注 一 讲授新课 一、按位逻辑运算符 1、按位与(&) 用途: (1)清零 如:有原数:x=0010 1011 取数:y=1101 0100 或:y=0000 0000 则:x&y=0 (2)截取(析出)变量指定的二进制位,其余位清零。 如:设有数a=0010 1100 1010 1100,占2B,现要取其低字节。 取数y=0000 0000 1111 1111,则: a&y=0000 0000 1010 1100 2、按位或(|) 用途:将二进制数据的指定位置1,而不管原来的二进制位状态如何。 工作数:指定位为1,其余位为0 如:int a=055555,现要将变量对应的存储单元的最高位置1,则取工 作数b=0x8000,即: 76 a: 0101 1011 0110 1101 b: 1000 0000 0000 0000 a | b: 1101 1011 0110 1101 3、按位异或(^) 当且仅当参加运算的两个操作数对应的二进制位的状态不同时才将 对应的二进制位置1; 按位异或也称按位加(即对应位相加,进位丢弃); 用途: ?使指定的二进制位状态翻转(1变0,0变1) 操作数:指定翻转的位为1,其余位全为0 如:a=0x0F 0000 0000 0000 1111 取数:b=0x18 0000 0000 0001 1000 则:a ^b= 0000 0000 0001 0111 ?与0相^,保留原值 ?常用按位加实现两个变量内容的互换,而不采用任何中间变 量。方法如下: a=a^b; b=b^a; a=a^b; 4、按位取反(~) ~ 是一个单目运算符,用来对一个二进制数按位取反; 如:~ 025 即为 ~ 0000 0000 0001 0101 即 1111 1111 1110 1010 注意: (1)~ 025绝非,025 (2)对同一操作数连续两次“按位取反”,其结果必须与原操作数相同; (3) “按位取反 ”常与 “按位与 ”、 “按位或 ”或移位操作结合使用,完成特定功能; 5、移位运算(>>、<<) 1) 移位运算的一般形式:m<>n 2) 其中m是被移位的操作数,n是移位的位数,且均为整型表达式, 移位运算结果的类型取决于m的类型。 3) 执行,,时,操作数左端移出的高位部分丢弃,右端低位补0; 4) 执行,,时,操作数右端移出的低位部分丢弃,左端高位部分?无符号数:一律补0;有符号数:算术移位时填符号位,逻辑移位时填0。 6、说明: a) 优先级:算术运算符?,,、,,?关系运算符?& ^ |?&& ,|| b) 结合性:,,与,,具有左结合性; nnc) 左移相当于乘2,右移相当于除2; d) 位运算与赋值运算结合可以组成扩展的赋值运算符 如:&=、|=、>>=、<<=、^= 等 a&=b 等价于 a=a&b a<<=2 等价于 a=a<<2 77 按位与、按位或按位异或运算规则及用途 1、 2、 移位运算符的运算规则 课 后 小 结 78 教 案 课程名称:C 语言程序设计 授课教师 段云娜 授课对象 2011农林经济管理 授课时间 2 课时 授课题目 第十三章 文件 课 型 理论 使用教具 计算机、投影仪 1、掌握标准设备输入/输出函数的使用 教学目的 2、掌握缓冲文件系统的使用 标准设备输入/输出函数(部分)的使用 教学重点和难点 文件的使用 《c 程序设计》 参考教材 清华大学出版社 谭浩强 教学内容 时间分配及备注 一、讲授新课 C语言把文件看成是一个字符(字节)的序列。按数据的组织形式,分为ASCII文件和二进制文件。前者每一个字节存放一个ASCII字符,后者把内存中的数据按其在内存中的存储形式输出到磁盘上存放。前者占空间多,需要转换,后者节省空间和转换时间,但一个字节不对应一个字符,不能直接输出字符形式。 C语言中可利用高级I,O库函数来存取文件,存取文件的过程与其他语言中的处理过程类似。通常按如下顺序进行: … 打开文件 … 读写文件(若干次) … 关闭文件 这个处理顺序表明:一个文件被存取之前首先要打开它,只有文件被打开后才能进行读,写操作,文件读,写完毕后必须关闭。 79 一、文件的打开 在操作系统中,每一个文件都有一个名字以供识别,如存储在磁盘上的C源程序文件file1(c,file2(c等。文件名是文件的外部名,通过它可以找到文件的实际存储设备、位置、大小、特性等诸如此类的相关信息。这些信息只能由操作系统的文件管理系统掌握与管理,因此要存取文件必须通过操作系统的文件系统。这意味着一个C语言程序没有直接通过文件的外部名存取一个外部文件的能力,程序中要存取文件必须与文件系统取得联系,把要存取文件的有关信息和要求,诸如文件的名字、读文件还是写文件、以何种方式读,写等告诉文件系统,由文件系统在设备中建立、寻找、定位文件,分配存取文件的缓冲区,做好存取文件要求的一切准备工作。 上述存取文件的有关信息和要求都由程序通过I/O库函数fopen告诉操作系统。 fopen函数的一般调用形式是: FILE *fp; fp=fopen(文件名,存取方式); 二、文件的关闭 在使用完一个文件后应该关闭它,以防止它再被误用。“关闭”就是使文件指针变量不指向该文件,也就是文件指针变量与文件“脱钩”,此后不能再通过该指针对其相连的文件进行读写操作,除非再次打开,使该指针变量重新指向该文件。用fclose函数关闭文件。 fclose函数调用的一般形式为: fclose (文件指针); 例如: fclose(fp); 三、文件的读写 1. 读/写字符函数(fputc函数和fgetc函数)或(putc函数和getc函数) fputc函数??把一个字符写到磁盘文件上去。 一般形式为: fputc(ch,fp); fgetc函数??从指定文件读入一个字符。该文件必须是以读或读写方式 打开的。调用形式为:ch=fgetc(fp); 本课讲解文件指针的说明,并用指针指向文件。利用fopen()和fclose()函数打开、 关闭文件,注意:需要用文件时,要打开;不用后,立刻关闭。另外,还学习了 两个读写文件的函数fgetc()、fputc(),用于读写字符。 课 后 小 结 80
/
本文档为【C语言程序设计教案】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索