第3章最简单的C程序设计—顺序结构程序设计_第1页
第3章最简单的C程序设计—顺序结构程序设计_第2页
第3章最简单的C程序设计—顺序结构程序设计_第3页
第3章最简单的C程序设计—顺序结构程序设计_第4页
第3章最简单的C程序设计—顺序结构程序设计_第5页
已阅读5页,还剩83页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第3章 最简单的C程序设计顺序结构程序设计3.1 程序的三种结构1966年,Bohra和Jacopini提出了以下三种基本结构:顺序结构、选择结构、循环结构,用这三种基本结构作为表示一个良好算法的基本单元。(1)顺序结构:如右图,虚线框内是一个顺序结构。其中A和B两个框是顺序执行的。即在执行完A框所指定的操作后,必然接着执行B框所指定的操作。顺序结构是最简单的一种基本结构。(2)选择结构:或称分支结构,如下图所示,虚线框内是一个选择结构。此结构中必包含一个判断框。根据给定的条件p是否成立而选择执行A框或B框。(a)请注意: 无论p条件是否成立,只能执行A框或B框之一,不可能既执行A框又执行B框

2、。无论走哪一条路径,在执行完A或B之后,都经过b点,然后脱离本选择结构。A或B两个框中可以有一个是空的,即不执行任何操作,如下图。(b)(3)循环结构:即反复执行某一部分的操作。有两类循环结构。当型(While型)循环结构 直到型(Until型)循环 当型(While型)循环结构如(a)图,它的功能是当给定的条件p1成立时,执行A框操作,执行完A后,再判断条件p1是否成立,如果仍然成立,再执行A框,如此反复执行A框,直到某一次p1条件不成立为止,此时不执行A框,而从b点脱离循环结构。直到型(Until型)循环结构如(b)图,它的功能是先执行A框,然后判断给定的p2条件是否成立,如果p2条件不成

3、立,则再执行A,然后再对p2条件作判断,如果p2条件仍然不成立,又执行A.如此反复执行A,直到给定的p2条件成立为止,此时不再执行A,从b点脱离本循环结构。三种基本结构的共同特点:三种基本结构的共同特点:(1)只有一个入口。 (2)只有一个出口。(请注意:一个菱形判断框有两个出口,而一个选择结构只有一个出口。不要将菱形框的出口和选择结构的出口混淆。)(3)结构内的每一部分都有机会被执行到。(4)结构内不存在“死循环”(无终止的循环)。小小 结结由三种基本结构顺序组成的算法结构,可以解决任何复杂的问题。由基本结构所构成的算法属于“结构化”的算法,它不存在无规律的转向,只在本基本结构内才允许存在分

4、支和向前或向后的跳转。不正确的流程表示:流程内的死循环图中没有一条从入口到出口的路径通过A框扩展扩展 只要具有上述四个特点的都可以作为基本结构。可以自己定义基本结构,并由这些基本结构组成结构化程序。此图符合基本结构的特点 这是一个多分支选择结构,根据表达式的值决定执行路线。虚线框内的结构是一个入口一个出口,并且有上述全部的四个特点。由此构成的算法结构也是结构化的算法。可以认为这是由三种基本结构所派生出来的。3.2 C语句概述C程序程序源程序文件源程序文件1源程序文件源程序文件2源程序文件源程序文件n预处理命令预处理命令函数函数n函数函数1数据声明数据声明函数首部函数首部函数体函数体数据声明数据

5、声明执行语句执行语句C语句:程序的执行部分是由C语句组成的,程序的功能也是由执行语句实现的。 C语句以“;”作分隔符,编译后产生机器指令。一个c程序可以由若干个源程序文件组成;一个源文件可以由若干个函数和预处理命令以及全局变量(第七章)声明部分组成;一个函数由函数首部和函数体组成;函数体由数据声明和执行语句组成。C语句分类:1、控制语句:用于完成一定的控制功能,以实现程序的各种结构方式,它们由特定的语句定义符组成。语言有9种控制语句,可分成以下三类:(1) 条件判断语句 :条件选择语句:if else ; (或 ?:)多分支条件选择语句(开关语句) switch( ) case.; (2) 循

