最基础的C语言教程

上传人:汽*** 文档编号:568802179 上传时间:2024-07-26 格式:PPT 页数:202 大小:670KB
返回 下载 相关 举报
最基础的C语言教程_第1页
第1页 / 共202页
最基础的C语言教程_第2页
第2页 / 共202页
最基础的C语言教程_第3页
第3页 / 共202页
最基础的C语言教程_第4页
第4页 / 共202页
最基础的C语言教程_第5页
第5页 / 共202页
点击查看更多>>
资源描述

《最基础的C语言教程》由会员分享,可在线阅读,更多相关《最基础的C语言教程(202页珍藏版)》请在金锄头文库上搜索。

1、C语言程序设计语言程序设计 主讲:主讲:1第一章第一章 C语言概述语言概述l主要内容:主要内容: C语言的发展语言的发展 C语言的特点语言的特点 简单简单C程序介绍程序介绍 算法算法 结构化程序设计结构化程序设计 C程序的执行过程程序的执行过程2C C C C语言出现的历史背景语言出现的历史背景语言出现的历史背景语言出现的历史背景(1 1 1 1)C C C C语语语语言言言言的的的的发发发发展展展展源源源源于于于于人人人人们们们们希希希希望望望望用用用用高高高高级级级级语语语语言言言言编编编编写写写写操操操操作作作作系系系系统统统统。 ALGOL60ALGOL60ALGOL60ALGOL60

2、(高级语言)高级语言)高级语言)高级语言) 60 60 60 60 - - - -CPLCPLCPLCPL(剑桥大学推出剑桥大学推出剑桥大学推出剑桥大学推出 接近硬件接近硬件接近硬件接近硬件 规模大规模大规模大规模大 难实现)难实现)难实现)难实现) 63 63 63 63 - - - -BCPL BCPL BCPL BCPL (剑桥大学剑桥大学剑桥大学剑桥大学 简化简化简化简化CPLCPLCPLCPL) 67 67 67 67 -B -B -B -B 语言语言语言语言 (贝尔实验室用(贝尔实验室用(贝尔实验室用(贝尔实验室用B B B B写了写了写了写了UNIXUNIXUNIXUNIX操作系

3、统)操作系统)操作系统)操作系统) 70 70 70 70 -C -C -C -C 语言语言语言语言 (用(用(用(用C C C C改写了改写了改写了改写了UNIX 90%UNIX 90%UNIX 90%UNIX 90%,即第即第即第即第5 5 5 5版)版)版)版) 72 72 72 7273737373 - - - -标准标准标准标准C C C C (K&R K&R K&R K&R The C Programming languageThe C Programming languageThe C Programming languageThe C Programming language)

4、78787878 - ANSI C 83 - ANSI C 83 - ANSI C 83 - ANSI C 83 (ANSI ANSI ANSI ANSI 美国国家标准化协会)美国国家标准化协会)美国国家标准化协会)美国国家标准化协会) - 87 ANSI C - 87 ANSI C - 87 ANSI C - 87 ANSI C - ISO C 90 - ISO C 90 - ISO C 90 - ISO C 90 (ISOISOISOISO国际标准化组织)国际标准化组织)国际标准化组织)国际标准化组织) 版本:版本:版本:版本:Microsoft CMicrosoft CMicrosoft

5、 CMicrosoft C、Turbo CTurbo CTurbo CTurbo C、Borland CBorland CBorland CBorland C、Quick CQuick CQuick CQuick C(2 2 2 2)C C C C语语语语言言言言既既既既具具具具有有有有高高高高级级级级语语语语言言言言特特特特性性性性,又又又又具具具具有有有有低低低低级级级级语语语语言言言言特特特特性性性性- - - -中中中中级语言。级语言。级语言。级语言。1.1C语言的发展语言的发展 31. 21. 2 C C语言的特点语言的特点l l语言简洁,表达能力强,易于理解语言简洁,表达能力强,易

6、于理解只有只有3232个关键字,个关键字,9 9种控制语句种控制语句32个关键字:(由系统定义,不能重作其它定义由系统定义,不能重作其它定义由系统定义,不能重作其它定义由系统定义,不能重作其它定义) )auto break case char constcontinue default do double elseenum extern float for gotoif int long register returnshort signed sizeof static structswitch typedef unsigned union voidvolatile while49 9种控制语

7、句种控制语句:if( )elseif( )elsefor( )for( )while( )while( )dowhile( )dowhile( )continuecontinuebreakbreakswitchswitchgotogotoreturnreturn5l l运算符丰富运算符丰富3434种运算符,运算能力强、效率高。种运算符,运算能力强、效率高。算术运算符:算术运算符:算术运算符:算术运算符:+ - * / % + -+ - * / % + -+ - * / % + -+ - * / % + -关系运算符:关系运算符:关系运算符:关系运算符: = != = != = != = !=逻

8、辑运算符:!逻辑运算符:!逻辑运算符:!逻辑运算符:! & | & | & | & |位运算符位运算符位运算符位运算符 : | & | & | & | &赋值运算符:赋值运算符:赋值运算符:赋值运算符:= = = = 及其扩展及其扩展及其扩展及其扩展条件运算符:条件运算符:条件运算符:条件运算符:?:?:?:?:逗号运算符:逗号运算符:逗号运算符:逗号运算符:, , , ,指针运算符:指针运算符:指针运算符:指针运算符:* &* &* &* &求字节数求字节数求字节数求字节数 :sizeofsizeofsizeofsizeof强制类型转换:强制类型转换:强制类型转换:强制类型转换:( ( (

9、(类型)类型)类型)类型)分量运算符:分量运算符:分量运算符:分量运算符:. -. -. -. -下标运算符:下标运算符:下标运算符:下标运算符:其它其它其它其它 :( ) -( ) -( ) -( ) -6数据类型丰富数据类型丰富数据类型丰富数据类型丰富C数据类型基本类型构造类型指针类型空类型void定义类型typedef数值类型字符类型char枚举类型enum整 型浮点型单精度型float双精度型double短整型short长整型long整型int数组结构体struct共用体union7l l具有结构化的控制语句具有结构化的控制语句l l程序书写格式自由程序书写格式自由l l能进行位操作,

10、能实现汇编语言的大部分能进行位操作,能实现汇编语言的大部分功能,可以直接对硬件进行操作功能,可以直接对硬件进行操作l l语言生成的代码质量高,程序执行效率高语言生成的代码质量高,程序执行效率高l l可移植性好可移植性好8例例1.1编编写写程程序序,在在屏屏幕幕上上打打印印字字符符串串“This is a C program.n”。main() printf( printf( This is a C program.n);.n);1. 3简单简单C程序介绍程序介绍9例1.2 /*求两数之和*/ main( ) int a , b , sum ; /*定义变量定义变量*/a=123 ; b=456

11、 ;sum= a + b ; printf (“Sum is %dn”, sum) ; Sum is 579 10例1.3 求两数之最大值 main( ) int a , b , c ; scanf (”%d,%d”, &a, &b) ; c=max(a , b) ; /*调用自定义函数max */ printf (“max=%dn”, c) ; int max(int x , int y) /*自定义函数*/ int z ; if (xy) z=x ; else z=y ; return(z) ; 11C程序结构程序结构l lC程序程序 由由函数函数构成构成必须有,且只能有一个必须有,且只能

12、有一个main(主函数)主函数) 总是从总是从main函数开始执行函数开始执行l l函数函数 由由函数首部函数首部和和函数体函数体组成组成 函数首部指定函数首部指定函数名、函数参数、类型函数名、函数参数、类型 函数体从函数体从 开始,到开始,到 结束结束 函数内有函数内有语句语句12C程序结构(续)程序结构(续)l l语句语句 包括包括说明性语句说明性语句、可执行语句可执行语句 以以 ;表示语句结束表示语句结束l l注释注释可以出现在程序的任何位置可以出现在程序的任何位置 用用 /* 和和 */ 括起来,必须成对出现括起来,必须成对出现l l书写格式书写格式 C语言没有行的概念,书写格式自由。

13、语言没有行的概念,书写格式自由。 习惯小写字母,缩进格式。习惯小写字母,缩进格式。131.4 程序的灵魂算法程序的灵魂算法l l程序包括两方面内容:程序包括两方面内容:1.1.对数据的描述。对数据的描述。对数据的描述。对数据的描述。数据元素及各元素之间的关数据元素及各元素之间的关数据元素及各元素之间的关数据元素及各元素之间的关系,即数据结构系,即数据结构系,即数据结构系,即数据结构。2.2.对操作的描述。对操作的描述。对操作的描述。对操作的描述。即操作步骤,也就是算法。即操作步骤,也就是算法。即操作步骤,也就是算法。即操作步骤,也就是算法。程序程序程序程序 = = 数据结构数据结构数据结构数据

14、结构 + + 算法算法算法算法程序程序程序程序 = =数据结构数据结构数据结构数据结构 + + 算法算法算法算法 + + 程序设计方法程序设计方法程序设计方法程序设计方法 + + 语言工具环境语言工具环境语言工具环境语言工具环境说明:说明:说明:说明:高级语言的数据结构是以数据类型来体现的。高级语言的数据结构是以数据类型来体现的。高级语言的数据结构是以数据类型来体现的。高级语言的数据结构是以数据类型来体现的。141.4.1 1.4.1 算法算法l l什么是算法什么是算法 为解决某一应用问题而采用的为解决某一应用问题而采用的解题步骤解题步骤l l算法的描述方式算法的描述方式 用自然语言描述算法用

15、自然语言描述算法 用流程图描述算法用流程图描述算法 用用N-S结构图描述算法结构图描述算法 用计算机语言表示算法(即实现算法)用计算机语言表示算法(即实现算法)例如:输出两个数中的最大数例如:输出两个数中的最大数 15用自然语言描述算法用自然语言描述算法第一步:输入第一步:输入x和和y的值的值第二步:比较第二步:比较x和和y的值,如果的值,如果x大于大于y,则则输出输出x的值,否则输出的值,否则输出y的值。的值。 例如当描述例如当描述“输出输出10个个数中最大数数中最大数”的算法时,的算法时,会冗长、难于理解会冗长、难于理解16图图1.5 用流程图描述算法用流程图描述算法用流程图描述算法用流程

16、图描述算法NYz= yz= xx y ?开始开始输入输入x和和y结束结束输出输出z起止框起止框起止框起止框输入输入输入输入/ /输出输出输出输出框框框框判断框判断框判断框判断框处理框处理框处理框处理框流程线流程线流程线流程线17用用N-S结构图描述算法结构图描述算法输入输入x、y的值的值xy T F z = x z = y输出输出z的值的值图图图图1.7 1.7 用用用用N-SN-S结构图描述的算法结构图描述的算法结构图描述的算法结构图描述的算法18第一章第一章 1.1 1.1 引言引言算法的特性算法的特性(1 1)有穷性。)有穷性。 (2 2)确定性。)确定性。 (3 3)有效性。)有效性。

17、 (4 4)输入。)输入。 (5 5)输出。)输出。 191.4.21.4.2结构化程序设计结构化程序设计l l程序的三种基本结构程序的三种基本结构程序的三种基本结构程序的三种基本结构顺序结构程序:顺序结构程序:顺序结构程序:顺序结构程序:按照书写顺序依次执行语句按照书写顺序依次执行语句按照书写顺序依次执行语句按照书写顺序依次执行语句选择结构程序:选择结构程序:选择结构程序:选择结构程序:按照条件判断选择执行语句按照条件判断选择执行语句按照条件判断选择执行语句按照条件判断选择执行语句循环结构程序:循环结构程序:循环结构程序:循环结构程序:通过条件控制循环执行语句通过条件控制循环执行语句通过条件

18、控制循环执行语句通过条件控制循环执行语句三种基本结构的共同点:三种基本结构的共同点:三种基本结构的共同点:三种基本结构的共同点:都是只有一个入口和一个出口;都是只有一个入口和一个出口;都是只有一个入口和一个出口;都是只有一个入口和一个出口;结构内的每一个框都有机会被执行;结构内的每一个框都有机会被执行;结构内的每一个框都有机会被执行;结构内的每一个框都有机会被执行;结构内没有死循环。结构内没有死循环。结构内没有死循环。结构内没有死循环。20结构化程序设计的三种基本结构:结构化程序设计的三种基本结构:1) 顺序结构顺序结构 传统流程图 N-S流程图 ABA AB B开始结束其中:A、B为操作框,

19、可由一条或多条语句实现。212) 选择结构选择结构(分支结构) 传统流程图 N-S流程图 入口 出口ABP P P A AB BT FT F其中:P为分支判断条件; A、B必有一个且只有一个被执行; A、B之一可是空操作,用 表示。22 3) 循环结构循环结构当型循环当型循环先判断后循环,有可能一次也不循环。 入口 F T PA当P为真 A出口其中:P为循环判断条件; A为要重复执行的操作,称为循环体;23 直到型循环直到型循环先循环后判断,至少循环一次。 入口 F T PA A直到P为真 出口其中:P为循环判断条件; A为要重复执行的操作,称为循环体;24算法举例算法举例例:计算5! (12

20、345) 1 1t t1 1i i当当当当i5i5 ti tit t i+1 i+1i i输出输出输出输出 t t1 1t t1 1i i titit t i+1 i+1i i直到直到直到直到 i5i5输出输出输出输出 t t当型循环 直到型循环 25结构化程序设计的基本原则:结构化程序设计的基本原则:l l结构化程序设计的基本原则:结构化程序设计的基本原则:结构化程序设计的基本原则:结构化程序设计的基本原则:采用采用采用采用自顶向下、逐步细化自顶向下、逐步细化自顶向下、逐步细化自顶向下、逐步细化的方法进行设计;的方法进行设计;的方法进行设计;的方法进行设计;采用采用采用采用模块化原则和方法模

21、块化原则和方法模块化原则和方法模块化原则和方法进行设计。即将大型进行设计。即将大型进行设计。即将大型进行设计。即将大型任务从上向下划分为多个功能模块,每个模任务从上向下划分为多个功能模块,每个模任务从上向下划分为多个功能模块,每个模任务从上向下划分为多个功能模块,每个模块又可以划分为若干子模块,然后分别进行块又可以划分为若干子模块,然后分别进行块又可以划分为若干子模块,然后分别进行块又可以划分为若干子模块,然后分别进行模块程序的编写;模块程序的编写;模块程序的编写;模块程序的编写;每个模块都是用结构化程序实现每个模块都是用结构化程序实现每个模块都是用结构化程序实现每个模块都是用结构化程序实现,

