《C语言程序设计方案》教案(清华谭浩强)
更新时间:2024-06-14 01:25:01 阅读量: 综合文库 文档下载
第一章C语言及程序设计概述
本章要求:
了解C语言的特点、C语言与其它高级语言相比有什么异同; 了解C程序在PC机上的建立、编译和运行过程; 了解C语言程序设计思想的基本篇;
重点:①C语言的主要特点;
②C语言在PC机上的运行过程及上机操作过程; ③常用算法的应用 难点:无
一、C语言概述
C语言是目前国际上在各种计算机运行较为广泛流行的一种高级语言。
主要表现为:
C语言:适合于作为系统描述语言——可用来写系统软件。
具有高级语言的特点,又有低级语言(汇编语言)的特点。 C语言:是AT&T贝尔实验室的Dennis Ritchie在1972年发明的。 C语言:是在B语言的基础上发展起来的。(ALGOL 60)
C语言:最早开始是用于UNIX操作系统。(C语言和UNIX是相辅相成的)
DBASE 、Microsoft Exel 、 Microsoft Word、PC-DOS等,则是用C语言加上若干汇编子程序编写的。
1983年:——制定的新标准,称为(美国国家标准化协会)ANSI C 1987年:——Turbo C1.0 (Borland) 1988年:TC 1.5(图形和文本窗口)
1989年:——Turbo C2.0 (DOS操作系统、查错、Tiny模式生成com文件)
1991年:——Turbo C++(3.0) 支持windows 3.X
说明:Turbo C语言可以在程序的任何地方嵌入汇编代码,提高速度,可以直接使用存储器和寄存器。
二.C语言的特点
1.语言简洁、紧凑、使用方便、灵活
C语言:——共有32个关键字,9种控制语句; 程序书写自由,主要用小写字母表示; 2.运算符丰富
C语言的运算符包含的范围很广泛,共有34种运算符; 即:把括号、赋值、强制类型转换都作为运算符处理 3.有丰富的数据类型
整型、实型、字符型、数据类型、指针类型、结构体类型、共用体(联合)类型等。实现复杂的数据结构(链表、树、栈、图)的运算。 4.具有结构化的功能,用函数作为程序模块,实现程序的模块化 5.语法限制不太严格,程序设计自由度大。(放宽了语法检查)
例:1)对数组下标越界不作检查,由程序编写者自己保证程序的正确;
2)整型数据、字符型数据、逻辑型数据可以通用。
6.能直接访问物理地址,能进行位(bit)操作,能实现汇编语言的大部分功能,可以直接对硬件进行操作。
7.生成目标代码质量高,程序执行效率高。 8.用C语言编写的程序,移植性较好。 说明:
C语言比其它高级语言难掌握,对编程人员要求较高
程序员使用C语言编写程序会感到限制少、灵活性大,功能强,可以编写出任何类型的程序。 三.C程序的构成 例:
main( ) /*主函数*/ {
int a,b,sum; /*定义变量*/ a=123;b=456; sum=a+b;
printf(“sum is %d\\n”,sum); /*输出变量*/ } 说明:
1)程序一般用小写字母书写;
2)每个程序必须要有一个main ( )(只能一个),称主函数; 注:C程序是由函数构成的,函数是C程序的基本单位。 函数:系统提供的库函数;用户设计的函数。 3)程序体必须在{ }之间;
4)每个语句的结尾,必须要有“;”作为终止符。 5)用/*……….. */ 作注释
四、C程序的上机过程 1.演示 书:P5 程序
2.上机步骤 书:P7
注:C语言是一种编译语言,编译语言的特点: 编译 连接 源程序 目标程序 执行程序 *.C *.OBJ *.EXE
C编译程序 Link程序 3.DOS下C语言的运行
目前DOS下运行C语言软件为:Turbo C 2.0 (1)Turbo C 2.0 的特点:
是一个把 ①编辑 ②编译 ③连接 ④运行 等全部操作集中在一个界面上。
(2) Turbo C 2.0的操作及运行 书:P8 五、算法的概念
1.算法的概念 书:P13 算法:程序的操作步骤。 程序中的数据 在程序设计中: 操作步骤
有: 程序 = 数据结构 + 算法 沃思 Nikiklaus Wirth 程序=算法+数据结构+程序设计方法+语言工具和环境 2. 计算机算法分为两大类: ①数值运算算法 ②非数值运算算法 (1)数值运算算法:求数值解;通过运算得出一个具体值,如求方程的根等
注:数值运算一般有现成的模型,算法较成熟。
(2)非数值运算算法:用于事务管理,如图书检索、人事管理等。 3、常用简单算法
(1)累乘 即:1×2×3×4×5……×100 1×2 → S(结果) S×3 → S(结果) S×4 → S(结果) ┇
S×100 → S(结果)
(2)累加 即:1+2+3+4+5……+100 1+2 → S(结果) S+3 → S(结果)
S+4 → S(结果) ┇
S+100 → S(结果)
(3)找最大值 5,2,4,12,9
5 →max (max 放最大值,后面的数都和它比较) 2 > max 不成立 4 > max 不成立
12 > max 成立:12 →max 9 > max 不成立
注:该算法可扩展为在一批数据中,找某一个数 (4)其它算法
P15 例 2.2 例 2.3 例 2.4 例 2.5 课余自学(必须)
4、算法的表示
常用的有:①自然语言②传统流程图③结构化流程图④伪代码⑤PAD图
(1)传统流程图
起止框 输入输出框 判断框 处理框 流程线 连接点
表示方法:P19 例
注:传统流程图对流程线的使用没有严格限制,难以实现结构化程序设计
为了限制流程线的滥用,提出三种基本结构: ①顺序结构 ②选择结构 ③循环结构
顺序结构 选择结构 f t . f 语句 表达式 表达式 t
语句 语 句 语 句1 语 句2
循环结构
表达式 语 句
语 句 表达式
a)“当型”结构 b)“直到型”结构
(2)N-S流程图
特点:去掉了带箭头的流程线,全部算法写在一个矩形框内。 称N-S结构化流程图
P A 成立 不成立 当P1成立 A B A B A 直到P1成立
顺序结构 选择结构 循环结构
作业:p37 2.4
上机:熟悉Turbo C 2.0的操作及运行
第三章 数据类型、运算符与表达式
本章要求:
本章是C语言的基本概念开篇,所介绍的概念是学习C语言的基础; 要求熟练掌握数据类型、运算符与表达式。
重点:①C语言数据类型定义的方法和分类。
②C语言运算符、表达式的使用以及它们的主要特点。
难点:自增、自减运算符、赋值运算符、逗号运算符及它们的混合使用
一.数据类型
概念:算法处理的对象——是数据,而数据是以某种特定的形式出现。
在C语言中,数据有:常量、变量;一般它们都有一定的数据类
型。
(C语言的数据结构是以数据类型形式出现的) 1.数据类型分类: 整型 int
基本类型 字符型 单精度型 float 实型(浮点型)
枚举类型 双精度型 double 数据类型 数组类型
构造类型 结构体类型 struct 共用体(联合)类型 union 指针类型* 空类型void
说明:在程序中对用到的所有数据都必须指定其数据类型。 2.C语言中的常量和变量
常量:——在程序运行过程中,其值不能被改变的量。 变量:——在程序运行过程中,其值可以改变的量。 说明:1)常量和变量,都要有一个名字表示它; 习惯上,符号常量(别名)名用大写,变量用小写。 符号常量的定义为: #define P 30
其它常量:直接用数据表示 例: 23 45.5 ‘e’ 3e+2 2)在C语言中,对变量要先定义,后使用。
3)如果一个变量被指定为一确定类型后,在C语言编译时,就能为其分配相应的存储单元。 a 变量名 存储地址)2000 3 变量值 存储单元 地址的概念
3.常用的基本数据类型 (1)整型
1)整型常量:十进制整数 123,-11,0 非0开头 八进制整型 0123,-011 0开头
十六进制整型 0x11 0x20 0x0D 0XFF 0x4e0x/0X开头
说明:在一个整常量后面加一个字母:l或L,是长整型常量。22L0733L 0xae4l
2)整型变量:
定义 存储字节 数的范围
基本型 int x (2字节) -32768~32767
短整型 short int x (2字节) -32768~32767
长整型 long int x (4字节)-2,147,483,648~2,147,483,647 无符号型 unsigned int x (2字节) 0~65535 unsigned short x(2字节) 0~65535
unsigned long x (4字节) 0~4,294,967,295 注: 数据在内存中是以:二进制形式存放 如:9 为 00001001
例: x=13。 x=015 。 x=0xD 存储结构 见P44 图3.5 注:数据超过数据范围,会发生数据溢出 例3.2、3.3 (2)实型(浮点数)
1)实型常量: 十进制整数 1.23 .0123 指数形式 1.23e3,1.00e-3 2)实型变量:数的表示范围P46表3.2
单精度 float x(4字节)3.4x10-38~3.4x1038 TC默认 双精度 double x (8字节)1.7x10-308~1.7x10308 说明:实型常量不分float和double,只有十进制表达方式
有的C编译系统64位存储方式,如尾加f或F可表示32位:324.567f 例:x=1.23。 x=123e3P47例3.4(存储精度) (3)字符型
1)字符常量:
a) 用单引号括起来的一个字符 ‘a’‘A’
b) 转义字符(由“\\专用字母” ) 书P48表3.3 例3.5 \\0字符串结束符 \\n换行 \\t水平制表 \\ddd八进制数 \\xdd十六进制数 2)字符变量: char c(1字节)
说明:一个字符变量,只能放一个字符常量。实际是把该常量的ASCII值,送入字符变量中。即:‘B’(66) c (字符变量)
书P374ASCII表 p50例3.6-7 c=‘B’c的内容为66
故:字符数据可以进行算术运算;即:c=‘B’+2 为68 字符数据在内存中的存储方式 书P50
unsigned char 0-255 char -128-127有符号数在TC中是用补码表示的
127(0x7f) 0111 1111 128(0x80) 1000 0000 复习:补码的规定:
正数:其原码、反码、补码相同
负数:最高位为1,其余各位为原码的反码(原码的相应位取反),然后对整个数加1。
140(0x8c) 1000 1100→1111 0011 + 1(取反加1)→1111 0100→-0x74 -0x74 1000 1011 + 1(取反加1) → 1000 1100 → 0x8c (0x80为负数-74 高位为1) 3)字符串常量
用双引号括起来的字符 “a” ,“ABFD”“a”=“a\\0” <> ‘A’
说明:C规定,在每一个字符串的结尾应加一个“字符串结束标志”(\\0),
以便系统判断字符串是否结束。
4.各类数值间的混合运算
1)整型、字符型、单精度型、双精度型数据——可以混合运算 2)字符型、整型——可以通用 规则:高double float long unsigned
低int char,short
例如 10+’a’+1.5-8765.1234*’b’-858873.593200 (TC默认6位小数) 10+97+1.5-8765.1234*98 二.运算符和表达式
C表达式:由变量、常量、函数等运算对象和运算符组成的式子 C运算符作用:
1)能把一些基本运算模块用单一的运算符处理 2)使用丰富的运算符,构成多种表达式
C运算符有优先级,优先级高的先执行,同级的由结合规则决定其处理规则
C运算符有两种结合规则:
1)从左到右的结合运算顺序;即:a=5+x-10;运算对象与左边运算符结合
2)从右到左的结合运算顺序;即:x=y=7;运算对象与右边运算符结合
C运算符分类 书P55 1.基本运算符(算术运算符) C语言有7个基本运算符
1)单目运算符:(表示符号) 正号“+” 负号“-”
2)双目运算符:+、- 、*、/、%(模运算,求余运算,两侧为整数) 说明:
a)运算顺序的结合方向从左到右
b)求余(取模)运算符是对两个整数相除的余数,计算结果的符号与第
一个数的符号相同。即:-5%3 值为-2、 -5%-3 值为-2、 5%-3 值为2 2.自增、自减运算符(优先级高于算术,右结合) 作用:——使变量的值增1或减1
++i(--i)——在使用i之前,先使i的值加1(减1),然后再使用i。
i++(i--)——先使用i的值,然后再使i加1(减1)。 例:i =4。
j=++i。 i 值为5,值为5; j=i++。 i 值为5,j值为4
说明:1)自增、自减运算符++(--),只能用于变量,不能用于常量或表达式
即:5++ 、 (a+b)++ —— 不合法 2)运算顺序的结合方向从右到左 例 例: main(){
int i=3 z,x,y。 z=(i++)+(i++)+(i++)
x=y=3。
//结果:z值为9 i值为6 z=x+++y。
//变量x右结合运算符++(不是3+4+5=12) printf(\。 }
输出结果:z=6 x=4 y=3
如果:z= -x+++y。 输出结果:z=0 x=4 y=3 x先为-4,然后+y,最后x++
3.赋值运算符和赋值表达式(优先级低于算术,右结合) (1)“=”——赋值运算符
作用:将一个数据赋给一个变量即:x=21
注意: 如果赋值运算符两侧的类型不一致,在赋值时,要进行类型转换。P61例3.9
即:float f 。 f=23 f值为23.0000符号位扩展 (2)复合的赋值运算符
“+=、-=、*=、/=、%=”—— 在赋值符“=”之前加上其它运算符 称复合运算符(也称为自反运算符) 例:a+=3 等价于 a=a+3 x*=y+8 等价于 x=x*(y+8) y/=4 等价于 y=y/4 m%=3 等价于 m=m%3
说明:
C语言采用这种复合运算符:
为了简化程序,使程序精练;提高编译效率。 (3)赋值表达式
格式:变量=表达式 表达式:
可以是 1)常量、变量、算术表达式; 2)赋值表达式
即:a=(b=5) 或 a=b=5 (运算顺序的结合方向从右到左) 例:
a=b=c=6 。 a=5+(c=6) (结果a=11 c=6)
如果:a=3。 求:a+=a-=a*a。 [有:1] a*a。 9 2)a= a-(a*a)。 -6 3) a+=-6 ] -6+-6 a为:-12 结果值为:-12
4.逗号运算符和逗号表达式(优先级最低,左结合) 用“,”将两个表达式连接起来。
格式:表达式1,表达式2 即: 3+5,6*9; 例: 3+5,6*9; 值为54
(先求解表达式1,再求解表达式2,最后逗号表达式的值为表达式2的值)
a=2*5,a*3; a值为10 结果值为:30(先求:a=2*5,后求:a*3) x=(a=2*5,a*3),a+4 a值为10 x值为30 结果值为:14 说明:
使用逗号表达式的目的,只是为了得到各个表达式的值(常用于循环语句)
解表达式1的结果可能影响解表达式2的值
5.强制类型转换运算符(优先级高于算术,右结合) 在要转换的数据前,用小括号括上要转换的数据类型 即: (int)x; (int)(a+b)(int)x+y 格式:(类型名)表达式
C一般会自动进行数据类型转换P56例3.8,用于不能自动转换的地方x%3(float f)
6.关系运算符和关系表达式(书P87)(优先级低于算术,左结合,高于赋值)
(1)6种关系运算符
< <= > >= (优先级高) = = !=(优先级低) (2)关系表达式
表达式 关系运算符 表达式
即:a>b a+b>=b+c (a=4)<(b=8) ‘x’= = ‘y’
说明:
关系表达式值:是一个逻辑值,即:“真”或“假” C语言:1 —— 代表“真”0 —— 代表“假”
7.逻辑运算符和逻辑表达式(书P88)(优先级低于关系,左结合) (1)3种逻辑运算符p89 表5.1
&& (与) | | (或) ! (非) (2)逻辑表达式
表达式 逻辑运算符 表达式 p89
即: (a>b) | | (a+b>=b+c) (a=4)&&(b=8) 1 | |∞ (1) ‘x’&& ‘y’ 值为1 1 说明:
逻辑表达式值:是一个逻辑值,即:“真”或“假”p90 优先次序(由高到低):
!(非) 算术运算符 关系运算符 &&和| | 赋值运算符 求值短路:5>3&&2||8<4-!0 1||∞ (结果1)
0&&∞ (结果0) 如:a&&b&&ca<>0才判断a&&b
8.条件运算符(书P97)
格式:表达式1 ? 表达式2:表达式3
执行:先求解表达式1,为真(非零),求表达式2 为假(为0),求表达式3
例: y= ( a>b ) ? a : b。
说明:a)条件运算符要求有三个操作对象(称三目元运算符) b)条件运算符优先于赋值运算符
y= ( a>b ) ? a : b。 先求 ( a>b ) ? a : b 后赋值 c)条件运算符的结合方向为“自右至左” ( a>b ) ? a : b可写为: a>b ? a : b
a>b ? a : b+5 相当于: a>b ? a :(b+5)
a>b ? a : c> d ? c : d 相当于: a>b ? a : ( c> d ? c : d )
* 9.位运算符 (书P298)(一般掌握)
位运算:—— 是对字节或字中的实际位进行检测、设置、屏蔽、移位。
位运算符:
&—— 位逻辑与 |——位逻辑或 ^—— 位逻辑异或 ~ —— 位逻辑反 >>—— 右移 << —— 左移
三、运算符小结
1.左结合方向的运算符
主要有:算术运算符、关系运算符、逻辑运算符、逗号运算符 2.右结合方向的运算符
主要有:自增、自减运算符、赋值运算符(复合的赋值运算符)、条件运算符
例:1) i=3; printf(\,%d\,i,i++);输出:4, 3
2) a=1;b=1;c=2; 求:a=b += c* = 5。 输出:a为11 b为11 c为10 3) a>b? a> c?a:c:b>c ? b:c 相当于:a>b? (a> c?a:c):(b>c ? b:c) (求最大值,如a=2, b=8, c=5 结果为:8)
3.运算符的优先次序(书 P375 附录Ⅲ)
()、!++/--/-转移、算术、关系(<<=>>=)、关系(= = !=)、&&、||、条件(?)、赋值、逗号
例:1) -a++ 相当于 -(a++)
2) x=4,y=7 求:y+=++x-3 x的值5y的值9 3) x=4,y=7 求:y=y+++x-3 x的值4y的值9
4) a=7,x=2.5,y=4.7 求:s=x+a%3*(int)(x+y)%*2/4 s的值2.500000
a%3*(int)(x+y)%*2 =》 1(整型) / 4 (整型) =》 0.25 =》0(整型) 5)a%3 && a%5 || a++>++b
如:a=7, b=5 a的值8 b的值6结果值1 1||1 如:a=15, b=15 a的值16 b的值16结果值0 1||0 如:a=15, b=14 a的值16 b的值15结果值0 0||0 如:a=15, b=13 a的值16 b的值14结果值1 0||1
四、该章的主要例题
数:P39 例3.1 P44 例3.2 P44 例3.3 字符: P49 例3.5 P50 例3.6P51例3.7
五、该章的主要习题
P65 3.5 3.6 3.8 3.9 3.10 3.12
六、该章的主要上机内容
P39 例3.1P44例3.2 P44例3.3 P51例3.7 P65 3.6 3.8 3.10
第四章 简单的C程序设计(顺序程序设计)
知识点:
1、赋值语句; 2、字符数据的输入/输出;
3、格式输入/输出语句printf和scanf及其格式控制符;%c、%f、%d(输出宽度、对齐方式、其它格式控制符只作了解) 4、程序的结构框架。
重点:
1.赋值语句;
2.基本输入/输出语句printf和scanf及其格式控制符%c、%f、%d等的意义。 难点: 无
一、C程序结构 C程序 源程序文件1 源程序文件2 源程序文件n 预编译命令 函数1 函数n 说明部分 执行部分 (语句) 语句的分类P67 P68 1、控制语句 ①条件:if else ②循环:for() ③循环:while() ④循环:do while() ⑤循环结束:continue
⑥终止循环或switch:break ⑦多分支:switch ⑧转向:goto
⑨函数返回:return
2、函数调用语句 printf(“a=%d”,a); 3、表达式语句
i=i+1 表达式 i=I+1。表达式语句函数调用也可以认为是表达式语句
4、空语句:一个“。”
5、复合语句(用{}:分程序) { x=3。 x=x+1。 print(“x=%x”,x) }
二.赋值语句 变量名=表达式
注:是组成顺序结构的主要语句。 a=b;if ( max<= x ) max =x 。
三.基本输入/输出语句
C语言本身不提供输入输出语句,输入输出操作是由函数来实现。 即:printf putcharscanf getchar
注:(1)这些函数构成一个标准的I/O函数库(放在“stdio.h”中) (2)如果要使用C语言库函数,要用预编译命令“#include”将有关“头文件”包括到用户源文件中。
#include
格式:printf(格式控制,输出表列)
格式控制:—— 用双引号括起来的字符串,也称为“转换控制字符串”
printf的格式字符 书P77 表4.1
输出表列:—— 需要输出的数据、表达式
即:printf( “x=%5.1f, y=%d, z=%c” , x, y, z ) d,i 带符号十进制形式
u 无符号十进制形式例3-3 c 字符形式 s 字符串形式
f 实数(小数)形式 默认6位小数
说明:1)printf( “ y=%-4d” , y ) 输出数据左对齐(默认为右对齐) 2)数据输出长度的修正;
l—— 输出长整型或双精度数据 即:printf( “%ld, %lf ” , i, y ) h—— 输出短型数据 即:printf( “%hu ” , a ) -m.n m最小宽度 n小数(实数) -左对齐
2.putchar函数 —— 字符输出函数
向终端输出一个字符
格式:putchar(变量) putchar(x) putchar(“\\n” )输出一个换行符 3.scanf函数 —— 格式输入函数
格式:scanf(格式控制,地址表列)
格式控制:—— 用双引号括起来的字符串,也称为“转换控制字符串”
scanf的格式字符书P80 表4.3
地址表列:—— 由若干个地址组成的表列,有:变量地址 &x 字符串的首地址 &—— 地址运算符
功能:求变量的地址(只能用于变量) &x —— 表示x变量值的内存单元的地址 即:scanf( “%d, M”, &a, &b )
说明:1)不带分隔字符的方式,系统将自动按格式说明截取数据 例: scanf ( “ M%*3d%f ”, &I , &p )。 输入:12345678.93时 得 I=1234 , p=8.93 “*”——作用是“虚读”,跳过相应的数据
2)带分隔字符的方式(分隔字符:空格、tab、回车、逗号) 即:scanf( “%d, %d”, &a, &b ) 4.getchar函数 —— 字符输入函数 从终端输入一个字符
格式:getchar ( ) 即:c=getchar ( )
函数值是从输入设备得到的字符 四、该章的主要例题
1已知矩形的两边长,求矩形的面积、周长 2大小写字母互相转化 3教材P83的例子
五、该章的主要习题 P84 4.5~4.9
第五章 选择结构程序设计
知识点:
1、关系、逻辑运算符、逻辑真/假; 2、关系表达式、逻辑表达式; 3、分支的概念及其算法描述; 4、三种IF分支语句; 5、条件运算符;
6、SWITCH语句。(了解)
重点:
1、关系、逻辑运算符、逻辑真/假; 2、关系表达式、逻辑表达式; 3、三种IF分支语句。 难点:
1、逻辑真/假;
2、关系、逻辑运算优先级。
一、关系表达式及逻辑表达式在分支选择结构的作用 在程序设计中,表示一些复杂的条件 1、关系运算符及关系表达式(第三章) 2、逻辑运算符及逻辑表达式(第三章) 3、条件运算符(第三章)
二.分支语句(书P91)
从一个条件表达式中,选择语句的执行 (用 if 语句或switch 语句来实现)
f . t . f 表达式 表达式 t
语 句 语 句1 语 句2
1.If 语句
(1)C语言提供三种形式的if语句 1)if (表达式) 语句
例: if (x>y ) printf ( “%d” , x )。 注意“;”位置 2) if (表达式) 语句1 else 语句2
例: if (x>y )
printf ( “%d” , x )。 else
printf ( “%d” , y )。注意分号“;” 3) if (表达式1) 语句1
else if (表达式2)语句2 else if (表达式3)语句3 ……
else if (表达式n)语句n
else 语句n+1 例:p92图5.6
(2)if ()和else后的执行语句可以使用复合语句{}
例5.1、5.2 p93if结构 将输入的三个数从大到小排列输出 例5.3 p95if 嵌套结构 计算函数值 (3)用条件运算符代替if语句 例: if ( a>b )
y=a。 条件运算符
else 可以用: y= ( a>b ) ? a : b。 y=b;
例5.4 p98条件运算符代替if 结构 将输入字符中的大写转换成小写输出
2.switch语句(了解)
switch语句——是多分支选择语句
表达式
语句1 语句2 语句3 语句 4
格式: switch (表达式) 表达式=常量表达式n 执行语句n
{ case 常量表达式1 :语句1; break; case 常量表达式2 :语句2; break; case 常量表达式3 :语句3; break; ┇
case 常量表达式n :语句n; break; default :语句n+1;
例:四级(ABCD)转化成百分制
#include
scanf(\。 switch(grade)
{ case 'A':printf(\。break。 case 'B':printf(\。break。 case 'C':printf(\。break。 case 'D':printf(\。break。 default:printf(\。} }
例:百分制成绩转化成五级(ABCDE)五级记分5-4-1 三、程序举例
例5.7 p103运费计算(自学)
p101 例5.6 求一元二次方程根(自学) p100例5.5判断某一年是否是闰年(自学) 五、该章的主要习题P104 5.3~5.10 该章的主要上机内容
P91 例5.2、P100 例 5.5,P101例5.6
P104 习题5.5、5.6、5.9 其他:上机实验指导书中内容
第六章 循环结构程序设计
知识点:
1、循环的概念及其算法描述;2、goto循环; 3、while循环;重点4、do—while循环;重点 6、for循环;重点难点7、break、continue语句;
8、各种循环结构中的执行循环体、判断循环条件的顺序;重点 9、各种循环结构在一定条件下的转化。重点难点
一、循环结构的概念
循环语句主要用于:重复执行的操作
1.C语言在实现循环过程——可使用以下语句: a) 用goto 语句和if 语句构成循环b) 用while语句 c) 用do—while语句 d) 用for语句 2.循环可分为二种类型结构:
a)“当型”结构 b)“直到型”结构
语句 语句 二.循环语句
1.用goto语句和if语句构成的循环 (1)goto语句——无条件转向语句 格式:goto 语句标号
语句标号:用标识符表示
例:goto next;如: goto 123 ;(不合法) (2)goto 和if语句构成循环
一般较少使用(不符合结构化原则) 例:求
?2nmain( )
i50{int i , sum=0 。 i=1 。
loop: if ( i<=50 ) { sum=sum+2*i 。
i++ 。 goto loop 。 }
printf ( “%d\\n” , sum ) 。 }
2.while语句 ——实现“当型”循环结构 格式:while ( 表达式 ) 语句 例:求
?2nmain( )
i50 { int i , sum=0 。 i=1 。
while (i<=50 )
说明:{ sum=sum+2*i 。i++ 。 }
printf ( “%d\\n” , sum ) 。 语句可为复合语句(用{ }构成) }
3.do—while语句 ——实现“直到型”循环结构 格式: do 语句 while ( 表达式 ); 例:求
?2n main( )
i50 { int i , sum=0 。 i=1 。 do
{ sum=sum+2*i 。 i++ 。 }
while (i<=50 ) 。
printf ( “%d\\n” , sum ) 。 }
do while 和while比较 p109 例6.4 4.for 语句
可以用于循环次数已知和循环次数不确定 (可以代替while语句) (应用广泛,而且使用较活)
格式:for ( 表达式1 。 表达式2 。 表达式3 ) 语句 过程: 表达式1
F 表达式2 T
说明:
语句 表达式1-----循环变量赋初值 表达式2-----循环结束条件 表达式3 表达式3-----循环变量增值
即:for (循环变量赋初值 , 循环结束条件 , 循环变量增值 ) 语句 例:求
?2n for ( i=1 。 i<=50 。 i++ ) sum=sum+2*i。
i50for语句的其它表示
(1) 用while 来表示 表达式1 while ( 表达式2 )
{ 语句
表达式3; }
(2) 表达式可以省略,但分号不能省略 a) 省略表达式1 i=1
for ( ;i<=50 ;i++ ) sum=sum+2*i b) 省略表达式2——产生死循环 for ( i=1;;i++ ) sum=sum+2*i c) 省略表达式3 for ( i=1;i<=50 ;)
{ sum=sum+2*i。 i++。 }
d) 省略表达式1 , 省略表达式3 i=1i=1
for ( ;i<=50 ;) while ( i<=50 )
{ sum=sum+2*i。 相当于 { sum=sum+2*i。 i++。 } i++。 } (3) 表达式1,表达式3可以是: a) 简单的表达式 b)逗号表达式 表达式2:一般是关系表达式或逻辑表达式
即: for ( sum=0 , i=1 。 i<=50 。 i++,i++ ) sum=sum+2*i。
或: for ( sum=0 , i=1 。 i<=50 。 i=i+2 ) sum=sum+2*i (4)循环体语句可使用break和continue语句
break:可以用来从循环体内跳出循环体(提前结束循环)
continue:用于跳过循环体中下面尚未执行的语句,接着重新执行循环的判断
.p115 例6.5将100-200间不能被3整除的数输出
三、程序举例
用多种循环方法实现
1 由泰勒展式计算sin(x)的近似值
2 .p115 例6.6 求π的近似值 1-1/3+1/5-1/7+
3.p115 例6.7求Fibonacci(斐波纳契)数列40个数 F1=1(n=1) F2=1(n=2)
Fn=Fn-1+Fn-2 (n>=3)
4.p115 例 6.8判断m是否是素数
5.p115 例 6.9 求100-200间的所有素数 6.例 求任意输入10个数中的最大数6-max
四、该章的主要习题 P120 6.1~6.15
五、该章的主要上机内容
P115 例6.5、例6.6、例6.7、例 6.9 P120 习题6.4、6.7、6.9、6.11、6.14 其他:上机实验指导书中内容
作业解答:
5-8利润提成:类似所得税
第七章 数组
1、数组的概念及数组的定义; 2、在程序设计中的如何使用数组;
3、字符数组是C语言存放字符串的主要方法,并注意字符串结束标志的规定。
重点:①数组的组成和特点。 ②一维数组和二维的定义、赋值。
③字符串与字符数组的关系以及数组在程序中的使用。 难点:①数组元素存储格式对程序设计的使用。
②字符串在数组中的组成以及字符串操作语句的使用。
基本类型
数组类型
C语言:数据类型 构造类型 结构体类型 共用体类型 指针类型
构造类型:是由基本类型按一定规则组成的类型 一.数组的概念
数组:—— 1)是一组有序数据的集合 2)这个集合用一个数组名来表示 3)数组的元素序号用一个下标值来表示
如:a[0] , a[1] , a[2] , a[3] b[1][1] , b[1][2] , b[2][1] , b[2][2] 注意:a)数组名后,用方括号;下标从0开始。 b)下标值——可以是常量表达式
常量表达式:包括常量和符号常量(用#define定义的),但不能包含变量。
C语言:不允许数组进行动态定义。 即: int n 。
scarf(“%d”,&n)。
int x[n]。 /*定义数组 */
c)数组分为:一维、二维等,主要由下标值的多少来确定。 二.一维数组 1.定义
格式: 类型说明符 数组名[常量表达式] 类型说明符:——表示数组的类型
int , short , long , unsigned , float , double , char等
数组名: ——表示各数组元素的统一名字,定义方法和变量名相同
常量表达式:——表示数组的长度 即:int a[10]
注意:C语言不提供数组下标越界的保护,设计时要注意。
2.数组元素的初始化
数组在定义的时候,同时,可对数组元素进行初始化 格式:static int a[10]={0,0,0,0,0,0,0,0,0,0} 静态定义 a[10]={0,1,2,3,4,5,6,7,8,9} 说明:
1)static 数组不赋初值,系统会对所有数组元素自动赋以0值。 即:int a[10]={0,0,0,0,0,0,0,0,0,0}。等价于:static int a[10] 。 2)对全部数组元素赋初值,可以不指定数组长度。 即: static int a[ ]={0,1,2,3,4,5}。 等价于: static int a[6]={0,1,2,3,4,5} 。 3)可以部分赋初值 即: int a[5]={1,3}。 3.数组元素的引用
C语言规定:只能逐个引用数组元素,而不能一次引用整个数组。 4.程序举例
书P124 例7.2 例7.3
三.二维数组和多维数组 1.定义
格式: 类型说明符 数组名[常量表达式] [常量表达式] 类型说明符:——表示数组的类型
int , short , long , unsigned , float , double , char等 数组名: ——表示各数组元素的统一名字 常量表达式:——表示数组的长度 即:int a[5] [6] 说明:
a)每一维的下标从0开始,整个数组元素为:5×6=30个 b)C语言中,二维数组中元素排列的顺序是按行存放。 即:先存放第一行的元素,再存放第二行的元素
3a[0][0] 3 4 5 存储单元
4a[0][1] a= 6 7 8 对应表:
5 a[0][2] 1 2 9 →
6a[1][0]
7a[1][1]
8 a[1][2]
1a[2][0]
2a[2][1]
9a[2][2]
c)可以计算数组元素在数组中的序号 假设 m×n的数组a,
计算a[i][j]序号的公式: i×n+j
如:a[0][1] 0×3+1=1(第二个) 如3×3 a[1][2] 的序号是: 1×3+2=5 a[2][2] 2×3+2=8 d)多维数组的定义
格式: 类型说明符 数组名[常量表达式] [常量表达式] [常量表达式] 即: 类型说明符 数组名[长度1] [长度2] [长度3] … int a[2] [3][4]
2.二维数组初始化 1)两种基本方法:
(a)分行给二维数组赋初值 static int a[2][3]={{1,2,3},{5,6,7}} (b)所有数据写在一个化括弧内
static int a[2][3]={1,2,3,5,6,7} 2)可以对部分元素赋初值 static int a[2][3]={{1},{3}}
即: 1 0 0 3 0 0
static int a[3][4]={{1},{3,1},{0,0,9}}
即: 1 0 0 0 3 1 0 0 0 0 9 0 3)定义数组时,第一维的长度可以不指定,但第二维的长度要指定(编译系统自动计算)。
static int a[][3]={1,2,3,4,5,6,7,8,9} 等价于: static int a[3][3]={1,2,3,4,5,6,7,8,9}
static int a[][4]={{1},{3,1},{0,0,9}} 等价于:static int a[3][4]={{1},{3,1},{0,0,9}}
4.程序举例
书P128 例7.4 二维数组行列转换
例7.53×4矩阵求最大元素及行列号
四.字符数组
存放字符数据的数组;每一个元素存放一个字符。 1.定义
char 数组名[常量表达式] 即:char c[10]。
说明:由于字符与整型是互相通用的,可使用 int c[10] 。 定义。 2.字符数组的初始化
1)static char c[5]={‘a’, ‘b’, ‘c’, ‘d’, ‘e’}。
注意:static char c[5]={‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’}。 ( 错误,多一个元素) static char c[5]={‘a’, ‘b’, ‘c’}。 (正确) 后面元素自动定为空格 2)static char c[]={‘a’, ‘b’, ‘c’, ‘d’, ‘e’}。 系统自动根据初值个数确定数组长度 3.字符数组的引用
一个字符数组元素,代表一个字符。
即:x=c[2] x的值为“c” 4.字符串的使用
C语言中,将字符串作为字符串来处理。
规定:一个“字符串结束标志”,以字符‘\\0’,在遇到字符‘\\0’时,表示字符串结束。
1)使用字符串常量进行数组初始化 static char c[ ]={“I am happy”}。 或 static char c[ ]=“I am happy”。
等价于 static char c[ ]={‘I’, ‘ ‘, ‘a’, ‘m’, ‘h’, ‘a’, ‘p’, ‘p’, ‘y’,’\\0’}。 注:(a)系统对字符串常量自动加一个‘\\0’ (b)字符数组并不要求它的最后一个字符为‘\\0’ 2)数组长度始终保证大于字符串实际长度
static char c[10]={“ABCDE”}。 (第5个元素\\0,第6个开始为空字符ASCⅡ为0)
static char c[10]={‘A’, ‘B’, ‘C’, ‘D’, ‘E’}。 (后面5个元素为空字符ASCⅡ为0)
例7-6 P131:字符数组引用 例子 打印图形 (J5_1.C)
#define NL printf(\ main()
{ char a[10]={'*','*','*','*','*','*','*','*','*','*'}。 int i,j。 图案层数 for (i=0。i<=4。i++) { NL。 图案前空格 for (j=1。j<=i。j++) printf(\。
for (j=1。j<=10-(2*i-1)。j++) printf(\。 } * 个数 }
*********
******* ***** *** *
5.字符数组的输入输出 1)两种方法:
a)逐个字符输入输出。 用格式符“%c”进行 scanf ( “%c”, &c[i])。 b)整个字符串一次输入输出。用格式符“%s”进行
例: static char c[ ]={“abcde”}。
printf(“ %s” , c ) 。 (为数组名,不能为“ %s” , c[0]) 2)可以用scanf 函数输入一个字符串 static char c[6]。
scanf ( “%s”, c )。
注意:键盘输入不能超过5个字符
c不用加地址符&,即&c;因数组名代表数组的起始地址 6.字符串处理函数
在C的函数库中提供了一些用来处理字符串的函数 (1)scanf 和printf函数在字符串的使用
使用scanf和printf函数对字符串的处理时,调用语句中的输入或输出项使用的是字符数组名。(即使用字符数组名的首地址) 例:main ( ) (j5_9.c) { char s1[3] , s2[5]。 scanf(“%s%s”,s1 , s2 )。 printf(%s\\n%s\\n”, s1 , s2 )。 } 输入:
ABC DEF HK (即:希望s1=“ABC ”s2=“DEF HK” 输出: ABC DEF
说明:C语言规定,scanf函数遇空格或回车就结束本次输入。 (2)puts函数
格式:puts(字符数组) 即: puts(str)
将一个字符串str(以‘\\0’结束的字符序列)输出到终端 (3)gets 函数
格式:gets(字符数组) 即: gets ( str ) 输入:abcde
读取字符串并把它们依次放到str指向的字符数组中去。 得到一个函数值,该函数值是字符数组的起始地址。
str是字符数组的首地址,它读取字符串直到遇到换行符或EOF。
换行符或EOF不进入字符串,被转换为“\\0”,作为字符串结束符 (4)strcat函数
strcat( str1 , str2 )。str1,str2是字符数组
连接两个字符数组中的字符串,把str2接到str1的后面,结果放在字
符数组str1中。
例:static char str1[20]={“ABCD EF”} static char str2[ ]={“gggg”}
执行strcat(str1,str2)的结果为:ABCD EFgggg 书P136 (5)strcpy函数
strcpy( str1 , str2 )。功能:把str2的内容复制到str1中 例:strcpy( str1 , “abcd” )。
strcpy( &a[n] , &a[n+1] )。 作用:将n个字符以后的字符顺序地向前移动一个序号。
说明:a ) str1>=str2
b ) str1必须是数组名,str2可以是数组名或字符串常量 c ) 可以解决字符串常量不能赋值给字符数组
即:str1={“abcde”} 。 str1=str2。(不合法) 可用strcpy(str1,str2) 注:strcpy(str1,str2,2); 是将str2中前面2个字符拷贝到str1中去,然后再加一个‘\\0’。 (6)strcmp函数 strcmp( str1 , str2 )。
功能:把str1与str2的内容进行比较(按ASCII码的大小进行比较) 如果:str1=str2,则函数返回0
如果:str1>str2,则函数返回正整数 如果:str1 strlen( str )测试字符串长度,不包括‘\\0’ (8)strlwr函数 strlwr ( str )将字符串中大写字母换成小写字母 (9)strupr函数 strupr ( str )将字符串中小写字母换成大写字母 7.程序举例:书P138 例7.8 例7.9 五、该章的主要例题:例7.1、例7.2、例7.3、例7.4、例7.5、例7.6、例7.8、例7.9 六、主要习题:7.1、*7.2、7.3、7.5、7.6、*7.9、7.11、*7.13 七、主要上机内容:例7.2、例7.3、例7.4、例7.5、例7.7、例7.8、7.1、7.3、*7.9、7.11 其他:上机实验指导书中内容 第八章 函数与程序结构 1、函数的一般概念:函数形参、实参、返回值,函数的类型; 2、动态存储变量与静态存储变量 3、变量的生存期与作用域 重点:①函数的定义和调用及使用函数的特点。 ②函数间的参数传递(值传递和地址传递)。 ③变量存储作用域、编译预处理的使用。 难点:①函数参数传递(数值、地址)及形参、实参的使用; ②变量存储作用域及自动变量与静态变量的区别。 一、函数概述 一个较大的程序:可由若干程序模块组成,每一模块用来实现一个特定的功能。 ——用子程序可实现该模块功能。 ——在C语言中:子程序称为:子函数 在C程序中: 可由一个主函数和若干个函数构成。 分为标准库函数和用户自定义函数 函数的作用: 减少重复编写程序段的工作量。 语句 语句 功能 调用 功能 语句 语句 功能 调用 语句 语句 标准库函数:由C语言预先编写的一系列常用函数(系统提供) Turbo C 的标准库——包含400多个常用函数 用户自定义函数: 一般自定义函数和自定义函数库(用户先已编好的) 二、函数定义(子函数的设计) 1.函数定义 格式:类型定义符函数名(形式参数表列) { 函数体 } 说明:1)类型定义符:函数返回值的数据类型 a) int , char , float , double 默认int b) 函数无数据返回,使用 void 作类型定义符 2)函数名:函数的名称(用户取的:合法的标识符) 3)形式参数表列:函数调用时传递信息的通道 有两种表示方法: a)(参数说明 形式参数) 传统风格 b) (形式参数) 参数说明 例: float add( float x , float y ) float add( x , y ) { x=x+y。 { float x , y 。 return (x) 。 x=x+y 。 } return (x)。 } a). b) 2.函数的返回值 ? 一般通过函数中的return语句获得。 ? 如果不需要返回值,可以不要return语句。 为了明确表示“不带回值”,可以用“void”定义“无类型” 例: main ( ) /*(打印平方表)*/ { void prin ( int x ) 。 int i 。 for ( i=1 。 i<=10 。 i++) prin ( i ) 。 } void prin ( x ) int x 。 { printf(“%d\\t%d\\n”,x,x*x)。 } 三、函数间的参数传递 在一个主调函数调用一个子函数时,须把主调函数的参数传递给子函数,称该参数为“实际参数”。 实参可以是常量、变量、表达式 实参应和形参类型相同或相容 P146 例8.2 (主函数) c=max(a , b)。 (子函数) max(int x , int y) 参数传递形式参数 实际参数 (1)数值传递方式 特点:实参通过复制的方式传递给形参(占用不同的内存空间) 实参地址2形参地址 a x 调用函数的实参:给出具体数据 (2)地址传递方式 特点:参数传递不是数据本身,而是数据的地址(使用同一地址空 间) 实参地址形参地址 调用函数实参:一般是数组名或指针变量 四、函数调用及值的返回 1.函数调用 格式: 函数名 (实参表列); 调用的过程: a)通过函数名,找到定义的函数 b)将实际参数传递给被调函数的形式参数 (实际参数与形式参数一一对应,既一一传递数据) 许多C版本是按自右而左的顺序求值 例:P150 例8.4 main ( ) { int i=2, p。 p=f(i, ++i) 。/* f为f(3, 3) */ printf ( “%d” , p )。 } int f(int a , b) { int c。 if (a>b) c=1。 else if (a= =b) c=0。 else c= -1。 return( c )。 } 运行结果:0 说明:(1)应避免这种情况的产生,可写为: ①自左而右顺序 ②自右而左顺序 j=i。 j=++i。 k=++i。 p=f(j, j)。 p=f(j, k)。 (2)在printf(“ %d, %d ”,i, i++)。 中同样存在 当:i=3; 结果为: 4,3 2.函数调用的几种方式 (1)函数语句 把函数调用作为一个语句,即单独一个语句行。 不要求函数带回值,只要求函数完成一定操作。 即:printstar( )。 (2)函数表达式 函数出现在一个表达式中,要求函数带回一个确 定的值以参加表达式的运算。 即:c=2*max( a, b )。 (3)函数参数 函数调用作为一个函数的实参; 即:m=max(a,max(b, c)); 3.函数说明 作用:在函数使用前对函数的特征进行说明的语句。(用户自定义函数) ? 对已定义的函数的返回值进行类型说明。 ? 告诉系统在本函数中将要用到的函数是什么类型。 ? C语言规定:以下几种情况可以不使用函数说明 a)函数的值(函数的返回值)是整型或字符型(系统自动按整说明) b)如果函数定义在调用函数之前,可以不必加以说明 在函数说明和函数定义中: a)类型定义、函数名要相同 b)形式参数标识符可以不相同 如:main ( ) { double abc ( int x , float y ) 。/*函数说明*/ --- } double abc ( int a , float b ) /*函数定义 a,b与x,y不同*/ 函数体 } 非int形参的函数必须在调用前进行函数说明P148 例8.3、8.5 不使用函数说明例子 例:main ( )float abc ( float x , float y ) {int sum , a=2 , b=5。{x=x+y。 定 sum=add( a , b ) 。 return(x)。义 ┄} } main ( ) int add( int x , int y ) { float sum , a=2.0 , b=5.0。 { x=x+y。 定义 sum=abc( a , b )。 return (x) 。 语句 } } 说明:使用库函数,一般在文件开头用#include命令 即:#include “math.h” main () { … a=sqrt(x) … } 4.函数的嵌套调用 1)C语言函数不能嵌套定义即:函数定义 函数定义 函数定义1 函数定义2 各个函数定义是互相平行的 函数定义3 2)C函数允许嵌套调用,即在调用一个函数的过程中,又调用另一个函数。 main ( )a函数 b函数 调用b函数 调用a函数 返回 结束 返回 示例: *五、递归调用 一个函数自己调用自己的过程 递归:由递归方式与递归终止条件两部分组成 即:一个递归的问题可以分为:首先“回推”,然后“递推” 在递归过程中,必须具有一个结束递归过程的条件。 例:N! 1 (N=0, 1) 递归公式= N*(N-1)! (N>1) 子函数定义 求:4! long fac( int n ) sum=fac(4)结束条件。 { long fa。 if (n= =0) fa=1 else fa=n*fac(n-1)。 return(fa)。} 第一步 fac(4)fa=4*fac(4-1)=4*fac(3) fa=4*3*2*1*1 第二步 fac(3)fa=3*fac(3-1)=3*fac(2) fa=3*2*1*1 第三步 fac(2)fa=2*fac(2-1)=2*fac(1) fa=2*1*1 第四步 fac(1)fa=1*fac(1-1)=1*fac(0) fa=1*1 第五步 fac(0)fa=1 递推 回推 六、函数参数的使用(实参或形参) ? 实参:在调用函数中; 形参:在函数定义中 ? 函数参数:1)数值 2)变量 3)数组元素 4)数组名 5)指针 1.函数间的参数传递 (1)数值传递方式 实参地址形参地址 调用函数的实参:给出具体数据 主要是:1)数值 2)变量 3)数组元素 (2)地址传递方式 实参地址形参地址 主要是:调用函数实参:一般是数组名或指针变量 2.数组有两种参数: a) 数组元素:一个数组元素相当于一个变量,所以,数组元素可以用于函数参数,用法与变量相同。 是传递数据方式 b) 数组名:数组名作为一个变量用于函数实参和形参,传递的是整个数组元素或部分数据元素。 是传递地址方式 (1)数组元素作实参的传值调用 ? 把数组元素当作变量来作为实参使用 ? 传值调用最多返回一个值 例: main ( ) { int a[5]。 调用函数 … a[0]=mul( a[1] , a[4] ) 。 … 函数定义 } int mul(int x , int y ) { int s 。 … return( s )。 } (2)数组名作函数参数(实参与形参都用数组名) 具有:存贮地址作实参的传址调用 例: (J5_3.C) main () { void swap(float x[2])。 float a[2]={10.5,2.7}。 printf(\。 swap(a)。 printf(\。 } void swap(float x[2]) 相当于: void swap( x) { float t。 { float x[2]。 t=x[0]。x[0]=x[1]。x[1]=t。 } 说明:a)数组名在主调函数和被调函数中,分别进行定义,并且类型一致。 b)调用的实质: 数组a和数组x 数组a独享存贮区共享存贮区 数组a独享存贮区 10.5 2.7 2.7 2.7 10.5 10.5 c)实参数组和形参数组大小可以不一致 (C语言编译时,对形参数组大小不作检查,只是将实参数组的首地址传给形参数组,这样两个数组共同占用同一段内存单元) 例 (J5_4.C) main () { void fun(float x[4])。 float a[4]={3.5,6.1,0.2,7.9}。 int i。 a[0] a[1] a[2] a[3] fun(&a[1])。第2个的开始连续3个地址 for (i=0。i<=3。i++) 3.5 6.1 0.2 7.9 printf(\。 x[0] x[1] x[2] } void fun(float x[4]) 共用内存单元 { x[0]=x[0]+1。x[1]=x[1]+1。x[2]=x[2]+1。 } 结果:3.5 7.1 1.2 8.9 数组a和数组x 数组a独享存贮区共享存贮区 数组a独享存贮区 a[0] 3.5 a[1] 7.1 a[0] 3.5 a[1] 6.1 a[2] 1.2 a[1] 7.1 a[2] 0.2 a[3] 8.9 a[2] 1.2 a[3] 7.9 a[3] 8.9 注意:不要使用x[3] , 即:x[2]是子程序最后一个可用元素。 (3)例子 书P164 例8.10例8.11 例8.12书P166例8.13 (4)二维数组作函数参数 二维数组的传值调用与一维数组相似。 例: main ( ) { int a[3][5]。 调用函数 … mul( n , a[1][2] , a[0][4] ) 。 … 函数定义 } int mul(int x , int y , int z ) { int s 。 … 例 (j5_8.c) main () { int tran(int n,int x[])。 int total,a[4][4]={{3,8,9,10},{2,5,-3,5},{7,0,-1,4},{2,4,6,0}}。 tran(2,a)。第一行的第0列 地址 9个 tran(2,&a[0])。 第一行的第0列 地址 9个 tran(0,&a[2])。第二行的第0列 地址 4个 } 计算数组元素在数组中的序号 tran(int n,int arr[]) { int i。 for (i=0。i<4。i++) printf(\。 printf(\。 } 程序输出: 7,0,-1,4, 7,0,-1,4, 7,0,-1,4, 七、局部变量和全局变量 1.变量存储作用域 (1)作用域:决定一个变量的有效范围。 a)作用域是整个程序的变量——为全局变量 b)作用域只限于程序的一部分的变量——为局部变量 局部变量:——在一个函数内部定义的变量(内部变量),它只在本函数 范围内有效。 全局变量:——在函数之外定义的变量称为外部变量,外部变量是全局变量 (2)有效范围为: 从定义变量的位置开始到本源文件结束。 书P169 外部变量在文件开头定义,则在整个文件范围内都可以使 用该外部变量。书P170 (3)作用: 增加函数间数据联系的渠道。 同一个文件中的所有函数都能引用全局变量的值 书P170 例8.15 八、变量的存储类型 ————用来规定变量的作用域以及它们存在的长短 2.变量的存储类别 ? 变量存在的长短:决定一个变量存在的范围(整个程序,部分函数) ? 从变量存在的时间(即生存期)角度来分,有静态存储变量和动态存 储变量 静态存储方式: 指在程序运行期间分配固定的存储空间的方式 动态存储方式: 指在程序运行期间根据需要进行动态的分配存储空间的方式 供用户使用的存储空间: 程 序 区 三个部分 静态存储区 动态存储区 静态存储区:主要放全局变量 即:在程序开始执行时给全局变量分配存储区,程序执行完毕 就释放。 动态存储区:主要放 ①函数形参变量。在调用函数时给形参变量分配存储空间。 ②局部变量(未加static说明的局部变量) ③函数调用时的现场保护和返回地址 在函数套眼调用开始时分配动态存储空间,函数结束时释放这些空间。 (分配和释放是动态的) C语言中,变量和函数有两个属性: 数据类型 (如整型、字符型等) 存储类型 (数据在内存中存储的方法) C语言提供:(四种存贮类型符) ① auto(自动) ② register(寄存器) ③ staic(静态) ④ extern (外部) C语言规定:存贮类型符放在变量定义的最前面 即:staic int a , b 。 (1)自动变量 ( auto ) 定义在函数内部的变量,变量的建立与撤消是系统自动进行的。 在调用此函数时才给此变量分配存储单元,当函数执行完毕时,存储单元就被撤消。 定义方式有:在函数体开始处定义 、在复合语句中定义 注: 1)自动变量的存储类型符(auto)一般可省去。 2)自动变量是一个局部变量,其值在一个函数的两次调用之间不能保持。 例(j4_11.c) (2)静态变量(static) 在整个函数调用期间都可以保存其值的变量(在函数调用结束后,其值不消失而保留原值,即占用的存储单元不释放) ? 静态变量未初始化时,其值是零 ? 自动变量未初始化时,其值是随机的 书P173 例8.17 注:静态变量的生存期是永久的,但它们的作用域却不都是全局的。 既:凡有static说明的,其作用域都是局限的; a)局限于本函数内(静态局部变量) b)局限于本文件内(静态外部变量)书P175 例8.18 示例: (j4_15.c) ? 如果把静态变量放在函数外面定义 称为静态外部变量,作用域为全 局 ? 静态外部变量的全局性仅限于本程序,它的值不能在文件之间互传 *(3)寄存器变量 ( register ) 存放于CPU的一个寄存器中的变量(在CPU中进行) ? 可以把使用频率高的变量 定义为register,提高程序执行的速度。 ? 寄存器变量只能用于整型和字符型。 ? 变量的个数受CPU寄存器数目的限制。 示例:书P175 例8.19(j4_12.c) 目前P系列 CPU自动分配 *(4)外部变量(extern ) 外部变量主要用在:要在n个文件之间互访一批变量 ? 外部变量的值是“永久”保留的;既从一个函数调用到另一个 函数调用,它原来的值始终存在。 ? 外部变量的作用域是整个程序(工程)。 1)作用域在n个文件之间的外部变量 一个程序中包含若干个文件,各个文件都要用到一些共用的变量时,就可以在一个文件中定义一批变量,而相关文件只要用extern说明它们是外部变量,那么,这些变量就可以供n个文件“全局”使用;同时,运算结果也可“共享” (外部变量开辟一条文件之间传递数据的通道)P176 例8.20 2)作用域在一个程序中的外部变量 定义变量的语句应放在变量作用域的开始处,而在引用这些变量的函数中,可以不再使用变量说明。 示例: (j4_18.c) 总结:P180 作用域分析: 局部变量:自动变量(函数内):离开函数,值消失 定义 auto int a 函数内定义 静态局部变量(函数内):离开函数,值保留 定义 static int a函数内定义 寄存奇变量(函数内):离开函数,值消失 定义 register int a函数内定义 全局变量:静态外部变量(函数内,本文件)首字母大写 使用static声明(可多次声明) 定义 ertern int A 函数外定义,用static声明(内外均可) 非静态外部变量(工程内所有文件)首字母大写 非动态,编译时分配内存 定义 ertern int A 函数外定义 变量存储时间 动态存储:自动变量(本函数内存在) 寄存奇变量(本函数内存在) 形式参数(本函数内存在) 静态存储:静态局部变量(函数外存在) 静态外部变量(函数外本文件内存在) 非静态外部变量(函数外,工程内所有文件存在) 变量存放位置 内存中静态存储区:静态局部变量(本函数) 静态外部变量(函数外部静态变量) 非静态外部变量(其它文件可使用) 内存中动态存储区:动态变量和形式参数 CPU中的寄存奇:寄存奇变量 * 3.内部函数和外部函数 内部函数:一个函数只能被本文件中其它函数所调用。(称静态函数) 在定义时:在函数名和函数类型前面加static 即:static 类型标识符 函数名(形参表) 外部函数:以extern说明的函数,表示此函数是外部函数。 书P182 例8.22 4. 工程文件(工程文件prj):多*.C源文件 九.编译预处理 书P187 编译预处理:——编译前对源程序进行的一些预加工。 C语言的预处理功能主要有三种: a)宏定义 b)文件包含 c)条件编译 以“#”符号开头的行——为预处理的标志 1.宏定义(宏替换)用预处理命令#define指定的预处理 1)不带参数的宏定义 用一个指定的标识符(即名字)来代表一个字符串 格式:#define 标识符 字符串 例: #define PI 3.14159
正在阅读:
《C语言程序设计方案》教案(清华谭浩强)06-14
冀教版六年级下册第六单元教案07-04
学习贯彻《准则》和《条例》 开创全面从严治党新境界05-16
2015中考压轴题系列46_动态几何之其他问题(平面几何)05-10
《爱心树》教学设计12-05
2014--二级建造师法律法规考试重点10-17
不胜任工作岗位员工优化管理办法09-27
市级青年文明号申报材料02-21
影像与剪辑艺术B卷答案10-26
2009学年第一学期高三语文期中试卷定稿02-28
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 浩强
- 清华
- 程序设计
- 教案
- 语言
- 方案
- 档案实务试题(2010省里)
- jacob迭代法 gauss-seidel迭代法 matlab命令
- 材料研究方法word
- 计算机组网技术实验报告 - 图文
- 《我爱红领巾》说课稿
- 锦绣东方营销推广方案
- 4-3《多彩服饰》教案
- Intraweb使用手册中文版
- 污水处理水质检化验操作规程
- 中国物流报告译稿
- 2015重庆选调生申论备考:模块串讲之概括题
- 2012报关员模拟试题2
- 八年级物理上册 6.3测量物质的密度达标练习题(无答案)(新版)
- 2018-2024年中国润滑油添加剂行业深度研究与发展趋势研究报告(
- 2014年高考理综模拟试题试卷(3套)
- 全新版大学进阶英语第二册第二单元答案
- 教育心理学章节练习题及答案(1)
- AUTOCAD2007快捷键命令
- 《宏观经济学》习题(学生版)
- 幼儿园中班歌唱活动《萤火虫》教案