资源预览内容
第1页 / 共291页
第2页 / 共291页
第3页 / 共291页
第4页 / 共291页
第5页 / 共291页
第6页 / 共291页
第7页 / 共291页
第8页 / 共291页
第9页 / 共291页
第10页 / 共291页
亲,该文档总共291页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
1教学内容第一章第一章 C语言概述语言概述第二章第二章 算法算法第三章第三章 数据类型、运算符与表达式数据类型、运算符与表达式第四章第四章 最简单的最简单的C程序设计程序设计第五章第五章 选择结构程序设计选择结构程序设计第六章第六章 循环控制循环控制第七章第七章 数组数组第八章第八章 函数函数第九章第九章 预处理命令预处理命令第十章第十章 指针指针第十一章第十一章 结构体结构体第十三章第十三章 文件文件2前前 言言前前 言言一、计算机语言一、计算机语言1、机器语言、机器语言2、汇编语言、汇编语言3、高级语言、高级语言4、高级语言向机器语言的过渡、高级语言向机器语言的过渡高级语言高级语言高级语言高级语言源程序源程序源程序源程序机器语言机器语言机器语言机器语言目标程序目标程序目标程序目标程序计算结果计算结果计算结果计算结果编译编译编译编译解释解释解释解释执行执行执行执行机器指令的集合机器指令的集合符号化的机器语言符号化的机器语言通用自然的算法语言通用自然的算法语言3前前 言言二、程序与程序设计二、程序与程序设计完成某一功能的计算机完成某一功能的计算机指令的有序集合指令的有序集合1、程序、程序2、程序设计、程序设计设计、编制、调试程序设计、编制、调试程序的过程的过程43、程序设计的基本步骤、程序设计的基本步骤(1) 分析问题分析问题(2) 确定解题思路和算法确定解题思路和算法(3) 编制流程图编制流程图(4) 编写源程序编写源程序(5) 静态检查静态检查(6) 上机调试上机调试(7) 正式运行正式运行前前 言言5&本章内容本章内容1.1 C语言发展史语言发展史1.2 C语言特点语言特点1.3 简单简单C程序分析程序分析第一章第一章 C语言概述语言概述返回返回6第一章第一章 C语言概述语言概述第一章第一章 C语言概述语言概述1.1 C语言发展史语言发展史1960 ALGOL60 (Algorithmic Language)1987 87 ANSI C 1990 ISO C1972 C (取取BCPL第二个字母第二个字母)1970 B (取取BCPL第一个字母第一个字母)1978 标准标准C 1983 ANSI C1967 BCPL (Basic CombinedProgramming Language)跳转跳转7第一章第一章 C语言概述语言概述1.2 C语言特点语言特点1、简练、自由、结构化、简练、自由、结构化 (32个关键字、个关键字、9种控制语句)种控制语句)2、运算符丰富(附录、运算符丰富(附录)34种种3、数据结构丰富、数据结构丰富4、可直接对硬件进行操作、可直接对硬件进行操作5、目标程序质量高、目标程序质量高6、可移植性好、可移植性好8第一章第一章 C语言概述语言概述1.3 简单简单C程序分析程序分析例例1.1 打印(显示)一串字符打印(显示)一串字符。运行结果运行结果: This is an example./* example1.1 */ main( ) printf(“This is an example. n”); 9第一章第一章 C语言概述语言概述例例1.2 已知角度值已知角度值45, 求正弦值的求正弦值的2倍。倍。 /*example 1.2*/ #include “math.h” main( ) float x, y; x=45; y=2*sin(x*3.14/180); printf(“Y=%f n”, y); 运行结果运行结果: Y=1.41365010第一章第一章 C语言概述语言概述例例1.3 已知三角形三边已知三角形三边 a, b, c, 求面积。求面积。 /*example 1.3*/ #include “math.h” main( ) float a, b, c, p, s; scanf(“%f, %f, %f ”, &a, &b, &c); p=(a+b+c)/2; s=sqrt(p*(p-a)*(p-b)*(p-c); printf(“P=%f n S=%f ”, p, s); 输入:输入:4,5,6 输出:输出:P=7.500000S=9.92156711第一章第一章 C语言概述语言概述max( int x , int y ) main( ) /*max number*/ int z ; int a , b , c ; if(xy) z=x ; scanf(“%d,%d”,&a,&b); else z=y ; c=max( a , b ) ; return(z) ; printf(“max=%dn ”, c) ; 例例1.4 已知整数已知整数 a, b, 求求其中的最大数。其中的最大数。12第一章第一章 C语言概述语言概述C程序结构程序结构1、C程序由函数构成程序由函数构成C程序程序=一个主函数(一个主函数(main函数)函数)一个主函数一个主函数+若干其他函数若干其他函数(子或库子或库)说明部分说明部分2、函数、函数 函数体函数体 数据定义数据定义执行部分执行部分(语句)(语句)Turbo C有有300多个多个跳转跳转3、语句书写自由,后带分号、语句书写自由,后带分号“;”4、可用、可用 /*/ 对对C程序作注释程序作注释前一页前一页13&本章内容本章内容2.1 算法的概念算法的概念2.4 算法的表示算法的表示2.5 结构化程序设计结构化程序设计第二章第二章 算法算法返回返回14第二章第二章 算法算法第二章第二章 算法算法程序程序 = 数据结构数据结构 + 算法算法程序程序=数据结构数据结构+算法算法+程序设计方法程序设计方法+语言工具和环境语言工具和环境数据结构数据结构:对数据的描述对数据的描述算法算法:对操作的描述对操作的描述#include “math.h” main( ) float x, y; x=45; y=2*sin(x*3.14/180); printf(“Y=%f n”, y); 15例如:例如:1+2+3+100=5050 或或100+1+99+2+98+49+51+50=100+49*100+50=5050第二章第二章 算法算法2.1 算法的概念算法的概念算法算法:为解决一个问题而采取的方法和步骤。为解决一个问题而采取的方法和步骤。16第二章第二章 算法算法2.4 算法的表示算法的表示(用流程图表示算法用流程图表示算法)起止框起止框处理框处理框判断框判断框输入输入/出框出框流程线流程线连接点连接点注释框注释框17第二章第二章 算法算法例例2.1 计算计算265的平方根的平方根顺序结构顺序结构开始开始X=265Y=X输出输出Y结束结束NS图图X=265Y=XY开始开始结束结束18第二章第二章 算法算法例例2.2 打印打印X的绝对值的绝对值分支结构分支结构NS图图X=0y n 打印打印x 打印打印 -xX=0? x -x结束结束开始开始19第二章第二章 算法算法例例2.3 计算计算1到到100的和的和循环结构循环结构i=100nNS图图 i=1,s=0s=s+ii=i+1打印打印sy i=1,s=0s=s+ii=i+1打印打印s当当i = = !=逻辑运算符逻辑运算符 ! & |赋值运算符赋值运算符 =条件运算符条件运算符 ? :逗号运算符逗号运算符 , 指针运算符指针运算符 * & 强制类型转换运算符强制类型转换运算符 (类型关键字类型关键字)46第三章第三章 数据类型、运算符与表达式数据类型、运算符与表达式二、算术表达式二、算术表达式1、定义:用、定义:用算术运算符算术运算符和和括号括号将将运算对象运算对象连连接起来且接起来且符合符合C语法语法规则规则的式子的式子2、运算顺序、运算顺序 a*b/c-1.5+a 473、运算类型(、运算类型( 3.7混合运算混合运算 )(1) 同类型运算结果类型不变同类型运算结果类型不变(2) 不同类型运算先按类型级不同类型运算先按类型级(3) 别低向高转换成同一类型,别低向高转换成同一类型,(4) 再计算再计算double floatlongunsignedint char, short 高高低低 10+a+ i * f - d/ldoubledouble doubleint4、优先级和结合性、优先级和结合性 double第三章第三章 数据类型、运算符与表达式数据类型、运算符与表达式48第三章第三章 数据类型、运算符与表达式数据类型、运算符与表达式(类型关键字类型关键字)(表达式表达式)例:例: (int) a (float)(5%3) (double)(x+y)三、强制类型转换运算三、强制类型转换运算注意注意: (int) x+y 只转换只转换 x的类型后与的类型后与y相加相加 (int) x 不等同于不等同于int (x)49第三章第三章 数据类型、运算符与表达式数据类型、运算符与表达式举例举例3.10main()int i ; float x ; x=3.6 ; i=(int)x ; printf(“x=%f , i=%dn” , x , i ) ; 运行结果:运行结果:x=3.600000 , i=350第三章第三章 数据类型、运算符与表达式数据类型、运算符与表达式四、自增、自减运算四、自增、自减运算1、运算规则、运算规则+i -i 使用前使使用前使i值值加加(减减) 1i+ i- 使用后使使用后使i值值加加(减减) 12、注意、注意(1) 只能用于变量只能用于变量(2) 右结合方向右结合方向(3) 使用时谨防出错使用时谨防出错j=+i;j=i+;相当于相当于i=i+1;j=i;j=i;i=i+1;51第三章第三章 数据类型、运算符与表达式数据类型、运算符与表达式3、例、例52第三章第三章 数据类型、运算符与表达式数据类型、运算符与表达式3.9 赋值运算符和赋值表达式赋值运算符和赋值表达式一、赋值运算符及其操作一、赋值运算符及其操作= 将一个表达式的值赋给一个变量将一个表达式的值赋给一个变量二、赋值表达式二、赋值表达式 说明:说明:(1) 发生类型转换(自学发生类型转换(自学60-61页)页) (2) 右结合右结合例:例:x= -b/(2*a) a=b=c=5 a= (b=4)+(c=6) 那么那么a=5=b=c?53第三章第三章 数据类型、运算符与表达式数据类型、运算符与表达式三、复合赋值运算三、复合赋值运算复合赋值运算符复合赋值运算符=运算符运算符+赋值号赋值号例:例:a+= 3 a+= 3 a=a+3a*= x+y a*= x+y a=a*(x+y)a%= b a%= b a=a%b 例例: 设设 a=3 求下列表达式的值求下列表达式的值a+=a-=a*aa+=(a-=a*a)a+=(a=a-a*a)a=a+(a=a-a*a) -1254第三章第三章 数据类型、运算符与表达式数据类型、运算符与表达式3.10 逗号运算符和逗号表达式逗号运算符和逗号表达式1、逗号表达式、逗号表达式表达式表达式1,表达式,表达式2,表达式表达式n2、运算规则、运算规则从左到右依次计算各表达式的值,以从左到右依次计算各表达式的值,以表达式表达式n的值作为最终值(其优先级最低)的值作为最终值(其优先级最低)例:比较例:比较 (设设a=3)a= 3*5, a*4a= (3*5, a*4)计算后:计算后:值值60,a=15 a=12 55第三章第三章 数据类型、运算符与表达式数据类型、运算符与表达式举例举例3.11main()int i ; float f=7.2 ; printf(“i=%d n” ,(f+=4 , i=f) ; printf(“f=%f n” , f ) ; 运行结果:运行结果:i=11f=11.200000 56&本章内容本章内容4.1 C语句概述语句概述4.2 赋值语句赋值语句4.3 I/O的概念及在的概念及在C语言中的实现语言中的实现4.4 字符数据的输入字符数据的输入/输出输出4.5 格式输入与输出格式输入与输出第四章第四章 最简单的最简单的C C程序设计程序设计返回返回57第四章第四章 最简单的最简单的C程序设计程序设计4.1 C语句概述语句概述第四章第四章 最简单的最简单的C C程序设计程序设计C语句语句控制语句(条件、分支、循环)控制语句(条件、分支、循环)函数调用语句(函数加分号)函数调用语句(函数加分号)表达式语句(表达式加分号)表达式语句(表达式加分号)空语句(一个单独的分号)空语句(一个单独的分号)复合语句(用复合语句(用 将若干语句括起)将若干语句括起)58第四章第四章 最简单的最简单的C程序设计程序设计4.2 赋值语句赋值语句语句格式:语句格式:赋值表达式;赋值表达式;例如:例如:if ( ( a=b ) 0 ) t=a ; if ( ( a=b ) ) x=a; if (a=b ) y=a;在在 if 后面的小括号内必须是表达式后面的小括号内必须是表达式59 C 程序最基本的成分是语句程序最基本的成分是语句目前我们已掌握的语句:目前我们已掌握的语句:变量说明语句变量说明语句: int a,b,c; 表达式语句:表达式语句:x+y; 特别地:特别地: a=5; 赋值语句赋值语句60 可以编写简单程序如:可以编写简单程序如: main() int x,y; x=5; y=2*x*x+3*x-1; 该程序语法上完整,但还缺少输出。该程序语法上完整,但还缺少输出。 61 数据的输出数据的输出用输出函数实现用输出函数实现,其中的两种输出函数:其中的两种输出函数:1.putchar 函数函数(字符输出函数)(字符输出函数)用于输出一个字符。用于输出一个字符。 如如: putchar (a); putchar (100); char c=b; putchar (c);62 例例:输出单词:输出单词Boy的完整程序:的完整程序: #include “stdio.h” 注意该语句的作用注意该语句的作用 main() char a, b, c; a=B; b=o; c=y; putchar (a); putchar (b); putchar (c); 63 2. printf2. printf函数(格式输出函数)函数(格式输出函数) 任意类型、任意格式、任意个数。任意类型、任意格式、任意个数。例如:例如:int a=100,b=56; printf(“a=%d,b=%d”,a,b);printf(“a=%d,b=%d”,a,b); 普通字符普通字符格式说明格式说明格式控制格式控制 输出表列输出表列 输出结果:输出结果:a=100,b=56a=100,b=56“%” 后的字符称格式字符,不同格式字符对应不同的数据类型。后的字符称格式字符,不同格式字符对应不同的数据类型。64 d d格式符:按整数格式输出格式符:按整数格式输出 几种用法:几种用法: %d 不指定宽度,按实际宽度输出不指定宽度,按实际宽度输出 %md 按指定宽度输出,按指定宽度输出,m为宽度为宽度 %ld 用于输出长整型数用于输出长整型数65例:例: int a=125,b=453;int a=125,b=453; long c=65535; long c=65535; printf(“a=%d,b=%5d,c=%ld”,a,b,c); printf(“a=%d,b=%5d,c=%ld”,a,b,c); 输出结果:输出结果: a=125,b= 453,c=65535a=125,b= 453,c=6553566 c格式符:用于输出字符格式符:用于输出字符 char c=A;char c=A; printf(“c=%c,%c”,c,B); printf(“c=%c,%c”,c,B); 输出结果输出结果:c=A,Bc=A,B 输输出出对对象象既既可可以以是是字字符符变变量量、字字符符常常量量,还还可可以以是整型表达式。是整型表达式。67 如:如: int a=100;int a=100; char b=A; char b=A; printf(“n%d,%c”,a,a); printf(“n%d,%c”,a,a); printf(“n%c,%d”,b,b); printf(“n%c,%d”,b,b); 输出结果:输出结果: 100,d100,d A,65 A,6568完整前面的程序:完整前面的程序:完整前面的程序:完整前面的程序:main() int x,y; x=5; y=2*x*x+3*x-1; printf(“n y=%d”,y);69例例4.1 已知三角形三边已知三角形三边 a, b, c, 求面积求面积 #include “math.h”main( ) float a, b, c, p, s; scanf(“%f, %f, %f ”, &a, &b, &c); p=(a+b+c)/2; s=sqrt(p*(p-a)*(p-b)*(p-c); printf(“p=%fns=%f n”, p, s); 第四章第四章 最简单的最简单的C程序设计程序设计70第四章第四章 最简单的最简单的C程序设计程序设计例例4.2 已知整型变量已知整型变量x,y的值分别是的值分别是3和和5, 试将它们的值互换。试将它们的值互换。int x=3, y=5, z;z=x; x=y; y=z;zy35x35371第四章第四章 最简单的最简单的C程序设计程序设计4.3字符数据的输入字符数据的输入/输出输出2、语句功能:从指定设备、语句功能:从指定设备读一个字符读一个字符输出输出c的值的值(字符字符)1、语句格式、语句格式输入:输入:getchar( );输出:输出:putchar(c);3、说明、说明使用标准使用标准I/O函数时,应在程序前加预函数时,应在程序前加预编译命令:编译命令: #include “stdio.h”字符变字符变量量72第四章第四章 最简单的最简单的C程序设计程序设计例例4.3 输入一个字符并把它输出出来输入一个字符并把它输出出来 #include “stdio.h” main( ) char c; c=getchar( ); putchar(c); 73第四章第四章 最简单的最简单的C程序设计程序设计1、语句格式、语句格式输入输入 scanf(格式控制,地址表列格式控制,地址表列);输出输出 printf(格式控制,输出表列格式控制,输出表列);2、语句功能、语句功能按按格式控制格式控制描述的格式给描述的格式给地址表列地址表列中的量中的量 输入值或输出输入值或输出输出表列输出表列中各量的值中各量的值3、格式控制、格式控制“”括起来的一串括起来的一串格式字符格式字符和其它字符和其它字符4.4 格式输入与输出格式输入与输出74第四章第四章 最简单的最简单的C程序设计程序设计4、格式字符、格式字符指定输出宽度在格式符中插入:指定输出宽度在格式符中插入:m.n例:例: %10d %10.4f %12.5e 75&本章内容本章内容5.1 关系运算符和关系表达式关系运算符和关系表达式5.2 逻辑运算符和逻辑表达式逻辑运算符和逻辑表达式5.3 if 语句语句5.4 switch 语句语句4.5 格式输入与输出格式输入与输出第五章第五章 选择结构程序设计选择结构程序设计返回返回76第五章第五章 逻辑运算和判断选取控制逻辑运算和判断选取控制第五章第五章 选择结构程序设计选择结构程序设计5.1 关系运算符和关系表达式关系运算符和关系表达式一、运算符与优先级一、运算符与优先级 (左结合性左结合性) = = != = = !=同级同级同级同级高高低低算术运算算术运算 关系运算关系运算 赋值运算赋值运算高高低低77第五章第五章 逻辑运算和判断选取控制逻辑运算和判断选取控制二、关系表达式二、关系表达式1、关系表达式的形式、关系表达式的形式 2、关系表达式的值、关系表达式的值1 真真0 假假下列是合法的关系表达式:下列是合法的关系表达式:a+b c+d (a=3) b)=(cd)注意:注意:f=abc 表达式的值。如:表达式的值。如: 0x 3 & 2 | 2 b)&(n=cd) 当当a=1,b=2,c=3,d=4,m=1,n=1时,执行结时,执行结 果果m=0, (n=cd)不被执行不被执行, n 仍然为仍然为13、运算中一旦能确定其值,终止计算、运算中一旦能确定其值,终止计算如计算:如计算: a&b&c a|b|c2、逻辑运算的对象并非仅限于逻辑量、逻辑运算的对象并非仅限于逻辑量C判断处理的原则判断处理的原则非非0 真真 0 假假例例 if (-5) x=10; else x=0;思考题思考题: 上式去掉括号后上式去掉括号后m=ab & n=cd 结果如何结果如何?81第五章第五章 逻辑运算和判断选取控制逻辑运算和判断选取控制5.3 if 语句(条件语句)语句(条件语句)一、语句格式一、语句格式任意表达式任意表达式可以是复可以是复合语句合语句格式格式1:if (e) 语句语句格式格式2:if (e) 语句语句1 else 语句语句2格式格式3:if (e1 ) 语句语句1 else if (e2 ) 语句语句2 else if (e3 ) 语句语句3 . else if (em ) 语句语句m else 语句语句n 82第五章第五章 逻辑运算和判断选取控制逻辑运算和判断选取控制二、语句功能二、语句功能格式格式1:if (e) 语句语句计算计算 e 的的值并判断值并判断。 e 值值非非0,则执行,则执行语句语句;否;否则,执行则,执行下条语句下条语句。格式格式2:if (e) 语句语句1 else 语句语句2计算计算 e 的的值并判断。值并判断。 e 值值非非0,则执行,则执行语句语句1;否;否则,执行则,执行语句语句2。下条语句下条语句语句语句1语句语句2e非非00下条语句下条语句e语句语句非非00goto83第五章第五章 逻辑运算和判断选取控制逻辑运算和判断选取控制格式格式3:if (e ) 语句语句1 else if (e ) 语句语句2 else if (e ) 语句语句3 . else if (e ) 语句语句m else 语句语句n 123m计算计算 e1 的的值并判断,值并判断,其其值值非非0执行执行语句语句1;否则,判断;否则,判断 e2 的的值,值,其其值值非非0执行执行语句语句2; 否则,判断否则,判断 e3 的的值,值, 其其值值非非0执行执行语句语句3;否则,;否则,. 判断判断em 的的值,值,其其值值非非0执行执行语句语句m ;否则,否则,执行执行语句语句n00e1e3eme2语句语句1语句语句3语句语句2语句语句m语句语句n 下条语句下条语句非非0非非0非非0非非000.84第五章第五章 逻辑运算和判断选取控制逻辑运算和判断选取控制例例5.1 从键盘输入两个整型数,输出最大数。从键盘输入两个整型数,输出最大数。main() int a ,b ; scanf(“%d,%d”,&a,&b); if(a=b)printf(“max=%dn”,a); if(ba)printf(“max=%dn”,b);开开始始enda , babaa) a=b; printf(“max=%dn”,a);开开 始始enda , bbaaa=b非非0086第五章第五章 逻辑运算和判断选取控制逻辑运算和判断选取控制例例5.2 输入两个整型数,按大小输出。输入两个整型数,按大小输出。main() int a ,b ,temp ; scanf(“%d,%d”,&a,&b); if (ba) temp=a;a=b;b=temp; printf(“%d,%dn”,a,b);开开始始enda , bbaa,ba b非非0087第五章第五章 逻辑运算和判断选取控制逻辑运算和判断选取控制例例5.3 输入互不相等的三个数,按从小到大输入互不相等的三个数,按从小到大 顺序输出它们。顺序输出它们。分析:设已知的三个数为分析:设已知的三个数为a, b, c。(1)可直接通过逻辑表达式和条件语句可直接通过逻辑表达式和条件语句 设计程序。设计程序。(2)可通过条件语句和互换变量值设计)可通过条件语句和互换变量值设计 程序,即经过处理后使:程序,即经过处理后使:abc88第五章第五章 逻辑运算和判断选取控制逻辑运算和判断选取控制方法(方法(1):):main( )float a, b, c; scanf(“%f %f %f ”,&a,&b,&c); if(ab&bc) printf(“%f,%f,%f”, a, b, c); if(ac&cb) printf(“%f,%f,%f”, a, c, b); if(ba&ac) printf(“%f,%f,%f”, b, a, c); if(bc&ca) printf(“%f,%f,%f”, b, c, a); if(cb&ba) printf(“%f,%f,%f”, c, b, a); if(ca&ab)t=a;a=b;b=t; if(ac)t=a;a=c;c=t; if(bc)t=b;b=c;c=t; printf(“%5.2f, %5.2f, %5.2f ”, a, b, c);90例例5.4 求一元二次方程求一元二次方程 ax2+bx+c=0 的解的解第五章第五章 逻辑运算和判断选取控制逻辑运算和判断选取控制求求x1、x2x1、x2endd=0无实根无实根yn开开 始始d=b2-4aca, b, c开开 始始求求根根:x1、x 2x 1、 x 2enda, b, cd=b2-4ac91第五章第五章 逻辑运算和判断选取控制逻辑运算和判断选取控制#include main( ) float a, b, c, d, x1, x2; scanf(“%f %f %f ”,&a,&b,&c); d=b*b-4*a*c; if (d=0) x1=(-b+sqrt(d)/(2*a); x2=(-b-sqrt(d)/(2*a); printf(“x1=%f,x2=%fn ”, x1,x2); else printf(“It is no real roots.”); 92第五章第五章 逻辑运算和判断选取控制逻辑运算和判断选取控制例例5.5某运输公司吨公里基本运费为某运输公司吨公里基本运费为p,根根 据距离据距离s的远近计费标准如下:的远近计费标准如下: s250km没有折扣没有折扣 250 s500 2% 折扣折扣500 s1000 5% 折扣折扣 1000 s2000 8% 折扣折扣 2000 s=3000) d=0.15; else if(s=2000) d=0.10; else if(s=1000) d=0.08; else if(s=500) d=0.05; else if(s=250) d=0.02; else d=0.0; f=p*w*s*(1-d); printf(“f=%15.2f ”, f); 94第五章第五章 逻辑运算和判断选取控制逻辑运算和判断选取控制三、三、if 语句的嵌套语句的嵌套嵌套嵌套 if 的一般形式的一般形式if ( ) if ( ) 语句语句1 else 语句语句2else if ( ) 语句语句3 else 语句语句4内嵌内嵌 if内嵌内嵌 if注意:注意:else 总是与它上面最近的总是与它上面最近的 if 配对配对95第五章第五章 逻辑运算和判断选取控制逻辑运算和判断选取控制if ( ) if ( ) 语句语句1else if ( ) 语句语句2 else 语句语句3内嵌内嵌 ifif ( ) if ( ) 语句语句1 else if ( ) 语句语句2 else 语句语句3内嵌内嵌 ifif ( ) if ( ) 语句语句1else 语句语句2if ( ) if ( ) 语句语句1 else 语句语句296第五章第五章 逻辑运算和判断选取控制逻辑运算和判断选取控制分析:分析:a=0 不是二次方程。不是二次方程。 b2-4ac=0 有两个相等实根。有两个相等实根。 b2-4ac0 有两不等实根。有两不等实根。 b2-4ac0求求xyynnd=b -4ac2yna=0开开 始始a , b , cend98第五章第五章 逻辑运算和判断选取控制逻辑运算和判断选取控制if ( fabs(a)1e-6) printf(“No!”);else d=b*b-4*a*c; if ( fabs(d)0 ) x1=(-b+sqrt(d)/(2*a); x2=(-b -sqrt(d)/(2*a); printf(“Two real roots:%f,%f ”,x1,x2); else xr= -b/(2*a); xi=sqrt(-d)/(2*a); printf(“Complex roots:%f,%f ”, xr,xi); 99第五章第五章 逻辑运算和判断选取控制逻辑运算和判断选取控制四、条件运算符与条件表达式四、条件运算符与条件表达式1、条件表达式的一般形式、条件表达式的一般形式 ? :2、运算规则、运算规则先计算先计算表达式表达式1,若为,若为非非0,则以则以表达式表达式2的值作为条件表达式的值;的值作为条件表达式的值;否则,以否则,以表达式表达式3的值为条件表达式的值。的值为条件表达式的值。3、优先级、优先级算术算术 关系关系 逻辑运算逻辑运算(!除外除外) 条件运算条件运算 赋值运算赋值运算高高低低右结合右结合100第五章第五章 逻辑运算和判断选取控制逻辑运算和判断选取控制(1)输出输出x和和y当中的最大值当中的最大值 z=xy ? x : y ; printf(“max=%d”,z);或或 printf(“max=%d”,xy?x:y); 或或 xy?printf (“%d”,x) : printf (“%d”,y); 举例举例:(2)ab?a:b+1等价于等价于ab?a:(b+1)而不是而不是(ab?a:b)+1(3)ab?a:cd?c:d等价于等价于ab?a:(cd?c:d)(4)xy?1:5.6 表达式的值的类型取高的表达式的值的类型取高的(5)ch=(ch=A&ch=Z)?(ch+32):ch;101第五章第五章 逻辑运算和判断选取控制逻辑运算和判断选取控制5.4 switch 语句语句一、语句格式一、语句格式 switch(表达式表达式) case 常量表达式常量表达式1:语句:语句1 case 常量表达式常量表达式2:语句:语句2 case 常量表达式常量表达式n:语句语句n default :语句语句n+1 102第五章第五章 逻辑运算和判断选取控制逻辑运算和判断选取控制二、执行过程二、执行过程当当switch后的表达式的值与某一个后的表达式的值与某一个case后后的常量表达式的值相等时,执行其后的语的常量表达式的值相等时,执行其后的语句;若无匹配,则执行句;若无匹配,则执行default后的语句。后的语句。三、三、break 语句语句使流程跳出使流程跳出switch结构,结构,终止终止switch语句的执行。语句的执行。103第五章第五章 逻辑运算和判断选取控制逻辑运算和判断选取控制例例5.7 用用switch语句设计语句设计“例例5.5运费程序运费程序”跳转跳转 s 1 d=0 1 s 2 d=0.2 2 s 4 d=0.05 4 s 8 d=0.08 8 s 12 d=0.112 =3000) c=12; else c=s/250; switch(c) case 0 : d=0; break; case 1 : d=0.02; break; case 2 : case 3 : d=0.05; break; case 4 : case 5 : case 6 : case 7 : d=0.08; break; case 8 : case 9 : case 10: case 11: d=0.1; break; case 12: d=.15; break; f=p*w*s*(1-d); printf(“f=%15.2f ”, f); 105第五章作业第五章作业第第111页页 5.3 、 5.5、 5.7上机调试作业上机调试作业第第111-112页页 5.6、 5.7第五章第五章 逻辑运算和判断选取控制逻辑运算和判断选取控制106第五章第五章 逻辑运算和判断选取控制逻辑运算和判断选取控制习题习题5.5 已知已知x,求分段函数值求分段函数值ymain() float x, y; scanf(“%f”, &x); if(x=1&x=10) y=3*x-11; printf(“x=%f, y=%fn”, x, y); 程序程序1:107第五章第五章 逻辑运算和判断选取控制逻辑运算和判断选取控制main() float x, y; scanf(“%f”, &x); if(x1) y=x; else if(x10) y=2*x-1; else y=3*x-11; printf(“x=%f, y=%fn”, x, y); 程序程序2:108第五章第五章 逻辑运算和判断选取控制逻辑运算和判断选取控制习题习题5.6分析:设百分制成绩为分析:设百分制成绩为x, 成绩等级为成绩等级为yAx 90B80 x90C70 x80D60 x70Ex60y=109第五章第五章 逻辑运算和判断选取控制逻辑运算和判断选取控制习题习题5.1010a|b|c|d0其他其他h=分析:设坐标为(分析:设坐标为(x, y), 高度为高度为h设:设: a=(x-2) + (y-2) 1b=(x+2) + (y-2) 1c=(x+2) + (y+2) 1d=(x-2) + (y+2) 122222222110&本章内容本章内容6.1 概述概述6.2 goto语句语句6.3 while语句语句6.4 do-while语句语句6.5 for语句语句6.6 循环的嵌套循环的嵌套6.7 几种循环的比较几种循环的比较6.8 break语句和语句和continue语句语句第六章第六章 循环控制循环控制返回返回111第六章第六章 循环控制循环控制第六章第六章 循环控制循环控制C 循环控制循环控制if - goto循环循环(6.2) while循环循环(6.3)do - while循环循环 (6.4)for循环循环(6.5)6.1 概述概述112第六章第六章 循环控制循环控制6.2 goto语句及其构成的循环语句及其构成的循环一、一、goto语句语句2、语句功能、语句功能使控制转到使控制转到语句标号语句标号所标识的语句所标识的语句 goto L1;L2: 语句语句 . L1: 语句语句 goto L2;例:例:1、语句格式、语句格式 goto 语句标号语句标号写在语句前的标识写在语句前的标识符符 (后加:后加:)113第六章第六章 循环控制循环控制二、用法二、用法1、与、与if语句联合使用构成循环语句联合使用构成循环2、用来实现从多重循环体内转出、用来实现从多重循环体内转出L1: if(e) 循环体循环体 goto L1; (当型循环)当型循环)L2: 循环体循环体 if(e) goto L2; (直到型循环)直到型循环)114第六章第六章 循环控制循环控制例例6.1 求求 s=1+2+3+.+n 的值。的值。 main( ) int i=1, sum=0, n; scanf(“%d”,&n);L1:sum=sum+i; i+; if(i=n) goto L1; printf(“s=%d”,sum); main( ) int i=1, sum=0, n; scanf(“%d”,&n); L1:if(i=n) sum=sum+i; i+; goto L1; printf(“s=%d”,sum); 115第六章第六章 循环控制循环控制6.3 while语句语句“当型当型”循环循环一、语句格式一、语句格式while(e)循环体循环体二、执行过程(先判断后执行)二、执行过程(先判断后执行)当表达式当表达式 e 值为值为非非0时,执行时,执行循环体,然后重复执行循环体,然后重复执行while语句;当语句;当e 的值为的值为0 时,结束时,结束循环,执行后继语句。循环,执行后继语句。非非00循环体循环体e单语句或复合语句单语句或复合语句116第六章第六章 循环控制循环控制例例6.2 求求 s=1+2+3+.+n 的值的值(用用while循环循环n=100)。main( ) int i=1, s=0, n; scanf(“%d”,&n); while(i=n) s=s+i; i+; printf(“s=%d”, s);main( ) int i=1, s=0, n; scanf(“%d”,&n); while(i=n) s+=i+; printf(“s=%d”, s);117第六章第六章 循环控制循环控制6.4 do-while语句语句“直到型直到型”循环循环一、语句格式一、语句格式do 循环体循环体while(e););二、执行过程(先执行后判断)二、执行过程(先执行后判断)先执行先执行do后的后的循环体循环体,然后判断,然后判断表达式表达式e 的值,若为的值,若为非非0,重复,重复执行执行循环体循环体,直到,直到while中的表中的表达式达式e 为为0,结束循环。,结束循环。循环体循环体e0非非0单语句或复合语句单语句或复合语句118第六章第六章 循环控制循环控制例例6.3 求求 s=1+2+.+n 的值的值(用用do-while循环循环n=100)。main( ) int i=1, s=0, n; scanf(“%d”,&n); do s=s+i; i+; while(i=n); printf(“s=%d”, s);main( ) int i=1, s=0, n; scanf(“%d”,&n); do s+=i+; while(i=n); printf(“s=%d”, s);119第六章第六章 循环控制循环控制6.5 for语句及其构成的循环语句及其构成的循环一、语句格式一、语句格式for(表达式表达式1;表达式表达式2;表达式表达式3) 循环体循环体计算表达式计算表达式1计算表达式计算表达式3表达式表达式2循环体循环体下一条语句下一条语句0非非0二、执行过程二、执行过程1、计算、计算表达式表达式1。2、判断、判断表达式表达式2。 若非若非0,执行,执行循环体循环体,转,转3; 否则,结束循环,转否则,结束循环,转4。3、计算、计算表达式表达式3。转。转2。4、执行、执行for语句的语句的下一条下一条语句。语句。120第六章第六章 循环控制循环控制三、说明三、说明1、for语句最简单、最常用的应用形式语句最简单、最常用的应用形式for(循环变量赋初值;循环条件;循环变量增值循环变量赋初值;循环条件;循环变量增值) 循环体循环体例例6.4 求求 s=1+2+.+n 的值的值(用用for循环循环n=100)。 main( ) int i, s=0, n; scanf(“%d”,&n); for(i=1; i=n; i+) s=s+i; printf(“s=%d”, s); 121第六章第六章 循环控制循环控制2、for语句中的三个表达式均可省略语句中的三个表达式均可省略 注意:注意:(1) 分号不能省略。分号不能省略。 (2) 应保证循环正确执行。应保证循环正确执行。例例 main( ) int i, s, n; scanf(“%d”,&n); for(i=1,s=0; i=n;) s+=i+; printf(“s=%d”, s);main( ) int i=1, s=0, n; scanf(“%d”,&n); for(; in)break; printf(“s=%d”, s);122第六章第六章 循环控制循环控制例例6.5 给一年级的小学生出给一年级的小学生出10道道100以内的加法练习题。以内的加法练习题。分析分析:1、出题出题 2、回答、回答 3、判断对错、判断对错#include “stdlib.h” main( ) int i , x , y , z ; randomize(); for(i=1; i=10; i+) x=random(99); y=random(99); printf(“%d+%d=”, x , y ); scanf(“%d”, &z); if(z=x+y)printf(“nright!n”); else printf(“nwrong!n”);思考思考:1、做对几题、做对几题 2、总成绩、总成绩#include “stdlib.h” main( ) int i ,x ,y ,z ; int count=0 ,score=0 ; randomize(); for(i=1; i=3) (注:一行打印(注:一行打印3个数字)个数字) main( ) long i=1, j=1, k ; int n ; printf(“%8ld%8ld”, i , j) ; for(n=3; n=30; n+) k=i+j ; printf(“%8ld”, k) ; if(n%3= =0) printf(“n”) ; i=j ; j=k ; 124第六章第六章 循环控制循环控制例例6.7 求分数序列:求分数序列:1/2,2/3,3/5,5/8,8/13, 13/21, .的前的前20项之和项之和。main() int k ; float i=1 , j=2 , s=0; for(k=1 ; k=20 ; k+) s=s+i/j ; j=i+j ; i=j-i ; printf(“sum=%10.6fn ”, s); 125第六章第六章 循环控制循环控制1、循环的嵌套概念对各种循环结构是一样的,、循环的嵌套概念对各种循环结构是一样的, 即某一循环的循环体内包含另一循环结构。即某一循环的循环体内包含另一循环结构。2、各种循环结构可以互相嵌套。、各种循环结构可以互相嵌套。例例for嵌套嵌套for( ; ; ) . for( ; ; ) . .for-while嵌套嵌套for( ; ; ) . while( ) . .6.6 循环的嵌套循环的嵌套多重循环多重循环126第六章第六章 循环控制循环控制1、各种循环结构可以互相替代,但不提倡使用、各种循环结构可以互相替代,但不提倡使用 用用goto构成的循环。构成的循环。2、在、在while和和do-while语句构成的循环体中必须语句构成的循环体中必须 有使循环趋于结束的语句,如有使循环趋于结束的语句,如i+。6.7 几种循环的比较几种循环的比较3、在、在while和和do-while语句构成的循环中,循环语句构成的循环中,循环 变量的初始化必须在循环之前完成。变量的初始化必须在循环之前完成。 4、在、在while、do-while和和for语句构成的循环中,语句构成的循环中, 可以用可以用break和和continue跳出或结束本次循环跳出或结束本次循环 127第六章第六章 循环控制循环控制6.8 break语句和语句和continue语句语句一、一、break语句语句1、用来跳出、用来跳出switch结构。结构。2、用来跳出当前循环。、用来跳出当前循环。循循 环环break;二、二、continue语句语句用来结束本次循环,即跳过当用来结束本次循环,即跳过当前循环中后继尚未执行的语句,前循环中后继尚未执行的语句,进行下进行下 一次循环一次循环循循 环环continue;128第六章第六章 循环控制循环控制例例6.8 利用公式利用公式 2/6=1-2 +2-2 +3-2 +4-2 +. 求求 的的 近似值,直到最后一项的值小于近似值,直到最后一项的值小于10-8为止为止。 #include “math.h” main() long i=1; double pi=0; while(i*i=1e8) pi=pi+1.0/(i*i); i+; pi=sqrt(6.0*pi); printf(“ pi=%10.6fn ”, pi);6.9程序举例程序举例129第六章第六章 循环控制循环控制例例6.8 利用公式利用公式 2/6=1-2 +2-2 +3-2 +4-2 +. 求求 的的 近似值,直到最后一项的值小于近似值,直到最后一项的值小于10-8为止为止。 #include “math.h” main() long i ; double pi=0; for( i=1 ; i=1e8) break; pi=pi+1.0/(i*i); pi=sqrt(6.0*pi); printf(“ pi=%10.6fn ”, pi) ; 130第六章第六章 循环控制循环控制例例6. 9 打印打印100以内个位数为以内个位数为6,且能被且能被3整除的数。整除的数。 main() int i , j ; for(i=0;i=9;i+) j=i*10+6; if(j%3!=0) continue; printf(%d , j ); 可以省略可以省略131第六章第六章 循环控制循环控制例例6.10 写出下列程序的运行结果。写出下列程序的运行结果。 main() int i , j , a=0 ; for ( i=0 ; i2 ; i+ ) for ( j=0 ;j4 ;j+ ) if ( j%2 ) break ; a+ ; a+; printf (%dn,a) ; 132第六章第六章 循环控制循环控制例例6.11 打印打印99表。表。1*1=11*2=2 2*2=41*3=3 2*3=6 3*3=91*4=4 2*4=8 3*4=12 4*4=161*5=5 2*5=10 3*5=15 4*5=20 5*5=251*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=361*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=491*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=641*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81133第六章第六章 循环控制循环控制例例6.11 打印打印99表。表。main() int i , j ; for ( i=1 ; i=9 ; i+ ) for ( j=1 ; j=i ;j+ ) printf ( “%d*%d=%-3d”,j , i, i*j ) ; printf (n) ; 134第六章第六章 循环控制循环控制例例6.12 百鸡百钱问题。百鸡百钱问题。公鸡一只公鸡一只5元,母鸡一只元,母鸡一只3元,小鸡三只元,小鸡三只1元,用元,用100元买一百只鸡,问公鸡、母鸡、小鸡各多少只?元买一百只鸡,问公鸡、母鸡、小鸡各多少只?设:设:公鸡公鸡x只、母鸡只、母鸡y只、小鸡只、小鸡z只只列等式:列等式:x+y+z=10015*x+9*y+z=300135第六章第六章 循环控制循环控制例例6.12 百鸡百钱问题。百鸡百钱问题。main() int x , y , z ; for ( x=1 ; x=20 ; x+ ) for ( y=1 ; y=33 ; y+ ) for ( z=1 ; z=100 ; z+ ) if(x+y+z=100&15*x+9*y+z=300) printf ( “%d,%d,%dn”,x , y, z) ;136第六章第六章 循环控制循环控制例例6.13 求求e x的台劳级数展开式的前的台劳级数展开式的前n项之和。项之和。e x=1+x+ + + (-x)x22!x33! xn-1 (n-1)!main() float x, s=1,t=1 , f=1 ; int i, n; scanf(“%f,%d”,&x,&n); for ( i=1 ; i1 ; i- ) if (m%i=0) break ; if(i=1)printf( “%d is a prime number.n”,m); else printf( “%d is not a prime number.n”,m);138第六章第六章 循环控制循环控制例例6.15 用牛顿迭代法求代数方程用牛顿迭代法求代数方程e x-x=0在在x=-2附近附近的一个实根的一个实根。直到满足。直到满足|xn+1-xn|=1010-6-6为止。为止。牛顿迭代公式:牛顿迭代公式:令:令: f (x)= e -x -x xn+1=xn- f (xn)是是f (x)曲线在曲线在xn点处的切线斜率点处的切线斜率 f (xn) f (xn)f(x)x1f(x1)x2f(x2)x2=x1- f (x1) f (x1)f (x1)= f (x1) x1-x2139第六章第六章 循环控制循环控制例例6.15 用牛顿迭代法求代数方程用牛顿迭代法求代数方程e x-x=0的实根的实根。#include“math.h”main() float f1 , f0 , x1=-2 , x0 ; do x0=x1; f0=exp(-x0)-x0; f1=-exp(-x0)-1; x1=x0-f0/f1; while(fabs(x1-x0)1e-6); printf ( “%fn”,x1) ;140第六章作业第六章作业上机调试作业上机调试作业第第129页页 6.2,6.8, 6.14第第129页页 6.2, 6.4 , 6.6, 6.8第六章第六章 循环控制循环控制141&本章内容本章内容7.1 一维数组一维数组7.2 二维数组二维数组7.3 字符数组字符数组第七章第七章 数组数组返回返回142第七章第七章 数组数组第七章第七章 数组数组7.1 一维数组一维数组一、定义一、定义类型关键字类型关键字 数组名数组名常数表达式常数表达式;标识符标识符数组体积数组体积二、数组元素二、数组元素数组名数组名下标下标下界为下界为 0,上界,上界为常数表达式为常数表达式-1143第七章第七章 数组数组例例: int a10; float b5;定义一维整型数组定义一维整型数组 a和实型数组和实型数组ba数组中的元素是:数组中的元素是:a0, a1, a2, a3, a4, a5, a6, a7, a8, a9;b数组中的元素是:数组中的元素是: b0, b1, b2, b3, b4 144第七章第七章 数组数组三、数组的引用三、数组的引用以数组元素作为引用对象以数组元素作为引用对象例例7.1 求求 s=a1+a2+a10 main( ) int i; float s=0, a10; for(i=0; i10; i+) scanf(“%f ”, &ai); s=s+ai; printf(“s=%fn”, s); 145第七章第七章 数组数组四、一维数组的初始化四、一维数组的初始化1、在定义数组时,给数组元素赋初值、在定义数组时,给数组元素赋初值例:例: int a6=1,2,3,4,5,6;2、可只给一部分数组元素赋初值。、可只给一部分数组元素赋初值。 例:例: int a6=1,2,3;3、未赋初值的数组,各元素值不确定。、未赋初值的数组,各元素值不确定。4、数组的大小由初始化的数据个数决定、数组的大小由初始化的数据个数决定 。 例:例: int a =1,2,3;5、数组中全部元素初始化为、数组中全部元素初始化为0 。 例:例: int a6=0;146第七章第七章 数组数组例例7.2 求求Fibonacci数列的前数列的前30项。项。(一行三个一行三个) main( ) long f30=1,1; int i; for(i=2; i30; i+) fi=fi-1+fi-2; for(i=0; i30; i+) if(i%3=0) printf(“n”) ; printf(“%8ld”, fi) ; 147第七章第七章 数组数组例例7.3 已知一组数已知一组数(n个个),找出其中最大者,找出其中最大者。main( ) int i, n ; float a20, max; scanf(“%d”, &n); for( i=0; in; i+) scanf(“%f ”, &ai); max=a0; for(i=1; in; i+) if(maxai) max=ai; printf(“Max=%fn”, max);148第七章第七章 数组数组例例7.3 已知一组数已知一组数(n个个),找出其中最大者,找出其中最大者(及其位置及其位置)。main( ) int i, n, position; float a20, max; scanf(“%d”, &n); for( i=0; in; i+) scanf(“%f ”, &ai); max=a0; position =0; for(i=1; in; i+) if(maxai) max=ai; position =i; printf(“Max=%fnPosition=%dn”, max, position +1);149第七章第七章 数组数组例例7.4 对任意对任意10个数按从大到小排序。(选择法)个数按从大到小排序。(选择法) main( ) float a10 , t ; int i , j , p ; for(i=0; i10; i+) scanf(“%f ”, &ai); for(i=0; i9; i+) p=i; for(j=i+1; j10; j+) if(apaj) p=j; if(p!=i)t=ai;ai=ap;ap=t; for(i=0; i10; i+) printf(“%f ”, ai);150第七章第七章 数组数组例例7.4 对任意对任意10个数按从大到小排序。(交换法)个数按从大到小排序。(交换法) main( ) float a10, t; int i, j; for(i=0; i10; i+) scanf(“%f ”, &ai); for(i=0; i9; i+) for(j=i+1; j10; j+) if(aiaj) t=ai; ai=aj; aj=t; for(i=0; i10; i+) printf(“%f ”, ai);151第七章第七章 数组数组7.2 二维数组二维数组二、定义二、定义类型关键字类型关键字 数组名数组名常量表达式常量表达式1常量表达式常量表达式2例:例:int a34; float b510;一、引入一、引入152第七章第七章 数组数组三、数组元素三、数组元素数组名数组名下标下标1下标下标2a00 a01 a02 a03a10 a11 a12 a13a20 a21 a22 a23 四、二维数组元素在内存四、二维数组元素在内存 中的存储形式中的存储形式 按行从上到下按行从上到下,行内行内 从左到右存放从左到右存放a00a01a02a03a10 a11a12a13a20a21a22a2312个个连连续续存存储储单单元元体积:体积:12 序号序号12345 6789101112153第七章第七章 数组数组五、二维数组的输入五、二维数组的输入/输出问题输出问题1、输入、输入for ( i=0 ; i3 ; i+ ) for ( j=0 ; j4 ; j+ ) scanf ( “%f” , &x ) ; aij=x ; 2、输出、输出for ( i=0 ; i3 ; i+ ) for ( j=0 ; jjij156第七章第七章 数组数组 main( ) int y1010, i, j; for(i=0; i10; i+) yi0=1; yii=1; for(i=2; i10; i+) for(j=1; j=i-1; j+) yij=yi-1j+yi-1j-1; for(i=0; i10; i+) for(j=0; j=i; j+) printf(“%5d”, yij); printf(“n”); 157第七章第七章 数组数组 main( ) int y1111, i, j; for(i=1; i=10; i+) yi1=1; yii=1; for(i=3; i=10; i+) for(j=2; j=i-1; j+) yij=yi-1j+yi-1j-1; for(i=1; i=10; i+) for(j=1; j=i; j+) printf(“%5d”, yij); printf(“n”); 158第七章第七章 数组数组7.3 字符数组字符数组用来存放字符串用来存放字符串二、初始化二、初始化1、用字符常量、用字符常量(结尾无结尾无0构不成字符串构不成字符串)例例: char c6=H, a, p, p, y, !; char d =G, o, o, d, , B, y, e;例:例:char a15, b20;一、定义一、定义159第七章第七章 数组数组注:注:c数组数组长度为长度为7,其中,其中c6= 0 d数组长度为数组长度为9,其中,其中d8= 0 不能用赋值语句将一个字符串常量或不能用赋值语句将一个字符串常量或字符数组直接赋给一个字符数组。字符数组直接赋给一个字符数组。c= “ Happy!”; d=c; ( )例:例: char c =“Happy!”; char d = “ Good Bye”;2、用字符串常量、用字符串常量160第七章第七章 数组数组三、字符数组的输入和输出三、字符数组的输入和输出I/O1、用、用%c逐个元素的逐个元素的I/O2、用用%s整个字符串整个字符串I/O 例例: char c 20; scanf(“%s”, c); printf(“%s”, c); 注意:注意:c为数组名,其作为输入项时不加为数组名,其作为输入项时不加&, 输入的字符个数要小于数组的大小;输入的字符个数要小于数组的大小; 输出时,串尾有输出时,串尾有0。3、用字符串、用字符串I/O函数函数puts(c)和和gets(c) for ( i=0 ; str i != 0 ; i+ ) printf(“%c”,str i );161第七章第七章 数组数组四、字符函数四、字符函数1、puts(字符数组字符数组)例如:例如:char str =“ChinanBeijing”; puts(str); (分两行输出,光标停在三行上分两行输出,光标停在三行上)2、gets(字符数组字符数组) 例如:例如:char str20; gets(str); 从键盘输入:从键盘输入:How are you? 注意:注意:scanf(“%s”,str); 只接受只接受 How162第七章第七章 数组数组3、strcat(字符数组字符数组1,字符数组字符数组2) (string.h)例如:例如:char str130=“Peoples Republic of ”; char str2 =“China ”; printf(“%sn”,strcat(str1,str2);4、strcpy(字符数组字符数组1,字符串字符串2) 例如:例如:char str110,str2 =“China ”; strcpy(str1,str2);或或strcpy(str1, “China ”,2); 注意:注意:str1=“China ”; 或或 str1=str2; 是不合法的!是不合法的!for ( i=0 ; str2i != 0 ; i+ ) str1 i = str2 i ;str1 i = 0 ;163第七章第七章 数组数组5、strcmp(字符串字符串1,字符串字符串2) 例如:例如:if ( strcmp(str1,str2)=0) printf(“Yes”);注意:注意:if (str1=str2) printf(“Yes”) ; 是不合法的。是不合法的。6、strlen(字符数组字符数组) 例如:例如:char str 10=“Chinan”; printf(“%d”,strlen(str); 结果为结果为6。7、strlwr(字符串字符串) (将字符串中的大写字母转成小写将字符串中的大写字母转成小写)8、strupr(字符串字符串) (将字符串中的小写字母转成大写将字符串中的小写字母转成大写)164第七章第七章 数组数组例例7.6 有三个字符串,要求找出其中最大者。有三个字符串,要求找出其中最大者。#includestring.hmain( ) char string20, str320 ; int i ; for(i=0; i0) strcpy(string,str0); else strcpy(string,str1); if ( strcmp(str2,string)0) strcpy(string,str2); puts(string); 165第七章作业第七章作业上机调试作业上机调试作业 7.6, 7.10, 7.13第第153页页 7.3, 7.4, 7.5, 7.13第七章第七章 数组数组166&本章内容本章内容8.1 概述概述8.2 函数的定义函数的定义8.3 函数的调用函数的调用8.4 参数及函数值参数及函数值8.5 函数的嵌套调用函数的嵌套调用8.7 数组作为函数参数数组作为函数参数8.8 局部变量和全局变量局部变量和全局变量8.9 变量的存储类别变量的存储类别第八章第八章 函数函数返回返回167第八章第八章 函数函数第八章第八章 函数函数8.1 概述概述maind efghijklmabc168第八章第八章 函数函数C程序程序=一个主函数(一个主函数(main函数)函数)一个主函数一个主函数+若干其他函数若干其他函数函数函数库函数库函数自定义函数自定义函数无参函数无参函数有参函数有参函数169第八章第八章 函数函数void print( ) printf(“*n”) ; main( ) int i , j ; for ( i=1 ; i=4 ; i+) for ( j=1 ; jy?x:y; &a, &b, &c); return ( z ); max1=max(max(a,b),c); printf(“%d ”, max1); 二、有参函数二、有参函数 例例8.2 求求3个数中的最大数个数中的最大数 返回返回171第八章第八章 函数函数8.2 函数的定义函数的定义一、无参函数的定义一、无参函数的定义类型符类型符 函数名(函数名( ) 函数体函数体 二、有参函数的定义二、有参函数的定义类型符类型符 函数名(形参表列)函数名(形参表列) 函数体函数体 跳转跳转172第八章第八章 函数函数三、说明三、说明1、省略类型符的函数,系统自动定义为整型、省略类型符的函数,系统自动定义为整型2、形参的定义可以在函数体外进行、形参的定义可以在函数体外进行(头部的下一行头部的下一行)3、可定义空函数、可定义空函数类型符类型符 函数名(函数名( ) 4、函数名在函数体中不作为变量使用,函数名在函数体中不作为变量使用, 返回的函数值由返回的函数值由 return 给出给出跳转跳转173第八章第八章 函数函数8.3 、8.4函数的调用、参数及函数值函数的调用、参数及函数值一、调用方式一、调用方式1、函数语句:、函数语句:函数名(实参表);函数名(实参表); 例:例:fun(x,y,z); prn( );2、函数作为运算量参加表达式计算、函数作为运算量参加表达式计算 例:例:z=5*max(x,y); 3、函数作为参数参加计算、函数作为参数参加计算 例:例:d=max(max(a,b),c); 跳转跳转跳转跳转174例例8.3 已知整数已知整数 m, n, 求组合数求组合数C mn第八章第八章 函数函数 float f(int k) main( ) float fac=1; int n, m; float c; int i; scanf(“%d, %d”, for(i=1; ib) c=1; int i=2 ,p; else if (a=b) c=0; p=f ( i , +i ) ; else c=-1; printf(“%d ”, p); return(c); 177第八章第八章 函数函数4、函数值为出现在、函数值为出现在 return 语句中的返回值。语句中的返回值。(1)函数名不作为一个量参加函数体中的运算。)函数名不作为一个量参加函数体中的运算。(2)函数返回值的类型由函数类型决定。)函数返回值的类型由函数类型决定。(3)函数调用可不返回值)函数调用可不返回值 (不使用(不使用return语句)语句) (4)可用)可用“void”定义定义“空类型空类型”函数,以此明确表示函数,以此明确表示“不带回值不带回值”。跳转跳转跳转跳转178第八章第八章 函数函数三、说明三、说明1、库函数应在文件开头使用、库函数应在文件开头使用 #include 2、自定义函数调用时应在主调函数中声明、自定义函数调用时应在主调函数中声明 声明方式:(声明方式:(1)在主调函数体内声明:)在主调函数体内声明:类型符类型符 函数名函数名(参数类型参数类型1,参数类型,参数类型2);类型符类型符 函数名函数名(参数类型参数类型1 参数名参数名1,参数类型参数类型2 参数名参数名2);(2)在文件开头进行外部声明)在文件开头进行外部声明(3)省略情况:整型、字符型函数或)省略情况:整型、字符型函数或 被调函数出现在主调函数之前被调函数出现在主调函数之前 179第八章第八章 函数函数 main( ) float a, b, c, m ; float max(float x, float y); scanf(“%f, %f, %f”, &a, &b, &c); m=max(max(a, b), c); printf(“max=%fn”, m); float max(float x, float y) return( xy?x:y); 例例8.5 求求3个数中的最大数个数中的最大数去掉去掉x和和y也行也行180第八章第八章 函数函数 float max(float , float ); main( ) float a, b, c, m; scanf(“%f, %f, %f”, &a, &b, &c); m=max(max(a, b), c); printf(“max=%fn”, m); float max(float x, float y) return( xy?x:y); 例例8.5 求求3个数中的最大数个数中的最大数181第八章第八章 函数函数 float max(float x , float y ) return( xy?x:y); main( ) float a, b, c, m; scanf(“%f, %f, %f ”, &a, &b, &c ); m=max(max(a, b), c) ; printf(“max=%fn”, m); 例例8.5 求求3个数中的最大数个数中的最大数182第八章第八章 函数函数8.5 函数的嵌套调用函数的嵌套调用概念概念: 在调用一个函数的过程中,在调用一个函数的过程中,又调用另一个函数又调用另一个函数注注: C语言不允许语言不允许嵌套定义嵌套定义函数函数main函数函数 a函数函数 b函数函数调用调用a函数函数结束结束调用调用b函数函数183第八章第八章 函数函数8.7 数组作为函数参数数组作为函数参数一、数组元素作函数实参一、数组元素作函数实参与变量同(值传递)与变量同(值传递)例例: m=max ( a5 , a6 );184第八章第八章 函数函数 #include “math.h” float area(float a, float b, float c) float p, s; p=(a+b+c)/2; s=sqrt(p*(p-a)*(p-b)*(p-c); return(s); 例例8.6 已知已知10个三角形的三边长,求它们的面积。个三角形的三边长,求它们的面积。185第八章第八章 函数函数 main( ) float a10, b10, c10, s10 ; int i; for(i=0; i10; i+) scanf(“%f%f%f”, &ai, &bi, &ci); si=area(ai, bi, ci); printf(“s%d=%fn”, i+1, si); 例例8.6 已知已知10个三角形的三边长,求它们的面积。个三角形的三边长,求它们的面积。186第八章第八章 函数函数 int total(char word )int count=0 , i=0 ; while(wordi) if (wordi= )count+; i+; return(count); 例例8.7 编写一个函数编写一个函数,求一段文字中包含空格的个数。求一段文字中包含空格的个数。二、数组名作函数参数二、数组名作函数参数187第八章第八章 函数函数main( ) char string80; int space; gets(string); space=total( string); printf(“Space number:%d”,space) ; 例例8.7 编写一个函数编写一个函数,求一段文字中包含空格的个数。求一段文字中包含空格的个数。188第八章第八章 函数函数void sort ( float a , int n ) int i, j , k ; float t; for(i=0; in-1; i+) k=i; for(j=i+1; jaj) k=j; t=ai; ai=ak; ak=t; 例例8.8 用选择法将用选择法将n个数按从小到大排序。个数按从小到大排序。189第八章第八章 函数函数main( )int i,n; float a100; scanf(“%d”, &n); for(i=0; in; i+) scanf(“%f”, &ai); sort(a, n); for(i=0; in; i+) printf(“%10.2f”, ai); printf(“n”); 例例8.8 用选择法将用选择法将n个数按从小到大排序。个数按从小到大排序。190第八章第八章 函数函数二、数组名作函数参数二、数组名作函数参数1、实参、形参应同为数组名(或数组指针)、实参、形参应同为数组名(或数组指针)2、实参、形参应同类型、实参、形参应同类型3、实参、形参数组体积可不相同、实参、形参数组体积可不相同4、在有些情况下形参数组可不指定大小,、在有些情况下形参数组可不指定大小, 但不允许出现可调数组但不允许出现可调数组 如:如: float f ( int n , float a ) 不不允许写成:允许写成: float f ( int n , float a n )() 5、数组参数的传递按、数组参数的传递按“地址传递地址传递”191第八章第八章 函数函数8.8 、8.9变量的作用域和存储方式变量的作用域和存储方式变量分类变量分类按生存期按生存期静态存储变量静态存储变量动态存储变量动态存储变量按作用域按作用域全局变量全局变量局部变量局部变量192第八章第八章 函数函数局部变量局部变量函数内部定义的变量函数内部定义的变量 (包括形参)(包括形参)全局变量全局变量函数之外定义的变量函数之外定义的变量作用域:本函数内作用域:本函数内作用域:定义处以下的函数作用域:定义处以下的函数8.8 局部变量和全局变量局部变量和全局变量193第八章第八章 函数函数例例8.9 局部变量局部变量float f1( int a ) int i , j ; main() int m , n ; char f2( int x , int y) int i , j ; int k ; i=k*k ; 说明:说明:1、m,n只在只在main 中有效。中有效。2、不同函数中的同、不同函数中的同 名变量互不干扰。名变量互不干扰。3、形参是局部变量。、形参是局部变量。4、复合语句中定义、复合语句中定义 的变量仅在的变量仅在中。中。194第八章第八章 函数函数例例8.10 全局变量全局变量float f1( int a ) int i , j ; main() int m , n ; char f2( int x , int y) int i , j ; 说明:说明:1、增加了函数间、增加了函数间 数据联系渠道。数据联系渠道。2、尽量少用全局变、尽量少用全局变 量。量。(占用空间、占用空间、 函数通用性低、函数通用性低、 程序清晰性低程序清晰性低)3、局变屏蔽外变。、局变屏蔽外变。char c1,c2;int p=1,q=5;195第八章第八章 函数函数例例8.11 求求10个学生的平均分,最高分和最低分。个学生的平均分,最高分和最低分。(用函数实现用函数实现)float Max=0 ,Min=0 ;float average( float array, int n ) int i; float sum=array0; Max=Min=array0; for( i=1 ; iMax)Max=arrayi; else if(arrayiMin)Min=arrayi; sum=sum+arrayi; return(sum/n) ; 10可有可无可有可无196第八章第八章 函数函数例例8.11 求求10个学生的平均分,最高分和最低分。个学生的平均分,最高分和最低分。用函数实现。用函数实现。main() int i; float aver , score10; for( i=0 ; ib?a:b);main() int a=8; printf(“%d”,max(a,b); 198第八章第八章 函数函数1、用户存储区、用户存储区程序区程序区静态存储区静态存储区动态存储区动态存储区2、静态存储方式、静态存储方式 程序运行期间分配固定的存储空间程序运行期间分配固定的存储空间3、动态存储方式、动态存储方式 程序运行期间动态分配存储空间程序运行期间动态分配存储空间8.9变量的存储类别变量的存储类别199第八章第八章 函数函数一、一、局部变量的存储方式局部变量的存储方式局部变量局部变量自动变量(自动变量(auto或省略)或省略)局部静态变量局部静态变量(static)寄存器变量寄存器变量(register)动态存储动态存储静态存储静态存储存于寄存器存于寄存器200第八章第八章 函数函数说明:说明:1、局部静态变量在编译时赋初值,、局部静态变量在编译时赋初值, 自动变量赋初值在函数调用时进行。自动变量赋初值在函数调用时进行。3、局部静态变量在函数调用结束后保留、局部静态变量在函数调用结束后保留 其值。其值。2、局部静态变量只在其被定义的函数、局部静态变量只在其被定义的函数 内有效。内有效。201第八章第八章 函数函数int fac(int n) main( )static int f=1; int i; f=f*n; for(i=1; i=5; i+) return(f); printf(“%dn”, fac(i); 例例8.13 打印打印15的阶乘值。的阶乘值。202第八章第八章 函数函数二、全局变量的存储方式二、全局变量的存储方式全局变量在函数外部定义,静态存储全局变量在函数外部定义,静态存储1、用、用extern声明全局变量声明全局变量 int max(int x,int y)main( )extern A,B; int A=12,B;File1.c#include“File2.c”int A,B;main( )int max(int,int); File2.cextern A,B;max(int x,int y) 203第八章第八章 函数函数2、用、用static声明全局变量声明全局变量File1.cstatic int A;main( ) File2.cextern int A;fun(int x) A=A*x;不能使用不能使用204第八章第八章 函数函数第八章作业第八章作业第第202页页 8.2、8.3、8.8、8.15(前两问)(前两问) 上机调试作业上机调试作业 8.8 、8.15 (前两问)(前两问) 205&本章内容本章内容9.1 宏定义宏定义9.2 文件包含文件包含第九章第九章 预处理命令预处理命令返回返回206第九章第九章 预处理命令预处理命令第九章第九章 预处理命令预处理命令C 语言的预处理功能:语言的预处理功能: 1、宏定义、宏定义 2、文件包含、文件包含 3、条件编译、条件编译207第九章第九章 预处理命令预处理命令9.1 宏定义宏定义一、不带参数的宏定义一、不带参数的宏定义#define 标识符标识符 字符串字符串宏名宏名例:例: #define PI 3.1415926208第九章第九章 预处理命令预处理命令说明:说明:1、宏展开、宏展开预编译时将宏名替换成字符串预编译时将宏名替换成字符串3、宏展开只作简单置换,不作正确性检查、宏展开只作简单置换,不作正确性检查4、宏定义不是、宏定义不是C语句语句2、宏定义可用来简化程序,提高程序通用性、宏定义可用来简化程序,提高程序通用性5、宏定义位于函数外,作用域为定义处到文、宏定义位于函数外,作用域为定义处到文 件结束。可以用件结束。可以用 #undef 命令终止其作用域命令终止其作用域6、可以引用已定义的宏名进行宏定义、可以引用已定义的宏名进行宏定义209第九章第九章 预处理命令预处理命令 #define R 3.0 #define PI 3.1415926 #define L 2*PI*R #define N 10 main( ) float scoreN; printf(“L=%fn”, L); 例例9.1 210第九章第九章 预处理命令预处理命令二、带参数的宏定义二、带参数的宏定义#define 标识符标识符(参数表参数表) 字符字符串串宏名宏名 #例:例:define S(a,b) a*b : : : area=S(3,2);211第九章第九章 预处理命令预处理命令 #define PI 3.14 #define S(r) PI*r*r main( ) float a=3.6 , b=4.3 , area ; area=S(a+b) ; printf(“area=%fn”, area) ; 例例9.2 area=3.14*a+b*a+b212第九章第九章 预处理命令预处理命令9.2 文件包含文件包含文件包含命令:文件包含命令:#include “文件名文件名” 或或 #include ABf1.cf2.c#include “f2.c”ABf1.c第九章作业第九章作业 第第199页页9. 1213&本章内容本章内容10.1 指针的概念指针的概念10.2 变量的指针和指向变量的指针和指向变量的指针变量变量的指针变量10.3 数组的指针和指向数组的指针和指向数组的指针变量数组的指针变量第十章第十章 指指 针针返回返回214第十章第十章 指针指针第十章第十章 指指 针针使用指针的优点:使用指针的优点:1、能有效地表示复杂的数据结构、能有效地表示复杂的数据结构2、能动态分配内存、能动态分配内存3、能方便地使用字符串和数组、能方便地使用字符串和数组4、在函数调用时能获得一个以上的值、在函数调用时能获得一个以上的值5、能直接处理内存地址、能直接处理内存地址215第十章第十章 指针指针地址地址-内存内存字节字节编号编号内存单元内存单元-存放数据的基本单位存放数据的基本单位变量名变量名-标识内存单元标识内存单元指针指针-变量地址变量地址 (变量所占内存单元首字节地址)(变量所占内存单元首字节地址)指针变量指针变量-存放变量地址存放变量地址10.1 指针的概念指针的概念变变量量内内存存单单元元字字节节地址地址指针指针指针变量指针变量对应对应对应对应对应对应包含包含存于存于指向指向216第十章第十章 指针指针C程序对变量值的存取方式程序对变量值的存取方式1、“直接访问直接访问”方式:方式: 按变量名与内存地址的对应关系按变量名与内存地址的对应关系 直接按变量地址存取直接按变量地址存取2、“间接访问间接访问”方式:方式: 通过指向变量的指针,对其指向通过指向变量的指针,对其指向 的变量值进行间接存取的变量值进行间接存取217第十章第十章 指针指针一、指针变量的定义一、指针变量的定义类型符类型符 *指针变量名;指针变量名;10.2 变量的指针和指向变量的指针变量变量的指针和指向变量的指针变量例:例:float *p1, *p2; int *p3, *p4;二、指针变量的引用二、指针变量的引用1、相关的运算、相关的运算 &取地址运算符取地址运算符*指针运算符指针运算符例:例:&a(a 变量变量的地址)的地址) *p(指针变量指针变量p所指向的变量)所指向的变量)218第十章第十章 指针指针main( )int a=50 , *p ; p=&a ; *p=100; printf(“%d, %d, %on”, a, *p, p);例:例: 10.1结果为:结果为:100,100,177726 内存地址值内存地址值219第十章第十章 指针指针 例:例:*p+ 等价于等价于 *(p+) 若:若:p=&a; 则:则:(*p)+ 等价于等价于 a+ &*p 等价于等价于 &a *&a 等价于等价于 a2、说明、说明 &、* 与与 +、- 运算符同级运算符同级(右结合右结合) 220第十章第十章 指针指针例例10.2 输入输入a和和b两个整数,按大小顺序输出两个整数,按大小顺序输出 main( ) int *p1, *p2, *p, a, b; scanf(“%d, %d”, &a, &b); p1=&a; p2=&b; if ( ab ) p=p1; p1=p2; p2=p; printf(“a=%d, b=%dn”, a, b); printf(“max=%d, min=%dn”, *p1, *p2); 输入:输入:5,7 输出:输出:a=5 , b=7 max=7 , min=5221第十章第十章 指针指针三、指针变量作为函数参数三、指针变量作为函数参数1、函数间指针变量参数的数据传递是、函数间指针变量参数的数据传递是 “值传递值传递”2、可利用指针变量,建立起所指向的、可利用指针变量,建立起所指向的 变量在主调与被调函数间的双向数变量在主调与被调函数间的双向数 据联系据联系结论结论:函数调用不能改变实参指针变量的值,:函数调用不能改变实参指针变量的值, 但可以改变其所指向的变量的值。但可以改变其所指向的变量的值。跳转跳转222第十章第十章 指针指针例例10.3 输入输入a和和b两个整数,按大小顺序输出两个整数,按大小顺序输出 swap(int * p1, int * p2) int p; p=*p1; *p1=*p2; *p2=p; main( ) int a, b, *pa =&a, *pb =&b; scanf(“%d, %d”, pa, pb); if ( ab ) swap(pa, pb); printf(“%d, %dn”, a, b); 返回返回223第十章第十章 指针指针 swap(int *p1, int *p2) int *p; p=p1; p1=p2; p2=p; main( ) int a, b, *pa, *pb; scanf(“%d, %d”, &a, &b); pa=&a; pb=&b; if ( ab ) swap(pa, pb); printf(“%d, %dn”, *pa, *pb); (有问题(有问题:不能实现交换)不能实现交换)224第十章第十章 指针指针 swap(int x, int y) int t; t=x; x=y; y=t; main( ) int a, b; scanf(“%d, %d”, &a, &b); if ( ab ) swap(a, b); printf(“%d, %dn”, a, b); (不能返回交换结果)不能返回交换结果)225第十章第十章 指针指针 swap(int * p1, int * p2) int *p; *p=*p1; *p1=*p2; *p2=*p; main( ) int a, b, *pa, *pb; scanf(“%d, %d”, &a, &b); pa=&a; pb=&b; if ( ab ) swap(pa, pb); printf(“%d, %dn”, a, b); 无所指无所指226第十章第十章 指针指针小结:小结:主主子之间数据传递的方式:子之间数据传递的方式:1、实参、实参-形参的数据传递;形参的数据传递;return语句。语句。2、全局变量。、全局变量。3、形参为指针。、形参为指针。4、函数参数(形参或实参)为数组名或指针、函数参数(形参或实参)为数组名或指针跳转跳转227第十章第十章 指针指针void fun(int a , int b , int *c , int *d ) *c=a+b ; *d=a-b ; main( ) int x , y , z , w ; scanf(“%d,%d”,&x , &y ) ; fun( x , y, &z , &w ) ; printf(“add=%d,sub=%dn” , z , w ) ;例例10.4 输入输入a和和b两个整数,求他们的两个整数,求他们的和和和和差差。228第十章第十章 指针指针10.3 数组的指针和指向数组的指针变量数组的指针和指向数组的指针变量数组的指针:数组的指针: 数组首地址、数组首地址、 数组第一个元素的地址(指针)数组第一个元素的地址(指针) 注意:数组名代表数组首地址(是常量)注意:数组名代表数组首地址(是常量)数组元素的指针:数组元素的指针: 数组元素的地址(首字节地址)数组元素的地址(首字节地址) 229第十章第十章 指针指针一、指向数组元素的指针变量一、指向数组元素的指针变量1、定义与一般指针变量一致、定义与一般指针变量一致 例:例: int a10, *p;2、赋值、赋值将数组元素的地址赋给指针变量将数组元素的地址赋给指针变量(1)利用赋值语句)利用赋值语句 p=&a5;(2)定义指针变量时赋初值定义指针变量时赋初值 例:例: int a10,*p=&a0; 或或 *p=a;230第十章第十章 指针指针二、通过指针引用数组元素二、通过指针引用数组元素1、指向数组的指针变量与数组元素的对应、指向数组的指针变量与数组元素的对应若指针变量若指针变量 p=&ai则:则:p+1 指向下一个数组元素指向下一个数组元素 ai+12、说明(、说明( int a10 , *p ;) 若:若:p=&a0 ;(或或 p=a ;)则:则:*(p+i)=*(a+i)=ai=pi231第十章第十章 指针指针main( )int a10, i; for(i=0; i10; i+)scanf(“%d”, &ai); printf(“n”); for(i=0; i10; i+)printf(“%d”, ai);例例10.5 数组的输入输出数组的输入输出(1)下标法)下标法232第十章第十章 指针指针main( )int a10, i; for(i=0; i10; i+) scanf(“%d”, a+i); /*此处不能用此处不能用a+*/ printf(“n”); for(i=0; i10; i+)printf(“%d”, *(a+i);(2)按数组名计算地址)按数组名计算地址233第十章第十章 指针指针main( )int a10, *p, i; p=a; for(i=0; i10; i+)scanf(“%d”, p+); for(p=a; pa+10; p+)printf(“%d”, *p);(3)指针变量法)指针变量法234第十章第十章 指针指针main() int i , j , n; float a20 , t ,*p=a; scanf(“%d”,&n); for(i=0;in;i+) scanf(“%f”,p+); p=a; for(i=0; in-1; i+) for(j=i+1; j *(p+j) ) t= *(p+i); *(p+i)=*(p+j);*(p+j)=t;for(i=0;in;i+) printf(“%f”,*p+);例例10.6 用指针方用指针方法对已知法对已知的的n个数个数(n=20)按按从小到大从小到大的顺序排的顺序排序。序。235第十章第十章 指针指针三、数组名作为函数的参数三、数组名作为函数的参数实参数组实参数组形参数组形参数组按地址结合按地址结合实参数组名实参数组名形参数组名形参数组名实参数组实参数组首地址首地址形参数组形参数组首地址首地址按值传递按值传递236第十章第十章 指针指针例例8.7 用选择法将用选择法将n个数按从小到大排序个数按从小到大排序1、实参与形参都是数组名(第八章)、实参与形参都是数组名(第八章)void sort ( float a , int n ) int i, j , k ; float t; for(i=0; in-1; i+) k=i; for(j=i+1; jaj) k=j; t=ai; ai=ak; ak=t; 237第十章第十章 指针指针 main( ) int i; float a10; for(i=0; i10; i+) scanf(“%f”, &ai); sort(a, 10); for(i=0; i10; i+) printf(“%f, ”, ai); printf(“n”); 238第十章第十章 指针指针主函数不变,主函数不变,sort 函数变为:函数变为: void sort(float * p, int n) int i, j,k; float t; for(i=0; in-1; i+) k=i; for(j=i+1; j *(p+j) )k=j; t= *(p+i); *(p+i)=*(p+j);*(p+j)=t; 2、实参为数组名、形参为指针变量、实参为数组名、形参为指针变量239第十章第十章 指针指针 main( ) int i; float a10 , *p=a ; for(i=0; i10; i+)scanf(“%f”, p+ ); p=a; sort(p, 10); for(i=0; i10; i+) printf(“%f, ”, *p+ ); sort 函数不变、主函数变为:函数不变、主函数变为:3、实参为指针变量、形参为数组名、实参为指针变量、形参为数组名240第十章第十章 指针指针1、实参与形参都是数组名(第八章)、实参与形参都是数组名(第八章)2、实参为数组名、形参为指针变量、实参为数组名、形参为指针变量3、实参为指针变量、形参为数组名、实参为指针变量、形参为数组名4、实参、形参都是指针变量、实参、形参都是指针变量组合组合2的的 sort 函数和函数和3的主函数即可的主函数即可 注意:当实参为指针变量时,该指针变量注意:当实参为指针变量时,该指针变量应有确定的值应有确定的值241第十章第十章 指针指针四、指向多维数组的指针和指针变量四、指向多维数组的指针和指针变量1、二维数组的地址、二维数组的地址设数组定义为:设数组定义为:a34a0 a00, a01, a02, a03 a1 a10, a11, a12, a13 a2 a20, a21, a22, a23 视视 a为一维数为一维数组名,组名,ai 为为 a 数组元素数组元素视视 ai 为一维数为一维数组名,组名,aij 为为 ai 数组元素数组元素242第十章第十章 指针指针设数组定义为:设数组定义为:a34a a+0 a0 a00, a01, a02, a03 a+1 a1 a10, a11, a12, a13 a+2 a2 a20, a21, a22, a23 a2+0 a2+1 a2+2 a2+3 a+i ai ai+0 ai0 *(a+i) 因而因而(a+i) 与与(*(a+i)的值相同,但级别不同。的值相同,但级别不同。 (a+i)二级指针,二级指针,(*(a+i)是一级指针是一级指针243第十章第十章 指针指针区分:简单变量名、一维数组名和二维数组名区分:简单变量名、一维数组名和二维数组名如:如:int a , b10 , c1010 ; 变量名赋值:变量名赋值:a=5 ; a: 0 级指针级指针一维数组元素赋值:一维数组元素赋值:*(b+i)=6 ; b: 一级指针一级指针二维数组元素赋值:二维数组元素赋值:*(*(c+i)+j)=7 ; c: 二级指针二级指针244第十章第十章 指针指针地址:地址:a 数组首地址,即数组首地址,即 a00 的地址的地址 a+0=a0第第0行首地址行首地址=数组首地址数组首地址 a+i=ai第第i行首地址行首地址=ai0的地址的地址 ai+j=*(a+i)+jaij的地址的地址注意:注意:1)不能将)不能将 *(a+i)+j 写成写成 *(a+i+j) 或或 a+i+j 2) *(ai+j)=*(*(a+i)+j)=aij 3)对二维数组,对二维数组,*(a+i) 代表地址。即代表地址。即 a+i=ai=*(a+i)=&ai=&ai0245第十章第十章 指针指针2、多维数组的指针及指针变量、多维数组的指针及指针变量(1)指向数组元素的指针变量)指向数组元素的指针变量 (或称为二维数组的一级指针变量)(或称为二维数组的一级指针变量) 设设:二维数组二维数组 aNM 若若:指针变量指针变量 p=&a00或或p=a0或或p=*a 则则:指向指向 aij 的指针为的指针为 p+i*M+j 即:即: *(p+i*M+j)=aij246第十章第十章 指针指针 main( ) int a34= ., ., . ; int *p, i, j ; p=*a;1) for(i=0; i12; i+) printf(“%d”,*p+) ;2)for(i=0; i12; i+) printf(“%d”,*(*a+i) ;3) for(i=0; i12; i+) printf(“%d”,pi) ;4) for(p=a0; pa0+12; p+) printf(“%d”,*p);5) for(i=0; i3; i+) for(j=0; j4; j+) printf(“%d”,*(p+i*4+j);247第十章第十章 指针指针(2)指向一维数组的指针变量)指向一维数组的指针变量 (或称为二维数组的二级指针变量)(或称为二维数组的二级指针变量) 使指针变量指向二维数组的每一行使指针变量指向二维数组的每一行若若: p 指向指向 a0,则则: p+1 指向指向 a1;即:即:p 的增值以一维数组长度为单位的增值以一维数组长度为单位称称 p 为为行指针行指针248第十章第十章 指针指针 指向一维数组的指针变量的定义指向一维数组的指针变量的定义类型符类型符 (*指针变量名)指针变量名)M若若 p=a ,则则 *(p+i)+j 指向指向 aij从而有:从而有: *(*(p+i)+j)=aij所指向二维所指向二维数组的列数数组的列数例:例: int (*p)4; 指向一维数组的指针变量与数组元素的对应指向一维数组的指针变量与数组元素的对应249第十章第十章 指针指针3、多维数组的指针作函数参数(不作要求)、多维数组的指针作函数参数(不作要求)形参形参用指向数组元素的指针变量用指向数组元素的指针变量用指向一维数组的指针变量用指向一维数组的指针变量例例10.7 (习题习题8.14 p186 、 )分析:分析:1)全局数组)全局数组 a10, b5 存放每个学生的存放每个学生的 平均分数和每门课程的平均分数。平均分数和每门课程的平均分数。2)函数)函数aver1和和aver2分别求上述平均分。分别求上述平均分。250第十章第十章 指针指针 float a10, b5; void aver1(p, n, m) float (*p)5; int n, m; float s; int i, j; for(i=0; in; i+) s=0; for(j=0; jm; j+) s=s+ *(*(p+i)+j) ; ai=s/m; 251第十章第十章 指针指针 void aver2(p, n, m) float *p; int n, m; float s; int i, j; for(j=0; jm; j+) s=0; for(i=0; in; i+) s=s+ *(p+i*m+j) ; bj=s/n; 252第十章第十章 指针指针 main( ) float score105=; int i, j; aver1(score, 10, 5); aver2( *score, 10, 5); for(i=0; i10; i+) for(j=0; j5; j+) printf(“%8.1f”, scoreij);printf(“%10.2fn”, ai); for(j=0; j5; j+) printf(“%8.1f”, bj); 253第十章第十章 指针指针字符串的表示形式字符串的表示形式1、用字符数组表示、用字符数组表示10.4 字符串的指针和指向字符串的指字符串的指针和指向字符串的指针变量针变量例:例: char s =“Happy New Year!”; 因数组名因数组名 s 代表数组首地址,代表数组首地址, 则则 *(s+i)=si254第十章第十章 指针指针2、用字符指针表示、用字符指针表示例:例: char *s=“Happy New Year!”;等价于:等价于:char *s;s=“Happy New Year!”;注意:注意: 1、s 不是字符串变量,是指针变量不是字符串变量,是指针变量 2、 char *s ; scanf(“%s”, s);是是错误的错误的 3、s 的使用方法同字符数组名的使用方法同字符数组名255第十章第十章 指针指针void stringcopy(char to , char from ) int i; for(i=0;fromi;i+) toi=fromi; toi=0; main( )char string1 =“China.”,string280; stringcopy(string2,string1); puts(string2);例例10.8 串拷贝举例串拷贝举例256第十章第十章 指针指针void stringcopy(char *to , char *from) while(*from) *to=*from;to+;from+; *to=0; main( )char string1 =“China.”,string280; stringcopy(string2,string1); puts(string2);例例10.8 串拷贝举例串拷贝举例257第十章第十章 指针指针void stringcopy(char *to , char *from) while(*from) *to+=*from+; *to=0; main( )char string1 =“China.”,string280; stringcopy(string2,string1); puts(string2);例例10.8 串拷贝举例串拷贝举例258第十章第十章 指针指针void stringcopy(char *to , char *from) while(*to+=*from+)!=0);或或void stringcopy(char *to , char *from) while(*to+=*from+);main( )char string1 =“China.”,string280; stringcopy(string2,string1); puts(string2);例例10.8 串拷贝举例串拷贝举例259第十章第十章 指针指针第十章作业第十章作业第第278页页 10.1、10.3、10.4、10. 8 上机调试作业上机调试作业第第278页页 10.1、10.3、10.4、 10. 8 、10.14 260&本章内容本章内容11.1 结构体的概念结构体的概念11.2 结构体类型及其变量的定义结构体类型及其变量的定义11.3 结构体类型变量的引用结构体类型变量的引用11.4 结构体变量的初始化结构体变量的初始化11.5 结构体数组结构体数组第十一章第十一章 结构体结构体返回返回261第十一章第十一章 结构体与共用体结构体与共用体第十一章第十一章 结构体结构体结构体:结构体:C的一种构造数据类型的一种构造数据类型结构体类型数据:结构体类型数据:由不同类型数据由不同类型数据 组合而成的一批数据的集合组合而成的一批数据的集合例:一个学生的基本信息例:一个学生的基本信息 学号学号 姓名姓名 性别性别 年龄年龄 成绩成绩 住址住址9801Wangm2098Beijing11.1 结构体的概念结构体的概念262第十一章第十一章 结构体与共用体结构体与共用体11.2 结构体类型及其变量的定义结构体类型及其变量的定义一、结构体类型的定义一、结构体类型的定义struct 结构体类型名结构体类型名 成员成员1的定义;的定义; 成员成员2的定义;的定义; . 成员成员n的定义;的定义;;类型符类型符 成员名;成员名;变量、数组、变量、数组、结构体等结构体等263第十一章第十一章 结构体与共用体结构体与共用体struct student int number; char name20; char sex; int age; float score; char addr30;例:将学生信息定义成结构体类型例:将学生信息定义成结构体类型264第十一章第十一章 结构体与共用体结构体与共用体说明:说明: 1、结构体类型的定义,实际上是结构体类型的定义,实际上是 定义该类型数据的结构。定义该类型数据的结构。 2、结构体类型定义的后面、结构体类型定义的后面 ,应带有应带有 ;265第十一章第十一章 结构体与共用体结构体与共用体二、结构体类型变量的定义二、结构体类型变量的定义1、先定义结构体类型再定义变量、先定义结构体类型再定义变量struct 结构体类型名结构体类型名 成员成员1的定义;的定义; . 成员成员n的定义;的定义;;struct 结构体类型名结构体类型名 变量表变量表定义定义结构结构体类体类型型定义结构体定义结构体类型变量类型变量266第十一章第十一章 结构体与共用体结构体与共用体struct student int number; char name20; char sex; int age; float score; char addr30;struct student s1, s2;例:例:267第十一章第十一章 结构体与共用体结构体与共用体2、在定义结构体类型的同时定义变量、在定义结构体类型的同时定义变量struct 结构体类型名结构体类型名 成员成员1的定义;的定义; . 成员成员n的定义;的定义; 变量表;变量表;可省略可省略268第十一章第十一章 结构体与共用体结构体与共用体 struct student int number; char name20; char sex; int age; float score; char addr30; s1, s2; struct int number; char name20 char sex; int age; float score; char addr30; s1, s2;例:例:269第十一章第十一章 结构体与共用体结构体与共用体3、说明、说明(1)结构体类型与结构体变量的区别)结构体类型与结构体变量的区别(2)结构体类型的多重定义,即)结构体类型的多重定义,即 结构体类型定义中的成员,亦可结构体类型定义中的成员,亦可 以是另一个结构体类型变量以是另一个结构体类型变量 (3)结构体变量所占内存为成员)结构体变量所占内存为成员 所占内存的总和所占内存的总和270第十一章第十一章 结构体与共用体结构体与共用体 struct student int number; char name20; char sex; int age; struct course score; char addr30; ; struct course float math; float phys; float comp; ;NumName SexAgeScoreMath Phys CompAddr即:定义了下列即:定义了下列结构结构例:例:271第十一章第十一章 结构体与共用体结构体与共用体11.3 结构体类型变量的引用结构体类型变量的引用引用方式:引用方式: 结构体变量名结构体变量名 . 成员名成员名成员(分量)运算符成员(分量)运算符优先级最高优先级最高例:例: s1.age=18; s2.score.math=95.5; s1.age+;strcpy(s2.addr,s1.addr);scanf(“%c”, &s1.sex);注:注:不能整体输入输出结构体变量不能整体输入输出结构体变量272第十一章第十一章 结构体与共用体结构体与共用体11.4 结构体变量的初始化结构体变量的初始化在定义结构体变量的同时,其后加:在定义结构体变量的同时,其后加: =成员成员1的初值,的初值,成员,成员n的初值的初值;例:对前例中已定义结构体类型例:对前例中已定义结构体类型student的的变量赋初值变量赋初值struct course.;struct student s1=9801, “Wang”, m, 20, 90, 80.5, 75, “Beijing”;273第十一章第十一章 结构体与共用体结构体与共用体11.5 结构体数组结构体数组一、结构体数组的定义一、结构体数组的定义 与定义结构体类型变量相似与定义结构体类型变量相似 例:例:(1)struct student stu40; (2)struct student stu40;274第十一章第十一章 结构体与共用体结构体与共用体二、结构体数组的初始化二、结构体数组的初始化 在结构体类型数组的定义后加:在结构体类型数组的定义后加: = 下标为下标为0的元素的初值表列的元素的初值表列, 下标为下标为1的元素的初值表列的元素的初值表列, . 下标为下标为i的元素的初值表列的元素的初值表列, . ;275第十一章第十一章 结构体与共用体结构体与共用体例例11.1:给一个班的:给一个班的40名学生年龄加名学生年龄加1。 struct course .; struct student s40=.; main( ) int i; for(i=0; i40; i+) si.age+; printf(“%s, %c, %dn”, si.name, si.sex, si.age);276第十一章第十一章 结构体与共用体结构体与共用体第十一章作业第十一章作业第第318页页 11.5上机调试作业上机调试作业第第318页页 11.5277&本章内容本章内容13.1 C文件概述文件概述13.2 文件类型指针文件类型指针13.3 文件的打开与关闭文件的打开与关闭13.4 文件的读写文件的读写第十三章第十三章 文文 件件返回返回278第十三章第十三章 文文 件件第十三章第十三章 文文 件件文件:文件:存储在外部介质上数据的集合。存储在外部介质上数据的集合。13.1 C文件概述文件概述数据也可以组成一个文件数据也可以组成一个文件键盘可以看作是输入文件键盘可以看作是输入文件文件的类型文件的类型显示器可以看作是输出文件显示器可以看作是输出文件ASCII文件文件二进制文件二进制文件279第十三章第十三章 文文 件件第十三章第十三章 文文 件件13.2 文件类型指针文件类型指针文件型指针变量:文件型指针变量: FILE *fp;fp指向某文件的结构体变量,通过该结构体指向某文件的结构体变量,通过该结构体变量中的文件信息访问该文件变量中的文件信息访问该文件文件结构体类型:文件结构体类型:FILE注:注:使用使用FILE类型类型需加:需加:#include “stdio.h”280第十三章第十三章 文文 件件13.3 文件的打开与关闭文件的打开与关闭一、文件的打开(一、文件的打开(fopen函数函数) fopen函数的调用方式:函数的调用方式: FILE *fp; fp=fopen(“文件名文件名”, “文件使用方式文件使用方式”);例:例:fp=fopen(“A1”, “r”);文件使用方式及含义见教材文件使用方式及含义见教材p312 表表13.1281第十三章第十三章 文文 件件二、文件的关闭(二、文件的关闭(fclose函数函数)用用fclose函数关闭文件函数关闭文件 fclose函数的调用方式:函数的调用方式:fclose(文件指针);文件指针); 例:例: fclose(fp);注:在程序终止之前应关闭所有使用注:在程序终止之前应关闭所有使用的文件的文件282第十三章第十三章 文文 件件13.4 文件的读写文件的读写一、一、fputc函数和函数和fgetc函数函数1、fputc函数把一个字符写入指定的文件函数把一个字符写入指定的文件一般形式:一般形式:fputc(ch, fp)字符型数据字符型数据文件指针文件指针283第十三章第十三章 文文 件件2、fgetc函数从指定的文件读入一个字符函数从指定的文件读入一个字符一般形式:一般形式:ch=fgetc(fp)文件指针文件指针字符型变量字符型变量或数组元素或数组元素284第十三章第十三章 文文 件件3、举例、举例13.1#includemain( ) FILE *fp ; char ch , filename10; scanf(“%s”,filename); if(fp=fopen(filename, “w”)=NULL) printf(“cannot open filen”); else ch=getchar(); ch=getchar(); while(ch!=#) fputc(ch,fp) ; putchar(ch); ch=getchar(); fclose(fp); 从键盘输从键盘输入一些字符,入一些字符,逐个把它们逐个把它们送到磁盘上送到磁盘上去,直道输去,直道输入一个入一个“#”为止。为止。285第十三章第十三章 文文 件件二、二、fread函数和函数和fwrite函数函数1、一般形式:、一般形式: fread(buffer,size,count , fp ); fwrite(buffer, size,count , fp );2、功能:、功能: 从指定文件上读写一个数据块从指定文件上读写一个数据块286第十三章第十三章 文文 件件三、三、fprintf函数和函数和fscanf函数函数1、一般形式:、一般形式: scanf(文件指针,文件指针,格式字符串,变量地址表格式字符串,变量地址表); printf(文件指针,文件指针,格式字符串,变量表格式字符串,变量表);2、功能:、功能: 从指定文件上按指定格式进行读写从指定文件上按指定格式进行读写287第十三章第十三章 文文 件件第十三章作业第十三章作业第第348页页 13.4上机调试作业上机调试作业第第348页页 13.4288谢谢 谢!谢!28952 54 56 58 60 62 64 66 68 70 72 74 76 78 80 82 84 86 88 90 92 94 96AdaALGOL60ALGOL68PascalModula-2CPLBCPL BCC+JavaLISPPROLOGCOBOLFORTRAN77FORTRANPL/1Simula 67Smalltalk 80BASICANSI-BASICQBASIC VBFORTRAN90跳转跳转290C语言发展过程语言发展过程l产生背景产生背景l产生过程产生过程时间时间:19721973地点地点:美国贝尔实验室美国贝尔实验室目的目的:UNIX操作系统操作系统设计人设计人: Ken.Thompson和和lC标准标准标准标准C: K&R合著合著The C Programming LanguageANSI C: 1983年年87 ANSI C: 1987年年1990年国际标准的年国际标准的ANSI C291
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号