TKS

24
TKS 1 自自自自自自 () 自自自自自自 自自自自自自自自自自自自 自自自自自自自自自自自自自自自 自自自自自自自自自自自自自自自

description

TKS. 1. 高级语言. (自学第二讲). 如何按我们的需要的格式输出数据 ?. 绍兴文理学院. 计算机系计算机应用教研室. 数据格式化输人输出. 一、学习目的: 明确数据格式化输出、输入的含义和功能;掌握数据格式化输出、输入的使用方法。. 二、学习重点: 常用数据 int 、 float 、 double 、 char 、 string 类型的格式化输出、输入方法;利用数据格式化输出、输入函数准确输出、输入数据。. 三、学习难点: 数据格式化输入的数据流正确控制。 四、学习教案:. § 补充 .1 格式化输出函数 printf(). TKS. 3. - PowerPoint PPT Presentation

Transcript of TKS

Page 1: TKS

TKS 1

(自学第二讲)

绍兴文理学院计算机系计算机应用教研室

如何按我们的需要的格式输出数据如何按我们的需要的格式输出数据??

Page 2: TKS

数据格式化输人输出

二、学习重点:二、学习重点:常用数据常用数据 intint 、、 floatfloat 、、 doubledouble 、、 chcharar 、、 stringstring 类型的格式化输出、输入方法;利用数据格类型的格式化输出、输入方法;利用数据格式化输出、输入函数准确输出、输入数据。式化输出、输入函数准确输出、输入数据。

一、学习目的:一、学习目的:明确数据格式化输出、输入的含义和功明确数据格式化输出、输入的含义和功能;掌握数据格式化输出、输入的使用方法。能;掌握数据格式化输出、输入的使用方法。

三、学习难点:三、学习难点:数据格式化输入的数据流正确控制。数据格式化输入的数据流正确控制。四、学习教案:四、学习教案:

Page 3: TKS

TKS

3 23:19

§§ 补充补充 .1 .1 格式化输出函数格式化输出函数 printf()printf() 11 、格式化输出功能、格式化输出功能(1)(1) 为输出数据添加一些需要的为输出数据添加一些需要的说明性字符说明性字符。。(2)(2) 指定指定对不同类型的数据的输出。对不同类型的数据的输出。(3) (3) 在输出项中添加一些在输出项中添加一些控制控制,如换行、警告等。,如换行、警告等。(4)(4) 为数据类型进一步指定长度修正说明。为数据类型进一步指定长度修正说明。(5) (5) 为实型数据指定是否确有一个为实型数据指定是否确有一个小数点小数点,是否采用,是否采用科学记数法科学记数法形形式输出。式输出。(6)(6) 为整数指定是否采用为整数指定是否采用八进制八进制数或数或十六进制十六进制数形式输出以及按十数形式输出以及按十六进制数形式输出时是否出现前缀六进制数形式输出时是否出现前缀 OxOx 。。(7) (7) 按照数据的正负为输出数据项添加前缀“按照数据的正负为输出数据项添加前缀“ ++”” 、“、“ --”” 或或空格空格等。等。(8)(8) 为输出数据指定对齐方式:左对齐或右对齐。为输出数据指定对齐方式:左对齐或右对齐。(9)(9) 为数据项指定输出字段的域宽和精度。为数据项指定输出字段的域宽和精度。(10)(10) 为数据项中的空位指定填充字符为数据项中的空位指定填充字符 (( 如如 00 或空格或空格 )) 。。

Page 4: TKS

22 、、 printf()printf() 函数的基本格式函数的基本格式

TKS

4 23:19

(1)(1) 格式:格式: int printfint printf(( 格式控制字符串格式控制字符串,,输出表达式输出表达式 11 ,输出表达,输出表达式式 22 ,…,… ))(2)(2) 功能:功能:在在格式控制字符串格式控制字符串所指定的格式控制下,把所指定的格式控制下,把输出表列输出表列的的内容内容 (( 参数参数 )) 输出到输出到 stdout(stdout( 输出设备输出设备 )) 中去。调用成功时返回实中去。调用成功时返回实际所写的字符个数;返回一个负值表示发生了错误。际所写的字符个数;返回一个负值表示发生了错误。 该函数的参数分为两部分。该函数的参数分为两部分。①① 前面是一个格式控制字符串,全部控制功能都是在这个字符串中前面是一个格式控制字符串,全部控制功能都是在这个字符串中完成的。 完成的。 ②② 后面的一个或多个参数是输出表达式。后面的一个或多个参数是输出表达式。

Page 5: TKS

TKS

5 23:19

(3) (3) 格式控制字符串可分为三部分组成 格式控制字符串可分为三部分组成

普通字符 格式说明 转义字符

格式控制

由双引号括起来的字符串

由“由“ %”%” 和格式字符组成,如和格式字符组成,如 %d%d ,,%f%f 等。它的作用是将输出的数据等。它的作用是将输出的数据转换为指定的格式输出。格式说转换为指定的格式输出。格式说明符总是由“明符总是由“ %”%” 字符开始的。字符开始的。

