第1章(3)标准输入输出为了让计算机处理各种数据,首先就应该把源数据输入到计算机中;计算机处理结束后,再将目标数据信息以人能够识别的方式输出。C语言中的输入输出操作,是由C语言编译系统提供的库函数来实现。格式化输出——printf()函数格式化输入——scanf()函数字符数据输入输出(补充内容)顺序结构程序设计格式化输出——printf()函数printf()函数的作用:向计算机系统默认的输出设备(一般指终端或显示器)输出一个或多个任意类型的数据。一、printf()函数的一般格式[案例1]已知圆半径radius=1.5,求圆周长和圆面积。voidmain(){floatradius,length,area,PI=3.1415926;radius=1.5;length=2*PI*radius;/*求圆周长*/area=PI*radius*radius;/*求圆面积*/printf(“radius=%f\n”,radius);printf(“length=%7.2f,area=%7.2f\n”,length,area);}程序运行结果如下:radius=1.500000length=9.42,area=7.07#definePI3.1415926printf()函数的一般格式如下:printf(“格式控制”[,输出项列]);1.格式控制“格式控制”是用双引号括起来的字符序列,包括:格式指示符、转义字符、普通字符(1)转义字符(2)普通字符──除格式指示符和转义字符之外的其它字符。格式字符串中的普通字符,原样输出。例如:printf(radius=%f\n,radius);printf(length=%7.2f,area=%7.2f\n,length,area);(3)格式指示符格式指示符由“%”和格式字符组成,如%d、%f等。printf格式字符格式字符含义%d(或%i)输出带符号的十进制整数%x(或%X)输出无符号十六进制整数(不输出前导符0x)%o输出无符号八进制整数(不输出前导符0)%u输出无符号十进制整数%f输出十进制实数(隐含输出6位小数)%e(或%E)以指数形式输出实数(隐含输出6位小数)%g(或%G)自动选用%f或%e格式中输出宽度较短的一种格式输出实数,不输出无意义的0%c输出单个字符%s输出字符串%%输出%inta=123,b=-1;floatx=12.34;charch=65;printf(a=%d,b=%d,a,b);printf(a=%X,b=%x,a,b);printf(a=%o,b=%o,a,b);printf(a=%u,b=%u,a,b);printf(x=%f,x);printf(x=%e,x);printf(x=%g,x);printf(%f%%,1.0/3);printf(ch=%c,ch);printf(str=%s,IloveChina!);输出结果:a=123,b=-1输出结果:a=7B,b=ffff输出结果:a=173,b=177777输出结果:a=123,b=65535输出结果:x=12.340000输出结果:x=1.234000e+001输出结果:x=12.34输出结果:0.333333%输出结果:ch=A输出结果:str=IloveChina!-1、123在内存中的存储:-1原码:1000000000000001-1补码:1111111111111111123:0000000001111011另外,格式控制字符中,在“%”和其后的格式字符之间,还可以插入附加的格式说明符。附加格式说明符含义字母h用于输出短整型数据,可加在格式符d、o、x、u前面字母l用于输出长整型数据或double型数据,可加在格式符d、o、x、u、f、e(或E)、g(或G)前面m(代表一个正整数)输出数据的最小宽度,如果数据的实际宽度超过m,则按实际宽度输出;如果小于m,则补空格.n(代表一个正整数)对于实数,表示输出n位小数;对于字符串,表示截取的字符个数-(负号)输出的数据或字符在域内向左对齐inta=123;floatx=12.345;printf(a=%5d,a);printf(a=%2d,a);printf(a=%-5X,a);printf(x=%7.2f,x);printf(x=%.2f,x);printf(x=%10.2e,x);printf(x=%2E,x);printf(str=%5.3s,Computer);printf(str=%3s,Computer);输出结果:a=__123(_表示空格)输出结果:a=123输出结果:a=7B___输出结果:x=__12.35输出结果:x=12.35输出结果:x=_1.23e+001输出结果:x=1.234500E+001输出结果:str=__Com输出结果:str=Computer2.输出项表输出项表是可选的。如果要输出的数据不止1个,相邻2个之间用逗号分开。下面的printf()函数都是合法的:(1)printf(Iamastudent.\n);(2)printf(%d,3+2);(3)printf(a=%fb=%5d\n,a,a+3);必须强调:“格式字符串”中的格式指示符,必须与“输出项表”中、输出项的数据类型一致,否则会引起输出错误。printf(week=n/7,day=n%7\n);printf(week=%d,day=%d\n,n/7,n%7);二、使用说明(1)printf()可以输出常量、变量和表达式的值。但格式控制中的格式说明符,必须按从左到右的顺序,与输出项表中的每个数据一一对应,否则出错。例如:printf(str=%s,f=%d,i=%f\n,Internet,1.0/2.0,3+5,CHINA);(2)格式字符x、e、g可以用小写字母,也可以用大写字母。使用大写字母时,输出数据中包含的字母也大写。除了x、e、g格式字符外,其它格式字符必须用小写字母。例如,%f不能写成%F。(3)格式字符紧跟在“%”后面就作为格式字符,否则将作为普通字符使用(原样输出)。例如:“printf(c=%c,f=%f\n,c,f);”中的第一个c和f,都是普通字符。格式化输入——scanf()函数scanf()函数是用来从外部输入设备向计算机主机输入数据的。[案例2]已知圆柱体的底半径radius=1.5,高high=2.0,求其体积。voidmain(){floatradius=1.5,high=2.0,pi=3.14159,vol;vol=pi*radius*radius*high;printf(“vol=%7.2f\n”,vol);}[案例3]已知圆柱体的底半径为radius,高为high,求其体积。voidmain(){floatradius,high,vol,pi=3.1415926;printf(Pleaseinputradius&high:);scanf(%f%f,&radius,&high);vol=pi*radius*radius*high;printf(radius=%7.2f,high=%7.2f,vol=%7.2f\n,radius,high,vol);}程序运行结果如下:Pleaseinputradius&high:1.5□2.0↙radius=□□□1.50,high=□□□2.00,vol=□□14.14在程序中给计算机提供数据,可以用赋值语句,也可以用输入函数。在C语言中,可使用scanf()函数,通过键盘输入,给计算机同时提供多个、任意的数据。1.scanf()函数的一般格式scanf(“格式控制”,输入项首地址表列);(1)scanf函数的“格式控制”与printf函数的“格式控制”相似。(2)输入项首地址表──由若干个输入项首地址组成,相邻2个输入项首地址之间,用逗号分开。变量首地址的表示方法:&变量名其中“&”是地址运算符。2.scanf()函数的功能按照格式控制部分的要求,把从终端输入的数据传送到地址表列指定的内存单元中。运行[案例3]的程序时,从键盘上输入2个实数,分别存入&radius、&high起始的存储单元中,即输入两个实数分别赋给radius和high。格式字符含义%d(或%i)用来输入十进制整数%x(或%X)用来输入无符号十六进制整数(大小写作用相同)%o用来输入无符号八进制整数%u用来输入无符号十进制整数%f,%e,%E,%g,%G用来输入实数,可以用小数形式或指数形式输入(作用相同)%c用来输入单个字符%s用来输入字符串,并将字符串送到一个字符数组中。输入时以非空白字符开始,以第一个空白字符结束,并在最后加一个'\0'作为结束标志scanf格式字符scanf的附加格式说明符附加格式说明符含义字母h用于输入短整型数据(可用%hd,%ho,%hx)字母l用于输入长整型数据(可用%ld,%lo,%lx)以及double型数据(可用%lf或%le)m(正整数)指定输入数据所占宽度(列数)*表示本输入项在读入后不赋给相应的变量说明⑴可以指定输入数据所占列数,系统自动按它截取所需数据。如:inta,b;charc;scanf(%3d%3c%3d,&a,&c,&b);输入:123ABC456↙后,a=123,c=‘A’,b=456⑵如果%后有附加格式说明符“*”,表示跳过它指定的列数。如:scanf(%3d%*3c%2d,&a,&b);输入:123456789↙后,a=123,b=78(456被跳过)。在利用现有的一批数据时,有时不需要其中某些数据,可用此方法“跳过”它们。⑶输入实型数据时可以指定数据的宽度,但不能规定数据的精度。例如,scanf(%5.2f,&a);是不合法的。注意事项:1.如果相邻2个格式指示符之间,不指定数据分隔符(如逗号、冒号等),则相应的2个输入数据之间,至少用一个空格分开,或者用Tab键分开,或者输入1个数据后,按回车,然后再输入下1个数据。例如,scanf(%d%d,&num1,&num2);假设给num1输入12,给num2输入36,则正确的输入操作为:12□36↙或者:12↙36↙注:使用“↙”符号表示按回车键操作,在输入数据操作中的作用是,通知系统输入操作结束。2.“格式字符串”中出现的普通字符(包括转义字符形式的字符),务必原样输入。例如,scanf(%d,%d,&num1,&num2);假设给num1输入12,给num2输入36正确的输入操作为:12,36↙另外,scanf()函数中、格式字符串内的转义字符(如\n),系统并不把它当转义字符来解释,从而产生一个控制操作,而是将其视为普通字符,所以也要原样输入。例如:scanf(num1=%d,num2=%d\n,&num1,&num2);假设给num1输入12,给num2输入36正确的输入操作为:num1=12,num2=36\n↙提高人机交互性建议:为改善人机交互性,同时简化输入操作,在设计输入操作时,一般先用printf()函数输出一个提示信息,再用scanf()函数进行数据输入。例如:scanf(num1=%d,num2=%d\n,&num1,&num2);改为:printf(num1=);scanf(%d,&num1);printf(num2=);scanf(%d,&num2);3.输入数据时,遇到以下情况,系统认为该数据结束:(1)遇到空格,或者回车键,或者Tab键。(2)遇到输入域宽度结束。例如“%3d”,只取3列。(3)遇到非法输入。例如,在输入数值数据时,遇到字母等非数值符号(数值符号仅由数字字符0-9、小数点和正负号构成)。4.使用格式说明符“%c”输入单个字符时,空格和转义字符均作为有效字符被输入。例如:scanf(%c%c%c,&ch1,&ch2,&ch3);printf(ch1=%c,ch2=%c,ch3=%c\n,ch1,ch2,ch3);假设输入:A□B□C↙则系统将字母‘A’赋值给ch1,空格‘□’赋值给ch2,字母‘B’赋值给ch3。printf()sca