1、计算机二级计算机二级C语言完整语言完整 教学课件教学课件 谭浩强谭浩强 著著 (第四版)(第四版) 第第1章章 程序设计和程序设计和C语言语言 第第2章章 算法算法程序的灵魂程序的灵魂* 第第3章章 最简单的最简单的C程序设计程序设计 顺序结构程序设计顺序结构程序设计 第第4章章 选择结构程序设计选择结构程序设计 第第5章章 循环结构程序设计循环结构程序设计 第第6章章 利用数组处理批量数据利用数组处理批量数据 第第7章章 利用函数实现模块化程序设计利用函数实现模块化程序设计 第第8章章 善于利用指针善于利用指针 第第9章章 用户自己建立数据类型用户自己建立数据类型 附录附录B 附录附录C 附
2、录附录D 附录附录F 目录目录 P22 第一章第一章 本章要点本章要点 C C语言的特点语言的特点 C C程序的结构程序的结构 在计算机上运行在计算机上运行C C程序的方法程序的方法 1.1 什么是计算机程序什么是计算机程序 程序程序:一组计算机能识别和执行的一组计算机能识别和执行的指令指令。 只要让计算机执行这个程序,计算机就会只要让计算机执行这个程序,计算机就会 自动地自动地、有条不紊地有条不紊地进行工作进行工作。 计算机的一切操作都是由计算机的一切操作都是由程序程序控制的,离控制的,离 开程序,计算机将一事无成开程序,计算机将一事无成。 P1 1语言的诞生与发展语言的诞生与发展 1.2
3、什么是计算机语言 机 器 语 言 机 器 语 言 汇 编 语 言 汇 编 语 言 高 级 语 言 高 级 语 言 C语言是国际语言是国际 上广泛流行上广泛流行 的高级语言的高级语言 计算机语言计算机语言: 人和计算机交流信息人和计算机交流信息的、的、 计算机和人都能识别的语言计算机和人都能识别的语言。 P1-3 源程序源程序 目标程序目标程序 结构化语言结构化语言 1.3 C1.3 C语言的发展及特点语言的发展及特点 C C语言是在语言是在B B语言的基础上发展起来的。语言的基础上发展起来的。 19731973年美国贝尔实验室的年美国贝尔实验室的D.M.Ritchie D.M.Ritchie
4、在在B B语言的语言的 基础上设计出了基础上设计出了C C语言,但仅在贝尔实验室使用。语言,但仅在贝尔实验室使用。 经过多次版本改进之后,经过多次版本改进之后,C C语言先后移植到大、中、语言先后移植到大、中、 小、微型计算机上小、微型计算机上, , C C语言迅速得到推广,很快风语言迅速得到推广,很快风 靡世界靡世界, ,成为最广泛的几种计算机语言之一。成为最广泛的几种计算机语言之一。 19831983年年, ,美国国家标准化协会美国国家标准化协会(ANSI)(ANSI)根据根据C C语言各种语言各种 版本对版本对C C的发展和扩充的发展和扩充, ,制定了新的标准制定了新的标准ANSI CA
5、NSI C 。 19941994年后,年后,ISOISO又多次修订了又多次修订了C C语言标准。语言标准。C99C99 P3 C语言特点语言特点 语言简洁、紧凑、灵活语言简洁、紧凑、灵活 运算符和数据类型丰富运算符和数据类型丰富 程序设计结构化、模块化程序设计结构化、模块化 生成目标代码质量高生成目标代码质量高 可移植性好可移植性好 有高级语言和有高级语言和 低级语言特点低级语言特点 C语言程序设计 第一章第一章 C C语言概述语言概述 P4-5 (1 1)语言简洁、紧凑)语言简洁、紧凑, ,使用方便、灵活。使用方便、灵活。 3232个关键字个关键字、 9 9种控制语句种控制语句, ,程序形式
6、自由程序形式自由 (2 2)运算符丰富。)运算符丰富。3434种运算符种运算符 (3 3)数据类型丰富。)数据类型丰富。 (4 4)具有结构化的控制语句)具有结构化的控制语句 ,是完全模块化和结构化,是完全模块化和结构化 的语言。的语言。 (5 5)语法限制不太严格)语法限制不太严格, ,程序设计自由度大。程序设计自由度大。 (6 6)允许直接访问物理地址)允许直接访问物理地址, ,能进行位操作能进行位操作, , 可直接对可直接对 硬件进行操作。兼有高级和低级语言的特点硬件进行操作。兼有高级和低级语言的特点 。 (7 7)目标代码质量高)目标代码质量高, ,程序执行效率高。程序执行效率高。 (
7、8 8)程序可移植性好)程序可移植性好( (与汇编语言比与汇编语言比) )。基本上不做修改。基本上不做修改 就能用于各种型号的计算机和各种操作系统。就能用于各种型号的计算机和各种操作系统。 32个关键字个关键字:(由系统定义,不能重作其它定义由系统定义,不能重作其它定义) 见见P365 auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch t
8、ypedef unsigned union void volatile while C语言程序设计 第一章第一章 C C语言概述语言概述 9 9种控制语句种控制语句(结构化控制语句)(结构化控制语句): if( )else for( ) while( ) dowhile( ) continue break switch goto return C语言程序设计 第一章第一章 C C语言概述语言概述 3434种运算符:种运算符:见见P365 算术运算符:算术运算符:+ + - - * / % + * / % + - 关系运算符:关系运算符: = != = != 逻辑运算符:!逻辑运算符:! /*文
9、件包含*/ /*主函数 */ /*函数体开始*/ /*输出语句*/ /*函数体结束*/ 说明: mainmain- -主函数名,主函数名, voidvoid- -空空类型类型 每个每个C C程序必须有一个程序必须有一个主函数主函数mainmain 是函数开始和结束的标志是函数开始和结束的标志, ,不可省不可省 每个每个C C语句以分号结束语句以分号结束 使用标准库使用标准库函数时函数时应在程序开头一行写:应在程序开头一行写: #include stdio.h#include 例例1.1 #include int main( ) printf (”This is a C program.n”);
10、 return 0; 例1.2 求两数之和 #include #include void main( ) void main( ) int a,b,sum; int a,b,sum; a=123; b=456;a=123; b=456; sum=a+b;sum=a+b; printf(sum is %dprintf(sum is %dn ,sum);n ,sum); /*声明部分,定义变量为整型声明部分,定义变量为整型*/ 说明:说明: /*/*/或或/表示注释。注释只是给人看的表示注释。注释只是给人看的, , 对编译和运行不起作用。所以可以用汉字或英文字符表对编译和运行不起作用。所以可以用汉
11、字或英文字符表 示,可以出现在一行中的最右侧,也可以单独成为一行。示,可以出现在一行中的最右侧,也可以单独成为一行。 用用sum的值的值替代替代 例例1.3求两个整数中的较大者。求两个整数中的较大者。 解题思路:解题思路: 用一个函数实现求两个整数中的较大者用一个函数实现求两个整数中的较大者 在主函数中调用此函数并输出结果在主函数中调用此函数并输出结果 #include int main( ) int max(int x,int y); int a,b,c; scanf(”%d,%d”, c = max(a,b); printf(max=%dn,c); return 0; int max(in
12、t x,int y) int z; if (x y) z = x; else z = y; return(z); 主函数主函数 max函数函数 例1.3 求2个数中较大者。 #include #include void main( ) void main( ) int max(int x,int y); int max(int x,int y); int a, b, c; int a, b, c; scanf(scanf(d,d,d, d, c=max(a,b); c=max(a,b); printf(max=printf(max=d d n,c);n,c); /* 主函数主函数*/ /* 对
13、被调用函数对被调用函数max的声明的声明 */ /*定义变量定义变量a、b、c */ /*输入变量输入变量a和和b的值的值*/ /*调用调用max函数函数,将得到的值赋给将得到的值赋给c */ /*输出输出c的值的值*/ max(a,b);max(a,b); int max(int x, int y) int z; if (xy) z=x; else z=y; return (z); 说明:本程序包括说明:本程序包括mainmain和被调用函数和被调用函数maxmax 两个函数。两个函数。maxmax函数的作用是将函数的作用是将x x和和y y中中 较大者的值赋给变量较大者的值赋给变量z z。
14、returnreturn语句将语句将z z 的值返回给主调函数的值返回给主调函数mainmain。 C程序小结: (1) (1) C C程序是由函数构成的程序是由函数构成的。 这使得程序容易实现模这使得程序容易实现模 块化。块化。 (2) (2) 一个函数由两部分组成一个函数由两部分组成: : 函数的首部:函数的首部:例例1.31.3中的中的maxmax函数首部函数首部 int max(int x,intint max(int x,int y )y ) 函数体:函数体:花括号内的部分。若一个函数有多个花括花括号内的部分。若一个函数有多个花括 号号, ,则最外层的一对花括号为函数体的范围。则最外
15、层的一对花括号为函数体的范围。 函数体包括两部分函数体包括两部分 : 声明部分:声明部分:int a,b,cint a,b,c; ; 执行部分:由若干个语句组成。执行部分:由若干个语句组成。 P10-11 小结:小结: (3) C(3) C程序总是从程序总是从mainmain函数开始执行的函数开始执行的, ,与与mainmain函数函数 的位置无关。的位置无关。 (4) C(4) C程序书写格式自由程序书写格式自由, ,一行内可以写几个语句一行内可以写几个语句, , 一个语句可以分写在多行上,一个语句可以分写在多行上,C C程序没有行号。程序没有行号。 (5) (5) 每个语句和数据声明的最后
16、必须有一个分号。每个语句和数据声明的最后必须有一个分号。 (6) C(6) C语言本身没有输入输出语句。输入和输出的操语言本身没有输入输出语句。输入和输出的操 作是由库函数作是由库函数scanfscanf和和printfprintf等函数来完成的。等函数来完成的。C C 对输入输出实行对输入输出实行“函数化函数化”。 1.5 运行程序的步骤和方法运行程序的步骤和方法 运行程序的步骤运行程序的步骤 上机输入与编辑上机输入与编辑源程序源程序 对对源程序源程序进行编译进行编译 与库函数连接与库函数连接 运行运行目标程序目标程序 P12-13 编辑编辑 链接链接 编译编译 执行执行 C程序的上机步骤程
17、序的上机步骤 C语言程序设计 第一章第一章 C C语言概述语言概述 程序代码的录入程序代码的录入, 生成源程序生成源程序*.c 语法分析查错,翻译语法分析查错,翻译 生成目标程序生成目标程序*.obj 与其它目标程序或库与其它目标程序或库 链接装配链接装配,生成可执行生成可执行 程序程序*.exe 源程序源程序目标程序目标程序 可执行程序可执行程序 内容内容程序设计语言程序设计语言 机器语言机器语言机器语言机器语言 可执行可执行不可以不可以不可以不可以可以可以 文件名后缀文件名后缀.c.obj.exe 演示演示 P370 1.6 程序设计的任务程序设计的任务 1. 问题分析问题分析 2. 设计
18、算法设计算法 3. 编写程序编写程序 4. 对源程序进行编辑、编译和连接对源程序进行编辑、编译和连接 5. 运行程序,分析结果运行程序,分析结果 6. 编写程序文档编写程序文档 结果错了,程序肯定错结果错了,程序肯定错 结果对了,程序未必对结果对了,程序未必对 P14 通常把由高级语言编写的程序称为“通常把由高级语言编写的程序称为“源程源程 序序”。”。 把由二进制代码构成的程序称为“把由二进制代码构成的程序称为“目标程目标程 序序”。”。 为了能使计算机处理高级语言源程序,需要为了能使计算机处理高级语言源程序,需要 把把源程序转换成及其能够接受的目标程序源程序转换成及其能够接受的目标程序,
19、这种具有翻译功能的软件成为“这种具有翻译功能的软件成为“编译程序编译程序” 或“或“解释程序解释程序”。每一种高级语言都有与它”。每一种高级语言都有与它 对应的翻译程序。对应的翻译程序。 第2章 主要内容 2.1 2.1 算法的概念算法的概念 2.2 2.2 简单算法举例简单算法举例 2.3 2.3 算法的特征算法的特征 2.4 2.4 怎样表示一个算法怎样表示一个算法 2.5 2.5 结构化程序设计方法结构化程序设计方法 一个程序包括两个方面:一个程序包括两个方面: 对数据的描述。对数据的描述。 对操作的描述。对操作的描述。 著名计算机科学家沃思公式:著名计算机科学家沃思公式: 程序数据结构
20、算法程序数据结构算法 实际上,算法、数据结构、程序设计方实际上,算法、数据结构、程序设计方 法和语言工具法和语言工具4个个方面是一个程序设计人方面是一个程序设计人 员所应具备的知识。员所应具备的知识。 指定数据的指定数据的类型类型和数据的和数据的 组织形式,即组织形式,即数据结构数据结构 操作步骤,也就是操作步骤,也就是算法算法 P16 2.1 什么是算法 算法(广义):算法(广义): 为解决一个问题而采取的为解决一个问题而采取的方法和步骤方法和步骤 计算机算法分为:计算机算法分为: 数值运算算法数值运算算法 非数值运算算法非数值运算算法 P17:方法:方法 有优劣之分有优劣之分 2.2 简单
21、算法举例 P17-18 例例2.1 求求12345。 原始方法原始方法 通用算法通用算法:设变量设变量P为被乘数,为被乘数,i为乘数为乘数 S1:使使P=1 S2:使使i=2 S3:使使P*i,乘积仍放在变量乘积仍放在变量P中,表示为:中,表示为: P*i P S4:使使i的值加的值加1,即,即i1 i 。 S5:若若i5,返回,返回S3,否则结束。否则结束。 (若(若i5,结束,否则,返回,结束,否则,返回S3) 具有通用性、灵活性。(具有通用性、灵活性。(S3S5组成一个循环)组成一个循环) 如何求如何求1357911? 问题:见问题:见P18 3 2 11 11 例例 2.2 有有50个
22、学生,要求将他们中成绩在个学生,要求将他们中成绩在80分以上的分以上的 学号和成绩输出。用学号和成绩输出。用n表示学生学号,表示学生学号,n1代表第一个学代表第一个学 生学号,生学号, ni代表第代表第i个学生学号。用个学生学号。用g代表学生成绩,代表学生成绩, gi代表第代表第i个学生成绩。个学生成绩。 算法:算法: S1: 1 i S2:如果:如果gi80,则输出,则输出ni 和和gi,否则不输出,否则不输出 S3: i+1 i S4: 如果如果i50,返回,返回S2,继续执行;否则,算法结束,继续执行;否则,算法结束 (S2S4组成一个循环)组成一个循环) P19 归纳:归纳: P19
23、2.3 算法的特性 P21 一个算法应具有特点:一个算法应具有特点: 有穷性。有穷性。一个算法包含有限的操作步骤,一个算法包含有限的操作步骤, 而不能是无限的。而不能是无限的。 确定性。确定性。算法中的每一个步骤都应当是确算法中的每一个步骤都应当是确 定的,不能模棱两可。定的,不能模棱两可。 有零个或多个输入。有零个或多个输入。 有一个或多个输出。有一个或多个输出。 有效性。有效性。如:如:a/b,若若b=0,不能执行。,不能执行。 2.4 怎样表示一个算法 常用算法表示的方法:常用算法表示的方法: 自然语言、传统流程图、结构化流程图(自然语言、传统流程图、结构化流程图(N-S流流 程图)、伪
24、代码等。程图)、伪代码等。 2.4.1 用自然语言表示算法用自然语言表示算法 2.4.2 用流程图表示算法用流程图表示算法 P22 一个流程图包括:一个流程图包括: 表示相应操作的框表示相应操作的框 带箭头的流程线带箭头的流程线 框内外必要的文字说明框内外必要的文字说明 例例2.6 将例将例2.1的算法的算法 用流程图表示。用流程图表示。 求求12345 P23 图图2.6 1t i5 开始开始 2i t*it i+1i 结束结束 N Y 例例2.6 将例将例2.1的算法的算法 用流程图表示。用流程图表示。 求求12345 如果需要将最后结果如果需要将最后结果 输出输出: P23 图图2.7
25、1t 输出输出t i5 开始开始 2i t*it i+1i 结束结束 N Y 例例2.7 例例2.2的算法用流程图表示。有的算法用流程图表示。有 50个学生,要求将成绩在个学生,要求将成绩在80分以上的分以上的 学生的学号和成绩输出。学生的学号和成绩输出。 1i i50 开始开始 i+1i 结束结束 N Y 输入输入ni、gi 1i 开始开始 gi80 输出输出ni、gi i+1i i50 N Y Y N 如果包括输入数据部分如果包括输入数据部分 P24 图图2.8 1i i50 开始开始 i+1i 结束结束 N Y 输入输入ni、gi 1i gi80 输出输出ni、gi i+1i i50 N
26、 Y Y N 如果包括输入数据部分如果包括输入数据部分 P24 图图2.9 三种基本结构和改进的流程图 1. 传统流程图的弊端传统流程图的弊端 2. 3种基本结构种基本结构 P26 顺序结构顺序结构 选择结构选择结构 循环结构循环结构 当型循环结构当型循环结构(while) 直到循环结构直到循环结构(until) P2627 三种基本结构三种基本结构 (1) 顺序结构顺序结构 A B P27 三种基本结构三种基本结构 (2) 选择结构选择结构 A B Y p N A Y p N P27 三种基本结构三种基本结构 (3) 循环结构循环结构 当型循环结构当型循环结构 A Y p1 N 直到型循环结
27、构直到型循环结构 Y A p2 N 三种基本结构的特点:三种基本结构的特点: (1)只有一个入口。)只有一个入口。 (2)只有一个出口。)只有一个出口。 (3)结构内的每一部分都有机会被执行到。)结构内的每一部分都有机会被执行到。 (4)结构内不存在“死循环”(无终止的循环)。)结构内不存在“死循环”(无终止的循环)。 基本结构不一定只限于上面三种,只要具有上基本结构不一定只限于上面三种,只要具有上 述述4个特点的都可以作为基本结构。个特点的都可以作为基本结构。 用用N-S流程图表示见流程图表示见P29 图图2-24、图、图2-25、图、图2- 26、图、图2-27 P27 2.4.5 用伪代
28、码表示算法 伪代码是介于自然语言和计算机之间的文字和符号来描伪代码是介于自然语言和计算机之间的文字和符号来描 述算法。述算法。 例例2.16 求求5! begin /*算法开始算法开始*/ 1 t 2 i while i5 t*i t i+1 i print t end /*算法结束算法结束*/ 用计算机语言表示算法 P32 计算机无法识别流计算机无法识别流 程图和伪代码,还程图和伪代码,还 需转换成计算机语需转换成计算机语 言程序。言程序。 用计算机语言表示用计算机语言表示 算法必须严格遵守算法必须严格遵守 所用的语言的所用的语言的语法语法 规则规则。 例例2.18 求求5! #includ
29、e void main( ) int i,t; t=1; i=2; while(i=5) t=t*i; i=i+1; printf(“%dn”,t); P33 2.5 结构化程序设计方法 P34 一个结构化程序就是用高级语言表示的一个结构化程序就是用高级语言表示的 结构化算法。用结构化算法。用3种基本结构种基本结构组成的程组成的程 序必然是序必然是结构化结构化的程序,这种程序便于的程序,这种程序便于 编写、阅读、修改和维护。编写、阅读、修改和维护。 基本思路:基本思路: 把一个把一个复杂问题复杂问题的求解过程的求解过程分阶段分阶段进进 行,每个阶段处理的问题都控制在人们行,每个阶段处理的问题都
30、控制在人们 容易理解和处理的范围内。容易理解和处理的范围内。 采用:采用: (1)自顶向下()自顶向下(2)逐步求精)逐步求精 (3)模块化设计()模块化设计(4)结构化代码)结构化代码 该设计方法的要点该设计方法的要点:“自顶向下,逐步求精自顶向下,逐步求精”的”的 设计思想,即整个设计应分成若干层次,逐步加以设计思想,即整个设计应分成若干层次,逐步加以 解决;解决; “独立功能,一个出口,一个入口独立功能,一个出口,一个入口”的模”的模 块化结构,即把一个大而复杂的问题层层细化分解块化结构,即把一个大而复杂的问题层层细化分解 成若干个相对独立、功能单一的问题处理模块,而成若干个相对独立、功
31、能单一的问题处理模块,而 每个模块与外部联系只有单一的入口和出口。每个模块与外部联系只有单一的入口和出口。 “用三种基本控制结构用三种基本控制结构”的设计原则,即每个模块都”的设计原则,即每个模块都 只用三种基本结构来描述。只用三种基本结构来描述。 3.4 数据的输入输出数据的输入输出 P65 3.4.1 输入输出举例输入输出举例 3.4.2 有关数据输入输出的概念有关数据输入输出的概念 3.4.3 用用printf函数输出数据函数输出数据 3.4.4 用用scanf函数输入数据函数输入数据 3.4.5 字符数据的输入输出字符数据的输入输出 3.4.1 输入输出举例输入输出举例 P65 例例3
32、.5 方程的根。方程的根。a、b、c 由键盘输入由键盘输入。 设设: 。 0 2 cbxax acb4 2 例例3.5 解题思路:首先要知道求方程式的根的方法。解题思路:首先要知道求方程式的根的方法。 由数学知识已知:如果由数学知识已知:如果 0,则一,则一 元二次方程有两个实根元二次方程有两个实根: acb4 2 a acbb x 2 4 2 1 a acbb x 2 4 2 2 a b p 2 a acb q 2 4 2 若记若记 qpx 1 qpx 2 #include #include int main ( ) double a,b,c,disc,x1,x2,p,q; scanf(%l
33、f%lf%lf, disc=b*b-4*a*c; p=-b/(2.0*a); q=sqrt(disc)/(2.0*a); x1=p+q; x2=p-q; printf(x1=%7.2fnx2=%7.2fn,x1,x2); return 0; 程序中程序中调用数学函数调用数学函数sqrt 输入输入a,b,c的值的值 #include #include int main ( ) double a,b,c,disc,x1,x2,p,q; scanf(%lf%lf%lf, disc=b*b-4*a*c; p=-b/(2.0*a); q=sqrt(disc)/(2.0*a); x1=p+q; x2=p-
34、q; printf(x1=%7.2fnx2=%7.2fn,x1,x2); return 0; 输入的是双输入的是双 精度型实数精度型实数 自动自动转成实数转成实数 后赋给后赋给a,b,c 输出输出数据占数据占7列,其中小数占列,其中小数占2列列 程序分析程序分析 P66 3.4.2 有关数据输入输出的概念有关数据输入输出的概念 几乎每一个几乎每一个C程序都包含输入输出程序都包含输入输出 输入输出是程序中最基本的操作之一输入输出是程序中最基本的操作之一 P67 有关数据输入输出的概念有关数据输入输出的概念 P67 语言本身不提供输入输出语句语言本身不提供输入输出语句 输入和输出操作是由输入和输出
35、操作是由C标准函数库中的函标准函数库中的函 数来实现的数来实现的 printf和和scanf不是语言的关键字,而只不是语言的关键字,而只 是库函数的名字是库函数的名字 putchar、getchar、puts、gets 有关数据输入输出的概念有关数据输入输出的概念 P68 在使用在使用输入输出输入输出函数时,要在程序文件的开函数时,要在程序文件的开 头用预编译指令头用预编译指令 #include 或或 #include stdio.h 3.4.3 用用printf函数输出数据函数输出数据 P68 在在C程序中用来实现输出和输入的,程序中用来实现输出和输入的, 主要是主要是printf函数和函数
36、和scanf函数函数 这两个函数是格式输入输出函数这两个函数是格式输入输出函数 用这两个函数时,必须指定格式用这两个函数时,必须指定格式 3.4.3 用用printf函数输出数据函数输出数据 P69 1. printf函数的一般格式函数的一般格式 printf(格式控制,输出表列)(格式控制,输出表列) 例如:例如: printf(”i=%d,c=%cn”,i,c); 格式声明格式声明 用用printf函数输出数据函数输出数据 P69 1. printf函数的一般格式函数的一般格式 printf(格式控制,输出表列)(格式控制,输出表列) 例如:例如: printf(”i=%d,c=%cn”,
37、i,c); 普通字符普通字符 用用printf函数输出数据函数输出数据 P69 1. printf函数的一般格式函数的一般格式 printf(格式控制,输出表列)(格式控制,输出表列) 例如:例如: printf(”i=%d,c=%cn”,i,c); 可以是常量、变量或表达式可以是常量、变量或表达式 用用printf函数输出数据函数输出数据 P70 2. 常用常用格式字符格式字符 格式符。用来输出一个有符号的十进制格式符。用来输出一个有符号的十进制 整数整数 可以在格式声明中指定输出数据的域宽可以在格式声明中指定输出数据的域宽 printf(”%5d%5dn”,12,-345); %d输出输出
38、int型数据型数据 %ld输出输出long型数据型数据 格式字符:格式字符: 对不同类型的数据用不同的格式字符。常用的对不同类型的数据用不同的格式字符。常用的 有以下几种格式字符:有以下几种格式字符: (1)d格式符。格式符。用来输出十进制整数。用来输出十进制整数。 1)%d, 按整型数据的实际长度输出。按整型数据的实际长度输出。 2)%md, m为指定的输出字段的宽度。为指定的输出字段的宽度。 3)%ld, 输出长整型数据。输出长整型数据。 对对long型数据应当用型数据应当用%ld格式输出。格式输出。 (2)o格式符格式符,以八进制数形式输出整数以八进制数形式输出整数 P73 (3)x格式
39、符格式符,以十六进制数形式输出整数以十六进制数形式输出整数 P73 (4)u格式符,用来输出格式符,用来输出unsigned型数据,即型数据,即 无符号数,以十进制形式输出无符号数,以十进制形式输出 P73 (5)c格式符,用来输出一个字符格式符,用来输出一个字符 P70 printf(“%4d,%4d”,a,b);a=123,b=12345 123,12345 Long a135790; printf(“(“%ld”,a);); 举例举例 P70P73 例例 int a=3,b=4; printf(“%d %dn”,a,b); printf(“a=%d , b=%dn”,a,b); 输出结果
40、输出结果: : 3 4 a=3, b=4 例例 int a=3,b=4; printf(“%d %dn”,a,b); printf(“a=%d , b=%dn”,a,b); 例例 #include void main( ) unsigned int u=65535; printf(“u=%dn”,u); 输出结果:输出结果:u=u=- -1 1 11 11 11 11 11 11 11 11 65535 见见P47及及P45表表3.2 2个字节个字节 (6)s格式符,用来输出一个字符串。有几种用法格式符,用来输出一个字符串。有几种用法: %s。P71 %ms,输出的字符串占,输出的字符串占m列
41、,如字符串本身长度列,如字符串本身长度 大于大于m,则突破则突破m的限制的限制,将字符串全部输出。,将字符串全部输出。 若串长小于若串长小于m,则左补空格,则左补空格。 % ms,若串长小于,若串长小于m,则在,则在m列的范围内,列的范围内,字字 符串向左靠,右补空格。符串向左靠,右补空格。 %m.ns,输出占输出占m列,但只取字符串中左端列,但只取字符串中左端n个字个字 符。这符。这n个字符输出在个字符输出在m列的右侧,左补空格列的右侧,左补空格。 % m.ns,其中,其中m 、n含义同上,含义同上, n个字符输出个字符输出 在在m列的左侧,右补空格。如果列的左侧,右补空格。如果n m,则自
42、动,则自动 取取n值,即保证值,即保证n个字符正常输出。个字符正常输出。 例例:字符串的输出字符串的输出 #include void main( ) printf(“%3s,%7.2s,%.4s,%-5.3sn”, “CHINA”, “CHINA”, “CHINA”, “CHINA”); 输出如下:输出如下: CHINA, CH,CHIN,CHI “%.4s”,及只指定了及只指定了n,没指定没指定m, 自动使自动使m=n=4,故占故占4列。列。 例:字符串的输出。例:字符串的输出。 #include void main( ) printf(“%3sn”, “student” ); printf
43、(“%8.3sn”, “student”); printf(“%.4sn”, “student”); printf(“%-8.3sn”, “student”); 运行结果:运行结果: student stu stud stu 例 - (7)f格式符格式符 P7172 例例:输出实数时的有效位数。输出实数时的有效位数。 #include void main( ) float x,y; x=111111.111;y=222222.222; printf(“%f”,x+y); 运行结果为运行结果为 333333.328125 %f: 不指定字段宽度,由不指定字段宽度,由 系统自动指定,使整系统自动指
44、定,使整 数部分全部如数输出,数部分全部如数输出, 并输出并输出6位小数。位小数。 例例: 输出实数时指定小数位数。输出实数时指定小数位数。 #include void main( ) float f=123.456; printf(“%f%10f%10.2f %.2f %10.2fn”, f,f,f,f,f); %-m.nf与与%m.nf基本基本 相同,只是使输出的数相同,只是使输出的数 值向左端靠,右端值向左端靠,右端 补空格。补空格。 输出结果如下:输出结果如下: 123.456001123.456001 123.46 123.46 123.46 e格式符,以指数形式输出实数。格式符,以
45、指数形式输出实数。P72 %e 不指定输出数据所占的宽度和数字部不指定输出数据所占的宽度和数字部 分小数位数,由系统自动指定给出分小数位数,由系统自动指定给出6位小数,位小数, 指数部分占指数部分占5位,其中“位,其中“ e ”占占1位,指数符位,指数符 号占号占1位,指数占位,指数占3位。数字按规范化指数位。数字按规范化指数 形式输出。形式输出。 不同系统的不同系统的 规定略有不同规定略有不同 %g P73 例如例如: printf(“%e”,123.456); 输出:输出:1.234560e+002 例例: f=123.456 printf(“%e%10e%10.2e %.2e%-10.2
46、e”,f,f,f,f,f); 输出结果:输出结果: 1.234560e+0021.234560e+002 1.23e+0021.23e+0021.23e+002 例如:若例如:若f=123.468 printf(“%f%e%g”,f,f,f); g格式符,用来输出实数,格式符,用来输出实数, 它根据数值的大小,自动选它根据数值的大小,自动选 f格式或格式或e格式(选择输出时格式(选择输出时 占宽度较小的一种),且占宽度较小的一种),且 不输出无意义的零。不输出无意义的零。 以上介绍了以上介绍了9种格式符,种格式符, 归纳如表归纳如表3.6(P74)。 输出如下:输出如下: 123.468000
47、1.234680e+002 123.468 在用在用printf函数输出时,函数输出时, 务必注意数据类型应与务必注意数据类型应与 上述格式说明匹配,上述格式说明匹配, 否则将会出现错误。否则将会出现错误。 3.4.4 用用scanf函数输入数据函数输入数据P75 1. scanf scanf(格式控制,地址表列)(格式控制,地址表列) 含义同含义同printf函数函数 3.4.4 用scanf函数输入数据 1. scanf scanf(格式控制,地址表列)(格式控制,地址表列) 可以是变量的地址,或字可以是变量的地址,或字 符串的首地址符串的首地址 用用scanf函数输入数据函数输入数据 2
48、. scanf 与与printf函数中的格式声明相似函数中的格式声明相似 以开始以开始,以一个格式字符结束,中间以一个格式字符结束,中间 可以插入附加的字符可以插入附加的字符 scanf(a=%f,b=%f,c=%f, 输入数据时不能规定精度输入数据时不能规定精度,例如,例如: scanf(“%7.2f” , 是不合法的。是不合法的。 使用使用scanf函数时应函数时应注意注意的问题的问题 scanf函数中的“格式控制”后面应当函数中的“格式控制”后面应当 是是变量地址变量地址,而不应是,而不应是变量名变量名。 用用scanf函数输入数据函数输入数据 P76 3.使用使用scanf scanf
49、(”%f%f%f”,a,b,c); 错错 scanf(”%f%f%f”, 对对 对于对于 scanf(a=%f,b=%f,c=%f, 1 3 2 错错 a=1,b=3,c=2 对对 a=1 b=3 c=2 错错 使用使用scanf函数时应注意的问题函数时应注意的问题 对于对于scanf(”%c%c%c”, abc 对对 a b c 错错 对于对于scanf(”%d%c%f”, 若输入若输入 1234a123o.26 P77 3.4.5 字符数据的输入输出字符数据的输入输出 P78 1.用用putchar函数输出一个字符函数输出一个字符 从计算机向显示器输出一个字符从计算机向显示器输出一个字符
50、putchar函数的一般形式为函数的一般形式为: putchar(c) 参数参数: c: c为字符常量、变量或表达式为字符常量、变量或表达式 功能:把字符功能:把字符c c输出到显示器上输出到显示器上 C可以是可以是字符字符变量或整型变量变量或整型变量 例3.8 P78 #include int main ( ) char a=B,b=O,c=Y; putchar(a); putchar(b); putchar(c); putchar (n); return 0; 向显示器输出字符向显示器输出字符B 向显示器输出换行符向显示器输出换行符 改为改为int a=66,b=79,c=89; 说明:说