51
第第第 C 第第第第 主主 主主主

第二讲 C 语言概述

Embed Size (px)

DESCRIPTION

第二讲 C 语言概述. 主讲:周春容. 2.0 预备知识 2.1 常量与变量 2.2 数据类型 2.3 常用输出与输入函数 练习与实践. 2.0 预备知识 计算机中数的表示及进制转换 数码、基与权 数码:表示数的符号 基:数码的个数 权:每一位所具有的值 数制. 十六进制数. 数制. 十进制数. 二进制数. 八进制数. 数码. 0~9. 0~1. 0~7. 0~9,A~F,a~f. 基. 10. 2. 8. 16. 权. … ,10²,10¹ 10 º. … , 2², 2¹, 2 º. - PowerPoint PPT Presentation

Citation preview

Page 1: 第二讲  C 语言概述

第二讲 C 语言概述主讲:周春容

Page 2: 第二讲  C 语言概述

第二讲 基本数据类型及数据输入输出

2.0预备知识2.1常量与变量2.2数据类型2.3常用输出与输入函数 练习与实践

Page 3: 第二讲  C 语言概述

第二讲 基本数据类型及数据输入输出

2.0 预备知识 计算机中数的表示及进制转换

•数码、基与权– 数码:表示数的符号– 基:数码的个数– 权:每一位所具有的值

•数制

Page 4: 第二讲  C 语言概述

第二讲 基本数据类型及数据输入输出

数制

表示

数码

特点

… ,10²,10¹10º

十进制数

0~9

10

逢十进一

二进制数

0~1

2

… , 2², 2¹, 2º

逢二进一

八进制数

0~7

8

… , 8², 8¹, 8º

逢八进一

十六进制数

0~9,A~F,a~f

16

… , 16², 16¹, 16º

逢十六进一

十进制: 4956= 410³+910² +510¹+610º二进制: 1011=12³+02² +12¹+12º十六进制: 81AE=816³+116² +1016¹+1416º八进制: 4275=48³+28² +78¹+58º

Page 5: 第二讲  C 语言概述

第二讲 基本数据类型及数据输入输出

• 各种进制之间的转换– 二进制、八进制、十六进制转换成十进制

» 方法:按权相加

10012345