22、即都只能,即都只能,即都只能,即都只能由三种基本结构组成,并通过计算机语言的由三种基本结构组成,并通过计算机语言的由三种基本结构组成,并通过计算机语言的由三种基本结构组成,并通过计算机语言的结构化语句实现。结构化语句实现。结构化语句实现。结构化语句实现。 261.51.5 C C语言的上机操作步骤语言的上机操作步骤 一一. . 上机过程:上机过程:编译编译正确正确正确正确正确正确有错误有错误有错误有错误编辑编辑运行运行27C程序的执行过程程序的执行过程 1 1源程序文件的建立和编辑源程序文件的建立和编辑源程序文件的建立和编辑源程序文件的建立和编辑 编写源程序,形成编写源程序,形成编写源程序,形

23、成编写源程序,形成 . . . .C C文件文件文件文件 需用需用需用需用编辑工具编辑工具编辑工具编辑工具:tc.exetc.exe、记事本、记事本、记事本、记事本2 2编译编译编译编译 编译源程序,形成目标程序编译源程序,形成目标程序编译源程序,形成目标程序编译源程序,形成目标程序 . . ObjObj文件文件文件文件 需用需用需用需用编译工具编译工具编译工具编译工具 :tcc.exetcc.exe3 3连接连接连接连接 连接连接连接连接OBJOBJ文件和调用的库函数,形成运行程文件和调用的库函数,形成运行程文件和调用的库函数,形成运行程文件和调用的库函数,形成运行程序序序序 . .exee

24、xe 文件文件文件文件 需用需用需用需用连接工具连接工具连接工具连接工具 :tlink.exetlink.exe4 4运行运行运行运行 . .exeexe 文件文件文件文件28装载装载c程序程序编辑编辑c程序程序运行运行c程序程序(ctrl+F9)正确正确?看结果看结果(alt+F5)运行下一程序运行下一程序?是是是是否否退出退出否否2.上机过上机过程流程图程流程图:29F3F3(打开源程序)打开源程序)F2F2(保存当前源程序)保存当前源程序) F9F9(编译当前源程序)编译当前源程序) CTRL+F9CTRL+F9(运行当前源程序)运行当前源程序) ALT+F5ALT+F5(查看运行结果)

25、查看运行结果)3.编写、编写、运行运行C C程序程序时常用功时常用功能键能键30三、需要记住的三、需要记住的TCTC中一些常用功能键中一些常用功能键F1:F1:帮助。帮助。 F2F2:将当前文件存盘。将当前文件存盘。 F3F3:装载原有文件或给新文件命名。装载原有文件或给新文件命名。 F4F4:程序运行到光标所在行。程序运行到光标所在行。 F5F5:放大或缩小活动窗口切换。放大或缩小活动窗口切换。F6F6:开或关活动窗口切换。开或关活动窗口切换。F7F7:单步运行程序,跟踪进入函数内部运行。单步运行程序,跟踪进入函数内部运行。F8F8:单步运行程序,不跟踪进入函数内部。单步运行程序,不跟踪进入