6、环执行语句 :条件循环语句:for ;条件循环(当型)语句:while ;条件循环(直到型)语句:do while ;(3) 转向语句:结束本次循环语句:continue终止循环或switch语句:break无条件转向语句:goto从函数返回语句:return 2、函数调用语句:用于完成一次函数调用。组成:由一次函数调用加“;”构成。其一般形式为:函数名(实际参数表); 执行函数语句就是调用函数体并把实际参数赋予函数定义中的形式参数,然后执行被调函数体中的语句,求取函数值。(在第7章函数中再详细介绍) 例如:printf(“This is a C statement!”);/*调用库函数,输出

7、字符串*/ 3、表达式语句:用于完成一次表达式操作。组成:由一个表达式加“;”构成。其一般形式为: 表达式; 执行表达式语句就是计算表达式的值。例如:x=y+z;/*赋值语句*/ y+z;/*加法运算语句,但计算结果不能保留,无实际意义 */ i+;/*自增1语句,i值增1 */4、空语句:组成:只由一个“;”构成,在程序中空语句可用来作流程的转向点或循环语句中的空循环体。程序执行时空语句不产生任何动作。程序设计中有时需要加一个空语句来表示存在一条语句,但随意加分号也会导致逻辑上的错误,需要慎用。例如: while(getchar()!=n);/*本语句的功能是,只要从键盘输入的字符不是回车则

8、重新输入。这里的循环体为空语句,什么也不做。*/ 5、复合语句:用 括起来的一组语句,完成一些特定的操作功能,语法上和单一语句相同,在程序中应把复合语句看成是单条语句,而不是多条语句。一般形式: 数据说明部分; 执行语句部分; 例如: x=y+z; a=b+c; printf(“%d%d”,x,a);是一条复合语句。复合语句内的各条语句都必须以分号“;”结尾,在括号“”外不能加分号。复合语句可嵌套:例如: void main( ) z=x+y; t=z/100; printf(%f,t); 3.3 赋值表达式和赋值语句3.3.1 赋值表达式1、赋值运算符1)含义:将赋值号“=”右边的运算对象之

9、值赋给左边的运算对象。 格式:变量标识符=表达式 如:x=1; x=x+1;2)使用要点:当“=”两边数据类型不同时,将进行数据类型的自动转换,转换规则:使赋值号右边表达式值自动转换成左边变量的类型。例如:int x; float y=3.5; x=y; /*则运行结果为int型3*/ 例如:int i; i=2.56; /*结果i=2;*/2、复合赋值运算符(自反运算符)1)含义:在赋值运算符“=”之前加上其它运算符构成的运算符。2)一般形式: 表达式1 运算符=表达式2 等价于:表达式1=表达式1 运算符 表达式2 如: a+=3 等价于 a=a+3 x*=3 等价于 x=x*3 x%=3

10、 等价于 x=x%3 x/=y+3 等价于 x=x/(y+3)3)使用要点: 凡是二目(二元)运算符,都可以与“=”组合成复合赋值符。 C语言规定的10种复合赋值运算符如下:+=、- =、*=、/=、%= /*复合算术运算符(5个)*/=、&=、|= 、= /*复合位运算符(5个)*/ 使用复合赋值符的目的:简化程序;提高编译效率。 左侧必须是变量,不能是常量或表达式。 例如:3=x-2*y; a+b=3; 赋值表达式的值与变量值相等,且可嵌套。例例: a=b=c=5 a=(b=5) a=5+(c=6) a=(b=4)+(c=6) a=(b=10)/(c=2)/*表达式值为5,a,b,c值为5

11、*/* b=5;a=5 */*表达式值11,c=6,a=11 */*表达式值10,a=10,b=4,c=6 */*表达式值5,a=5,b=10,c=2 */例例: int a=2; a%=4-1; a+=a*=a-=a*=3; 例例: a=12; a+=a-=a*a/* a=0 等价于a=a+(a=a*(a=a-(a=a*3) */* a=-264 等价于a=a+(a=a-(a*a) */ 赋值转换规则:使赋值号右边表达式值自动转换成其左边变量的类型例例 float f; int i; i=10; f=i;则则 f=10.0例例 int i; i=2.56; /*结果结果i=2*/3、赋值表达

12、式1)含义:由一个赋值运算符将一个变量和表达式连接起来的式子。2)一般形式:变量 = 表达式3)求解过程:赋值运算符按照“右结合”顺序运算,将“=”右边表达式的值赋值给左边的变量。求赋值运算符右侧的“表达式”的值; 赋给赋值运算符左侧的变量。例如:赋值表达式“= 3*5”的值为15,执行表达式后,变量a的值也是15。 注意: 一个表达式应该有一个值 左值 (lvalue):赋值运算符左侧的标识符变量可以作为左值;而表达式就不能作为左值(如a+b);常量也不能作为左值。 右值 (rvalue):出现在赋值运算符右侧的表达式 左值也可以出现在赋值运算符右侧,因而左值 都可以作为右值。4、使用举例1