2 59212120212121111011 )()(例

10012

8 94868381136 )()(例

100123

16 79781610162161516121 )()(例 AF

Page 6: 第二讲  C 语言概述

第二讲基本数据类型及数据输入输出各种进制之间的转换 ( 整数 )

二进制、八进制、十六进制转换成十进制方法:按权相加

十进制转换成二进制、八进制、十六进制原理:

的余数是2

)2......22(2

22......22

)......(

0

00

12

11

00

11

11

2011

Na

aaaa

aaaa

aaaaN

nn

nn

nn

nn

nn

方法:连续除以基,从低到高记录余数,直至商为 0

例 把十进制数 59 转换成二进制数

592

292

142

72

32

120

(59)10=(111011)2

1

1

01

11

1 1 1 0 1 1

余余余余余余

例 把十进制数 159 转换成八进制数

1598

198

280

(159)10=(237)8

2 3 7

余 7

余 3

余 2

例 把十进制数 459 转换成十六进制数

45916

2816

1160

(459)10=(1CB)16

1 C B

余 11

余 12

余 1

Page 7: 第二讲  C 语言概述

第二讲 基本数据类型及数据输入输出二进制与八进制之间的转换

二进制转换成八进制:从右向左,每 3 位一组(不足 3 位左补 0 ),转换成八进制

八进制转换成二进制:用 3 位二进制数代替每一位八进制数

例 (1101001)2=(001,101,001)2=(151)8

例 (246)8=(010,100,110)2=(10100110)2

000 ~ 0001 ~ 1010 ~ 2011 ~ 3100 ~ 4101 ~ 5110 ~ 6111 ~ 7

Page 8: 第二讲  C 语言概述

第二讲 基本数据类型及数据输入输出二进制与十六进制之间的转换

二进制转换成十六进制:从右向左,每 4 位一组(不足 4 位左补 0 ),转换成十六进制

十六进制转换成二进制:用 4 位二进制数代替每一位十六进制数

例 (11010101111101)2=(0011,0101,0111,1101)2=(357D)16

例 (4B9E)16=(0100,1011,1001,1110)2=(100101110011110)2

0000 ~ 00001 ~ 10010 ~ 20011 ~ 30100 ~ 40101 ~ 50110 ~ 60111 ~ 71000 ~ 81001 ~ 91010 ~ A1011 ~ B1100 ~ C1101 ~ D1110 ~ E1111 ~ F

Page 9: 第二讲  C 语言概述

第二讲 基本数据类型及数据输入输出 字节和位

• 内存以字节为单元组成• 每个字节有一个地址• 一个字节一般由 8 个二进制位组成• 每个二进位的值是 0 或 1

01234567

0123456789

10

……

...

7

6

4

3

2

5

1

Page 10: 第二讲  C 语言概述

第二讲 基本数据类型及数据输入输出 数值的表示方法——原码、反码和补码

• 原码:最高位为符号位,其余各位为数值本身的绝对值• 反码:

– 正数:反码与原码相同– 负数:符号位为 1 ,其余位对原码取反

• 补码:– 正数:原码、反码、补码相同– 负数:最高位为 1 ,其余位为原码取反,再对整个数加 1

3

12

6

9

1

2

4

57

8

10

11

9-5=49+7=16=(14)12

Page 11: 第二讲  C 语言概述

第二讲 基本数据类型及数据输入输出

为什么用补码表示?

25-19=25+(-19)(25)10=(00011001)2 (-19) 10

=(11101101) 2

00011001

+ 11101101----------------- 100000110

Page 12: 第二讲  C 语言概述

第二讲 基本数据类型及数据输入输出

为什么用补码表示?19 - 25 = 19 +(- 25)(19)10=(00010011)2 (-25) 10 =(11100111)

2

00010011+ 11100111----------------- 11111010 -------(-6)?

引入补码之后符号位也进入了运算,不用再单独处理符号位

Page 13: 第二讲  C 语言概述

第二讲 基本数据类型及数据输入输出

原码 反码 补码+7 00000111 00000111 00000111

-7 10000111 11111000 11111001

+0 00000000 00000000 00000000

-0 10000000 11111111 00000000

数的范围01111111~

11111111(-127~+127)

01111111~10000000

(-127~+127)

01111111~10000000

(-128~+127)

(用一字节表示数)

负数补码转换成十进制数:最高位不动,其余位取反加 1

例 补码: 11111001 取反: 10000110

加 1 : 10000111=-7

Page 14: 第二讲  C 语言概述

第二讲 基本数据类型及数据输入输出2.1 常量与变量

标识符• 定义:用来标识变量、常量、函数等的字符序列• 组成:

– 只能由字母、数字、下划线组成,且第一个字母必须是字母或下划线

– 大小写敏感– 不能使用关键字

• 长度:最长 32 个字符• 命名原则:

– 见名知意– 不宜混淆 如 l 与 I, o 与 0

例 :判断下列标识符号合法性sum Sum M.D.John day Date 3days

student_name #33 lotus_1_2_3

char a>b _above $123

M.D.John 3days#33

char $123a>b

Page 15: 第二讲  C 语言概述

第二讲 基本数据类型及数据输入输出

一般用大写字母是宏定义预处理命令,不是 C 语句

直接常量 :整型常量 实型常量 字符常量 字符串常量

如 #define PRICE 30

常量定义:程序运行时其值不能改变的量(即常数)分类 :

符号常量 : 用标识符代表常量定义格式: #define 符号常量 常量

例 符号常量举例

#define PRICE 30main(){ int num,total; num=10; total=num*PRICE; printf("total=%d",total);}

运行结果: total=300

Page 16: 第二讲  C 语言概述

第二讲 基本数据类型及数据输入输出

变量 ------ 其值可以改变的量 概念:

• 每个变量有一个名字:用标识符表示。• 每个变量有一个存储空间(存储单元),该单元中的状态所表示

的数为此时变量的值。

变量初始化 : 定义时可以赋初值

合法标识符

变量的使用:先定义,后使用变量定义的一般格式: 数据类型 变量 1[ ,变量 2 ,…,变量 n];

如: int a,b,c; float x,y;

Page 17: 第二讲  C 语言概述

第二讲 基本数据类型及数据输入输出

编译程序根据变量定义为其分配指定字节的内存单元 …

...

地址

int a=1, b=-3,c;

a

b

c

2 字节

2 字节

2 字节

地址

地址

….

..

内存

1

-3

随机数

Page 18: 第二讲  C 语言概述

第二讲 基本数据类型及数据输入输出

例 : int a=2,b,c=4; float data=3.67; char ch=‘A’; int x=1,y=1,z=1; int x=y=z=1;

例 2 float a,b,c; c=a%b; //Illegal use of floating point in function main

变量定义位置:一般放在函数开头

main(){ int a,b=2; float data; a=1; data=(a+b)*1.2; printf(“data=%f\n”,data);}

变量定义可执行语句

main(){ int a,b=2; a=1; float data; data=(a+b)*1.2; printf(“data=%f\n”,data);}

例 1 int student; stadent=19; //Undefined symbol ‘statent’ in function main

Page 19: 第二讲  C 语言概述

第二讲 基本数据类型及数据输入输出

每一个变量都有一个类型,表明了为它的存储属性 : 分配空间的大小; 表示的数的范围; 所能进行的运算。

Page 20: 第二讲  C 语言概述

第二讲 基本数据类型及数据输入输出例 2.1main(){float length,area,radius; /*length 为周

长, area 为面积, radius 半径 */ printf("\nEnter a radius: "); scanf("%f",&radius); length=2*PI*radius; /* 计算圆的周长 */ area=PI*radius*radius; /* 计算圆的面积 */ printf("\n length is : %f ",length); printf("\n area is : %f ",area); }程序的运行情况为: Enter a radius: 2.8 ↙ length is : 17.584000 area is : 24.617599

Page 21: 第二讲  C 语言概述

第二讲 基本数据类型及数据输入输出2.2 数据类型

数据类型总表

C数据类型

基本类型

构造类型

指针类型空类型 void

定义类型 typedef

字符类型 char

枚举类型 enum

整 型

实型单精度型 float

双精度型 double

数组结构体 struct

共用体 union

短整型 short

长整型 long

整型 int

数据类型决定:1. 数据占内存字节数

2. 数据取值范围3. 其上可进行的操作

Page 22: 第二讲  C 语言概述

第二讲 基本数据类型及数据输入输出2.2.1 整数类型 整数类型的标识符是 int。整型数据根据其占用的内存字节数不同,可加限定词:

short(短整型 ) , int ,long(长整型 ) , short≤int≤long可用 sizeof( 类型标识符)测量

unsigned short (无符号短整型 ), unsigned int (无符号整型 ),

unsigned long (无符号长整型 ), 其中 short 和 long的引入是为满足实际要求的不同长度的整数,而经 unsigned限定词限定的整数总是正的。

Page 23: 第二讲  C 语言概述

第二讲 基本数据类型及数据输入输出

01 11 11 11 11 11 11 11int 型: 最大 :32767

10 00 00 00 00 00 00 00 最小 :-32768

11 11 11 11 11 11 11 11unsigned int 型: 最大 :65535

00 00 00 00 00 00 00 00 最小 :0

Page 24: 第二讲  C 语言概述

第二讲 基本数据类型及数据输入输出

整型常量(整常数)三种形式:

十进制整数:由数字 0~9 和正负号表示 . 如 123,-456,0八进制整数:由数字 0 开头 , 后跟数字 0~7 表示 . 如0123,011

十六进制整数:由 0x开头 , 后跟 0~9,a~f,A~F 表示 . 如 0x123,0Xff

例 12 与 12L例 30000 为 int 型 65536 为 long int 型

问题:0123 = ( )10

0x123 = ( )10

0Xff = ( )10

83

291

255

问题:0123 = ( )10

0x123 = ( )10

0Xff = ( )10

Page 25: 第二讲  C 语言概述

第二讲 基本数据类型及数据输入输出

整型常量的类型根据其值所在范围确定其数据类型: 一个整数若值在 -32768 ~ 32767内,则默认为它是 int型;一个整数若值在 -2147483648 ~ 2147483647之间,可使用长整型常量表示。

在整常量后加字母 l 或 L ,认为它是 long int 型常量无符号数也可用后缀表示,整型常数的无符号数的后缀为“ U” 或“ u” 。

例如: 358u,0x38Au,235Lu 均为无符号数; 0XA5Lu表示十六进制无符号长整数 A5,其十进制为 165。

一个非负的整数,只要它的值不超过相应变量的取值范围,就可以赋给 unsigned型变量。例如,可以将 6000赋给一个 unsigned int型变量,但却不可以将 66000赋给一个unsigned int型变量(将会出现溢出错误)

Page 26: 第二讲  C 语言概述

第二讲 基本数据类型及数据输入输出 整型变量 定义方法: int a1,a2; unsigned int b1,b2;

一个整型常量只可以赋给能容纳下其值的整型变量。

如 a1,a2的取值范围为 -32768----32767 b1,b2的取值范围为 0----65535如果: a1=65535;或者 : b1=-1;在内存中数值将不是所赋的数值。

Page 27: 第二讲  C 语言概述

第二讲 基本数据类型及数据输入输出

2.2.2 实数类型 实数类型分为单精度( float)和双精度( double

)类 型,二者的区别在于所占存储位的多少,从而决定了其取值范围。

通常以 32位( bits)来存储单精度实数型数据,以64位来存储双精度实型数据。

Page 28: 第二讲  C 语言概述

第二讲 基本数据类型及数据输入输出

实型常量(实数或浮点数)表示形式:

十进制数形式:由数字和小数点组成,小数点的左右至少一边要有数字。 (必须有小数点) 如 0.123, .123, 123.0, 0.0, 123.

指数形式:由尾数、 e 或 E 和指数部分组成, E 的两边都至少要有一位数且 E 的右边只允许是整数形式( e 或 E 之前必须有数字;指数必须为整数)如 12.3e3 ,123E2, 1.23e4 , e-5 , 1.2E-3.5

实型常量的类型默认 double型在实型常量后加字母 f 或 F ,认为它是 float 型

Page 29: 第二讲  C 语言概述

第二讲 基本数据类型及数据输入输出 实型变量

实型变量的说明形式如下 : float 变量名 1[,变量名 2 ,…… 变量名 n]; double 变量名 1[,变量名 2 ,…… 变量名 n];

float:占 4字节,提供 7位有效数字double:占 8字节,提供 15~16 位有效数字

例 float a;a=111111.111; /* a=111111.1*/double b;b=111111.111; /* b=111111.111*/

float a,b,c;double x,y;

Page 30: 第二讲  C 语言概述

第二讲 基本数据类型及数据输入输出【例 2.2 】实型变量的有效数字。 main( ){ double a; a=6.152367864359046178294901; printf("\n%25.20f",a);}输出结果为: 6.15236786435904648000

在这个例子中, a 被赋值了一个有效位数为 25 位的数字。但由于 a是 double 类型的,所以 a 只能接收 15~16 位有效数字。在 printf语句中,我们使用了 %20.18f 这样的格式符号,这指示 printf 语句在输出 a 时总长度应为 25 位,小数点位数占 20 位。输出的结果显然显示了 25 位数,但只有 6.152367864359046 共 16 位有效数字被正确显示出来,后面的数字是一些无效的数值。这就表明 double 型的数据只接收 15~16 位有效数字。

Page 31: 第二讲  C 语言概述

第二讲 基本数据类型及数据输入输出

2.2.3 字符类型 整型、实型都是数值型,是大家比较熟悉的。除数值型外,还有一类数据是计算机经常处理的数据,这就是字符型。

字符型数据包含的是一个字符集。一般用的是ASCII码字符集见附录 A(p249) 。

字符集中的每一个字符都有一个序号,称为 ASCII码。 ASCII码大的字符比 ASCII码小的字符值大。

字符类型的标识符是 char。

Page 32: 第二讲  C 语言概述

第二讲 基本数据类型及数据输入输出 字符常量定义 : 用单引号括起来的单个普通字符或转义字符 .

字符常量的值:该字符的 ASCII码值

<

转义字符及其含义:转义字符 含义

\n

\v

\r

\a

\‘

\ddd

\t

\b

\f

\\

\“

\xhh

转义字符 含义

换行垂直制表

回车

响铃单引号

3 位 8 进制数代表的字符

水平制表退格

换页

反斜线

双引号2 位 16 进制数代表的字符

如 ‘ \101’ -----------‘A’ ‘\012’ -----------’\n’ ‘\376’ -----------’’ ‘\x61’ -----------’a’ ‘\60’ -----------’0’ ‘\483’ ----------()

例 :‘A’-------’\101’-------’\x41’--------65

如 ‘ A’——65, ‘ a’——97, ‘0’——48 , ‘\n’——10

如 ‘ a’ ‘A’ ‘?’ ‘\n’ ‘\101’转义字符 :反斜线后面跟一个字符或一个代码值表示

例 转义字符举例 (ch2_001.c,ch2_004.c) main()

{ printf("\101 \x42 C\n");

printf("I say:\"How are you?\"\n"); printf("\\C Program\\\n");

printf("Turbo \'C\'");}

运行结果: ( 屏幕显示 )A B C

Isay:”How are you?”\C Program\

Turbo ‘C’

例 main() { printf(“Y\b=\n”);

}

运行结果:屏幕显示: =

打印机输出: ¥

Page 33: 第二讲  C 语言概述

第二讲 基本数据类型及数据输入输出

字符型变量char 变量名 1 , [ 变量名 2 ,......变量

名 n]; 如: char c1,c2 ;一个字符型变量的值只能是一个单个字符;在内存中占一个字节 ;

字符变量存放的是字符的 ASCII码 ;char与 int数据间可进行算术运算 ; 由于字符型变量在内存中是以字符的 ASCII码—一个无符号整数的形式来存放的,所以在一定范围内,字符型数据和整型数据是可以互相通用的,二者的区别仅在于:字符型常量占一个字节,而整型常量占两个字节。

例 a=‘D’; /* a=68; */ x=‘A’+5; /* x=65+5; */ s=‘!’+‘G’ /* s=33+71; */

Page 34: 第二讲  C 语言概述

第二讲 基本数据类型及数据输入输出【例 2.3 】将小写字母转化为大写字母。main( ){char c1,c2; c1='x';c2='y'; c1=c132; c2=c232; printf("\n%c,%c",x1,x2);}程序的输出结果是: X,Y 这个例子是将小写字母转化为大写字母的程序。我们在

对 ASCII码字符表进行观察后会发现,大小写对应的字母,它们之间的 ASCII码正好相差 32。利用这个特性和上一个特性,我们可以编写出非常简单的大小写字母转换程序。

Page 35: 第二讲  C 语言概述

第二讲 基本数据类型及数据输入输出

字符常量与字符串常量不同

字符串常量定义:用双引号 (“”) 括起来的字符序列存储:每个字符串尾自动加一个 ‘ \0’ 作为字符串结束标志

h e l l o \0例 字符串“ hello” 在内存中

a a \0例 ‘ a’ “a”

例 空串 “” \0

例 : char ch; ch=“A”;

例 : char ch; ch=‘A’;

没有字符串变量,用字符数组存放

Page 36: 第二讲  C 语言概述

第二讲 基本数据类型及数据输入输出基本数据类型

类型符号 关键字

数的表示范围所占位数

整型

字符型

实型

(signed)int 16 -32768~32767(signed)short 16 -32768~32767

(signed)long 32 -2147483648~214748364716unsigned

int0~65535

32 0~4294967295unsigned long

unsigned short 16 0~65535

有 float 32 3.4e-38~3.4e38有 double 64 1.7e-308~1.7e308

有 char 8 -128~127

无 unsigned char 8 0~255

说明 : 数据类型所占字节数随机器硬件不同而不同 , 上表以 IBM PC 机为例 :

Page 37: 第二讲  C 语言概述

第二讲 基本数据类型及数据输入输出

例 /*ch2_003.c*/ #define PRICE 12.5 main() { int num=3; float total; char ch1,ch2=‘D’;

total=num*PRICE; ch1=ch2-‘A’+‘a’; printf(“total=%f,ch1=%c\n”,total,ch1); }

