240 likes | 421 Views
TKS. 1. 高级语言. (自学第二讲). 如何按我们的需要的格式输出数据 ?. 绍兴文理学院. 计算机系计算机应用教研室. 数据格式化输人输出. 一、学习目的: 明确数据格式化输出、输入的含义和功能;掌握数据格式化输出、输入的使用方法。. 二、学习重点: 常用数据 int 、 float 、 double 、 char 、 string 类型的格式化输出、输入方法;利用数据格式化输出、输入函数准确输出、输入数据。. 三、学习难点: 数据格式化输入的数据流正确控制。 四、学习教案:. § 补充 .1 格式化输出函数 printf(). TKS. 3.
E N D
TKS 1 高级语言 (自学第二讲) 如何按我们的需要的格式输出数据? 绍兴文理学院 计算机系计算机应用教研室
数据格式化输人输出 一、学习目的:明确数据格式化输出、输入的含义和功能;掌握数据格式化输出、输入的使用方法。 二、学习重点:常用数据int、float、double、char、string类型的格式化输出、输入方法;利用数据格式化输出、输入函数准确输出、输入数据。 三、学习难点:数据格式化输入的数据流正确控制。 四、学习教案:
§补充.1 格式化输出函数printf() TKS 3 1、格式化输出功能 (1)为输出数据添加一些需要的说明性字符。 (2)指定对不同类型的数据的输出。 (3) 在输出项中添加一些控制,如换行、警告等。 (4)为数据类型进一步指定长度修正说明。 (5) 为实型数据指定是否确有一个小数点,是否采用科学记数法形式输出。 (6)为整数指定是否采用八进制数或十六进制数形式输出以及按十六进制数形式输出时是否出现前缀Ox。 (7) 按照数据的正负为输出数据项添加前缀“+”、“-”或空格等。 (8)为输出数据指定对齐方式:左对齐或右对齐。 (9)为数据项指定输出字段的域宽和精度。 (10)为数据项中的空位指定填充字符(如0或空格)。 10:30
2、printf()函数的基本格式 TKS 4 (1)格式:int printf(格式控制字符串,输出表达式1,输出表达式2,…) (2)功能:在格式控制字符串所指定的格式控制下,把输出表列的内容(参数)输出到stdout(输出设备)中去。调用成功时返回实际所写的字符个数;返回一个负值表示发生了错误。 该函数的参数分为两部分。 ①前面是一个格式控制字符串,全部控制功能都是在这个字符串中完成的。 ②后面的一个或多个参数是输出表达式。 10:30
(3) 格式控制字符串可分为三部分组成 TKS 5 普通字符、格式说明和转义字符。 由双引号括起 来的字符串 格式控制 普通字符 格式说明 转义字符 需要原样输 出的字符 用于控制输出 由“%”和格式字符组成,如%d, %f等。它的作用是将输出的数据 转换为指定的格式输出。格式说 明符总是由“%”字符开始的。 10:30
3、格式说明中的字段结构 TKS 6 10:30
例1 基本格式码 C+S2_1 TKS 7 void main() {int a=975311; printf("d--%d\n",a); printf("u--%u\n",a); printf("o--%o\n",a); printf("x--%x\n",a); a=68; printf("c--%c\n",a); char s[]="abcde"; printf("s--%s\n",s); double b=123.456; printf("f--%f\n",b); printf("e--%e\n",b); printf("G--%G\n",b); printf("p--%p\n",&b); printf("%%\n"); } 10:30
例2 长度修正符C+S2_2 TKS 8 长度修正符 可修饰的格式码 参数类型 l d,i,o,u,x,X long ll(暂不可用) d,i,o,u,x,X long long int,unsigned long long int h d,i,o,u,x,X short,unsigned short hh(暂不可用) d,i,o,u,x,X char,unsigned char L e,E,f,g,G long,double void main() {short a=10; printf("d--%d\n",a); printf("ld--%ld\n",a); int b=123456; printf("ld--%ld\n",b); printf("hd--%hd\n",b); double c=123456789123456789.789; printf("f--%f\n",c); printf("Lf--%Lf\n",c); } 10:30
例3 域宽与精度说明C+S2_3 TKS 9 格式:m.n 其中m为输出域宽。对于实数,包括了一个小数点的位置。 n为精度。 ①配合格式码f、e/E时,指定小数点后面的位数;未指定精度时,默认小数点后6位。 ②配合格式码g/G时,指定有效位的数目。 ③作用于字符串时,精度符限制最大域宽。 ④作用于整型数据时,指定必须显示的最小位数,不足时左侧以先导0补充。 ◆ 输出数据的实际精度并不主要取决于格式说明字段中的域宽和精度,也不取决于输入数据的精度,而主要取决于数据在机器内的存储精度。 10:30
4、前修饰符 TKS 10 修饰符 意 义 - 数据在输出域中左对齐显示 0 用“0”而非空格进行前位填充 + 在有符号数之前输出前缀“+”或“-” 空格 对于正数添加前缀空格,对于负数添加前缀“-” # 在g和f之前,确保输出字段中有一个小数点; 在x之前,确保所输出的十六进制数前面有前缀0x * 用做占位符 例4 printf格式输出 C+S2_4 例5 编写一个显示美国各州面积、森林覆盖面积和森林覆盖率的简单程序。C+S2_5 10:30
5、printf()中输出表达式的运算顺序 TKS 11 例6 printf()中输出表达式的运算顺序C+S2_6 int main(void) {int a=1,b=2; printf("x=%d,y=%d\n",++a+b,++b+a); return 0; } 表达式的运算顺序是不确定的。 10:30
§补充.2 格式化输入函数scanf() TKS 12 1、scanf函数(格式输入函数)的格式和功能 (1)格式:int scanf(格式控制字符串,地址1,地址2, …)(原型在stdio.h中) (2)功能:根据格式控制,从stdin(输入设备)中依次把数据读入到地址表列中相应变量地址中。调用成功时返回实际所读入的变量个数;返回EOF表示没有正常读入数据。它很象是printf()的反函数。 2、地址参数 C/C++语言可以间接地使用内存地址,这个地址是通过对变量名进行“求地址”运算得到。求地址的运算符为&。如: int a;float b;double c; &a,变量a的4B空间的首地址。 &b,变量b的4B空间的首地址。 &c,变量c的8B空间的首地址。 10:30
3、格式说明字段 % 宽度 长度修正 格式码 TKS 13 十进制整数 l/L,h,hh c,d,e/E,f,g,i,n,o,p,s,u,x/X,% (1) 基本格式码和长度修正 格式码 长度修正符 输入数据类型 说明 d 无 int 输入带符号十进制整数,可选加 +或- hh char h short l long u 无 unsigned 输入无符号十进制整数 o hh unsigned char 输入无符号八进制整数,可选加 +或- 10:30
% 宽度 长度修正 格式码 十进制整数 l/L,h,hh c,d,e/E,f,g,i,n,o,p,s,u,x/X,% TKS 14 格式码 长度修正符 输入数据类型 说明 x h unsigned short 输入无符号十六进制整数,可选 加+或- l unsigned long c 无 char 读取字符 s 无 字符串 连续读取字符,直到遇到文件结 束符、空白或达到指定字段宽度 p 无 地址 读取地址 f,e,g 无 float 读取带符号十进制实数 % 无 % 读取% ◆ 应当注意,在输入数据时,格式说明字段中的格式码以及长度修饰符所指定的类型必须与地址参数的类型相一致。 10:30
TKS 15 例7 基本格式码和长度修正C+S2_7 int main(void) {double a,b,c,d; scanf("%f%f",&a,&b); printf("\na=%lf,b=%lf\n",a,b); scanf("%lf%lf",&c,&d); printf("\nc=%lf,d=%lf\n",c,d); return 0; } 10:30
(2) 字段宽度 TKS 16 字段宽度是放在%与格式码之间的整数,用于限制一个字段可读取字符的数目(使用较少)。 4、数值数据流的分隔 (1) 使用默认分隔符:空格、制表符(’\t’)、换行符(’\n’)。 例8 数值数据流的分隔C+S2_8 int main() {int a; float b,c; scanf ("%d%f%f",&a,&b,&c); printf("a=%d,b=%f,c=%f\n",a,b,c); return 0; } 10:30
(2)根据格式项所指定的域宽分隔出数据项 TKS 17 例9 数值数据流的分隔C+S2_9 int main(void) {int a; float b,c; scanf("%2d%3f%4f",&a,&b,&c); printf("a=%d,b=%f,c=%f\n",a,b,c); return 0; } 10:30
(3) 根据格式字符的含义从输入流中获取数据,当输入流中的数据类型与格式字符要求不相符时,就认为这一数据项结束。 TKS 18 例10 数值数据流的分隔C+S2_10 int main(void) {int a; char b; float c; printf("input a,b,C:\n"); scanf("%d%c%f",&a,&b,&c); printf("a=%d,b=%c,c=%f\n",a,b,c); return 0; } 10:30
(4)格式控制字符串中的非空字符 TKS 19 在scanf()的格式控制字符串中,所出现的其他字符都必须在输入数据流时照样输入。 例11 其他字符都必须在输入数据流时照样输入 C+S2_11 int main(void) {int a,b; scanf("input:%d$$$%d",&a,&b); printf("%d,%d\n",a,b); return 0; } 10:30
5、scanf()与输入缓冲区 缓冲区 TKS 20 输入缓冲区一般是指键盘缓冲区,从键盘输入的数据在按回车键后被先放在键盘缓冲区(个别除外)。scanf()是按格式说明的要求从缓冲区中依次读取数据。只要缓冲区中有数据可读, scanf()就能读取数据。 例12 体会输入缓 冲区C+S2_12 int main(void) {int a,b,c,d,e,f; scanf("%d%d",&a,&b); scanf("%d%d",&c,&d); scanf("%d",&e); scanf("%d",&f); printf(“a=%d,b=%d,c=%d,d=%d,e=%d,f=%d\n",a,b,c,d,e,f); } 10:30
6、scanf()用于字符输入 TKS 21 (1) 所有空白字符、转义字符都将作为有效字符被接收 因此不能再使用空白字符或其他字符进行数据项的分隔。 例13 分隔符作为一个字符接收 C+S2_13 int main(void) {char c1,c2,c3; scanf("%c%c%c",&c1,&c2,&c3); printf("\nc1=%c,c2=%c,c3=%c\n",c1,c2,c3); return 0; } 10:30
◆ 注意:数值数据与字符数据混合使用的情况 TKS 22 例14 有一组职工信息:职工号、姓氏(用一个字母表示)、性别、 年龄和工资。要求从键盘上输入,然后显示出来。C+S2_14 int main() {int num,age; double salary; char name,sex; printf("\n请输入职工号、姓氏、性别、年龄、工资:\n"); scanf("%d%c%c%d%lf",&num,&name,&sex,&age,&salary); printf("\n职工号 姓氏 性别 年龄 工 资:\n"); printf("%6d%5c%6c%6d%10.2lf",num,name,sex,age,salary); return 0; } 10:30
(2)当定义中有字段宽度1时,scanf()将在缓冲区中的输入流上,按照宽度有间隔地挑取字符。(2)当定义中有字段宽度1时,scanf()将在缓冲区中的输入流上,按照宽度有间隔地挑取字符。 TKS 23 例15 按照宽度有间隔地挑取字符C+S2_15 int main(void) {char c1,c2,c3,c4,c5,c6; scanf("%3c%3c%3c",&c1,&c2,&c3); printf("\nc1=%3c,c2=%3c,c3=%3c\n",c1,c2,c3); scanf("%3c%3c%3c",&c4,&c5,&c6); printf("\nc4=%3c,c5=%3c,c6=%3c\n",c4,c5,c6); scanf("%3c%3c%3c",&c1,&c2,&c3); printf("\nc1=%3c,c2=%3c,c3=%3c\n",c1,c2,c3); return 0; } 每次读取宽度个字符,字符变量得到其中的第一个字符,起到按照宽度有间隔地挑取字符的作用。 10:30
7、scanf()的停止与返回 TKS 24 scanf()函数操作有以下几个作用。 (1)首先从缓冲区中提取所需数据。 (2)如果缓冲区中没有所需数据,则要求从键盘输入一个数据流。 (3)遇到下面的情形时终止执行 ① 格式参数中的格式项用完——正常结束。 ② 当格式项与输入数据不匹配时,非正常结束。 (4)如果执行成功,返回成功匹配的项数;否则执行失败, 例16 其他字符都必须在输入数据流时照样输入 C+S2_16 int main(void) {int a,b,c; printf("%d\n",scanf("%3d-%2d-%4d",&a,&b,&c)); printf("a=%d,b=%d,c=%d\n",a,b,c); return 0; } 10:30