26、函数内部。 第一章第一章 1.3 1.3 C C语言集成开发环境语言集成开发环境31实验报告实验报告实验一实验一实验一实验一 实验目的实验目的实验目的实验目的 实验内容和步骤实验内容和步骤实验内容和步骤实验内容和步骤 1.1.设计算法,写出程序设计算法,写出程序设计算法,写出程序设计算法,写出程序2.2.在在在在TurboCTurboC下编辑,得到源程序(下编辑,得到源程序(下编辑,得到源程序(下编辑,得到源程序(. .c c)3.3.编译,得到目标文件(编译,得到目标文件(编译,得到目标文件(编译,得到目标文件(. .objobj)4.4.连接,得到可执行文件(连接,得到可执行文件(连接,得

27、到可执行文件(连接,得到可执行文件(. .exeexe)5.5.分析结果分析结果分析结果分析结果 实验体会实验体会实验体会实验体会 32C程序设计程序设计数据类型、运算符与表达式332.1 2.1 数据类型数据类型2.2 2.2 常量与变量常量与变量2.3 2.3 整型数据整型数据2.4 2.4 实型数据实型数据2.5 2.5 字符型数据字符型数据2.6 2.6 变量赋初值变量赋初值2.7 2.7 混合运算混合运算2.8 2.8 运算符与表达式运算符与表达式 数据类型、运算符与表达式数据类型、运算符与表达式 CHAPTER 234数据类型、运算符与表达式数据类型、运算符与表达式 的的数据类型数

28、据类型vC语言提供的数据结构是以数据类型形式出现的v数据在内存中存放的情况有数据类型决定v 数据的操作要依靠运算符实现,而数据和运算符共同组成了表达式。35数据类型、运算符与表达式数据类型、运算符与表达式 的的数据类型数据类型数组类型数组类型数据类型数据类型构造类型构造类型空类型空类型指针类型指针类型双精度双精度单精度单精度实型(浮点型)实型(浮点型)字符型字符型枚举类型枚举类型基本类型基本类型整型整型结构体类型结构体类型共用体类型共用体类型363.2常量与变量常量与变量 3.2.1常量和符号常量常量和符号常量1.1.常量常量: :在运行过程中,其值不能被改变的量称为常量。在运行过程中,其值不

29、能被改变的量称为常量。2. 分类:整型分类:整型实型实型字符字符字符串字符串2.2.符号常量符号常量,用一个标识符代表的常量。,用一个标识符代表的常量。 习惯上,符号常量名用大写,变量用小写,以示区别。习惯上,符号常量名用大写,变量用小写,以示区别。u1,0,123为整型常量为整型常量u 4.6, 1.23为实型常量为实型常量u a, d 为字符常量为字符常量u #define PRICE 255 A=PRICE*A+6 C=PRICE+C/120PRICE是标识符,符号常量是标识符,符号常量373.2.2 变变 量量1.1.变量变量:在程序运行过程中,其值可以改变的量称为变量。:在程序运行过

30、程中,其值可以改变的量称为变量。2.2.标识符标识符:用来标识变量名、符号常量名、函数名、类型名、:用来标识变量名、符号常量名、函数名、类型名、数组名、文件名的有效字符序列称为标识符。数组名、文件名的有效字符序列称为标识符。3.3. 由字母、数字和下划线三种字符组成,且第一个字由字母、数字和下划线三种字符组成,且第一个字符必须为字母或下划线。符必须为字母或下划线。u合法的变量名如:合法的变量名如: average,abd, a, s2, student_name, _initu不合法的变量名:不合法的变量名:M.D.John, 1a, #33, ab3. C 3. C 语言要求对变量语言要求对

31、变量“先定义,后使用先定义,后使用”。383.3 整型数据整型数据 3.3.1 整型常量整型常量由一系列数字组成。也可带有减号,但不使用加号。由一系列数字组成。也可带有减号,但不使用加号。u十进制整数:十进制整数:123,-456,0u八进制整数:以八进制整数:以0 0开头的数据,如:开头的数据,如:-011,0123u十六进制整数:以十六进制整数:以0x0x开头的数据,如:开头的数据,如:0x123 整型常量的分类根据其值的范围而决定其类型,整型常量的分类根据其值的范围而决定其类型,并可以赋值给类型相匹配的整型变量。并可以赋值给类型相匹配的整型变量。393.3.2 整型变量1.整数数据在内存

32、中的存放形式 数据在内存中是以二进制形式存放的。数据在内存中是以二进制形式存放的。 例如:例如:3 3 (0000000000000011)(0000000000000011)2 2要区别:要区别:3 3 和和 3 3 方法是:方法是:将符号也数码化将符号也数码化即:即: 正的符号正的符号 用用 0 0 表示表示 负的符号负的符号 用用 1 1 表示表示 数值是以数值是以补码补码表示的。表示的。 正数的补码和其原码的形式相同。正数的补码和其原码的形式相同。 负负数数的的补补码码:将将该该数数的的绝绝对对值值的的二二进进制制形形式式,按位取反再加按位取反再加1 1 。 3 3(111111111

33、11111101 11111111111111101 ) )2 2402.整型变量的分类整型变量的分类 整型整型 int int 在内存中以二进制形式存放,每一个整型变量在内存中占在内存中以二进制形式存放,每一个整型变量在内存中占2 2个字节。个字节。短整型短整型 以以short intshort int表示或以表示或以shortshort表示,表示, 一般与一般与intint占有的内存相同。占有的内存相同。长整形长整形以以long intlong int表示或以表示或以longlong表示,表示,一般占有在内存中字节为一般占有在内存中字节为intint两倍。两倍。无符号型无符号型只能存放正整

34、数,它的表示是在上述三种类型之前加上只能存放正整数,它的表示是在上述三种类型之前加上unsignedunsigned类型名称类型名称类型符类型符bitbit取值范围取值范围整型整型( (短整型短整型) )int int shortshort int int 1616- -2-215152 21515-1-1(-32768(-3276832767 )32767 )无符号整型无符号整型unsignedunsigned int int16160 0 2 21616-1-1(0(065535 )65535 )长整型长整型longlong int int3232-2-231312 23131- 1- 1

35、无符号长整型无符号长整型 unsigned longunsigned long int int32320 0 2 23232-1-1413. 整型变量的定义整型变量的定义对变量的定义一般放在函数的开头部分。对变量的定义一般放在函数的开头部分。例例2.1main() int a,b,c,d; unsigned u; a = 12; b =24; u =10; c = a+u; d = b+u; printf(“a + u = %d, b + u = % dn”, c, d); a+u = 22, b+u =a+u = 22, b+u =1414不同类型的数可以直接运算不同类型的数可以直接运算42

36、4.整型数据的溢出整型数据的溢出main()int a,b; a=32767; b=a+1; printf(“%d,%d”,a,b); 运行结果为运行结果为 32767,-327683.3.3 整型常量的类型整型常量的类型 一个整常量,其值在一个整常量,其值在-215-215215-1内可认为是内可认为是 int 型,并可赋值型,并可赋值给给 int 型和型和 long int 型变量;型变量; 一个整常量,其值在一个整常量,其值在 231 231-1 范围内则认为它是范围内则认为它是 long int 型,可赋值给一个型,可赋值给一个 long int 型变量;型变量; 常量中无常量中无 u

37、nsigned 型,但一个非负值的整常量可以赋给型,但一个非负值的整常量可以赋给 unsigned 型整变量;型整变量;433.4 实型数据3.4.1 实型常量1.十进制小数形式(日常记数形式) 1.0 +12.0 -12.0 0.02.指数形式(科学记数形式) E(e)。例如3.0+5等。3.4.2 实型变量1 1类型:类型: 单精度:float,分配4 Byte双精度:double,分配 8 Byte2 2存储:存储: 指数部分指数部分指数部分指数部分小数部分小数部分小数部分小数部分 小数的符号位小数的符号位指数的符号位指数的符号位44实型数据的类型及规定实型数据的类型及规定 类型类型类型

38、符类型符ByteByte绝对值的范绝对值的范围围有效数字有效数字单精度型单精度型 floatfloat4 41010-38 -38 10 1038386 67 7位位双精度型双精度型 doubledouble8 81010-308 -308 101030830815151616位位u实型常量不分实型常量不分float和和double,根据范围赋值给相应的变量。,根据范围赋值给相应的变量。u如:如:float a;double b;a=111111.111; b=111111.111a中实际存储的是中实际存储的是111111.1 (7位有效位有效)b中实际存储的是中实际存储的是111111.11

39、1 (全部有效全部有效)453.5 3.5 字符型数据字符型数据3.5.1字符常量字符常量1. 定义定义用一对单引号括起来的单个字符,称为字符常量。例如,A、等。2.转义字符转义字符语言还允许使用一种特殊形式的字符常量,就是以反斜杠“ ”开头的字符序列。0000字符串结束标志字符串结束标志字符串结束标志字符串结束标志 n n回车换行回车换行回车换行回车换行 t t跳到下一个输出位置跳到下一个输出位置跳到下一个输出位置跳到下一个输出位置 双引号字符双引号字符双引号字符双引号字符 ddddd ddddddd为为为为1 1到到到到3 3位八进制数所代表的字符位八进制数所代表的字符位八进制数所代表的字

40、符位八进制数所代表的字符 xhxhh hhhhh为为为为1 1到到到到2 2位十六进制数所代表的字符位十六进制数所代表的字符位十六进制数所代表的字符位十六进制数所代表的字符463.5.2 字符型变量字符型变量 字符变量的类型关键字为字符变量的类型关键字为char,一般占用一般占用1字节内存单元。字节内存单元。 1.变量值的存储变量值的存储 将一个字符常量存储到一个字符变量中,实际上是将该将一个字符常量存储到一个字符变量中,实际上是将该字符的字符的ASCII码值(无符号整数)存储到内存单元中。码值(无符号整数)存储到内存单元中。 例如:例如: char ch1, ch2; /*定义两个字符变量:

41、定义两个字符变量:ch1,ch2*/ ch1=a; ch2=b; /*给字符变量赋值给字符变量赋值*/ a、b的的ASCII码为码为97、98 。 2.特性特性 1)字符数据在内存中存储的是字符的字符数据在内存中存储的是字符的ASCII码;码; 2)语言允许字符型数据与整型数据之间通用语言允许字符型数据与整型数据之间通用,可以互可以互相赋值。相赋值。 3)字符数据也可以整数形式输出。字符数据也可以整数形式输出。47 例1 字符变量的字符形式输出和整数形式输出。 main() char c1,c2; c1=a; c2=b; printf(“c1=%c,c2=%cn”,c1,c2); printf

42、(“c1=%d,c2=%dn”,c1,c2); 程序运行结果: c1=a,c2=b c1=97,c2=9848 例例2 大小写字母的转换。大小写字母的转换。 main() char c1,c2; c1=a; c2=b; c1=c1-32;c2=c2-32; printf(“%c c2=%cn”,c1,c2); 程序运行结果:程序运行结果: A B 49数据类型、运算符与表达式数据类型、运算符与表达式 字符型数据字符型数据3.5.3 字符串常量字符串常量u用双引号括起来的字符序列。用双引号括起来的字符序列。如:如:“How do you do”, “CHINA”, “a”, “$ 123.34”

43、 等。等。u字符串可以一次输出。字符串可以一次输出。如:如:printf(“How do you do”);uC语言规定:在存储字符串常量时,由系统在字符串的语言规定:在存储字符串常量时,由系统在字符串的末尾自动加一个末尾自动加一个0作为字符串的结束标志。在内存作为字符串的结束标志。在内存中中,对字符串常量是采用字符数组表示,即用一个字符对字符串常量是采用字符数组表示,即用一个字符型数组来存放一个字符串。型数组来存放一个字符串。 u注意:注意: a是字符常量,是字符常量,“a”是字符串常量,二者是字符串常量,二者不同。不同。50综上所述,字符常量综上所述,字符常量 AA与字符串常量与字符串常量

44、 AA是两回事:是两回事:(1 1)定界符不同:字符常量使用单引号,而字符串常)定界符不同:字符常量使用单引号,而字符串常量使用双引号;量使用双引号;(2 2)长度不同:字符常量的长度固定为)长度不同:字符常量的长度固定为1 1,而字符串常,而字符串常量的长度,可以是某个整数;量的长度,可以是某个整数;(3 3)存储要求不同:字符常量存储的是字符的)存储要求不同:字符常量存储的是字符的ASCIIASCII码码值,而字符串常量,除了要存储有效的字符外,还要存值,而字符串常量,除了要存储有效的字符外,还要存储一个结束标志储一个结束标志00。513.6 3.6 变量赋初值变量赋初值在变量定义的同时可

45、以为变量赋初值。在变量定义的同时可以为变量赋初值。如:如:int a=3; (相当于相当于 int a; a=3;)float f = 3.56;char c = a;int a,b,c = 5 ; 表示只给表示只给c赋初值。赋初值。(相当于(相当于int a,b,c; c = 5;)523.7 各类数值型数据间的混合运算各类数值型数据间的混合运算u不同类型的数据(整型、实型、字符型)可进行混合运算。不同类型的数据(整型、实型、字符型)可进行混合运算。如:如:10 + a + 1.5 8765.1234 * b u必须首先将它们转换成同一类型的数值。必须首先将它们转换成同一类型的数值。u转换原

46、则是由低向高转换,运算结果为最高级别的类型。转换原则是由低向高转换,运算结果为最高级别的类型。 double double floatfloatlonglongunsignedunsignedintintchar,shortchar,short表示必须要转换表示必须要转换表示由低向高表示由低向高高高低低53数据类型、运算符与表达式数据类型、运算符与表达式 混合运算混合运算如:如:10 +a + i * f - 10 +a + i * f - d/ed/eintdoubledoubledouble+double54例例2-52-5:已知:已知: float a=2.0; int b =6,c =

47、3;float a=2.0; int b =6,c =3;求解:求解: a*b/c-1.5+ a*b/c-1.5+ A A +abs(-5)= +abs(-5)=?12.0/34.04.0 - 1.5 - 1.52.52.5+65(+65(int)int)67.567.55 572.572.5第二章第二章 2.3 2.3 运算符和表达式运算符和表达式553.8 算术运算符和算术表达式算术运算符和算术表达式1.基本的算术运算基本的算术运算: 、*、% % 是模运算,即求余运算,要求整数。是模运算,即求余运算,要求整数。 如:如:7%4的结果是的结果是3。说明:说明: 5/3的结果仍是整数,小数部

48、分被忽略。的结果仍是整数,小数部分被忽略。 5.3/3或或5/3.0的结果为的结果为double型。型。 C编译系统将实型常量作为双精度来处理。如果参加、编译系统将实型常量作为双精度来处理。如果参加、*、/ 运算的两个数中有一个数为实数,则结果是运算的两个数中有一个数为实数,则结果是double型。型。2.算术表达式算术表达式:用算术运算符将运算对象按:用算术运算符将运算对象按C的语法规则连接起的式子。的语法规则连接起的式子。 例如:例如:a * b/c1.5+a优先级(算术运算)优先级(算术运算): ()() * / % + 在同一级别中,采取由左至右的结合方向。在同一级别中,采取由左至右的

49、结合方向。 如:如:a-b+c 相当于相当于 (a-b)+c563.强制类型转换运算符可将一个表达式转换成所需类型。强制类型转换运算符可将一个表达式转换成所需类型。其一般形式为:其一般形式为:(类型名)(表达式)(类型名)(表达式) 例如:例如:(double) a (int) (x+y) (float) (5%3) 在强制类型转换时,得到一个所需类型的中间变量,原在强制类型转换时,得到一个所需类型的中间变量,原来变量的类型未发生变化。来变量的类型未发生变化。57练习练习 main( ) int i; float x; x=3.6; i=(int)x; printf( x=%f,i=%dn,x

50、,i); 58数据类型、运算符与表达式数据类型、运算符与表达式 运算符运算符和表达式和表达式4.自增、自减运算符自增、自减运算符使变量的值加使变量的值加1或减或减1。如:如:i, i 在使用在使用i之前,先使之前,先使i的值加(减)的值加(减)1 i, i 在使用在使用i之后,再使之后,再使i的值加(减)的值加(减)1例如:例如:i的值为的值为3,则,则 j= + + i; j的值为的值为4,i的值为的值为4 j= i + +; j的值为的值为3,i的值为的值为4又如:又如: printf(“%d”, +i); 输出结果为输出结果为4 printf(“%d”,i+); 输出结果为输出结果为3单

51、独使用时,单独使用时, i , i 等价等价59第二章第二章 2.3 2.3 运算符和表达式运算符和表达式结合性:结合性:自右向左自右向左例:例:i = 2; i = 2; j = -i+;j = -i+;分析:分析:(1 1)+、-、+ +、- -是同级运算符,结合方向:是同级运算符,结合方向:自右向左自右向左自右向左自右向左。(2 2) - -i+i+等价于等价于 - -(i+i+)(3 3) 对于括号内的自增运算,要先使用对于括号内的自增运算,要先使用i i,再使再使i i增加增加1 1。运算结果:运算结果: i i的值为的值为3 3,j j的值为的值为-2-2。60练习练习l la=1

52、,b=2,c=3,d=4l l下列式子的值分别是多少?下列式子的值分别是多少?l la*b/cl la*b%c+1l l+a*b-c-613.9 赋值运算符和赋值表达式赋值运算符和赋值表达式1.赋值运算符:赋值运算符:“=” 。2.复合赋值运算复合赋值运算:在赋值符号前加上其它运算符号。在赋值符号前加上其它运算符号。 +=,-=,*=,/=,%=,=,&=,=,|= 例如:例如: a + = 3; 等价于等价于a = a + 3; x * = y + 8; 等价于等价于x = x * ( y + 8 ); x % = 3; 等价于等价于x = x % 3;l l赋值运算符仅优先于赋值运算符仅优

53、先于“ “, ,” ” ,且具有右结合性,且具有右结合性例如: a= b= b*c 等价于:a= (b=(b*c) )l l赋值号与数学中的等号含义不同赋值号与数学中的等号含义不同例如:数学中 a=b 等价于 b=a C语言中 a=b 不等价于 b=a623.赋值运算中的类型转换 l l = = 小数部分自动补小数部分自动补小数部分自动补小数部分自动补0 0l l = = 自动舍去实型表达式的小数部分(自动舍去实型表达式的小数部分(自动舍去实型表达式的小数部分(自动舍去实型表达式的小数部分(注意不进行四舍五入注意不进行四舍五入注意不进行四舍五入注意不进行四舍五入) l l = = l l =

54、= 自动截取表达式值的低字节赋值,舍去高字节自动截取表达式值的低字节赋值,舍去高字节自动截取表达式值的低字节赋值,舍去高字节自动截取表达式值的低字节赋值,舍去高字节l l = = l l = = 自动给高字节补自动给高字节补自动给高字节补自动给高字节补0 0 或或或或补补补补1 163数据类型、运算符与表达式数据类型、运算符与表达式 运算符和运算符和表达式表达式4.赋值表达式:赋值表达式: 由赋值运算符将一个变量和一个表达式连接由赋值运算符将一个变量和一个表达式连接起来的式子。起来的式子。 一般形式为:一般形式为:u例如:例如:int a=12;求下列运算的结果求下列运算的结果 a aa aa

55、 * a a * a a aa aa * a=12-12 * 12=-132)a * a=12-12 * 12=-132)a a-132-132a aa a(-132)=(-132)+(-132)=-264(-132)=(-132)+(-132)=-264a=-264a=-26464练习练习l lint i=1,j=2,k=3,m=4;l l计算下列式子的值计算下列式子的值l li+=j+kl lj*=k=m+565数据类型、运算符与表达式数据类型、运算符与表达式 运算符运算符和表达式和表达式3.10 逗号运算符和逗号表达式逗号运算符和逗号表达式u逗号运算符又称为逗号运算符又称为“顺序求值运算

56、符顺序求值运算符”,是所有运算符,是所有运算符中级别最低的,它将两个表达式连接起来。中级别最低的,它将两个表达式连接起来。 一般形式为:一般形式为:表达式表达式1,表达式,表达式2u求解过程是:先求解表达式求解过程是:先求解表达式1,再求解表达式,再求解表达式2,整个逗,整个逗号表达式的值是表达式号表达式的值是表达式2的值。的值。 例如:例如: a=3*5, a*4; a的值为的值为15,表达式的值为,表达式的值为60 (a=3*5, a*4), a+5; a的值为的值为15, 表达式的值为表达式的值为20 又如:又如: x=(a=3, 6*3); x的值为的值为18 x=a=3, 6*a x

57、的值为的值为3, 表达式的值为表达式的值为1866第第4章章 最简单的最简单的C程序设计程序设计 顺序程序设计顺序程序设计671 C1 C语句概述语句概述2 2 赋值语句赋值语句 3 3 数据的输入输出数据的输入输出4 4 字符数据输入输出字符数据输入输出5 5 格式输入输出格式输入输出7 7 程序举例程序举例 684.1 C4.1 C语句概述语句概述 用用C语言编写的程序称为语言编写的程序称为C语言源程序语言源程序,简称,简称C程序。程序。 C语言一般由一个或若干个函数组成,而这些函数可以保存在一个语言一般由一个或若干个函数组成,而这些函数可以保存在一个或几个源程序中,这些文件都以或几个源程

58、序中,这些文件都以.C作为文件扩展名。作为文件扩展名。 例例 求园的面积求园的面积#DEFINE PI=3.1415926#DEFINE PI=3.1415926main()main() float r,s;float r,s; r = 20; r = 20; s = r * r * PI; s = r * r * PI; printf (“area=%f ”,s); printf (“area=%f ”,s); area=1256.637C C程序程序源程序文件源程序文件1 1源程序文件源程序文件i i源程序文件源程序文件n n预编译命令预编译命令函数函数1 1函数函数n n变量申明部分变量

59、申明部分执行部分(语句)执行部分(语句)语句是计算语句是计算机执行的最机执行的最小单位小单位69C语句分类语句分类 和其他高级语言一样和其他高级语言一样,C语言的语句也是用来向计算机发出操作命令语言的语句也是用来向计算机发出操作命令的。一条语句经过编译后生成若干条机器指令。在的。一条语句经过编译后生成若干条机器指令。在C语言中只有可执行语言中只有可执行语句语句,没有非执行语句。没有非执行语句。 C语句有以下五类语句有以下五类: 控制语句,完成一定的控制功能;控制语句,完成一定的控制功能; if( ) else (条件语句) for( ) (循环语句) while( ) (循环语句) do wh

60、ile ( ) (循环语句) continue (结束本次循环语句) break (中止执行switch或循环语句) Switch (多分支选择语句) goto (转向语句) return (从函数返回语句)70 函数调用语句,由一次函数调用加一个分号构成一个语句,函数调用语句,由一次函数调用加一个分号构成一个语句, 如:如:printf (“This is a C statement.”); 表达式语句,由一个表达式构成一个语句,表达式语句,由一个表达式构成一个语句, 如:如: a=3 (是表达式,不是语句)(是表达式,不是语句) a=3; (是语句)(是语句) 空语句,只有一个分号,什么也

61、不做;空语句,只有一个分号,什么也不做; 复合语句,用复合语句,用 把一些语句括起来成为复合语句。相当一条语句,把一些语句括起来成为复合语句。相当一条语句,哪里有语句,哪里就可用复合语句。哪里有语句,哪里就可用复合语句。 if (ab) max=a; min=b; 复合语句最后一个语句中最后的分号不能忽略不写。复合语句最后一个语句中最后的分号不能忽略不写。714.2 赋值语句赋值语句u 赋值表达式后面加上分号,构成赋值语句。赋值表达式后面加上分号,构成赋值语句。u 功能:将数据赋给变量。功能:将数据赋给变量。 如如: x=3.1; a=d+ 123 + b/d;u 程序中基本的命令行必须是一个

62、语句,表达式不能单独构成语句。程序中基本的命令行必须是一个语句,表达式不能单独构成语句。 例如:例如: d+ 123 + b/d 是一个表达式是一个表达式 a =d+ 123 + b/d;是一个赋值语句;是一个赋值语句 特点:特点: C语言中的赋值号语言中的赋值号“ = ”作为赋值运算符;作为赋值运算符; 作为赋值表达式可以被包括在其他表达式之中;作为赋值表达式可以被包括在其他表达式之中; if(ab)0) t=a; 赋值语句可以连接赋值;赋值语句可以连接赋值; a=b=c=2;724.3 数据输入输出的概念数据输入输出的概念 1. 所谓输入输出是以计算机主机为主体而言的。主机向外部所谓输入输

63、出是以计算机主机为主体而言的。主机向外部设备设备 “输出输出” ,外部设备向主机,外部设备向主机“输入输入”。 2.C语言本身不提供输入输出语句,语言本身不提供输入输出语句,输入和输出操作是由函输入和输出操作是由函数数实现。实现。 C语言通过调用四个系统函数来实现输入输出。语言通过调用四个系统函数来实现输入输出。 printf(),scanf(),getchar(), putchar() 3.在使用在使用C语言库函数时,要用到预编译命令语言库函数时,要用到预编译命令“#include”将将有关的有关的“头文件包括到用户源文件中。头文件包括到用户源文件中。 在调用标准输入输出库函数时,文件开头应

64、有以下预编译命在调用标准输入输出库函数时,文件开头应有以下预编译命令:令: #include 或或 #include”stdio.h”734.4 字符数据的输入输出字符数据的输入输出1.字符输出函数字符输出函数putchar() 向终端输出一个字符。向终端输出一个字符。 如:如:putchar(c);); 输出变量输出变量c的值,的值,c可以是字符型变量或整型变量。可以是字符型变量或整型变量。 例例3.13.1#include “stdio.h”#include “stdio.h”main()main() char a,b,c; char a,b,c; a= B; b= O;c= Y; a=

65、B; b= O;c= Y; putchar(a);putchar(b);putchar(c); putchar(a);putchar(b);putchar(c); BOY74也可以输出控制字符,如也可以输出控制字符,如putchar(n)输出一个换行符。输出一个换行符。u 输出其它转义字符输出其它转义字符 putchar(101); 输出输出 A; putchar(); 输出单引号输出单引号 putchar(015); 使输出回车,不换行使输出回车,不换行 例例3.23.2#include #include main()main() char a,b,c; char a,b,c; a= B;

66、b=O;c=Y; a= B; b=O;c=Y; putchar(a); putchar(a); putchar(n)putchar(n); putchar(b); putchar(b); putchar(n)putchar(n); putchar(c); ; putchar(c); putchar(n)putchar(n); ; BOY752.字符输入函数字符输入函数getchar() 从终端(或系统隐含指定的输入设备)输入一个字符。从终端(或系统隐含指定的输入设备)输入一个字符。 一般形式为:一般形式为: getchar();(); 函数的值就是从输入设备得到的字符函数的值就是从输入设备得到

67、的字符 例例 #include “stdio.h”#include “stdio.h”main()main() char c; char c; c=getchar(); c=getchar(); putchar(c); putchar(c); aa76 例例 从键盘上输入一个大写字母,分别用大小从键盘上输入一个大写字母,分别用大小写字母形式输出,同时输出它们的写字母形式输出,同时输出它们的asciiascii码。码。#include “stdio.h”#include “stdio.h”main()main()char c1,c2; char c1,c2; c1=getchar(); c1=g

68、etchar(); printf(“%c,%dn”,c1,c1); printf(“%c,%dn”,c1,c1); c2=c1+32; c2=c1+32; printf(“%c,%dn”,c2,c2); printf(“%c,%dn”,c2,c2); AA ,65A ,65a ,97a ,97774.5格式输入与输出函数格式输入与输出函数1.格式输出函数格式输出函数printf() 按规定格式向终端输出若干个任意类型的数据。按规定格式向终端输出若干个任意类型的数据。一般格式一般格式: printf: printf(控制格式,输出列表)(控制格式,输出列表)被输出的数据,可以被输出的数据,可以是

69、常量、变量、表达式是常量、变量、表达式用双引号括起的转换控制字用双引号括起的转换控制字符串,它包括两种信息:符串,它包括两种信息:格式说明,格式说明,由由% %开始。如:开始。如:%d,%f,%c%d,%f,%c普通字符,要输出的字符普通字符,要输出的字符printf(“%d %d”,a,b)格式说明格式说明 输出列表输出列表printf(“ a=%d b=%d”,a,b); 控制格式控制格式 输出列表输出列表78printf()格式字符格式字符格式格式字符字符说说 明明d, id, i以以以以带符号带符号带符号带符号的十进制形式输出整数的十进制形式输出整数的十进制形式输出整数的十进制形式输出

70、整数(正数不输出符号)(正数不输出符号)(正数不输出符号)(正数不输出符号)o o以以以以8 8进制进制进制进制无符号无符号无符号无符号形式输出整数(不形式输出整数(不形式输出整数(不形式输出整数(不输出前导符输出前导符输出前导符输出前导符0 0)x, Xx, X以以以以1616进制进制进制进制无符号无符号无符号无符号形式输出整数形式输出整数形式输出整数形式输出整数(不输出前导符(不输出前导符(不输出前导符(不输出前导符0x0x) u u以以以以无符号无符号无符号无符号1010进制形式输出整数进制形式输出整数进制形式输出整数进制形式输出整数c c以字符形式输出,只输出一个字以字符形式输出,只输

71、出一个字以字符形式输出,只输出一个字以字符形式输出,只输出一个字符符符符s s输出字符串输出字符串输出字符串输出字符串f f以小数形式输出单、双精度数,以小数形式输出单、双精度数,以小数形式输出单、双精度数,以小数形式输出单、双精度数,隐含输出隐含输出隐含输出隐含输出6 6位小数位小数位小数位小数e, Ee, E以标准指数形式输出单、双精度以标准指数形式输出单、双精度以标准指数形式输出单、双精度以标准指数形式输出单、双精度数,数字部分小数位数为数,数字部分小数位数为数,数字部分小数位数为数,数字部分小数位数为6 6位位位位g, Gg, G选用选用选用选用%f%f或或或或%e%e格式中格式中格式

72、中格式中输出宽度较短输出宽度较短输出宽度较短输出宽度较短的一种格式,不输出无意义的的一种格式,不输出无意义的的一种格式,不输出无意义的的一种格式,不输出无意义的0 079printf()附加格式说明字符附加格式说明字符字符字符说说 明明字母字母l l用于长整型整数,可加在格式符用于长整型整数,可加在格式符用于长整型整数,可加在格式符用于长整型整数,可加在格式符d d、o o、x x、u u前前前前面面面面mm(代表一个正(代表一个正整数)整数)数据最小宽度数据最小宽度数据最小宽度数据最小宽度.n.n(代表一个正(代表一个正整数)整数)对实数,表示输出对实数,表示输出对实数,表示输出对实数,表示

73、输出n n位小数;对字符串,表示截位小数;对字符串,表示截位小数;对字符串,表示截位小数;对字符串,表示截取的字符个数取的字符个数取的字符个数取的字符个数- -输出的数字或字符在域内向左靠输出的数字或字符在域内向左靠输出的数字或字符在域内向左靠输出的数字或字符在域内向左靠例如:%ld 输出十进制长整型数 %m.nf 右对齐,m位域宽,n位小数或n个字符 %-m.nf 左对齐 80例例1.1. main()main() int x1=123; int x1=123; long x2=123456; long x2=123456; printf(x1=%d,x1=%5d,x1=%-5d,x1=%2

74、dn, x1,x1,x1,x1); printf(x1=%d,x1=%5d,x1=%-5d,x1=%2dn, x1,x1,x1,x1); printf(x2=%ld,x2=%8ld,x2=%5ldn,x2,x2,x2); printf(x2=%ld,x2=%8ld,x2=%5ldn,x2,x2,x2); 程序运行结果如下:程序运行结果如下:x1=123,x1=123,x1=123,x1=123x1=123,x1=123,x1=123,x1=123x2=123456,x2=123456,x2=123456x2=123456,x2=123456,x2=12345681例2.main( ) int

75、m=-1; long n=123456789; printf(“m= %d, %o, %x, %un,m,m,m,m); printf(n=%dn,n); printf(n=%ldn,n);程序输出:程序输出:程序输出:程序输出:1122a=11, b=22m= -1, 177777, ffff, 65535n=-13035n=12345678982例3.main( )main( ) float f=123.456; float f=123.456; double d1,d2; double d1,d2; d1=1111111111111.111111111; d1=1111111111111

76、.111111111; d2=2222222222222.222222222; d2=2222222222222.222222222; printf(%f,%12f,%12.2f,%-printf(%f,%12f,%12.2f,%-12.2f,%.2fn,f,f,f,f,f);12.2f,%.2fn,f,f,f,f,f); printf(d1+d2=%fn,d1+d2); printf(d1+d2=%fn,d1+d2); 程序运行结果如下:程序运行结果如下:123.456001,123.456001,123.46,123.46123.456001,123.456001,123.46,123.4

77、6,123.46,123.46d1+d2=3333333333333.333010d1+d2=3333333333333.333010 对于实数,也可使用格式符对于实数,也可使用格式符% %e e,以标准指数以标准指数形式输出:尾数中的整数部分占一位,小数点占形式输出:尾数中的整数部分占一位,小数点占一位,尾数中的小数部分占一位,尾数中的小数部分占5 5位;指数部分占位;指数部分占4 4位位(如(如e-03e-03),),共计共计1111位。位。 也可使用格式符也可使用格式符% %g g,让系统根据数值的大小,让系统根据数值的大小,自动选择自动选择% %f f或或% %e e格式、且不输出无意

78、义的零。格式、且不输出无意义的零。83最简单的最简单的C程序设计程序设计 数据输出数据输出在使用在使用printf()函数时要注意:函数时要注意:1. 有些系统要求格式字符必须用小写字母;有些系统要求格式字符必须用小写字母;2. 格式控制符中,可包含转义字符;格式控制符中,可包含转义字符;3. 格式说明必须以格式说明必须以“ % ”开头;开头;4. 欲输出字符欲输出字符 % 则应在则应在“格式控制格式控制”字符串中用字符串中用连续两个连续两个 % 表示。表示。5.5. 不同的系统在实现格式输出时,输出结果可不同的系统在实现格式输出时,输出结果可能会有一些小的差别。能会有一些小的差别。842.格

79、式输入函数格式输入函数scanf()把从输入设备输入的数值按先后顺序存入在内存的把从输入设备输入的数值按先后顺序存入在内存的地址中去。地址中去。u 一般格式一般格式: scanf(格式控制,地址列表格式控制,地址列表) 例例 main()main() int a,b,c; int a,b,c; scanf(“%d%d%d”,&a,&b,&c); scanf(“%d%d%d”,&a,&b,&c); printf(“%d,%d,%d”,a ,b ,c); printf(“%d,%d,%d”,a ,b ,c); 3 4 53 4 53 3,4 4,5 5 85最简单的最简单的C程序设计程序设计 数据

80、输入数据输入scanf()格式字符格式字符格式字格式字符符说说 明明d, id, i用来输入十进制整数用来输入十进制整数用来输入十进制整数用来输入十进制整数o o用来输入用来输入用来输入用来输入8 8进制整数进制整数进制整数进制整数x, Xx, X用来输入用来输入用来输入用来输入1616进制整数进制整数进制整数进制整数c c用来输入单个字符用来输入单个字符用来输入单个字符用来输入单个字符s s用来输入字符串,将字符串送到一个字符数组用来输入字符串,将字符串送到一个字符数组用来输入字符串,将字符串送到一个字符数组用来输入字符串,将字符串送到一个字符数组中,在输入时以非空白字符开始,以第一个空中,

81、在输入时以非空白字符开始,以第一个空中,在输入时以非空白字符开始,以第一个空中,在输入时以非空白字符开始,以第一个空白字符结束。字符串以串结束标志白字符结束。字符串以串结束标志白字符结束。字符串以串结束标志白字符结束。字符串以串结束标志 0 0 作为其作为其作为其作为其最后一个字符。最后一个字符。最后一个字符。最后一个字符。f f用来输入实数,可以用小数形式或指数形式输用来输入实数,可以用小数形式或指数形式输用来输入实数,可以用小数形式或指数形式输用来输入实数,可以用小数形式或指数形式输入入入入e, E, g, e, E, g, GG与与与与 f f 作用相同,作用相同,作用相同,作用相同,e

82、 e 和和和和 f f、g g 可以互相替换可以互相替换可以互相替换可以互相替换86最简单的最简单的C程序设计程序设计 数据输入数据输入scanf()附加格式说明字符附加格式说明字符字符说 明字母l用于输入长整型数据(可用%ld、%lo、%lx),以及double型数据(用%lf或%le)字母h用于输入短整型数据(可用%hd、%ho、%hx)域宽(为一正整数)指定输入数据所占宽度(列数)*表示本输入项在读入后不赋给相应的变量87在使用在使用scanf()函数时要注意:函数时要注意:uScanf()函数中的函数中的“格式控制格式控制”后面应当是变量后面应当是变量地址;地址;u如果在如果在“格式控

83、制格式控制”字符串中除了格式说明以字符串中除了格式说明以外还有其他字符,则在输入数据时应输入与这外还有其他字符,则在输入数据时应输入与这些字符相同的字符;些字符相同的字符;u在用在用“%c”格式输入字符时,格式输入字符时,空格字符和空格字符和“转转义字符义字符”都作为有效字符输入;都作为有效字符输入; u在输入数据时,遇到以下情况时该数据认为结在输入数据时,遇到以下情况时该数据认为结束:束: 遇空格,或按回车;遇空格,或按回车; 遇指定的宽度结束,如遇指定的宽度结束,如“3d”,只取只取3列;列; 遇非法输入遇非法输入88 例例 输入三角形的边长,求三角形的面积。输入三角形的边长,求三角形的面

84、积。 area = s*(s-a)*(s-b)*(s-c) area = s*(s-a)*(s-b)*(s-c) s = (a+b+c)/ 2 s = (a+b+c)/ 2#include stdio.h#include stdio.h#include math.h#include math.hmain()main() float a,b,c,s,area; float a,b,c,s,area; scanf(%f,%f,%f, &a, &b, &c); scanf(%f,%f,%f, &a, &b, &c); s = 1.0/2 * (a+b+c); s = 1.0/2 * (a+b+c);

85、 area = sqrt(s*(s-a)*(s-b)*(s-c); area = sqrt(s*(s-a)*(s-b)*(s-c); printf(a=%7.2f,b=%7.2f,c=%7.2f,s=%7.2fn, a,c,b,s); printf(a=%7.2f,b=%7.2f,c=%7.2f,s=%7.2fn, a,c,b,s); printf(area=%7.2fn,area); printf(area=%7.2fn,area); 3,4,6 a= 3.00, b= 4.00, c= 6.00, s= 6.50 area= 5.334.6 顺序结构程序设计举例顺序结构程序设计举例89第五

86、章第五章选择结构程序构程序设计关系运算符和关系表达式逻辑运算符和逻辑表达式If语句三种形式条件运算符Switch语句905.1 关系运算符和关系表达式1.关系运算符关系运算符u关系运算实际上是两个量的比较,比较的结果只有两种可能:关系运算实际上是两个量的比较,比较的结果只有两种可能:真真(1)、假、假(0)。 例如:例如: a 3 ? 当当a=5时,比较的结果为真;时,比较的结果为真; 当当a=1时,结果为假。时,结果为假。uC语言提供语言提供6种关系运算符种关系运算符 (小于小于) (大于大于) = (大于或等于大于或等于) = 相等相等 != 不等不等 912.关系表达式关系表达式u用关系

87、运算符或者等式运算符将两个表达式连接起来,叫关系表达式。用关系运算符或者等式运算符将两个表达式连接起来,叫关系表达式。u合法的关系表达式:合法的关系表达式: ab、 a+bb+c、 (a=3)(b=5)、 (a=3)(b=5)、 ab)(b=0的值为真(在计算机中记为的值为真(在计算机中记为1)。)。 u例:例:a=3, b=2, c=1, 则则: (1)ab的值为的值为1(2)(ab)=c的值为真(即的值为真(即1)(3)b+cb中中d的值为的值为ab的值,为。的值,为。(5)f=abc中中f的值为的值为c的值,为。的值,为。92关系、等式和逻辑运算符关系、等式和逻辑运算符关于优先次序关于优

88、先次序u,=为同一级别,为同一级别, =和和!=为同一级别。为同一级别。u在同一级别中,采取由左至右的结合方向。在同一级别中,采取由左至右的结合方向。u 算术运算符算术运算符关系运算符关系运算符赋值运算符赋值运算符高高低低 例例 ca+b c(a+b)ca+b c(a+b)ab!=c (ab)!=cab!=c (ab)!=ca=bc a = = (bc)a=bc a = = (bc a = (bc)a=bc a = (bc) 等式运算符等式运算符935.2 逻辑运算符逻辑运算符u逻辑运算:产生真假值的运算。逻辑运算:产生真假值的运算。u逻辑运算符:逻辑运算符: &逻辑与逻辑与(AND) | 逻

89、辑或逻辑或(OR) ! 逻辑非逻辑非(NOT)u“&”和和“|”是双目运算符。是双目运算符。 u“!”是一元运算符是一元运算符. 如:如: a & b a,b同时为真,则表达式为真同时为真,则表达式为真 a | b a,b只要有一个为真,表达式为真只要有一个为真,表达式为真 !a a为真,则表达式为假为真,则表达式为假a ab b!a!a!b!ba&ba&ba|ba|bT TT TF FF FT TT TT TF FF FT TF FT TF FT TT TF FF FT TF FF FT TT TF FF F94关系、等式和逻辑运算符关系、等式和逻辑运算符逻辑运算符的优先级逻辑运算符的优先级

90、u! & | 逻辑运算符逻辑运算符 “&” 和和 “|” 低于关系运算符,低于关系运算符,“!”高于算术运算符高于算术运算符 ab & xy 相当于相当于: (ab) & (xy) a=b|x=y 相当于相当于: (a=b) | (x=y) !a | ab 相当于相当于: (!a ) | (ab)! ! 算术算术 关系关系 逻辑逻辑 赋值赋值95逻辑表达式逻辑表达式u用逻辑运算符将关系表达式或逻辑量连接起来就是逻辑表达式。用逻辑运算符将关系表达式或逻辑量连接起来就是逻辑表达式。u在在C语言中,当判断一个量的真假时,一切非数均被当成语言中,当判断一个量的真假时,一切非数均被当成真真来处理。来处理

91、。 例如:若例如:若a=4, 则则!a的值为的值为 若若a=4, b=5, 则则a & b的值为的值为 a | b的值为的值为 !a | b的值为的值为 4 & 0|2 的值为的值为u区分下面的表达式中算术运算量,关系运算量和逻辑运算量:区分下面的表达式中算术运算量,关系运算量和逻辑运算量: 53 & 2| 83是两个数值间的比较,结果为是两个数值间的比较,结果为 1& 2是两个非值(逻辑量)间的运算,结果为是两个非值(逻辑量)间的运算,结果为 1|84-!0,根据优先级根据优先级,先计算先计算!,结果为,结果为96 例例 判断某一年是否是闰年。条件是:判断某一年是否是闰年。条件是: 能被能被

92、4 4整除,但不能被整除,但不能被100100整除;整除; 能被能被4 4整除,又能被整除,又能被400400整除。整除。 用用yearyear表示年份,判断闰年的逻辑表达式为:表示年份,判断闰年的逻辑表达式为: (year%4=0 & year%100!=0)|(year % 400=0) 如果给如果给yearyear输入一个值,使上面的表达式的值为时,则输入一个值,使上面的表达式的值为时,则yearyear所代所代表的年份就是闰年。表的年份就是闰年。 变换一下角度,如何判断变换一下角度,如何判断yearyear不是闰年?不是闰年? !( (year%4=0 & year%100!=0)|(

93、year % 400=0) )当当yearyear的值使表达式的值为时,则的值使表达式的值为时,则yearyear所代表的就不是闰年。所代表的就不是闰年。关系、等式和逻辑运算符关系、等式和逻辑运算符975.3 if 语句语句if 语句的三种形式语句的三种形式uif用来判断给定的条件的真假,并决定执行哪一种操作。用来判断给定的条件的真假,并决定执行哪一种操作。1. if 语句语句条件满足时执行表达式后面的语句,然后继续执行以下的条件满足时执行表达式后面的语句,然后继续执行以下的语句。条件不满足时,越过语句。条件不满足时,越过if表达式后面的语句,往下执表达式后面的语句,往下执行。行。表达式语句真

94、(非0)假(0)例如:如果输入的是正数,例如:如果输入的是正数,则打印出来。则打印出来。if (x0) printf(%d,x);98选择结构程序设计选择结构程序设计 ifif语句语句if 语句的三种形式语句的三种形式2. if 语句语句1 else 语句语句2条件满足时,执行语句条件满足时,执行语句1,然后继续执行,然后继续执行if以下的语句。以下的语句。条件不满足时,执行语句条件不满足时,执行语句2,然后继续执行,然后继续执行if以下的语句。以下的语句。表达式语句1语句2真假PYNAB例如:输出两个数中较大的一个。例如:输出两个数中较大的一个。if (xy) printf(%d,x) ;e

95、lse printf(%d,y);99选择结构程序设计选择结构程序设计 ifif语句语句if 语句的语句的 第三种形式第三种形式if 语句语句1; else if 语句语句2; else if 语句语句3; else if 语句语句4; else 语句语句5 表达式1表达式2表达式3表达式4语句1语句2语句3语句4语句5 假假假假真真真真100选择结构程序设计选择结构程序设计 ifif语句语句例如:商场促销,购物例如:商场促销,购物500元以上,元以上,8折折;购物购物300元以上,元以上,85折折;购物购物100元以上,元以上,9折折;购物购物50元以上,元以上,95折折;购物购物50元以元

96、以下,不打折。根据消费量,计算优惠率。下,不打折。根据消费量,计算优惠率。 设:消费量为设:消费量为 money; 折扣为折扣为 cost; 实际花费实际花费 priceif (money500) cost=0.2; else if (money300) cost=0.15; else if (money100) cost=0.1; else if (money50) cost=0.05; else cost=0;price=money-(money*cost);101选择结构程序设计选择结构程序设计 ifif语句语句If 语句的嵌套语句的嵌套u嵌套的定义:在嵌套的定义:在if 语句中又包含一

97、个或多个语句中又包含一个或多个if 语句。语句。u嵌套的一般形式:嵌套的一般形式:If ( ) if ( ) 语句1 else 语句2Else if ( ) 语句3 else 语句4(注意!(注意! If 与与else的配对关系。)的配对关系。)102 例例 比较两个整数的关系。比较两个整数的关系。#include main( ) int x, y; printf (Enter integer X and Y:); scanf (%d%d, &x, &y); if ( x != y ) if ( x y ) printf (XYn); else printf (Xb) t=a; a=b; b=

98、t; printf(%5.2f,%5.2f,a,b); 输入为输入为 3.6, -3.23.6, -3.2输出为输出为 -3.20, 3.60-3.20, 3.60104例例 输入三个数,按由小到大次序排列并输出。输入三个数,按由小到大次序排列并输出。 main() flaot a,b,c,t; scanf(%f,%f,%f, &a,&b,&c); if (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);输入为:输入为: 3,7,13,7,1输出为:输出为: 1

99、.00, 3.00, 7.001.00, 3.00, 7.00105选择结构程序设计选择结构程序设计 程序举例程序举例例例 写一程序判断某一年是否是闰年写一程序判断某一年是否是闰年. main() int year,leap; printf(输入年份:输入年份:); scanf(%d,&year); if (year%4=0& year%100!=0)|(year % 400=0) leap=1; else leap=0; if (leap) printf(%d is leap yearn,year); else printf(%d is not leap yearn,year); 输入年份:

100、输入年份:200420042004 is leap year2004 is leap year 106选择结构程序设计选择结构程序设计 ifif语句语句条件运算符条件运算符umax=(ab)?a:b; 条件表达式条件表达式 当当(ab)为真时,表达式取为真时,表达式取a的值的值 当当(ab)为假时,表达式取为假时,表达式取b的值的值u条件运算符是三目运算符条件运算符是三目运算符 表达式表达式1 ? 表达式表达式2 : 表达式表达式 3u条件运算符的结合方向为条件运算符的结合方向为从右向左从右向左 例如:例如: ab?a:cd?c:d 相当于相当于 ab?a:(cd?c:d) 如果如果a=1,b

101、=2,c=3,d=4,则条件表达式的值为,则条件表达式的值为4。107选择结构程序设计选择结构程序设计 ifif语句语句main() int x, y; scarf(%d, &x); if (x=0) y=0; else if (x0) y=1; else y=-1; print(x=%d, y=%dn, x, y);例例 -1 (x0)开始输出Y结束输入XX = A & c= Z)? (c+32):c; printf(%c,c)选择结构程序设计选择结构程序设计 ifif语句语句1095.4 switch语句语句Switch语句是多分支选择语句,也叫开关语句或者选择语句。语句是多分支选择语句,

102、也叫开关语句或者选择语句。一般形式:一般形式: switch (表达式表达式) case常量表达式常量表达式1: 语句语句1; case常量表达式常量表达式2: 语句语句2; case常量表达式常量表达式n: 语句语句n; default: 语句语句n+1; 功能:功能:1.计算表达式的值,与常量表达式的值比较,等于第计算表达式的值,与常量表达式的值比较,等于第i个值时,顺个值时,顺 序执行语句序列序执行语句序列i、i+1、 、 n+1 2.若与所有常量表达式值都不相等,执行语句序列若与所有常量表达式值都不相等,执行语句序列n+1。 如:如:switch (a) case 5: printf(

103、&); break; case 2: printf(#); break; default:printf($); break; 如:如:switch (a) case 5: printf(&); case 2: printf(#); default:printf($); 110选择结构程序设计选择结构程序设计 switchswitch语句语句例例 根据成绩等级打出成绩范围根据成绩等级打出成绩范围. main() char grade; printf(Enter your graden); scanf(%c,&grade); switch(grade); case A: printf(85100n

104、); break; case B: printf(7084n); break; case C: printf(6069n); break; case D: printf(60n); break; default: printf(errorn); 输入为输入为 B B输出为输出为 707084 84 111选择结构程序设计选择结构程序设计 switchswitch语句语句gradegrade流程图如下:流程图如下:AABBCCDDdefaultdefault输出输出8585100100输出输出70708484输出输出60606969输出输出errorerror输出输出6060112例:给出百分制

105、成绩,要求输出等级例:给出百分制成绩,要求输出等级 A,B,C,D,E。 90分以分以上为上为A, 8089分为分为B,7079分为分为C,6069分为分为D,60分以下分以下为为E。 main() int score,num; char grade; scanf(%d,&score); num=score/10; switch(num) case 10: grade=A; break; case 9 : grade=A; break; case 8 : grade=B: break; case 7 : grade=C; break; case 6 : grade=D; break; defa

106、ult : grade=E; printf(%d %c,score,grade);输入为输入为 7676输出为输出为 76 76 C C 113选择结构程序设计选择结构程序设计 switchswitch语句语句switch语句的说明语句的说明1.条件表达式的类型和常量表达式的类型是条件表达式的类型和常量表达式的类型是整数整数、字符字符。2.当表达式的值与某一个当表达式的值与某一个 case 后面的常量表达式的值相等时后面的常量表达式的值相等时,就执行此就执行此 case 后面的语句,若所有的后面的语句,若所有的 case 中的常量表达式的值都没有与表达式中的常量表达式的值都没有与表达式的值匹配

107、,则执行的值匹配,则执行 default 后面的语句。后面的语句。3.每一个每一个 case 的常量表达式的值必须互不相同。的常量表达式的值必须互不相同。4.case常量表达式只起语句标号作用常量表达式只起语句标号作用;必须用必须用break语句终止多个语句终止多个case连续连续执行,否则只要有一个执行,否则只要有一个case满足后,以下的语句全部无条件执行。满足后,以下的语句全部无条件执行。5.多个多个case可共用一组执行语句。可共用一组执行语句。1141 1 概述概述2 goto2 goto语句语句3 while3 while语句语句 4 do-while4 do-while语句语句5

108、 for5 for语句语句6 6 循环的嵌套循环的嵌套7 7 breakbreak语句和语句和continuecontinue语句语句8 8 程序举例程序举例 循环控制循环控制 1156.1 概述概述u一般需要使用循环的情况是一般需要使用循环的情况是: 有重复的动作有重复的动作(循环体循环体) 循环次数可以控制循环次数可以控制(循环条件循环条件) 例如:例如: 1+2+3+.+100u 在在C语言中可以用下列语句实现循环:语言中可以用下列语句实现循环: goto 和和 if 结合结合 while do-while for1166.2 goto 语句语句uGoto语句的一般形式:语句的一般形式:

109、 goto 语句标号语句标号; ; 语句标号语句标号: :语句;语句; u功能:功能:无条件转向无条件转向语句。语句。uGoto 语句的常用形式:语句的常用形式: 1. 与与 if 语句构成循环语句构成循环; 2. 从循环体中转到循环体外。从循环体中转到循环体外。例:求例:求1+2+3+100。main()int i,sum=0; i=1; loop:if(i=100) sum=sum+i; i+; goto loop; printf(“%dn”,sum);1176.3 while语句语句u一般形式:一般形式: While ( (表达式表达式) ) 语句语句u功能:实现功能:实现“当型当型循环

110、,循环,先判断,后执行先判断,后执行。表达式为真时。表达式为真时(非非0值值),执行,执行while语句的内嵌语句。语句的内嵌语句。u说明:说明: 可以是关系表达式、可以是关系表达式、逻辑表达式或其它类型,表达逻辑表达式或其它类型,表达式后不允许有分号结尾式后不允许有分号结尾; 语句可以是简单的,也可以是复语句可以是简单的,也可以是复合的合的; 循环体中应有使循环趋向于结束循环体中应有使循环趋向于结束的语句。的语句。表达式语句0非 0118 例例 求求1+2+3+.+100 。 main() int i=1,sum=0; while (i=100) sum=sum+i; /累加器累加器 i+;

111、 printf(%d,sum);i=1i=1,sum=0 sum=0 i=100 i=100 sum=sum+i sum=sum+i i=i+1 i=i+1 输出输出 sum sum 如果有一个以上的语句循环,则必须用如果有一个以上的语句循环,则必须用 构成复合语句。构成复合语句。要有修改循环变量的语句。要有修改循环变量的语句。119 6.4 do-whiledo-while语句语句u一般形式:一般形式:do 循环语句循环语句while( (表达式表达式) ); ;u功能:功能: 实现实现“当型当型循环结构。循环结构。u说明:说明: 当当 while 后面的表达式的第一次的值为后面的表达式的第

112、一次的值为真真时,两种时,两种循环得到的结果相同。否则,二者结果不相同。循环得到的结果相同。否则,二者结果不相同。 do while 中的循环体至少执行一次,而中的循环体至少执行一次,而 while 语句中语句中的循环语句可能一次都不执行。的循环语句可能一次都不执行。表达式语句非 0(真)0 (假)120例例 求求1+2+3+.+100 。 main() int i,sum=0; i=1; do sum=sum+i; i+; while (i100 i100 sum=sum+i sum=sum+i i+ i+ 输出输出 sum sum 1216.5 for 语句语句在在C语言中用语言中用 fo

113、r 语句构成的循环最为灵活。语句构成的循环最为灵活。u一般形式:一般形式:for(表达式表达式1 1; ;表达式表达式2 2; ;表达式表达式3 3)语句)语句u执行过程:执行过程: u例:例:for (i=1;i=100;i+) sum=sum+i;从图中可以看出从图中可以看出FOR语句等价于语句等价于下列程序:下列程序:表达式表达式1;While (表达式表达式2)语句语句 表达式表达式3;求解表达式1表达式2语句求解表达式3For语句的下一语句假真122u说明:说明: 语句的一般形式中的语句的一般形式中的表达式表达式1可以省略,此时应在语句之前给循可以省略,此时应在语句之前给循环变量赋初

114、值(注意!省略表达式环变量赋初值(注意!省略表达式1时,其后的分号不能省略)时,其后的分号不能省略); 如:如:for (; i=100;i+) sum=sum+i; 如果表达式如果表达式2省略,即不判断循环条件,循环无终止地进行下去省略,即不判断循环条件,循环无终止地进行下去; 如:如:for (i=1; ; i+) sum=sum+1; 表达式表达式3也可以省略,但此时应另外设法保证循环能正常结束也可以省略,但此时应另外设法保证循环能正常结束; 如:如:for (i=1;i=100; ) sum=sum+i; i+ 可以省略表达式可以省略表达式1和表达式和表达式3,只有表达式,只有表达式2

115、,即只给循环条件,即只给循环条件; 如:如:for ( ;ib & xy ;)如:如:for (; (c=getchar( ) != n;) printf(%c,c);u由以上说明可以看出,由以上说明可以看出,C语言中语言中 for 语句的功能比其它语言语句的功能比其它语言中的中的 for 语句功能要强、要灵活,它能替代语句功能要强、要灵活,它能替代 while 语句。语句。124例例求求n!=1 2 3 nmain() double s=1; int k; for(k=1;k=100;k+) s=s*k; printf( s=%f ,s); 整数连乘结果一定是整数,而本例中结果数值相当大,用

116、整数连乘结果一定是整数,而本例中结果数值相当大,用long型型都无法存放,因此将存放累乘结果的变量都无法存放,因此将存放累乘结果的变量s定义为定义为double型。型。 125 6.6 循环的嵌套循环的嵌套u嵌套的概念:一个循环体内又包含另一个完整的循环结构,称为循嵌套的概念:一个循环体内又包含另一个完整的循环结构,称为循环的嵌套。环的嵌套。 while( ) while( ) (2) for( ; ; ) for ( ; ; ) (3) for( ; ; ) while( ) 126ubreak语句语句 用来从循环体里退出,中止循环用来从循环体里退出,中止循环uContinue语句语句 用来

117、跳过剩下的语句,回到循环开始用来跳过剩下的语句,回到循环开始表达式1表达式2循环的下一个语句语句语句breaknyyn表达式1表达式2循环的下一个语句语句语句continuenyyn6.7 break6.7 break语句和语句和continuecontinue语句语句127 例例 把把100200之间不能被之间不能被3整除的数输出。整除的数输出。 main() int n; for (n=100; n=200; n+) if (n%3=0) continue; printf(%d,n); 128 例例 判断判断m是否是素数。是否是素数。操作:用操作:用2m-1依次去除依次去除m, 若其中有任

118、意一个数被除尽若其中有任意一个数被除尽,则没有必要再则没有必要再判断下去,它肯定不是素数,跳出循环判断下去,它肯定不是素数,跳出循环;若所有数都不能被除尽,则循若所有数都不能被除尽,则循环可以自然完成。环可以自然完成。#include math.hmain()int m, i, k; scanf(%d,&m); k=m-1; for (i=2;ik+1) printf(%d is prime numbern,m); else printf(%d is not a primen,m);或一个数或一个数x在在2,sqrt(x)范围内没有因子,我们就称其为素数(质数)。范围内没有因子,我们就称其为素

119、数(质数)。k=sqrt(m);129 例例 打印出打印出100100到到200200之间所有的素数。之间所有的素数。 #include math.hmain() int m, i, k,n=0; for (m=101;m=200;m=m+2) k=sqrt(m); for (i=2;ik) printf(%d n,m); n=n+1; if(n%10=0) printf(“n”); printf(“n”);130 例例 用用 /4 1-1/3+1/5-1/7+的公式求的公式求 的近似值,直到最后一项的绝的近似值,直到最后一项的绝对值小于对值小于10-6为止。为止。 #include math

120、.hmain() int s; float n, t, pi; t=1; pi=0; n=1.0; s=1; while (fabs(t)=1e-6) pi=pi+t; n=n+2; s=-s; t=s/n; pi=pi*4; printf(pi=%10.6fn,pi);t=1,pi=0,n=1,s=1当当| t | 10-6pi=pi+tn=n+2s=-s;t=s/npi=pi*4输出输出pi131例例 裴波那契数列的第裴波那契数列的第1、2项分别为项分别为1、1,从第,从第3个数开个数开始,该数是其前面两项之和。即始,该数是其前面两项之和。即1,1,2,3,5,8,13,求前求前40项项菲

121、波那契数。菲波那契数。 分析:分析:f1-第一个数第一个数 f2-第二个数第二个数 f1=f1+f2 第三个数第三个数 f2=f2+f1 第四个数第四个数main() long f1=1, f2=1; int i; for(k=3;k=20;k+) printf( %12ld%12ld, f1,f2); if(k%2=0) printf( n ); f1=f1+f2; f2=f2+f1; 132 循环控制循环控制 本本章总结章总结u三种循环语句:三种循环语句:while, do-while 和和 foru建立循环通常有以下情况建立循环通常有以下情况:1. 给定次数给定次数, for比较适用比较

122、适用 for(i=1;i100;i+)2. 给定条件给定条件, while比较适用比较适用 while(x+y)a &c A& cZ)133【例】编程序,输出以下图形。【例】编程序,输出以下图形。【例】编程序,输出以下图形。【例】编程序,输出以下图形。 * * * *一共有一共有一共有一共有4 4 行,每行由空格和星号组成:空格数行,每行由空格和星号组成:空格数行,每行由空格和星号组成:空格数行,每行由空格和星号组成:空格数按行增加,星号按行减少按行增加,星号按行减少按行增加,星号按行减少按行增加,星号按行减少变量变量变量变量 i i 控制输出行数,控制输出行数,控制输出行数,控制输出行数,

123、从从从从1 1变化到变化到变化到变化到4 4变量变量变量变量 j j 控制输出每行的空格和星号:控制输出每行的空格和星号:控制输出每行的空格和星号:控制输出每行的空格和星号:j j 从从从从1 1变化到变化到变化到变化到 i i,每次输出一个空格每次输出一个空格每次输出一个空格每次输出一个空格 j j 从从从从1 1变化到变化到变化到变化到 8-28-2* *i i1 1,每次输出一个星号每次输出一个星号每次输出一个星号每次输出一个星号思路:思路:思路:思路:134算法和程序:算法和程序:main( )main( ) int i,j; int i,j; for (i=1; i=4; i+)fo

124、r (i=1; i=4; i+) for (j=1; j=i; j+) for (j=1; j=i; j+) printf( ); printf( ); for (j=1;j=8-(2*i-1);j+) for (j=1;j=8-(2*i-1);j+) printf( printf(* *);); printf(n); printf(n); for (i=1; i=4; i+) for (j=1; j=i; j+) 输出一个空格输出一个空格 for (j=1; j=8- -(2*i- -1); j+) 输出一个星号输出一个星号 换行换行思考:思考:思考:思考:l l如何输出如何输出如何输出如何

125、输出1010行行行行图形?图形?图形?图形? l l输出图形向右输出图形向右输出图形向右输出图形向右平移平移平移平移2020个字符个字符个字符个字符位置,应如何修改程序?位置,应如何修改程序?位置,应如何修改程序?位置,应如何修改程序? 135总结总结l lfor(; )l lwhile( ) l ldo while( )l lcontinuel lbreakl lgoto136 例例 打印图形打印图形。 分析分析: : 行的控制行的控制 i:1i:14 4*的个数与当前行的关系的个数与当前行的关系j=2*i-1j=2*i-1*前面的空格前面的空格k k与行的关系与行的关系: :开始时开始时,

126、 ,第一行有第一行有3 3个空格个空格每多一行每多一行, ,少一个空格少一个空格k=4-ik=4-i while (i=4) while (i=4) for (k=1,k=4-i,k+) for (k=1,k=4-i,k+) 输出空格输出空格; ; for (j=1,j=2*i-1 ,k+)for (j=1,j=2*i-1 ,k+) 输出输出* *; *main() int i,j,k; for(i=1;i=4;i+) for(j=1;j=4-i;j+) printf( ); for(j=1;j=2*i-1;j+) printf(*); printf(n); for(i=1;i=3;i+) f

127、or(j=1;j=i;j+) printf( ); for(j=1;jEA-E, W-AW-A,非字母字符忽略。非字母字符忽略。 思路思路:1.建立循环建立循环, 循环结束以输入回车循环结束以输入回车符为准符为准 ; while (c=getchar()!=n)2.判判断断输输入入是是否否是是字字符符,否否则则忽忽略略; if (c=a & c=A & cZ & cz) c=c-26#include stdio.hmain() char c; while (c=getchar()!=n) if (c=a & c=A & cZ & cz) c=c-26; printf(%c,c); abdEgW

128、abdEgWefhIkAefhIkA1386.1 6.1 一维数组的定义和引用一维数组的定义和引用6.2 6.2 二维数组的定义和引用二维数组的定义和引用6.3 6.3 字符数组字符数组 第七章数组第七章数组139 在在c语言中语言中,除了前面介绍的基本类型之外除了前面介绍的基本类型之外,还有另外一些数还有另外一些数据类型据类型-构造类型。其中数组就属于构造类型中的一种。构造类型。其中数组就属于构造类型中的一种。 数组是有序数据的集合。数组中的每一个元素都属于同一数组是有序数据的集合。数组中的每一个元素都属于同一个数据类型。用一个统一的数组名和下标来唯一的确定数组中的个数据类型。用一个统一的数

129、组名和下标来唯一的确定数组中的元素。元素。7.17.1一维数组的定义和引用一维数组的定义和引用一维数组的定义和引用一维数组的定义和引用一、定义一、定义一、定义一、定义u一般形式:一般形式:类型说明符类型说明符 数组名数组名 常量表达式常量表达式 ; ; 例如:例如: int a10;a0 a1 a2 a3 a4 a5 a6 a7 a8 a9a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 1 20 4 60 9 3 98 0 11 501 20 4 60 9 3 98 0 11 50140二、一维数组元素的引用二、一维数组元素的引用二、一维数组元素的引用二、一维数组元素的引用u数组元

130、素的引用形式:数组元素的引用形式: 数组名数组名 下标下标 u每次可引用一个数组元素,不能引用整个数组每次可引用一个数组元素,不能引用整个数组u一个数组元素就如同一个简单变量一个数组元素就如同一个简单变量例例main() int i, a10; for (i=0;i=0;i-) printf(%d,ai); 9 8 7 6 5 4 3 2 1 09 8 7 6 5 4 3 2 1 0141 数组数组 一维数组的定义和一维数组的定义和引用引用一维数组的初始化一维数组的初始化一维数组的初始化一维数组的初始化u初始化方法:从数组的第一个元素开始依次给出初始值表初始化方法:从数组的第一个元素开始依次给

131、出初始值表;表表中各值之间用逗号分开,并用一对大括号括起来。中各值之间用逗号分开,并用一对大括号括起来。 在定义数组时对数组元素赋予初值在定义数组时对数组元素赋予初值 int a10=0,1,2,3,4,5,6,7,8,9; 只给一部分元素赋初值只给一部分元素赋初值 int a10=0,1,2,3,4; 欲使一个数组中全部元素初值为欲使一个数组中全部元素初值为0,可以写成,可以写成 int a10 = 0,0,0,0,0,0,0,0,0,0,;或或int a10=0; 在对全部数组元素赋初值时,可以不指定数组长度在对全部数组元素赋初值时,可以不指定数组长度 int a =0,1,2,3,4,5

132、;142 数组数组 一维数组的定义和一维数组的定义和引用引用例例 求求Fibonacci数列数列 1,1,2,3,5,8,13,21,.main() int f20 = 1,1; int i; for (i = 2; i 20; i+) fi=f i-2 + f i-1; for (i = 0;i 20;i+) if (i % 5 = 0) printf(n); printf(%12d,fi); 143 例例 用冒泡法对用冒泡法对1010个数排序。个数排序。第第1次次, a0和和a1比较比较9 8 5 4 2 0 6 1 3 7 8 9 5 4 2 0 6 1 3 7 8 5 9 4 2 0

133、6 1 3 7 8 5 4 9 2 0 6 1 3 7 8 5 4 2 9 0 6 1 3 7 8 5 4 2 0 9 6 1 3 7 8 5 4 2 0 6 9 1 3 7 8 5 4 2 0 6 1 9 3 7 8 5 4 2 0 6 1 3 9 7 8 5 4 2 0 6 1 3 7 9第第2次次, a1和和a2比较比较第第i次次, ai和和ai+1比较比较9 89 59 49 29 7for (i=0;i9;i+)for (j=0;jaj+1) t=aj; aj=aj+1; aj+1=t; 144main() int a11 int i, j,t; printf(“input 10 n

134、umber:n); for (i = 1; i 11; i+) scanf(“%d”,&ai); /从键盘给数组元素赋值从键盘给数组元素赋值 printf(“n”); for (j = 1; j =9; j+)/排序排序 for (i = 1; i ai+1) t = ai; ai = ai+1; ai+1 = t; for (i = 1;i 11;i+) /输出数组元素输出数组元素 printf(%3d,ai);145一、二维数组的定义一、二维数组的定义一、二维数组的定义一、二维数组的定义u一般形式:一般形式:类型说明符类型说明符 数组名数组名 常量表达式常量表达式常量表达式常量表达式 ;

135、; 例如:例如: float a34a00 a01 a02 a03a10 a11 a12 a13a20 a21 a22 a23u二维数组在内存中的存放形式:二维数组在内存中的存放形式:按行存放按行存放,即在内存中先存放第一行的元素,再存放第,即在内存中先存放第一行的元素,再存放第二行的元素。二行的元素。7.2 7.2 二维数组的定义和引用二维数组的定义和引用二维数组的定义和引用二维数组的定义和引用146多维数组的定义多维数组的定义多维数组的定义多维数组的定义u多维数组的定义与二维数组相同。多维数组的定义与二维数组相同。 例如:三维数组例如:三维数组 float a234 共有共有234=24个

136、元素个元素 float a100100100 共有共有1000000个元素个元素a010a000a999999147二、二维数组元素的引用二、二维数组元素的引用二、二维数组元素的引用二、二维数组元素的引用u二维数组元素的引用形式:二维数组元素的引用形式: 数组名数组名 下标下标下标下标 三、二维数组的初始化三、二维数组的初始化三、二维数组的初始化三、二维数组的初始化u初始化方法:初始化方法:分行给二维数组赋初值分行给二维数组赋初值 int a34 = 1,2,3,4, 5,6,7,8, 9,10,11,12 ; 可以将所有数据写在一个花括弧内可以将所有数据写在一个花括弧内,按数组排列的顺序对各

137、元素赋按数组排列的顺序对各元素赋初值初值 int a34 = 1,2,3,4,5,6,7,8,9,10,11,12;可以对部分元素赋初值,其余元素值自动为可以对部分元素赋初值,其余元素值自动为0 int a34 = 1, 5, 9 ; int a34 = 1, 0,6, 9,0,11 ; int a34 = 1, 5,6 ; int a34 = 1, , 9 ;148u初始化方法:初始化方法:如果对全部元素都赋初值,则定义数组时对第一维的长度可以不如果对全部元素都赋初值,则定义数组时对第一维的长度可以不指定,但第二维的长度不能省指定,但第二维的长度不能省int a 4 = 1,2,3,4,5,

138、6,7,8,9,10,11,12;int a 4 = 0,2,3, , 0,10 ;u在程序中为数组赋值的方法:在程序中为数组赋值的方法:用用scanf语句由用户输入语句由用户输入由循环变量自动构成由循环变量自动构成for (i=0;i=2;i+) for (j=0;j=3;j+) scanf(%d,&aij);for (i=0;i3;i+)for ( j=0;j4;j+) aij = 4*i+j+1; 1 2 3 4 5 6 7 8 9 10 11 12149 数组数组 二维数组的定义和二维数组的定义和引用引用 例例 将一个二维数组行和列元素互换将一个二维数组行和列元素互换, ,存到另一个数

139、组中。存到另一个数组中。a= 1 2 3 4 5 6 1 4b= 2 5 3 6 for (i=0;i3;i+) for (j=0;jmaxaijmaxy yn nmax=aijmax=aijrow=irow=icolumn=jcolumn=j输出输出 max, row,columnmax, row,columnfor i=0 to 2for i=0 to 2151main() main() int i,j,row,column,max; int i,j,row,column,max; int a34=1,2,3,4,9,8,7,6,-10,10,-5,2; int a34=1,2,3,4,9

140、,8,7,6,-10,10,-5,2; max=a00; max=a00; for (i=0;i3;i+) for (i=0;i3;i+) for(j=0;j4;j+) for(j=0;jmax) if (aijmax) max=aij; max=aij; row=i; row=i; column=j; column=j; printf(“max=%d,row=%d,colum=%dn, max, row, column); printf(“max=%d,row=%d,colum=%dn, max, row, column); 1527.3 7.3 字符数组字符数组字符数组字符数组 一、字符数

141、组的定义一、字符数组的定义一、字符数组的定义一、字符数组的定义字符数组字符数组:可以存放若干个可以存放若干个字符字符,也可以存放也可以存放字符串字符串。字符串字符串:字符串的末尾必须有:字符串的末尾必须有0字符,它的字符,它的ASCII码值为码值为0。字符数组定义:字符数组定义:char 数组名数组名 exp;exp; 如:如:char s10; s数组是一维字符数组,它可以存放数组是一维字符数组,它可以存放10个字符或一个长度不大于个字符或一个长度不大于9的字符串。的字符串。c c h h i i n n a a 0 0153二、字符数组的初始化二、字符数组的初始化二、字符数组的初始化二、字

142、符数组的初始化逐个元素初始化。逐个元素初始化。 例如:例如:char c10 = c, h, a, r ;2. 说明:说明:v如果初值个数如果初值个数数组长度,则作语法错误处理;数组长度,则作语法错误处理;v如果初值个数如果初值个数数组长度,则只将这些字符赋给数组中前面那些元素,其余数组长度,则只将这些字符赋给数组中前面那些元素,其余元素自动定为空字符(即元素自动定为空字符(即0););v如果初值个数如果初值个数=数组长度,则在定义时可省略数组长度。数组长度,则在定义时可省略数组长度。3. 用字符串来初始化字符数组用字符串来初始化字符数组 char a11 =”I am a boy” ; c

143、h a r 0 0 0 0 0 0c h a r 0 0 0 0 0 0154三、字符三、字符数组数组的引用的引用main() main() /*/*输出一个钻石图形的程序输出一个钻石图形的程序* */ / char diamond 5= , ,*, char diamond 5= , ,*, ,*, ,*, ,*, ,*, * , , , ,*, * , , , ,*, ,*, ,*, ,*, ,*, , ,*; , ,*; int i,j; int i,j; for (i=0;i5;i+) for (i=0;i5;i+) for (j=0;j5;j+) for (j=0;j5;j+) pr

144、intf(%c,diamondij); printf(%c,diamondij); printf(n); printf(n); 155四、字符数组的输入输出四、字符数组的输入输出四、字符数组的输入输出四、字符数组的输入输出用格式符用格式符%c逐个输入逐个输入/输出一个字符输出一个字符scanf(%c,&a0); printf(%c,a0);用格式符用格式符%S整个输入整个输入/输出字符串输出字符串char c10 ; scanf(“%s”,c); /注意此处用数组名注意此处用数组名printf(%s,c); /注意此处用数组名注意此处用数组名注意事项注意事项:u用用“%s”格式输入或输出字符数

145、组时,函数格式输入或输出字符数组时,函数scanf的地址项、函数的地址项、函数printf的输出的输出项都是字符数组名。这时数组名前不能再加项都是字符数组名。这时数组名前不能再加“&”符号,因为数组名就是数组符号,因为数组名就是数组的起始地址。的起始地址。u用语句用语句“scanf(%s,s);”为字符数组为字符数组s输入数据时,遇空格键或回车键时结输入数据时,遇空格键或回车键时结束输入。但所读入的字符串中不包含空格键或回车键,而是在字符串末尾添加束输入。但所读入的字符串中不包含空格键或回车键,而是在字符串末尾添加0。156u同时输入多个字符串,输入数据时以同时输入多个字符串,输入数据时以空格

146、或回车键空格或回车键为分隔符。为分隔符。char str15,str25,str35;scanf(%s%s%s,str1,str2,str3); 如果改为:如果改为: char str13; scanf(%s,str);how are you?h o w 0 strhow are you? h o w 0 str1a r e 0 str2y o u ? 0 str3157五、字符串处理函数五、字符串处理函数五、字符串处理函数五、字符串处理函数u函数是一个提供某种功能的程序段,可以通过名字调用,需要参数,函数是一个提供某种功能的程序段,可以通过名字调用,需要参数,返回结果。返回结果。1. put

147、s(str) 在显示器上输出在显示器上输出str数组中的字符串,输出后自动换行。数组中的字符串,输出后自动换行。 例如:例如:char str =ChinanBiejing; puts(str);2. gets(str) 从键盘读入一个字符串存入从键盘读入一个字符串存入str数组中,并且得到一个函数值,该函数数组中,并且得到一个函数值,该函数值是值是str数组的首地址。数组的首地址。 例如:例如: gets(str); 输入为输入为“How are you?” 则则str中存有整个字符串及中存有整个字符串及0。main( ) char c120,c220; gets(c1); gets(c2)

148、; puts(c1); puts(c2);ChinaBeijing程序运行情况如下:程序运行情况如下:How are you? Fine thank you. How are you?Fine thank you. 1583. strcat(字符数组字符数组1,字符数组字符数组2) 连接两个字符数组中的字符串,把字符串连接两个字符数组中的字符串,把字符串2接到字符串接到字符串1的后的后面,结果放在字符串字符串面,结果放在字符串字符串1中,函数调用后得到一个函数值中,函数调用后得到一个函数值字符数组字符数组1的地址。的地址。 例如:例如: char str130=Peoples Republic

149、 of ; str2 =China; printf(%s, strcat(str1,str2); 输出: Peoples Republic of China 字符数组字符数组1必须足够大,以便容纳连接后的新字符串。必须足够大,以便容纳连接后的新字符串。连接前两个字符串后面都有一个连接前两个字符串后面都有一个0,连接时将紧跟字,连接时将紧跟字符串符串1后面的后面的0取消,只在新串最后保留一个取消,只在新串最后保留一个0 。1594. strcpy(字符数组字符数组1,字符串,字符串2) 将字符串将字符串2拷贝到字符数组中,相当于赋值语句。拷贝到字符数组中,相当于赋值语句。 例如:例如: char

150、 str110, str2 =China;strcpy(str1,str2);字符数组字符数组1必须是写成数组名,字符串必须是写成数组名,字符串2 可以是数组名也可以是数组名也可以是一个字符串。可以是一个字符串。 如:如:strcpy(str1, china);不能用赋值语句将一个字符串常量或字符数组直接赋给不能用赋值语句将一个字符串常量或字符数组直接赋给一个字符数组。但可以给一个字符变量或字符数组元素一个字符数组。但可以给一个字符变量或字符数组元素赋值。赋值。 如:如:char str1 =China,str220; str2=str1;( )可以将字符串可以将字符串2前面若干个字符复制到字

151、符数组前面若干个字符复制到字符数组1中去。中去。 如:如:strcpy(str1, str2, 2); 1605. strcmp(字符串字符串1,字符串,字符串2) 比较两个字符串的大小,即对两个字符串自左至右逐个字符相比比较两个字符串的大小,即对两个字符串自左至右逐个字符相比(ASCII值大的为大),直到出现不同的字符或遇到值大的为大),直到出现不同的字符或遇到0为止。如为止。如全部字符相同,则认为相等;若出现不同的字符,则以第一个不相同全部字符相同,则认为相等;若出现不同的字符,则以第一个不相同的字符的比较结果为准。的字符的比较结果为准。如:如:“”compare” 返回值返回值:零零,两

152、个串相等,两个串相等正数正数, str1str2负数负数, str1str2 注意:两个字符串不能用关系运算符比较注意:两个字符串不能用关系运算符比较 例如,下面的写法是不合法的:例如,下面的写法是不合法的:if (str1=str2) printf(yes);应写成应写成 : if (strcmp(str1,str2)=0) printf(yes); 161 数组数组 字字符数组符数组6. strlen(字符数组字符数组) 测试字符串的长度。函数的值为字符串中的实际长度,不包测试字符串的长度。函数的值为字符串中的实际长度,不包括括0在内。在内。 例如:例如:char str10=China;

153、 printf (%d, strlen(str);7. strlwr(字符串字符串) 将字符串中大写字母转换成小写字母。将字符串中大写字母转换成小写字母。 8. strupr(字符串字符串) 将字符串中小写字母转换成大写字母。将字符串中小写字母转换成大写字母。5162例:输入一行字符,统计其中有多少个单词,单词之间用空格分隔开。例:输入一行字符,统计其中有多少个单词,单词之间用空格分隔开。程序如下:程序如下:#includemain()char string81;int i,num=0,word=0;char c;gets(string);for(i=0;(c=stringi)!=0; i+)

154、 if (c= ) word=0;else if(word=0)word=1;num+;printf(“there are %d words in the line.n”,num);运行如下:运行如下:am a boy.there are 4 words in the line.解题思路:单词的数目由空格出现的次数决定。若测出某解题思路:单词的数目由空格出现的次数决定。若测出某一个字符为非空格,而它的前面的字符是空格,则表示一个字符为非空格,而它的前面的字符是空格,则表示“新的单词出现了新的单词出现了”,此时使,此时使num累加累加163第八章 函数8.1 概述模块化程序设计:模块化程序设计:

155、u基本思想:将一个大的程序按功能分割成一些小模块基本思想:将一个大的程序按功能分割成一些小模块u特点:特点:各模块相对独立、功能单一、结构清晰、接口简单各模块相对独立、功能单一、结构清晰、接口简单控制了程序设计的复杂性控制了程序设计的复杂性提高元件的可靠性提高元件的可靠性缩短开发周期缩短开发周期避免程序开发的重复劳动避免程序开发的重复劳动易于维护和功能扩充易于维护和功能扩充u开发方法开发方法: 自顶向下自顶向下,逐步分解,分而治之逐步分解,分而治之164例例例例: :打印图形打印图形打印图形打印图形: *: * How do you do!How do you do! * * * *编程编程编

156、程编程: : main()main() printf(*n); printf(*n); printf( How do you do! n); printf( How do you do! n); printf(*n); printf(*n); printf(*n); printf(*n); 三个语句一样三个语句一样, ,可编写成函数可编写成函数: : printstar() printf(* *n); 则原程序可简化为则原程序可简化为:main() printstar(); printf( How do you do!n): printstar(): printstar(); 165 函数分类

157、函数分类函数分类函数分类l l从用户角度从用户角度标准函数(库函数):由系统提标准函数(库函数):由系统提供供用户自定义函数用户自定义函数l l从函数形式从函数形式无参函数无参函数有参函数有参函数166l l函数的定义形式函数的定义形式函数类型函数类型 函数名(形式参数表)函数名(形式参数表) 说明部分说明部分 语句语句 8.2 8.2 函数的一般形式函数的一般形式int max(int x, int y) /*形式参数说明形式参数说明*/ int z; /*函数体内部说明函数体内部说明*/ z=xy? x:y; return(z); /*返回值返回值*/ 1678.3 8.3 函数的参数和函

158、数的值函数的参数和函数的值函数的参数和函数的值函数的参数和函数的值一、形式参数和实际参数一、形式参数和实际参数一、形式参数和实际参数一、形式参数和实际参数u在函数定义时指定的参数为形式参数(形参)在函数定义时指定的参数为形式参数(形参);u在函数调用时给出的参数叫实际参数(实参)。在函数调用时给出的参数叫实际参数(实参)。main() int a,b,c;scanf(%d,%d,&a,&b); c=max(a,b); printf(Max is %d,c);max(int x,int y) int z; z=xy?x:y; return(z);168n说明:说明:q实参必须有确定的值实参必须有

159、确定的值q形参与实参类型一致,个数相同形参与实参类型一致,个数相同q参数传递方式为值传递方式:函数调用时参数传递方式为值传递方式:函数调用时,为形参分配单元为形参分配单元,并将实参并将实参的值复制到形参中;调用结束,形参单元被释放,实参单元仍保留并的值复制到形参中;调用结束,形参单元被释放,实参单元仍保留并维持原值。维持原值。q特点:特点: 形参与实参占用不同的内存单元;单向值传递。形参与实参占用不同的内存单元;单向值传递。169 例例 main() int a,b; a=2;b=3; printf(%d %d,a,b); change(a,b); printf(%d %d,a,b);chan

160、ge(int a,int b) a=10;b=20; printf(%d %d,a,b); 2 3 10 20 2 323ab32ab1020main 空间空间change 空间空间170二、函数的返回值二、函数的返回值二、函数的返回值二、函数的返回值q形式:形式: return(表达式表达式);或或 return 表达式表达式;q功能:使程序控制从被调用函数返回到调用函数中,同时把返功能:使程序控制从被调用函数返回到调用函数中,同时把返回回值值带给调用函数带给调用函数说明:说明:n函数中可有多个函数中可有多个return语句语句n若无若无return语句,遇语句,遇 时,自动返回调用函数时,

161、自动返回调用函数n若函数类型与若函数类型与return语句中表达式值的类型不一致,按前者为语句中表达式值的类型不一致,按前者为准,自动转换准,自动转换-函数调用转换函数调用转换nvoid型函数型函数用来明确表明函数不带回任何值用来明确表明函数不带回任何值例例 无返回值函数无返回值函数void swap(int x,int y ) int temp; temp=x; x=y; y=temp;171u说明说明:函数类型决定返回值类型函数类型决定返回值类型; 例例 main() float a,b,c; scanf(%f,%f,&a,&b); c=max(a,b); printf(Max is %f

162、,c); max(float x, float y) float z; z =xy? x:y; return(z); /*返回整数返回整数*/1.5, 2.5Max is 2.0000001728.4 8.4 函数的调用函数的调用函数的调用函数的调用一、函数调用的一般形式一、函数调用的一般形式 函数调用的一般形式函数调用的一般形式: 函数名函数名 (实参表列实参表列); 实参的个数、类型以及顺序必须与形参表一致。实参的个数、类型以及顺序必须与形参表一致。二、函数调用的方式二、函数调用的方式1.函数语句函数语句: 此时只要求函数完成一定的操作。此时只要求函数完成一定的操作。2. printsta

163、r();3.函数表达式函数表达式:被调用函数出现在一个表达式中被调用函数出现在一个表达式中;函数返回一个值。函数返回一个值。 c=2*max(a,b);4.函数参数函数参数: 函数作为另一个函数的实参。函数作为另一个函数的实参。 m = max(a, max(b,c); printf(%d, max(a,b);173二、对被调用函数的声明和函数原型二、对被调用函数的声明和函数原型二、对被调用函数的声明和函数原型二、对被调用函数的声明和函数原型 1 1. . . .对被调用函数要求:对被调用函数要求:必须是必须是已存在已存在的函数的函数库函数库函数: : #include #include 用户

164、自定义函数用户自定义函数: : 主调函数对被调函数作主调函数对被调函数作函数函数声明声明, ,对对函数的声明称为函数的声明称为函数原型函数原型2.2.函数声明函数声明一般形式:一般形式:函数类型函数类型 函数名函数名( (形参类型形参类型11形参名形参名1,. );1,. );作用:告诉编译系统作用:告诉编译系统函数类型、参数个数及类型,以便检验函数类型、参数个数及类型,以便检验函数定义与函数声明不同函数定义与函数声明不同函数声明位置:函数声明位置:程序的数据说明部分(函数内或外)程序的数据说明部分(函数内或外)下列情况下,可不作函数声明下列情况下,可不作函数声明若函数返值是若函数返值是cha

165、rchar或或intint型型,系统自动按,系统自动按intint型处理型处理被调用函数定义出现在主调函数之前被调用函数定义出现在主调函数之前在所有的函数定义之前,在函数的外部已做了函数声明在所有的函数定义之前,在函数的外部已做了函数声明174 例例 main() float add(float x, float y); /*/*在主函数中对被调用函数进行声明在主函数中对被调用函数进行声明*/*/ float a,b,c; scanf(%f,%f,&a,&b); c=add(a,b); printf(sum is %f,c);float add(float x, float y) float

166、z; z=x+y; return(z);175l l8.5 8.5 函数的嵌套调用函数的嵌套调用函数的嵌套调用函数的嵌套调用 嵌套调用嵌套调用嵌套调用嵌套调用C C规定:函数规定:函数规定:函数规定:函数定义不可嵌套定义不可嵌套定义不可嵌套定义不可嵌套,但可以,但可以,但可以,但可以嵌套调用嵌套调用嵌套调用嵌套调用函数函数函数函数main( )调用函数调用函数a结束结束a函数函数b函数函数调用函数调用函数b1768.68.6函数的递归调用函数的递归调用函数的递归调用函数的递归调用u递归调用的概念递归调用的概念:在调用一个函数的过程中又出现直接或间接的调在调用一个函数的过程中又出现直接或间接的调

167、用该函数本身用该函数本身递归调用。递归调用。u递归的说明递归的说明 :递归必须是有条件的递归必须是有条件的;程序中只应出现有限次数的、有终止的递程序中只应出现有限次数的、有终止的递归调用归调用;递归函数的执行在时间和空间上都不节省,但从算法角度讲,递归函数的执行在时间和空间上都不节省,但从算法角度讲,结构清晰,代码紧凑结构清晰,代码紧凑;每调用函数一次,在内存堆栈区分配空间,用于存放函数变量、每调用函数一次,在内存堆栈区分配空间,用于存放函数变量、返回值等信息,所以递归次数过多,可能引起堆栈溢出返回值等信息,所以递归次数过多,可能引起堆栈溢出在实际使用时,除非特殊需要一般尽量不采用递归调用。在

168、实际使用时,除非特殊需要一般尽量不采用递归调用。 f函数函数 调用调用f函数函数177例例: 5个人坐一起,问第个人坐一起,问第5个人多少岁?他说比第个人多少岁?他说比第4个人大个人大2岁。问第岁。问第4个人多少个人多少岁?他说比第岁?他说比第3个人大个人大2岁。问第岁。问第3个人多少岁?他说比第个人多少岁?他说比第2个人大个人大2岁。问第岁。问第1个个人多少岁?他说人多少岁?他说10岁。请问第岁。请问第5个人多大?个人多大?/int age (int n) int c; if(n=1) c=10; else c=age(n-1)+2; return(c);main() printf(%dn,

169、age(5);age(5)=age(4)+2age(4 )=age(3)+2age(3)=age(2)+2age(2)=age(1)+2age(1)=10age(2)=12age(3)=14age(4)=16age(5)=18递递 归归 调调 用用递递 归归 返返 回回主函数主函数 1 2 3 4 3 2返回返回1 178 例例 求一个自然数的阶乘。求一个自然数的阶乘。 n!= 1 (n=0,1) n!= 1 (n=0,1) n*(n-1)! (n1) n*(n-1)! (n1)float fac (int n) float f; if (n=0 | n=1) f=1; else f=n*fa

170、c(n-1); return(f); main()int n; float y; scanf(“%d”,&n);y=fac(n);printf(“%d!=10.0f”,n,y);运行情况如下:运行情况如下:10!36288001798.7 数组作为函数参数数组作为函数参数数组元素和整个数组均可以作为实参和形参。数组元素和整个数组均可以作为实参和形参。1.数组元素做函数实参数组元素做函数实参:值传递值传递 例例 比较两个数组的对应元素,比较过程在函数中完成,比较结果在主函数中输出。比较两个数组的对应元素,比较过程在函数中完成,比较结果在主函数中输出。main() int a10,b10,i,n=

171、0,m=0,k=0; printf(输入数组 a:n); for (i=0;i10;i+) scanf(%d,&ai); printf(输入数组b:n); for (i=0;i10;i+) scanf(%d,&bi); for (i=0;ib%d次na=b%d次nay) flag=1; else if(xy) flag=-1 else flag=0; return(flag);1802.用数组名作函数参数用数组名作函数参数:地址传递(双向传递)地址传递(双向传递)用数组名作函数参数,应该在主调函数和被调函数中分别定义用数组名作函数参数,应该在主调函数和被调函数中分别定义数组数组;实参数组与形参

172、数组类型应一致实参数组与形参数组类型应一致;形参数组可以不指定大小,定义时在数组名后跟一个空的方括形参数组可以不指定大小,定义时在数组名后跟一个空的方括号号;数组名作函数参数时不是数组名作函数参数时不是“值传送值传送”,而是把实参数组从起始地,而是把实参数组从起始地址传送给形参数组,址传送给形参数组,“地址传递地址传递”。形参和实参共用一个存储空间。形参的改变会导致实参的改变。形参和实参共用一个存储空间。形参的改变会导致实参的改变。181 例例 一维数组一维数组scorescore内放内放1010个学生成绩,求平均成绩。个学生成绩,求平均成绩。float average (float arra

173、y10) int i; float aver; sum = array0; for (i = 1;i10;i+) sum=sum+arrayi; aver = sum/10; return(aver); main() float score10, aver; int i;for (i = 0;i (y)?(x):(y)(x)(y)?(x):(y)l lmain( )main( )l l l l printf(%dn,a,b, printf(%dn,a,b, MAX(a,b)MAX(a,b); );l l printf(%dn, printf(%dn,MAX(a+m,b+n)MAX(a+m,b+

174、n); );l l 分两次替换:分两次替换:将宏名将宏名MAX(a,b) 替换成字符串替换成字符串 (x)(y)?(x):(y)。用实参用实参a替换形参替换形参x,实参实参b替换形参替换形参y。程序中的两个程序中的两个printf语句被展开为:语句被展开为:printf(%dn, (a)(b)?(a):(b); printf(%dn, (a+m)(b+n)?( a+m):( b+n);196l l9.2 9.2 文件包含文件包含文件包含文件包含l l功能:一个源文件可将另一个源文件的内容全部功能:一个源文件可将另一个源文件的内容全部功能:一个源文件可将另一个源文件的内容全部功能:一个源文件可将

175、另一个源文件的内容全部包含进来包含进来包含进来包含进来 一般形式:一般形式:一般形式:一般形式: # #include “include “文件名文件名文件名文件名” ” 或:或:或:或: # #include include #include “file2.c”file1.cfile2.cfile1.cBABAl l处理过程:预编译时处理过程:预编译时处理过程:预编译时处理过程:预编译时, , 用被包含文件的内容取用被包含文件的内容取用被包含文件的内容取用被包含文件的内容取代该预处理命令,再对代该预处理命令,再对代该预处理命令,再对代该预处理命令,再对“ “包含包含包含包含” ”后的文件作一

176、后的文件作一后的文件作一后的文件作一个源文件编译个源文件编译个源文件编译个源文件编译197 被包含文件内容被包含文件内容被包含文件内容被包含文件内容l l源文件源文件源文件源文件(*.(*.c)c)l l头文件头文件头文件头文件(*.(*.h)h)宏定义宏定义数据结构定义数据结构定义函数说明等函数说明等 文件包含可嵌套文件包含可嵌套#include “file2.c”file1.cAfile3.cC#include “file3.c”file2.c Bfile1.cA C B198例例 文件包含举例文件包含举例/* powers.h */#define sqr(x) (x)*(x)#define cube(x) (x)*(x)*(x)#define quad(x) (x)*(x)*(x)*(x)#include #include powers.h#define MAX_POWER 10void main() int n; printf(numbert exp2t exp3t exp4n); printf(-t-t-t-n); for(n=1;n=a&c=A&c=Z) c=c+32; #endif printf(%c,c); printf(n); 202

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 资格认证/考试 > 自考

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号