宏定义

变量定义

输出结果

运行结果:total=37.500000, ch1=d

Page 38: 第二讲  C 语言概述

第二讲 基本数据类型及数据输入输出

2.3 常用输入与输出函数

C 语言无 I/O 语句, I/O 操作由函数实现 #include <stdio.h>

Page 39: 第二讲  C 语言概述

第二讲 基本数据类型及数据输入输出

格式: printf(“ 格式控制串”,输出表列 ) ;功能:按指定格式向显示器输出数据返值:正常,返回输出字节数;出错,返回 EOF(-1)

2.3.1 格式输出函数

输出表列:要输出的数据 ,通常是表达式,可以没有,多个时以“ ,” 分隔)

格式控制串:包含两种信息:格式说明: %[修饰符 ] 格式字符 --- 用于指定所输出的表达事的格式;

普通字符或转义序列:原样输出;格式字符

Page 40: 第二讲  C 语言概述

第二讲 基本数据类型及数据输入输出d,ix,Xoucs

e,Efg

%%

格式字符:

十六进制无符号整数

不带符号十进制整数

十进制整数

指数形式浮点小数

单一字符字符串

八进制无符号整数

小数形式浮点小数e 和 f 中较短一种百分号本身

int a=567;printf ( “%d”,a);

int a=255;printf(“%x”,a);