13、)赋值表达式中的“表达式”,又可以是一个赋值表达式。例如:a=(b=5) 分析:括弧内的“b=5”是一个赋值表达式,它的值等于5。执行表达式“a=(b=5)”相当于执行“b=5”和“ab”两个赋值表达式。 赋值运算符按照“自右而左”的结合顺序,因此,“(b5)”外面的括弧可以不要,即“a=(b=5)”和“a=b=5”等价。a=b=c=3 /*表达式值为3,a,b,c值均为3*/a=5+(c=2)/*表达式值为7,a值为7,c为2*/a=(b=4)+(c=6)/*表达式值为10,a=10,b=4,c=6*/a=(b=10)/(c=2)/*表达式值为5,a=5,b=10,c=2*/请分析下面的赋值

14、表达式(a=3*5)=4*3分析:先执行括弧内的运算,将15赋给a,然后执行4*3的运算,得12,再把12赋给a。最后a的值为12,整个表达式的值为12。可以看到:(a=3*5)出现在赋值运算符的左侧,因此赋值表达式(a=3*5)是左值 。注意:在对赋值表达式(a=3*5)求解后,变量a得到值15执行(a=3*5)=4*3时,实际上是将4*3的积12赋给变量a,而不是赋给3*5。不能写成:a=3*5=4*32)赋值表达式也可以包含复合的赋值运算符。 例如:若a=12,求a+=a-=a*a 分析:此赋值表达式的求解步骤如下 先进行“a-=a*a”的运算, 它相当于=-*,a的值为12-144=-

15、132。再进行“a+=-132”的运算,相当于a=a+(-132),a的值为-132-132=-264。3)将赋值表达式作为表达式的一种,使赋值操作不仅可以出现在赋值语句中,而且可以以表达式形式出现在其他语句(如输出语句、循环语句等)中。例如:printf(%d,a=b);分析:如果b的值为3, 则输出a的值(也是表达式a=b的值)为3。在一个语句中完成了赋值和输出双重功能。3.3.2 赋值过程中的类型转换如果赋值运算符两侧的类型不一致,但都是数值型或字符型时,在赋值时要进行类型转换。1、将浮点型数据(包括单、双精度)赋给整型变量时,舍弃浮点数的小数部分,取整数部分赋给整型变量。 即:int=

16、float的结果为int型。如:i为整型变量,执行“i=3.56”的结果是使的值为,以整数形式存储在整型变量中。如:float a; int s; a=12.34; s=a; 这时s的值为12。2、将整型数据赋给单、双精度浮点型变量时,数值不变,但以浮点数形式存储到变量中。 如:将23赋给float变量f,即执行f=23,先将23转换成23.00000,再存储在f中。即:float=int的结果为float型。 将23赋给double型变量d,即执行d=23,则将23补足有效位数字为23.00000000000000,然后以双精度浮点数形式存储到变量d中。即:double=int的结果为dou

17、ble型。3、将一个double型数据赋给float变量时,截取其前面7位有效数字,存放到float变量的存储单元(4个字节)中。但应注意数值范围不能溢出。 如:float f;double d=123.456789e100;f=d; 就出现溢出的错误。 如果将一个float型数据赋给double变量时,数值不变,有效位数扩展到16位,在内存中以8个字节存储。4、字符型数据赋给整型变量时,由于字符只占1个字节,而整型变量为2个字节,因此将字符数据(8个二进位)放到整型变量存储单元的低8位中:。即: int=char 第一种情况: 如果所用系统将字符处理为无符号的字符类型,或程序已将字符变量定义