需要原样输出的字符

用于控制输出

普通字符、格式说明和转义字符。普通字符、格式说明和转义字符。

Page 6: TKS

TKS

6 23:19

33 、格式说明中的字段结构、格式说明中的字段结构

Page 7: TKS

TKS

7 23:19

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");}

例 1 基本格式码 C+S2_1 例 1 基本格式码 C+S2_1c+S2_1.cpp

Page 8: TKS

TKS

8 23:19

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

长度修正符 可修饰的格式码 参数类型

例 2 长度修正符 C+S2_2 例 2 长度修正符 C+S2_2

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);}

c+S2_2.cpp

Page 9: TKS

TKS

9 23:19

例 3 域宽与精度说明 C+S2_3 例 3 域宽与精度说明 C+S2_3格式:格式: m.nm.n 其中其中 mm 为输出域宽。对于实数,包括了一个小数点的位置。为输出域宽。对于实数,包括了一个小数点的位置。 nn 为精度。为精度。①① 配合格式码配合格式码 ff 、、 ee // EE 时,指定小数点后面的位数;未指定精时,指定小数点后面的位数;未指定精度时,默认小数点后度时,默认小数点后 66 位。位。②② 配合格式码配合格式码 gg// GG 时,指定有效位的数目。时,指定有效位的数目。③③ 作用于字符串时,精度符限制最大域宽。作用于字符串时,精度符限制最大域宽。④④ 作用于整型数据时,指定必须显示的最小位数,不足时左侧以作用于整型数据时,指定必须显示的最小位数,不足时左侧以先导先导 00 补充。补充。◆ ◆ 输出数据的实际精度并输出数据的实际精度并不不主要取决于格式说明字段中的域宽和精主要取决于格式说明字段中的域宽和精度,度,也不也不取决于输入数据的精度,而取决于输入数据的精度,而主要取决于主要取决于数据在机器内的存数据在机器内的存储精度。储精度。

c+S2_3.cpp

Page 10: TKS

TKS

10 23:19

44 、前修饰符、前修饰符

- 数据在输出域中左对齐显示 0 用“ 0”而非空格进行前位填充 + 在有符号数之前输出前缀“ +” 或“ -” 空格 对于正数添加前缀空格,对于负数添加前缀“ -” # 在 g 和 f之前,确保输出字段中有一个小数点; 在 x之前,确保所输出的十六进制数前面有前缀 0x * 用做占位符

修饰符 意 义

例 4 printf 格式输出 C+S2_4 例 4 printf 格式输出 C+S2_4

例 5 编写一个显示美国各州面积、森林覆盖面积和森林覆盖率的简单程序。 C+S2_5 例 5 编写一个显示美国各州面积、森林覆盖面积和森林覆盖率的简单程序。 C+S2_5

c+S2_4.cpp

c+s2_5.cpp

Page 11: TKS

TKS

11 23:19

55 、、 printf()printf() 中输出表达式的运算顺序中输出表达式的运算顺序 例 6 printf() 中输出表达式的运算顺序 C+S2_6 例 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;} 表达式的运算顺序是不确定的。

c+s2_6.cpp

Page 12: TKS

TKS

12 23:19

§§ 补充补充 .2 .2 格式化输入函数格式化输入函数 scanf() scanf() 11 、、 scanfscanf 函数函数 (( 格式输入函数格式输入函数 )) 的格式和功能的格式和功能(1) 格式:格式: int scanf(int scanf( 格式控制字符串格式控制字符串,,地址地址 11 ,地址,地址 22 , …, … )()(原原型型在在 stdio.hstdio.h 中中 ))(2)(2) 功能:功能:根据根据格式控制格式控制,从,从 stdin(stdin( 输入设备输入设备 )) 中依次把数据读入中依次把数据读入到地址表列中相应变量地址中。调用成功时返回实际所读入的到地址表列中相应变量地址中。调用成功时返回实际所读入的变量变量个数个数;;返回返回 EOFEOF表示没有正常读入数据表示没有正常读入数据。。它很象是它很象是 printf()printf() 的反函的反函数数。。22 、地址参数、地址参数 C/C++C/C++ 语言可以间接地使用内存地址,这个地址是通过对变量名语言可以间接地使用内存地址,这个地址是通过对变量名进行“求地址”运算得到。进行“求地址”运算得到。求地址求地址的运算符为的运算符为 && 。如:。如: int aint a ;; float bfloat b ;; double cdouble c ;; &&aa ,变量,变量 aa 的的 4B4B空间的空间的首地址首地址。。 &&bb ,变量,变量 bb 的的 4B4B空间的空间的首地址首地址。 。 &c&c ,变量,变量 cc 的的 8B8B空间的空间的首地址首地址。 。

Page 13: TKS

TKS

13 23:19

(1) 基本格式码和长度修正

33 、格式说明字段、格式说明字段

格式码格式码长度修正长度修正宽度宽度%%

c,d,e/E,f,g,i,n,o,p,s,u,x/X,%l/L,h,hh十进制整数

