,Edit Master title,Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,共,25,页 第,*,页,数据的输入和输出,C,语言程序设计,第四章,1,本章要点,掌握,C,语言中输入输出数据的方法,掌握各种格式的使用,2,数据输入输出的概念,输出:从计算机向显示器、打印机等外部设备输出数据。,输入:从标准输入设备键盘、鼠标等向计算机输入数据。,C语言不提供输入输出语句,输入输出操作是由C函数库中的函数实现。,两个基本的输出,(,输入,),函数:,即:格式输出,(,输入,),函数,字符输出,(,输入,),函数,3,4.1.1,格式输出函数,函数的基本功能,格式:,printf,(,格式控制串,输出表列),功能:从标准输出设备上,按指定的格式输出对应,的变量。,printf(.),4.1,数据输出,2.,函数说明,:,(1),格式控制串由双引号括起来,由“,%,”,和格式符以及,普通字符(即需要原样输出的字符组成)。,(2),输出表列是需要输出的一些数据,可以是常量、变量或表达式。,(3),输出的参数必须与格式控制符中的格式说明在类型、个数和位置上一一对应。,4,例,:,#include ,main( ),int,a=3, b=4;,printf(“a,=,%d,b=,%d,”,a,b,);,运行结果,:,a=3 b=4,格式说明,(,格式字符,),普通字符,输出表列,5,3.,格式说明符,一般格式,:%-,m.nl,格式符,说明如下,:,-,当数据的宽度小于显示宽度时,数据,左对齐,右方补空格,.,m,输出数据占,m,个字符位,不够,右对齐,,左边填空格。,n,输出数据有,n,位小数,m.n,输出数据占,m,列,,n,位小数,对不同类型的数据使用不同的格式字符。有以下几种格式符:,6,d,:,以,十进制,带符号形式输出整型数,o,:以,八进制,无符号形式输出整型数,x,:以,十六进制,无符号形式输出整型,u,:以十进制,无符号,形式输出整型数,f,:以,小数形式,输出单、双精度实型数,e:,以,指数形式,输出单、双精度实型数,c:,以,字符形式,输出一个,字符,s:,以,字符形式,输出一个,字符串,ld:,以十进制带符号形式输出,长整型数,基本格式控制符,7,(1),d,格式符,:,输出十进制整数。,%d,按整型数据的实际长度输出。,%,md,m,为指定的输出字段的宽度,.,若数据的位数小于,m,则左端补以空格,;,若大于,m,则按实际位数输出。,%ld,输出长整型数据,.,例,:,int,a=1234;,printf(“%3d”,a);,printf,(“%5d,n”,a);,printf(“%-5d”,a);,1234,1234,实际 左补空,1234,左对齐,右补空,8,以下程序运行后的输出结果是?,main(),int x,y,z;,x=y=1;,z=x+,y+,+y;,printf(%d,%d,%d,x,y,z);,A)2,3,3 B)2,3,2 C)2,3,1 D)2,2,1,9,(2),o,格式符,以八进制数形式输出整数。,将内存单元中的各位的值,(0,或,1),按八进制形式输出,输出的数值不带符号,将符号也作为八进制数的一部分输出。,例如,-1,在内存单元中,(,以补码形式存放,),如下,:,int,a=-1; -1,:,printf(“%d,%o”,a,a,);,输出,:,1 1 11 11 11 11 11 11 11,VC+,下,-1,177777,10,(3),x,格式符,以十六进制数形式输出整数。,(4),u,格式符,以十进制形式输出无符号型数据。,例,#include ,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=-1,177777,ffff,65535,b=-2,177776,fffe,65534,VC+,下,11,(5),c,格式符,输出一个字符。,整数的值在,33,126,范围内,也可以用字符形式输出。在输出前,将该整数转换成相应的,ASCII,字符,;,字符数据也可以用整数形式输出。,例,#include ,main( ),char c=a;,int,i=97;,printf(%c,%dn,c,c,);,printf(%c,%dn,i,i,);,输出,: a,97,a,97,12,s,格式符,输出一个字符串。,说明:,若不指定字符宽度和对齐方式,则输出全部字符串,.,例如,:,printf(,%s,CHINA,);,程序运行输出:,CHINA,若指定宽度,m,,实际字符个数大于,m,按实际宽度输出,;,如果实际字符个数小于,m,字符右对齐,左边填空格。,例如,:,printf(,“s1=,%s,s2=%3s,s3=%-5.2s,s4=%.3s,abcd, ,abcd, ,abcd, ,abcd,) ;,程序运行输出:,s1=abcd,s2=abcd,s3=,ab,s4=,abc,13,(7),f,格式符,以小数形式输出实数,(,包括单、双精度,),。,1),%f,不指定字段宽度,由系统自动指定,使整数部分全部输出,并输出,6,位小数(输出双精度数据,也是,6,位,但误差降低)。,2),%,m.nf,指定输出的数据共占,m,列,其中有,n,位小数,.,若数据长度小于,m,则左端补空格。,例:,float x=15.3,y=222.225111;,printf(“%f,%6.2fn”,x,y);,14,(8),e,格式,以指数形式输出实数。,1),%,e,不指定输出数据所占的宽度和数字部分小数位数,由系统自动指定给出,6位小数,指数部分占,5位,其中,“,e”,占一位,指数,符号占一位,指数,占3位,.数值按标准化指数形式输出,(,小数点前有,1,位非零数字)。,例如:,printf(“%e”,123.456);,输出,:1.234560e+002,e,格式输出的实数共占,13,列宽度,.,3位,6位,15,g,格式符,:,根据数值的大小输出实数,自动选,f,格式或,e,格式,(,选择输出时占宽度较小的一种,),且不输出无意义的零。,例如:,f=123.468,;,printf(“%f,%e %g”,f,f,f);,输出如下,:,123.468000 1.234680e+002 123.468,10,列,13,列,10,列,16,几点说明:,1.,格式控制串的控制符号与变量表要一一对应,即:,类型相同,,,个数相等,2.,格式控制符号用小写字母,3.,格式控制符号之外的符号均照原样显示,4.,若需显示百分号,格式为:,%,5.,如果实际数据所占字符位大于指定的域宽,,按实际输出,17,例,:,分析程序的执行结果,main( ),int,a=16;char e=,A,;,unsigned b;,long c;,float d;,b=65535;c=123456;d=123.45;,printf(,”,a,=%d,%4d,%-6d,c=%ldn,”, a, a, a, c);,printf(,”,%o, %x, %,un,”, b, b, b);,printf(,”,%f, %e, %13.3e, %gn,”, d, d, d, d);,printf(,”,%c,%s,%7.3sn,”,e,”,China,”,”,Beijing,”,);,这里,7,指输出宽度,,3,表示输出该字符串的前,3,个字符。,18,4.1.2,字符输出函数,格式:,putchar,(,字符变量),功能 :在标准输出设备上,输出指定的字符。,说明,:,putchar,* 一次调用只能输出,一个字符,* 加上分号成为,字符输出语句,* 使用时在程序开头用编译预处理命令,#,include”stdio.h,”,或,:,#include,编译预处理,头文件,请详见附录,E,19,例,:#include ,main( ),char,a,b,c,;,a=,B;b,=,O;c,=Y;,putchar(a);putchar(b);putchar(c,);,输出:,BOY,注意:头文件声明不可少!,20,#,include,main( ), char c=,a,;,putchar,( c);,思考,怎样输出多个字符?,多个字符怎样排列?,char c1,,,c2,c3;,c1,=,a,;c2=,b,;c3=,c,;,putchar(c1);,putchar(c2);,putchar(c3);,a,b,c,abc,putchar(,n,);,例,与,putchar(97);putchar(98);,putchar(99);,等效,与,printf(“%c%c%c”,c1,c2,c3);,等效,char c1,,,c2,c3;,c1,=,a,;c2=,b,;c3=,c,;,putchar(c1);,putchar(,n,);,putchar(c2);,putchar(,n,);,putchar(c3);,21,4.2.1,格式输入函数,一般形式,:,scanf,(,格式控制字符串,地址表列,),“,格式控制字符串,”,的含义同,printf,函数,“,地址表列,”,:要求是,变量的地址,或字符串的首地址,.,例如,:,int,a,b,c;,scanf(,“,%d%d%d,”,&,a,&,b,&,c,);,说明:,*,scanf,函数中的,“,格式控制,”,后面应当是,变量地址,而不是变量名。,*,输入数据时,在两个数据之间以,一个,或,多个空格,间隔,也可以用,回车,键,、,跳格键,tab,分隔,。,4.2,数据的输入,22,*,输入时可以指定域宽,不允许规定精度,.,int,a,b,;,scanf,(“%3d,%3d,”,&a,&b,);,float x;,scanf(“%8.2f ”,*,输入,时,遇下列情况结束,* 回车,空格,* 宽度结束,* 非法输入,输入,123456,系统自动将,123,赋给,a,456,赋给,b,如:,int,k;,scanf(“%,3d,”,输入:,123456789,k,为:,123,例:,main( ),int,a ,b,c,;,scanf(%d%d%d,&a,&b,&c,),;,printf(%d,%d ,%,dn,a,b,c,),;,以下三种数据输入方法都可以:,12,15,16, 12,1516, 12(,按,tab,键,)15,16,23,* 格式控制字符串中若包含,普通字符,,则输入时必须照原样输入普通字符,否则将导致输入结束。,如:,int,a,b,c,;,scanf(,“,%d,%d,%d,”,&,a,&b,&c,);,输入:,1,2,3,*,数值型数据和字符型数据混合输入方法,main(),int,a,b,c,d,e,;,scanf(,“,%d%c%c%c%d,”,&a,&b,&c,&d,&e,);,printf(,“,a,=%,d,b,=%,c,c,=%,c,d,=%,c,e,=%,d,”,a,b,c,d,e,);,输入:,123,a,b,c,789,输出:,a=123,b=,a,c,=,b,d,=,c,e,=789,注意格式说明符以外的其他字符,24,*在用“,%c”,格式输入字符时,空格字符和“转义字符”都作为有效字符输入,.,如,,scanf(%c%c%c,&a,&b,&c,);,输入:,x,yz,x,字符赋给,a,空格字符赋给,b, y,字符赋给,c,25,输入,double,型数据,必须用格式说明符,%lf,或,%le,,,输入,long,型数据,必须用,%ld,。,标准,C,在,scanf,中不使用,%u,说明符,对,unsigned,型数据,以,%d,或,%o,、,%x,格式,输入。,%,后的,“,*,”,为附加说明符,用来表示跳过它对应的数据。,输入时格式控制符中不能加,“,n,”,。,在,scanf,函数的格式控制字符串中尽量不要出现普通字符,尤其不能将输入提示放在其中。需要显示输入提示应该调用,printf,函数实现。,提示注意:,26,例:,double,a;,int,b;,float,c;,scanf,(,%f,%,2d,%*d,%5f,&,a,&b,&,c,);,printf(,%f,%,d,%f,a,b,c,);,输入:,5.3,12,456,1.23456,回车,结果:,a=0.000000,b=12,c=1.234000,原因是格式符用错了,.,应该用,lf,或,le,格式,这里必须用,%lf,格式,这里可以用,%f,格式或,%lf,格式,27,#include ,main(),int,a; float b,c;,scanf(“%,2,d%,3,f%,4,f”,printf(“a,=%d,b=%f,c=%fn”,a,b,c);,输入:,12345678987654321,输出,?,a=12,b=345.000000,c=6789.000000,例,:,28,4.2. 2,getchar,函数,(,字符输入函数,),一般形式:,getchar,( ),-,没有参数,功能:从键盘输入一个字符。,说明:,1,)只能输入一个字符,2,)可以将获得的字符赋给,int,型或,char,型的变量,例,#include ,main(),char c;,c=,getchar,( );,putchar(c,);,运行时键入字符,a,必须要回车,则输出为:,a,注意:输入字符时不要带撇号,29,例:从键盘读入一个字符,将该字符及其它前、后字符输出到显示器。,#include,stdio.h,main(),int,c;,c=,getchar,();,putchar(c-1);putchar(c);putchar(c+1);,不要丢掉头文件,30,#include main() char,a,b,c,d,;,scanf(“%c%c”,&a,&b,); c=,getchar,(); d=,getchar,();,printf(“%c%c%c%cn”,a,b,c,d,);,当执行程序时,按下列方式输入数据:,12,34,则输出结果是,A) 1234 B) 12 C)12 D) 12,3 34,练习:,31,程序举例,例,:,输入三角形的三边长,求三角形面积,.,为简单起见,设输入的三边长,a,b,c,能构成三角形,.,#include,math.h,main(),float a,b,c,s,area;,scanf(,%f,%f,%f,&a,&b,&c,);,s=1.0/2*(a+b+c);,area=,sqrt(s,*(s-a)*(s-b)*(s-c);,printf(,a,=%7.2f, b=%7.2f, c=%7.2f, s=%7.2fn,a,b,c,s);,printf(,area,=%7.2fn,area);,输入,:3,4,6,输出如下,:,a= 3.00, b= 4.00, c= 6.00, s= 6.50,area= 5.33,注意:此例调用了函数库中的函数,sqrt,,,必须在程序开头加上,include,命令,把头文件“,math.h”,包含到程序中。,32,本章学习要点,1.,格式输入函数,:,scanf,格式输出函数,:,printf,,,常用格式:,%d, %f, %s, %c ,%o, %ld,2.,scanf,函数中的“格式控制”后面是,变量地址,而不是变量名,.,3.,putchar,函数(字符输出函数),4.,getchar,函数,(,字符输入函数,),地址,精度,域宽,注意,:,33,