04顺序结构.docx
- 文档编号:10822659
- 上传时间:2023-02-23
- 格式:DOCX
- 页数:15
- 大小:23.48KB
04顺序结构.docx
《04顺序结构.docx》由会员分享,可在线阅读,更多相关《04顺序结构.docx(15页珍藏版)》请在冰豆网上搜索。
04顺序结构
第4章输入输出
无输入/出语句,用库函数实现。
4.1字符数据的输入输出
putchar:
该函数的作用是向终端输出一个字符
getchar:
此函数的作用是从终端(或系统隐含指定的输入设备)输入一个字符.getchar函数没有参数.
#include
putchar(c)
c可以是int,char
c=getchar()
可将其值赋给int或char
例1:
#include“stdio.h”
•main()
•{chara,b,c;
•a=‘B’;b=’O’;c=’Y’;
•putchar(a);putchar(b)putchar(c);
•}
结果输出?
例2:
#include“stdio.h”
•main()
•{charc:
•c=getchar();
•putchar(c);
•}
假设从键盘上键入a,则输出?
也可以输出其它转义字符,如:
putchar(’\101’)(输出字符’A’)
putchar(’\’’)(输出单引号字符’)
putchar(’\015’)(使输出回车,不换行)
程序测试:
main()
{charc1,c2,c3;/*intc1,c2,c3;*/
c1=getchar();c2=getchar();c3=getchar();
putchar(c1);putchar(c2);putchar(c3);
}
4.2格式化的输入输出
4.2.1printf(格式控制串,变量表)函数
printf("x=%d,y=%f\n",x,y);
格式控制串的组成:
普通字符:
原样打印
格式字符:
%d,%o,%x,%u,%c,%s,%f,%e,%g
格式符
打印形式
变化形式
备注
%d
十进制
%md,%-md,%ld,%mld
打印实数时,结果为0!
%o
八进制
%mo,%-mo,%lo,%mlo
%x,%X
十六进制
%mx,%-mx,%lx,%mlx
%u
无符号数
%mu,%-mu,%lu,%mlu
%f,%F
有效位7位
%m.nf
打印整数时出错!
%e,%E
系数7位
%m.ne
%c
字符形式
%mc
在编程过程中合理使用格式符!
对于给定备注部分请上机实践!
•1.d格式符。
用来输出十进制整数。
有以下几种用法:
•
(1)%d,按整型数据的实际长度输出。
•
(2)%md,m为指定的输出字段的宽度。
如果数据的位数小于m,则左端补以空格,若大于m,则按实际位数输出,如
•printf(“%4d,%4d”,a,b)
•若a=123,d=12345,则输出结果为:
123,12345
•(3)%ld,输出长整型数据。
如
•1onga=135790;
•printf(”%ld,a);
•如果用%d输出,就会发生错误,对1ong型数据应当用%ld格式输出。
对长整型数据也可以指定字段宽度,如将上面printf函数中的“%ld”改为“%81d”则输出为
•135790(8列)
一个int型数据可以用%d或%ld格式输出。
•2.O格式符,以8进制数形式输出整数。
由于是将内存单元中的各位的值(0或1)按八进制形式输出,因此输出的数值不带符号,即将符号位也一起作为八进制数的一部分输出。
例如:
•inta=-1;
•printf(”%d,%o”,a,a);
•输出为
•-1,177777
不会输出带负号的八进制整数。
对长整数(1ong型)可以用
•“%1o”格式输出。
同样可以指定字段宽度%mo,如
•printf(”%8o”,a)输出数据为177777。
•3·x格式符,以16进制数形式输出整数.
同样不会出现负的十六进制数。
例如:
•inta=一1;
•printf(”%x,%0,%d”,a,a,a);
•输出结果为
•ffff,177777,-1
•同样可以用“%lx”输出长整型数,也可以指定输出字段的宽度,如“%12x”
•4.u格式符,用来输出unsigned型数据,即无符号数,以十进制形式输出。
•一个有符号整数(int型)也可以用%u格式输出;反之,一个unsigned型数据也可以用%d格式输出。
按相互赋值的规则处理。
unsigned型数据也可用%o或%x格式输出。
例4.3
•main()
•{unsignedinta=65535;
•intb=-2;
•printf(”a=%d,%o,%x,%u\n”,a,a,a,a);
•printf(”b=%d,%o,%x,%u\n”,b,b,b,b);
•}
•运行结果为?
•5.c格式符,用来输出一个字符。
如:
•charc=’a’;
•printf(”%c”,c);
•输出字符‘a’,请注意:
“%c”中的c是格式符,逗号右边的c是变量名,不要搞混。
同样可以用“%mc”输出长整型数,也可以指定输出字段的宽度,如“%3c”
•一个整数,只要它的值在0~255范围内,也可以用字符形式输出,在输出前,将该整数转换成相应的ASCII字符;反之,一个字符数据也可以用整数形式输出。
•6.s格式符,用来输出一个字符串。
有几种用法:
•
(1)%s,例如:
printf(”%s”,”CHINA”)
•输出“CHINA”字符串(不包括双引号)。
•
(2)%ms,输出的字符串占m列,如字符串本身长度大于m,则突破m的限制,将字符串全部输出。
若串长小于m,则左补空格。
•(3)%-ms,如果串长小于m,则在m列范围内,字符串向左靠,右补空格。
•(4)%m.ns,输出占m列,但只取字符串中左端n个字符。
这n个字符输出在m列的右侧,左补空格。
•(5)%-m.ns,其中m、n含义同上,n个字符输出在m列范围的左侧,右补空格。
如果n>m,则m自动取n值即保证n个字符正常输出。
•例4.5
•main()
•{printf(”%3s,%7.2s,%.4s,%-5.3s\n”,
•”CHINA”,”CHINA”,”CHINA”,”CHINA”);
•}
•输出结果?
•其中第三个输出项,格式说明为“%.4s”,即只指定了n,没指定m,自动使m=n=4,故占4列。
7.f格式符,用来输出实数(包括单、双精度),以小数形式输出,有以下几种用法:
(1)%f,不指定字段宽度,由系统自动指定,使整数部分全部如数输出,并输出6位小数。
应当注意,并非全部数字都是有效数字.单精度实数的有效位数一般为7位。
•
(2)%m.nf指定输出的数据共占m列,其中有n位小数。
如果数值长度小于m,则左端补空格。
•(3)%一m.nf基本相同,只是使输出的数值向左端靠,右端补空格。
•例4.6
•main()
•{floatx,y;
•x=111111.111;
•y=222222.222;
•printf(”%f\n”,x+y);
•}
•运行结果为:
333333.328125
•显然,只有前7位数字是有效数字。
千万不要以为凡是打印出来的数字都是准确的。
双精度数也可用%f格式输出,它的有效位数一般为16位,给出小数6位。
•例4.8
•main()
•{floatf=123.456;
•printf(”%f,%10f,%10.2f,%.2f,%-10.2f\n”,f,f,f,f,f);
•}
•输出结果为?
f的值应为123.456,但输出为123.455994,这是由于实数在内存中的存储误差引起的.
8.e格式符,以指数形式输出实数。
可用以下形式:
•
(1)%e不指定输出数据所占的宽度和数字部分小数位数,由系统自动指定给出6位小数,指数部分占5位(如e+002),其中“e”占一位,指数符号占一位,指数占3位。
数值按标准化指数形式输出(即小数点前必须有而且只有一位非零数字)。
例如
•printf(”%e”,123.456);
•输出:
1.234560e+002,(1.23456e+02)。
也就是说用%e格式输出的实数共占13列宽度。
•
(2)%m.ne和%-m.nem,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,1.23e+002,
•1.23e+002
第二个输出项按%10e输出,即只指定了m=10,未指定n,凡未指定n,自动使n=6,整个数据长12列,超过给定的10列,乃突破10列的限制,按实际长度输出。
第三个数据共占10列,小数部分占2列。
第四个数据按字“%.2e”格式输出,只指定n=2,未指定m,自动使m等于数据应占的长度,今为8列。
第五个数据应占10列,数值只有8列,由于是“%-10.2e”,数值向左靠,右补一个空格。
9.g格式符,用来输出实数,它根据数值的大小,自动选f格式或e格式(选择输出时占宽度较小的一种),且不输出无意义的零。
例如,若:
f=123.456,则
•printf(”%f,%e,%g”,f,f,f);
•输出如下:
•123.456000,1.234560e+002,123.456
•用%f格式输出占10列,用%e格式输出占13列,用%g格式时,自动从上面两种格式中选择短者(今为%f格式为短),故占10列,且按%f格式用小数形式输出,最后三个小数位“0”为无意义的0,不输出,%g格式用得较少。
•(表4.2附加格式说明字符)
•l——用于长整型整数,可加在格式符d、o、x、u前面。
•m(代表一个正整数)——数据最小宽度。
•.n(代表一个正整数)——对实数,表示输出n位小数;对字符串,表示截取的字符个数。
•-——输出的数字或字符在域内向左靠。
•在使用printf函数时,还有几点要说明:
1.除了X,E,G外,其他格式字符必须用小写字母,如%d不能写成%D。
2.可以在printf函数中的“格式控制”字符串内包含第二章中的“转义字符”,如“\n”、“\t”、“\b”、“\r”、“\f”、“\377”等。
3.上面介绍的d,o,x,c,s,f,e,g等字符,如用在“%”后面就作为格式符号。
一个格式说明以“%”开头,以上述9个格式字符之一为结束,中间可以插入附加格式字符(也称修饰符)。
例如:
•printf(“c=%cf=%fs=%s”,c,f,s);
第一个格式说明为”%c”而不包括其后的f,第二个格式说明为“%f,不包括其后的s,第三个格式说明为%s。
其它的字符为原样输出的普通字符。
4.如果想输出字符“%”,则应该在“格式控制”字符串中用连续两个%表示,如
•printf(”%f%%”,1.0/3);
•输出0.333333%
5.不同的系统在实现格式输出时,输出结果可能会有一些小的差别,例如用%e格式符输出实数时,有些系统输出的指数部分为4位(如e+02)而不是5位(e+002),前面的数字部分为5位小数而不是6位等等.
程序测试:
main()
{intx;longy;floatz;charw;
x=88;y=12345678;z=8888.12345678;w='a';
printf("x=%d\n",x);
printf("y=%ld\n",y);
printf("z=%f\n",z);
printf("w=%c\n",w);
}
4.2.2scanf(格式控制串,变量地址表)函数
scanf("x=%d,y=%d",&x,&y);
格式控制串的组成:
普通字符:
必须原样输入!
格式字符:
按指定格式输入数据。
&:
取地址符
例4.9
•main()
•{inta,b,c;
•scanf(”%d%d%d”,&a,&b,&c);/*按照a,b,c在
•内存的地址将a,b,c的值存进去*/
•prinrf(“%d,%d,%d\n”,a,b,c);
•}
用“%d%d%d”格式输入时,不能用逗号(可用空格)作两个数据间的分隔符.
格式符
输入形式
%d
十进制
%o
八进制
%x
十六进制
%s
用来输入字符串
%f,%e
用来输入实数,可以用小数形式或指数形式输入
%c
字符形式
•附加的格式说明字符
•l用于输入长整型数据(可用%ld,%lo,%lx),以及double型数据(用%lf或%1e)。
•h用于输入短整型数据(可用%hd,%ho,%hx)。
m域宽(为一正整数)指定输入数据所占宽度(列数)。
•*表示本输入项在读入后不赋给相应的变量。
说明:
•1.标准C在scanf中不使用%u说明符,对unsigned型数据,以%d或%o、%x格式输入。
•2·可以指定输入数据所占列数,系统自动按它截取所需数据。
如
•scanf(”%3d%3d”,&a,&b);
•输入:
123456
•系统自动将123赋给a,456赋给b。
也可用于字符型.
•scanf(”%3c”,&ch);
•输入3个字符,把第一个字符赋给ch,例如输入abc,ch得到字符’a’。
•3.%后的“*”附加说明符,用来表示跳过它相应的数据。
例如
•scanf(”%2d%*3d%2d\n”,&a,&b);
•如果输入如下信息:
•1234567
•将12赋给a,67赋给b.第二个数据“345”被跳过不赋给任何变量。
在利用现成的一批数据时,有时不需要其中某些数据,可用此法“跳过”它们。
•4.输入数据时不能规定精度,例如
•scanf(”%7.2f”,&a);
•是不合法的,不能企图输入1234567而使a的值为12345.67。
scanf函数的执行中应注意的问题:
•1.scanf函数中的“格式控制”后面应当是变量地址,而不应是变量名。
例如,如果a,b为整型变量,则:
•scanf(”%d,%d”,a,b);
•是不对的,应为&a,&b。
这是C语言与其它高级语言不同的。
•2.如果在“格式控制”字符串中除了格式说明以外还有其它字符,则在输入数据时应输入与这些字符相同的字符。
例如
•scanf(“%d,%d”,&a,&b);
•输入时应用如下形式:
3,4
•注意3后面是逗号,它与scanf函数中的“格式控制”中的逗号对应。
如果输入时不用逗号而用空格或其它字符是不对的:
•34(不对)3:
4(不对)
•如果是scanf(”%d%d”,&a,&b);
•输入时两个数据间应空二个或更多的空格字符。
•scanf(”%d:
%d:
%d”,&h,&m,&s);
•输入应用以下形式:
12:
23:
36
•scanf(”a=%d,b=%d,c=%d”,&a,&b,&c);
•输入应为以下形式:
•a=12,b=24,c=36
•这种形式为了使用户输入数据时添加必要的信息以帮助理解,不易发生输入数据的错误。
•3.在用”%c”格式输入字符时,空格字符和“转义字符”都作为有效字符输入/*在编程中经常出错*/
•scanf(”%c%c%c”,&c1,&c2,&c3);
•如输入abc
•字符’a’送给c1,字符‘’送给c2,字符’b’送给c3,因为%c只要求读入一个字符,后面不需要用空格作为两个字符的间隔,因此‘’作为下一个字符送给c2。
•4.在输入数据时,遇以下情况时该数据认为结束:
•①遇空格,或按“回车”或“跳格”(TAB)键。
•②遇宽度结束,如“%3d”,只取3列。
•③遇非法输入。
如scanf(”%d%c%f”,&a,&b,&c);
•若输入:
1234al23o.26
•第一个数据对应%d格式输入1234之后遇字母a,因此认为数值1234后己没有数字了,第一个数据到此结束,把1234送给变量a,字符’a’送给变量b由于%c只要求输入一个字符,因此a后面不需要空格,后面的数值应送给变量c,如果由于疏忽把本来应为1230.26错打成123o·26,由于123后面出现字母’o’就认为此数值结束,将123送给入c.
程序测试:
不含普通字符
(数据结束标记:
空格,TAB,回车;指定宽度结束。
)
main()
{intx;longy;floatz;charw;
scanf("%d%ld",&x,&y);
scanf("%f%c",&z,&w);
printf("x=%d,y=%ld,z=%f,w=%c\n",x,y,z,w);
}
含普通字符
main()
{intx;longy;floatz;charw;
scanf("x=%d,y=%ld,z=%f,w=%c",&x,&y,&z,&w);
printf("x=%d,y=%ld,z=%f,w=%c\n",x,y,z,w);
}
•4.6程序举例
•例4.10输入三角形的三边长,求三角形面积。
•为简单起见,设输入的三边长能构成三角形。
•程序如下:
/*page45example3.10*/
•#include"math.h"
#include“stdio.h”
•main()
•{
•floata,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.2f\n",a,b,c,s);
•printf("area=%7.2f\n",area);
•}
•运行情况如下:
3,4,6
程序改写:
还可以采用何种方法计算三角形面积?
请上机实验完成!
•例4.11从键盘输入一个大写字母,要求改用小写字母输出。
程序如下:
•/*example3.11atpage45*/
•#include"stdio.h"
•main()
•{
•charc1,c2;
•c1=getchar();
•printf("%c,%d\n",c1,c1);
•c2=c1+32;
•printf("%c,%d\n",c2,c2);
•}_
•运行情况下:
•A
•A,65
•a.97
•例4.12求ax2+bx+c=0方程的根。
a,b,c由键盘输入,设b2-4ac>0。
•程序如下:
•/*example3.12atpage46*/
•#include"math.h"
#include“stdio.h”
•main()
•{
•floata,b,c,disc,x1,x2,p,q;
•scanf("a=%f,b=%f,c=%f",&a,&b,&c);
•disc=b*b-4*a*c;
•p=-b/(2*a);q=sqrt(disc)/(2*a);
•x1=p+q;x2=p-q;
•printf("\n\nx1=%5.2f\nx2=%5.2f\n",x1,x2);
•}_
•运行情况如下:
a=1,b=3,c=2
•程序中用了预处理命令#inc1ude“math.h”,这表示要用到数学库函数。
如果想要写出一个满意的程序,首先要学会读程序!
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 04 顺序 结构