18、为unsigned char型,则将字符的8位放到整型变量低8位,高8位补零。例如:将字符376赋给int型变量iunsigned char c; int i; c=376; i=c; 则i的值为254。1 1 1 1 1 1 1 01 1 1 1 1 1 1 01 1 1 1 1 1 1 01 1 1 1 1 1 1 00 0 0 0 0 0 0 00 0 0 0 0 0 0 0 第二种情况: 如果所用系统(如Turbo C)将字符处理为带符号的(即signed char),若字符最高位为0,则整型变量高8位补0;若字符最高位为1,则高8位补1。这称为“符号位扩展”,这样做的目的是使数值保持

19、不变。例如:变量(字符376)以整数形式输出为-2,i的值也是-2。 char c; int i; c=376; i=c; 则i的值为-2。1 1 1 1 1 1 1 11 1 1 1 1 1 1 11 1 1 1 1 1 1 01 1 1 1 1 1 1 01 1 1 1 1 1 1 01 1 1 1 1 1 1 0376代表ASACII为254的那个字符,转换成二进制就为11111110;因为首位为1,所以它为负数。即为:-(1111110)2(补码)转换成原码为:-(0000001+1)2=-(10)2=-2;所以char c=254和char c=-2是一样的5、将一个int、shor

20、t、long型数据赋给一个char型变量时,只将其低8位原封不动地送到char型变量(即截断)。例如:int i=289;char c=a;c=i;赋值情况 :c的值为33, 如果用“%c”输出c,将得到字符“!” (其ASCII码为33)。0 0 0 0 0 0 0 10 0 0 0 0 0 0 10 0 1 0 0 0 0 10 0 1 0 0 0 0 10 0 1 0 0 0 0 10 0 1 0 0 0 0 1i=2896、将带符号的整型数据(int型)赋给long型变量时,要进行符号扩展,将整型数的16位送到long型低16位中: 如果int型数据为正值(符号位为0),则long型变

21、量的高16位补0;如果int型变量为负值(符号位为1),则long型变量的高16位补1,以保持数值不改变。 反之,若将一个long型数据赋给一个int型变量,只将long型数据中低16位原封不动地送到整型变量(即截断)。 7、将signed型数据赋给长度相同的unsigned型变量,按原样照赋(连原有的符号位也作为数值一起传送)。例3.1 有符号数据传送给无符号变量。 #include void main() unsigned a;int b=-1;a=b;printf(%un,); 赋值情况见图P.47 图3-7说明:“%u”是输出无符号数时所用的格式符。如果b为正值,且在032767之间,

22、则赋值后数值不变。运行结果:运行结果:65535655358、将unsigned int型数据赋给long int型变量时,不存在符号扩展问题,只需将高位补即可。将一个unsigned类型数据赋给一个占字节数相同的signed型整型变量(例如:unsigned int int,unsigned longlong,unsigned shortshort),将unsigned型变量的内容原样送到signed型变量中,但如果数据范围超过相应整型的范围,则会出现数据错误。例3.2 unsigned int a=65535; int b; b=a; 此时b的值为-1。(补码)将a整个送到b中,由于b是i

23、nt,第位是符号位,因此b成了负数。根据补码知识可知,b的值为-1,可以用printf(%d,b);来验证。111111111111111111111111111111113.3.3 赋值语句 赋值语句是由赋值表达式再加上分号构成的表达式语句。 其一般形式为: 变量=表达式;赋值语句的功能和特点都与赋值表达式相同。 它是程序中使用最多的语句之一。 在赋值语句的使用中需要注意以下几点:1、由于在赋值符“=”右边的表达式也可以又是一个赋值表达式,因此,下述形式 变量=(变量=表达式); 是成立的,从而形成嵌套的情形。其扩展之后的一般形式为: 变量=变量=表达式;例如:a=b=c=d=e=5;按照赋

24、值运算符的右结合性,因此实际上等效于:e=5;d=e;c=d;b=c;a=b;2、注意在变量说明中给变量赋初值和赋值语句的区别:给变量赋初值是变量说明的一部分,赋初值后的变量与其后的其它同类变量之间仍必须用逗号间隔,而赋值语句则必须用分号结尾。3、在变量说明中,不允许连续给多个变量赋初值。 如说明int a=b=c=5是错误的,必须写为int a=5,b=5,c=5; 而赋值语句允许连续赋值。4、注意赋值表达式和赋值语句的区别:赋值表达式是一种表达式,它可以出现在任何允许表达式出现的地方,而赋值语句则不能。如:语句if(x=y+5)0) z=x;是合法的,语句的功能是,若表达式x=y+5大于0