int a=65;printf(“%o”,a);

int a=567;printf(“%u”,a);

char a=65;printf(“%c”,a);

printf(“%s”,“ABC”);

float a=567.789;printf(“%e”,a);

float a=567.789;printf(“%f”,a);

float a=567.789;printf(“%g”,a);

printf(“%%”);

567

ff

101

567

A

ABC

5.677890e+02

567.789000

567.789

%

说明格式字符要用小写格式字符与输出项个数应相同,按先后顺序一一对应输出转换 : 格式字符与输出项类型不一致 ,自动按指定格式输出

例 main() { unsigned int u=65535; printf(”u=%d\n",u); } 输出结果: u=-1

例 int a=3,b=4; printf(“%d %d\n”,a,b); printf(“a=%d , b=%d\n”,a,b);

例 int a=3,b=4; printf(“%d %d\n”,a,b); printf(“a=%d , b=%d\n”,a,b);输出结果 : 3 4 a=3, b=4

11 11 11 11 11 11 11 11 65535

Page 41: 第二讲  C 语言概述

第二讲 基本数据类型及数据输入输出• 附加格式说明符(修饰符)

.n对实数 , 指定小数点后位数 (四舍五入 )对字符串 , 指定实际输出位数

修饰符 功 能m 输出数据域宽 , 数据长度 <m, 左补空格 ;否则按实际输出

输出数据在域内左对齐(缺省右对齐 )

-

指定在有符号数的正数前显示正号(+)

+

输出数值时指定左面不使用的空位置自动填0

0

在八进制和十六进制数前显示前导 0 ,0x

#

在 d,o,x,u前,指定输出精度为long型在 e,f,g前,指定输出精度为double型

l

Page 42: 第二讲  C 语言概述

第二讲 基本数据类型及数据输入输出例 2.4 main(){

int n1,n2; float f1,f2,sum; char ch; n1=65; n2= 3; f1=234.5; f2=18.75; sum=f1+f2; ch='A'; printf("%d ,%c ,%d,%o ,%f ,%c, %d ",n1,n1,n2,n2,sum,ch,ch); printf("%s","Very good!"); }

运行结果: 65, A ,–3 ,177775, 253.250000 ,A ,65 ,Very good!

例 static char a[]=“Hello,world!” printf(“%s\n%15s\n%10.5s\n%2.5s\n%.3s\n”,a,a,a,a,a);

运行结果: Hello,world! Hello,world!��� Hello����� Hello Hel

Page 43: 第二讲  C 语言概述

第二讲 基本数据类型及数据输入输出

例 int a=1234; float f=123.456; static char c[]=“Hello,world!”; printf(“%8d,%-8d\n”,a,a); printf(“%10.2f,%-10.1f\n”,f,f); printf(“%10.5s,%-10.3s\n”,c,c);

运行结果: ����1234 , 1234���� 123.46,123.5���� ����� Hello,Hel����� �������

例 -

Page 44: 第二讲  C 语言概述

第二讲 基本数据类型及数据输入输出例 int a=1234; float f=123.456; printf(“%08d\n”,a); printf(“%010.2f\n”,f); printf(“%0+8d\n”,a); printf(“0+10.2f\n”,f);

例 0 、 +

例 int a=123; printf(“%o,%#o,%X,%#X\n”,a,a,a,a);

例 #

例 long a=65536; printf(“%d,%8ld\n”,a, a);

例 l

00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00

//00001234//0000123.46//000+1234//000+123.56

//173,0173,7B,0X7B

//0, 65536���

Page 45: 第二讲  C 语言概述

第二讲 基本数据类型及数据输入输出2.3.2 格式输入函数

格式 : scanf(“ 格式控制串”,地址表)功能:按指定格式从键盘读入数据,存入地址表指定的 存储单元中 , 并按回车键结束返值:正常,返回输入数据个数

地址表:变量的地址,常用取地址运算符 &格式字符 :d,i,o,x,u,c,s,f,e

例 scanf(“%d”,&a); 输入: 10 则 a=10

例 scanf(“%x”,&a); 输入: 11 则 a=17

Page 46: 第二讲  C 语言概述

第二讲 基本数据类型及数据输入输出• 附加格式说明符(修饰符)

l

修饰符 功 能h

m

*

用于 d,o,x前,指定输入为 short型整数用于 d,o,x前,指定输入为 long型整数用于 e,f前,指定输入为 double型实数

指定输入数据宽度,遇空格或不可转换字符则结束抑制符,指定输入项读入后不赋给变量

例 scanf(“%4d%2d%2d”,&yy,&mm,&dd);

输入 19991015

则 1999yy, 10 mm, 15 dd

例 scanf(“%3d%*4d%f”,&k,&f); 输入 12345678765.43 则 123k, 8765.43f

例 scanf(“%2d �%*3d �%2d”,&a,&b); 输入 12 �345 �67 则 12a, 67b

例 scanf(“%3c%2c”,&c1,&c2);

输入 abcde

则‘ a’c1, ‘d’ c2

Page 47: 第二讲  C 语言概述

第二讲 基本数据类型及数据输入输出

• 输入分隔符的指定– 一般以空格、 TAB 或回车键作为分隔符– 其它字符做分隔符:格式串中两个格式符间字符

例 scanf(“%d%o%x”,&a,&b,&c);

printf(“a=%d,b=%d,c=%d\n”,a,b,c);

输入 123 123 123

输出 a=123,b=83,c=291

例 scanf(“%d:%d:%d”,&h,&m,&s); 输入 12:30:45 则 12 h, 30 m, 45 s

例 scanf(“%d,%d”,&a,&b) 输入 3,4 则 3a, 4 b

例 scanf(“a=%d,b=%d,c=%d”,&a,&b,&c); 输入 a=12,b=24,c=36

Page 48: 第二讲  C 语言概述

第二讲 基本数据类型及数据输入输出• 说明:用“ %c” 格式符时,空格和转义字符作为

有效字符输入如 scanf(“%c%c%c”,&c1,&c2,&c3);

若输入 a�b�c 则 ac1, � c2, b c3

输入数据时,遇以下情况认为该数据结束:遇空格、 TAB 、或回车遇宽度结束遇非法输入如 scanf(“%d%c%f”,&a,&b,&c);

若输入 1234a123o.26

则 1234 a, ‘a’ b, 123 c

输入函数留下的“垃圾”:例 int x; char ch; scanf(“%d”,&x); ch=getchar(); printf(“x=%d,ch=%d\n”,x,ch);执行: 123输出: x=123,ch=10

例 int x; char ch; scanf(“%d”,&x); scanf(“%c”,&ch); printf(“x=%d,ch=%d\n”,x,ch);执行: 123输出: x=123,ch=10

解决方法:( 1 )用 getchar()清除( 2)用函数 fflush(stdin)清除全部剩余内容 (3) 用格式串中空格或“ %*c”来“吃掉”

例 int x; char ch; scanf(“%d”,&x); scanf(“ %c”,&ch);或 scanf(“%*c%c”,&ch);

Page 49: 第二讲  C 语言概述

第二讲 基本数据类型及数据输入输出

#include <stdio.h>main(){ int c; char a; c=65; a='B'; putchar(c); putchar('\n'); putchar(a);}

运行结果: A B

2.3.3 字符输出函数 ------putchar()

格式 : putchar( c )参数 : c 为字符常量、变量或表达式功能:把字符 c 输出到显示器上返值:正常,为显示的代码值;出错,为 EOF(-1)

Page 50: 第二讲  C 语言概述

第二讲 基本数据类型及数据输入输出

格式 :getchar( )功能:从键盘读一字符返值:正常,返回读取的代码值;出错 , 返回 EOF(-1)

2.3.4 字符输入函数 ------getchar()

例 #include <stdio.h>main(){ int c; printf("Enter a character:"); c=getchar(); printf("%c--->hex%x\n",c,c);}

运行结果:Enter a character:AA--->hex41

Page 51: 第二讲  C 语言概述