d 无 int 输入带符号十进制整数 , 可选加 + 或 -

hh char h short l long u 无 unsigned 输入无符号十进制整数 o hh unsigned char 输入无符号八进制整数 , 可选加

+ 或 -

格式码 长度修正符 输入数据类型 说明

Page 14: TKS

TKS

14 23:19

格式码格式码长度修正长度修正宽度宽度%%

c,d,e/E,f,g,i,n,o,p,s,u,x/X,%l/L,h,hh十进制整数

x h unsigned short 输入无符号十六进制整数 , 可选 加 + 或 -

l unsigned long c 无 char 读取字符 s 无 字符串 连续读取字符 ,直到遇到文件结

束符、空白或达到指定字段宽度 p 无 地址 读取地址 f,e,g 无 float 读取带符号十进制实数 % 无 % 读取%

格式码 长度修正符 输入数据类型 说明

◆ 应当注意,在输入数据时,格式说明字段中的格式码以及长度修饰符所指定的类型必须与地址参数的类型相一致。

Page 15: TKS

TKS

15 23:19

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;}

例 7 基本格式码和长度修正 C+S2_7 例 7 基本格式码和长度修正 C+S2_7c+s2_7.cpp

Page 16: TKS

TKS

16 23:19

(2) 字段宽度 字段宽度是放在%与格式码之间的整数,用于限制一个字段可读取字符的数目 ( 使用较少 ) 。4 、数值数据流的分隔(1) 使用默认分隔符:空格、制表符 (’\ t’) 、换行符 (’\ n’) 。 例 8 数值数据流的分隔 C+S2_8 例 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;}

C+s2_8.cpp

Page 17: TKS

TKS

17 23:19

(2)根据格式项所指定的域宽分隔出数据项

例 9 数值数据流的分隔 C+S2_9 例 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;}

c+s2_9.cpp

Page 18: TKS

TKS

18 23:19

(3) 根据格式字符的含义从输入流中获取数据,当输入流中的数据类型与格式字符要求不相符时,就认为这一数据项结束。

例 10 数值数据流的分隔 C+S2_10 例 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;}

C+s2_10.cpp

Page 19: TKS

TKS

19 23:19

(4) 格式控制字符串中的非空字符 在 scanf() 的格式控制字符串中,所出现的其他字符都必须在输入数据流时照样输入。

例 11 其他字符都必须在输入数据流时照样输入 C+S2_11 例 11 其他字符都必须在输入数据流时照样输入 C+S2_11

int main(void){int a,b; scanf("input:%d$$$%d",&a,&b); printf("%d , %d\n",a,b); return 0;}

c+s2_11.cpp

Page 20: TKS

TKS

20 23:19

5 、 scanf() 与输入缓冲区 输入缓冲区一般是指键盘缓冲区,从键盘输入的数据在按回车键后被先放在键盘缓冲区 ( 个别除外 ) 。 scanf() 是按格式说明的要求从缓冲区中依次读取数据。只要缓冲区中有数据可读, scanf()就能读取数据。

例 12 体会输入缓 冲区 C+S2_12 例 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);}

缓冲区c+s2_12.cpp

Page 21: TKS

TKS

21 23:19

6 、 scanf() 用于字符输入

例 13 分隔符作为一个字符接收 C+S2_13 例 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;}

(1) 所有空白字符、转义字符都将作为有效字符被接收 因此不能再使用空白字符或其他字符进行数据项的分隔。

c+s2_13.cpp

Page 22: TKS

TKS

22 23:19

例 14 有一组职工信息:职工号、姓氏 ( 用一个字母表示 ) 、性别、 年龄和工资。要求从键盘上输入,然后显示出来。 C+S2_14例 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;}

c+s2_14.cpp

Page 23: TKS

TKS

23 23:19

(2)当定义中有字段宽度 1 时, scanf() 将在缓冲区中的输入流上,按照宽度有间隔地挑取字符。 例 15 按照宽度有间隔地挑取字符 C+S2_15 例 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,c

3); scanf("%3c%3c%3c",&c4,&c5,&c6); printf("\nc4=%3c , c5=%3c , c6=%3c\n",c4,c5,c

6); scanf("%3c%3c%3c",&c1,&c2,&c3); printf("\nc1=%3c , c2=%3c , c3=%3c\n",c1,c2,c

3); return 0;}

c+s2_15.cpp

Page 24: TKS

TKS

24 23:19

7 、 scanf() 的停止与返回

例 16 其他字符都必须在输入数据流时照样输入 C+S2_16 例 16 其他字符都必须在输入数据流时照样输入 C+S2_16

scanf() 函数操作有以下几个作用。(1)首先从缓冲区中提取所需数据。(2) 如果缓冲区中没有所需数据,则要求从键盘输入一个数据流。(3)遇到下面的情形时终止执行 ① 格式参数中的格式项用完——正常结束。 ② 当格式项与输入数据不匹配时,非正常结束。(4) 如果执行成功,返回成功匹配的项数;否则执行失败,

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;}

c+s2_16.cpp