25、则z=x。如:语句if(x=y+5;)0) z=x;是非法的,因为x=y+5;是语句,不能出现在表达式中。 5、条件中不能含有赋值符号,但是赋值表达式可以包含于条件表达式中例: if(a=b) t=a;错误 if(a=b)0) t=a; 正确问题:c语言中的赋值语句于其他高级语言的赋值语句有什么不同点?1)C语言中的赋值号“=”是一个运算符,在其他大多数语言中赋值号不是运算。2)其他大多数高级语言没有“赋值表达式”这一概念。3.3.4 变量赋初值 1、语言允许在定义变量的同时使变量初始化。如:int a=3; /*指定为整型变量,初值为*/ float f=3.56;/* 指定为浮点型变量,初

26、值为.56 */ char c= a;/* 指定为字符变量,初值为a*/ 2、可以使被定义的变量的一部分赋初值。 如:int a,b,c=5;表示指定、为整型变量,但只对初始化,c的初值为3、如果对几个变量赋以同一个初值,如:表示、的初值都是,应写成:int a=3,b=3,c=3; 不能写成:int a=b=c=3;注意:初始化不是在编译阶段完成的而是在程序运行时执行本函数时赋初值的,相当于有一个赋值语句。3.4 数据输入输出的概念及在c语言中的实现1、所谓输入输出是以计算机主机为主体而言的。输入:从输入设备(键盘,鼠标,扫描仪)向计算机 输入数据。输出:从计算机向外部输出设备(显示器,打印

27、机) 输出数据。2、C语言本身不提供输入输出语句,输入和输出操作是由C函数库中的函数来实现的。例如:字符输入函数:getchar 字符输出函数:putchar格式输入函数:scanf 格式输出函数:printf字符串输入函数:gets 字符串输出函数:puts3、在使用系统库函数时,要用预编译命令“#include”将有关的“头文件”包括到用户源文件中。例如:在调用标准输入输出库函数时,文件开头应该有: #include 或: #include “stdio.h”头文件头文件3.5 字符数据的输入输出3.5.1 单个字符的输出putchar()函数功能:将一个字符输出到标准输出设备。格式:pu

28、tchar(c)使用要点:vputchar(c)中的c可以是字符型或整型数据; c=98; putchar(c) 输出字符b putchar(a) 输出字符a putchar(0 x41) 输出字符Av使用输出函数需要调用c的标准I/O库函数,故需用预编译命令:#include 或#include“stdio.h” 将stdio.h头文件(.h)包含在用户源程序文件中;vputchar()也可以输出一个控制字符或其它转义字符。 如:putchar(n)输出一个换行符 putchar(101) 输出字符A putchar() 输出字符单引号例3.3 输出单个字符。#includevoid mai

29、n()char a,b,c;a=B;b=O;c=Y;putchar(a);putchar(b);putchar(c);putchar(n);运行结果:BOY运行结果:B O Y3.5.2 单个字符的输入getchar()函数功能:从标准输入设备上读入一个字符。格式:getchar( )使用要点:vgetchar( )函数本身没有参数,其函数值就是从输入设备得到的一个字符;v由getchar( )获得的字符可以赋值给一个字符或整型变量,也可以作为表达式的一部分; 如: c=getchar( ); putchar(getchar( ); printf(“%c”, getchar( );v使用get

30、char( )函数要调用c的标准I/O库函数,应在程序首部加上编译预处理命令:#include “stdio.h”或#include例3.4 输入单个字符。#include void main() char c; c=getchar(); printf(“%cn%dn”,c,c); /*putchar(c)*/ 运行程序:输入 a 输出 a 973.6-3.7 格式输入与输出一、格式输出printf函数1、功能:按指定的格式向终端输出若干任意类型的数据。2、格式:printf(格式控制参数,输出表列) 如:printf(“x=%d”,x) 格式控制参数:包含两种信息v格式说明: %修饰符格式字

31、符,用于指定输出格式。v普通字符或转义序列:原样输出 输出表列:要输出的数据,可以是合法的常量、变量和表达式, (可以没有,多个时以“,”分隔)格式字符v当格式字符个数少于输出项时,多余的输出项不予输出。v若格式字符多于输出项时,各系统的处理有所不同,TC对于缺少的项将输出不定值。vprintf( )函数的格式控制字符格式控制字符是用双引号括起来的字符串,用来确定输出项的格式和需要原样输出的字符串。其组成形式为: “普通字符串 % 0 m .n l 格式控制字符”“普通字符串 % 0 m .n l 格式控制字符”其中:? 输出数据项的顺序一般按从左至右的顺序输出。格式控制中的普通字符串,照原样

32、输出; 如:printf(“a= %d,b= %d”,a,b);? %:为C语言规定的标记符;? :指定输出数据的对齐方式:+为右对齐(可缺省);-为左对齐;? 0:指定输出的数据中不使用的位置是否填数字“0”printf( )函数的附加格式说明符(修饰符):修饰符修饰符功功 能能m输出数据域宽,数据长度m,左补空格;否则按实际输出.n对实数,指定小数点后位数(四舍五入)对字符串,指定实际输出位数-输出数据在域内左对齐(缺省右对齐)+指定在有符号数的正数前显示正号(+)0输出数值时指定左面不使用的空位置自动填0#在八进制和十六进制数前显示前导0,0 xl或或L在d,o,x,u前,指定输出精度为

33、long型在e,f,g前,指定输出精度为double型printf( )函数的格式控制字符:格式控制字符用于指定数据的输出形式,可以包含转义字符。d,ix,Xoucse,Efg,G%十六进制无符号整数十六进制无符号整数不带符号十进制整数不带符号十进制整数十进制整数十进制整数指数形式浮点小数指数形式浮点小数单一字符单一字符字符串字符串八进制无符号整数八进制无符号整数小数形式浮点小数小数形式浮点小数e和和f中较短一种中较短一种百分号本身百分号本身int a=567;printf ( “%d”,a);int a=255;printf(“%x”,a);int a=65;printf(“%o”,a);i

34、nt a=567;printf(“%u”,a);char a=65;printf(“%c”,a);printf(“%s”,“ABC”);float a=567.789;printf(“%e”,a);float a=567.789;printf(“%f”,a);float a=567.789;printf(“%g”,a);printf(“%”);用两个连续的用两个连续的“%”表示输出字符表示输出字符“%”。567ff101567AABC5.677890e+02567.789000567.789%(1)格式符:用来输出十进制整数。 %d:按十进制整型数据的实际长度输出。 %md:m为指定的输出字段

35、的宽度。如果数据的位数小于m,则左端补以空格,若大于m,则按实际位数输出。例:printf(“%4d,%4d”,a,b); 若a=123,b=12345 则输出为:123,12345 ld:输出长整型数据。例:long a=135790; /* 定义a为长整型变量*/printf(“%ld”,a); 长整型数据应采用%ld格式输出,若采用%d格式则出错。(2)o格式符:以八进制整数形式输出。输出的数值不带符号,符号位也一起作为八进制数的一部分输出。例:int a=-1; printf(“%d,%o”,a,a); -1在内存单元中的存放形式(以补码形式存放)如下: 111111111111111

36、1则输出为:-1,177777不会输出带负号的八进制整数。长整型数(long型)据用%lo格式输出,也可以指定字段宽度。如:printf(“%lo,%8o”,a,a);(3)格式符:以十六进制数形式输出整数。同样不会出现负的十六进制数。例:int a=-1; printf(“%x,%o,%d”,a,a,a); 输出结果为:ffff,177777,-1 同样,也可以用%lx输出长整型数据或指出输出宽度。 如:printf(“%lx,%12x”,a,a)(4)u格式符:用来输出unsigned型数据。一个有符号整数(int型)也可以用u格式输出;一个unsigned型数据也可以用d格式输出;uns

37、igned型数据也可用o或x格式输出。例3.9 无符号数据的输出。#includevoid main() unsigned int a=65535;int b=-2; printf(“a=%d,%o,%x,%un”,a,a,a,a); printf(“b=%d,%o,%x,%un”,b,b,b,b);运运行行结结果:果:a=-1a=-1,177777177777,ffffffff,6553565535b=-2b=-2,177776177776,fffefffe,6553465534(5)c格式符:用来输出一个字符。例:char d=a; printf(“%c”,d); 输出字符a.一个整数,只

38、要它的值在0255范围内,可以用“c”使之按字符形式输出,在输出前,系统会将该整数作为ASCII码转换成相应的字符;一个字符数据也可以用整数形式输出。例3.5 字符数据的输出。#includevoid main() char c=a; int i=97; printf(“%c,%dn”,c,c); printf(“%c,%dn”,i,i);运行结果:a,97a,97若指定输出字数的宽度,若指定输出字数的宽度,printf(“%3c”,c);则输出:则输出: a(6)s格式符:输出字符串。 s:例:printf(“%s”, “ CHINA”); 输出字符串“CHINA”(不包括双引号)。 %ms

39、:输出的字符串占m列,若串长大于m,则全部输出,若串长小于m,则左补空格。 %-ms:若串长小于m,字符串向左靠,右补空格。 %m. ns:输出占m列,只取字符串中左端n个字符,输出在m列的右侧,左补空格。 %-m.ns:n个字符输出在m列的左侧,右补空格,若nm,m自动取n值。例3.10 字符串的输出。#includevoid main() printf(“%3s,%7.2s,%.4s,%-5.3sn”, “CHINA”, “CHINA”, “CHINA”, “CHINA”); 运行结果:CHINA, CH,CHIN,CHI (7)f格式符:用来以小数形式输出实数(包括单双精度)有以下几种用

40、法:%f:不指定字段宽度,由系统自动指定字段宽度,使整数部分全部输出,并输出位小数。应当注意,在输出的数字中并非全部数字都是有效数字。单精度实数的有效位数一般为位。%m.nf:指定输出的数据共占列,其中有位小数。如果数值长度小于,则左端补空格。%-m.nf:与% m.nf基本相同,只是使输出的数值向左端靠,右端补空格。 例3.6 输出实数时的有效位数。#include void main() float,; x=111111.111;y=222222.222; printf(“%f”,x+y); 例3.7 输出双精度数时的有效位数。#include void main() double x,y

41、; x=1111111111111.111111111; y=2222222222222.222222222; printf(“%f”,x+y);运行结果:333333.328125运行结果: 3333333333333.3330103333333333333.333010 例3.11 输出实数时指定小数位数。#include void main() float f=123.456; printf(“%f %10f %10.2f %.2f %-10.2fn”,f,f,f,f,f);运行结果:123.456001123.456001 123.456001123.456001 123.46123.

42、46 123.46123.46 123.46123.46 (8)e格式符:以指数形式输出实数。可用以下形式: e:不指定输出数据所占的宽度和数字部分的小数位数。例: printf(“%e”,123.456);输出: 6列 5列所输出的实数共占列宽度。(注:不同系统的规定略有不同) m.ne和-m.ne:m、n和“-”字符的含义与前相同。 此处n指拟输出的数据的小数部分(又称尾数)的小数位数。 若f=123.456,则:printf(%e %10e %10.2e %.2e %-10.2e,f,f,f,f,f); 输出如下:1.234560e+002 1.234560e+002 1.23e+002

43、 1.23e+002 1.23e+002 13列 13列 10列 9列 10列说明说明:未指定未指定n,自动使,自动使n=6。超过给定的超过给定的10列,乃突破列,乃突破10列的限制,按实际长度输出。列的限制,按实际长度输出。第第3个数据共占个数据共占10列,只指定列,只指定n=2,小数部分占,小数部分占2列。未指定列。未指定m,自动使,自动使m等于数据应占的长度。等于数据应占的长度。第第5个数据应占个数据应占10列,数值只有列,数值只有9列,由于是列,由于是“%-10.2e”,数,数值向左靠,右补一个空格。值向左靠,右补一个空格。(注:有的注:有的C系统的输出格式与此略有不同系统的输出格式与

44、此略有不同) (9)g格式符:用来输出实数。 它根据数值的大小,自动选f格式或e格式(选择输出时占宽度较小的一种),且不输出无意义的零。例:若f=123.468,则printf(“%f %e %g”,f,f,f); 输出如下:123.468000 1.234680e+002 123.468 10列 13列 10列说明说明:用用%f格式输出占格式输出占10列,用列,用%e格式输出占格式输出占13列,用列,用%g格式时,格式时,自动从上面两种格式中选择短者(今以自动从上面两种格式中选择短者(今以%f格式为短)故占格式为短)故占10列,列,并按并按%f格式用小数形式输出,最后格式用小数形式输出,最后

45、3个小数位为无意义的,个小数位为无意义的,不输出,因此输出不输出,因此输出123.468,然后右补,然后右补3个空格。个空格。%g格式用得格式用得较少。较少。说明:? 除了X,E,G外,其他各式字符必须用小写。? 可以在printf函数中的“格式控制”字符串中包含转义字符。? 一个格式说明必须以“%”开头,以9个格式字符之一为结束,中间可以插入附加格式字符。? 想输出%,则应该在格式控制字符串中用连续两个%表示。例 int a=1234; float f=123.456; char ch=a; printf(“%8d,%2dn”,a,a); printf(“%f,%8f,%8.1f,%.2f,

46、%.2en”,f,f,f,f,f); printf(“%3cn”,ch);运运行行 1234,12341234,1234结结果:果: 123.456001,123.456001,123.456001,123.456001, 123.5,123.46,1.23e+02123.5,123.46,1.23e+02 a a例:m.n2 static char a =“Hello,world!” printf(“%sn%15sn%10.5sn%2.5sn%.3sn”,a,a,a,a,a);运运行行结结果:果:Hello,world!Hello,world! Hello,worldHello,world!

47、 ! HelloHello Hello Hello Hel Hel 例:m.n1例 -例 int a=1234; float f=123.456; static char c =“Hello,world!”; printf(“%8d,%-8dn”,a,a); printf(“%10.2f,%-10.1fn”,f,f); printf(“%10.5s,%-10.3sn”,c,c);运行结果: 1234,1234 123,46 ,123. 5 Hel lo ,Hel 例 int a=1234; float f=123.456; printf(“%08dn”,a); printf(“%010.2fn

48、”,f); printf(“%0+8dn”,a); printf(“%0+10.2fn”,f); 例 0 、+例 int a=123; printf(“%o,%#o,%X,%#Xn”,a,a,a,a); 例 #例 long a=65536; printf(“%ld,%8ldn”,a, a); 例 l/*00001234*/*0000123. 46*/* + 0001234*/*+ 000123. 46*/*173,0173,7B,0X7B*/*65536, 65536*/二、格式化输入 scanf函数1、格式: scanf(“格式控制串”,输入项地址表)说明:输入项地址表由若干个地址组成,代表

49、每一个变量在内存的地址(或数组与字符串的首地址)。表示为:&变量(&为取地址运算符)每次调用scanf( )函数后,函数将得到一个整型函数值,此值等于正常输入数据的个数。2、功能:按指定格式从键盘读入数据,存入地址表指定的存储单元中,并按回车键结束。例:scanf(“%d”,&a); 输入:10 则 a=10例:scanf(“%x”,&a); 输入:11 则 a=173、格式控制参数v(1)格式说明项:“% * m l或h 格式控制字符” 格式控制的含义同printf函数,“%格式控制字符” 中格式字符有:d,o,x,u,c,s,e,f。v(2) 输入分隔符的指定:?一般以空格、TAB或回车键

50、作为分隔符。?其它字符做分隔符:格式串中两个格式符间的字符。例例 scanf(“%d%o%x”,&a,&b,&cscanf(“%d%o%x”,&a,&b,&c);); printf(“a printf(“a=%d,b=%d,c=%dn”,a,b,c);=%d,b=%d,c=%dn”,a,b,c); 输入输入 123 123123123123123 输出输出 a=123,b=83,c=291a=123,b=83,c=291例例 scanf(“%d:%d:%d”,&h,&m,&sscanf(“%d:%d:%d”,&h,&m,&s);); 输入输入 12:30:45 12:30:45 则则12 12

51、 h, 30 h, 30 m, 45 m, 45 s s例例 scanf(“%d,%d”,&a,&bscanf(“%d,%d”,&a,&b) ) 输入输入 3,4 3,4 则则3 3a, 4 a, 4 b b例例 scanf(“ascanf(“a=%d,b=%d,c=%d”,&a,&b,&c);=%d,b=%d,c=%d”,&a,&b,&c); 输入输入 a=12,b=24,c=36 a=12,b=24,c=36 v(3)抑制字符*:指定输入项读入后不赋给变量。例: scanf(“%2d%*2d%3d”,&num1,&num2); printf(num1=%d,num2=%dn,num1,num2); 假设输入“123456789”,则系统将读取“12”并赋值给num1;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论