版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
本章要求:本章难点:各种数据类型的数据在内存中的存放形式本章重点:变量与常量的概念第2章数据类型与常用库函数掌握各种常用数据类型的数据在内存中的存放形式掌握常量的分类,变量的定义和变量名的命名规则理解指针的含义,掌握指针变量的定义及简单应用掌握一些常用内部函数的使用第2章数据类型、运算符和表达式2第2章数据类型、运算符和表达式
2.1C语言的数据类型2.2常
量
2.3变量2.4指针变量
2.5标准输入/输出函数用法2.6常用库函数第2章数据类型、运算符和表达式32.1C语言的数据类型
(引例)例2-1
下面是计算两个数据参与算术运算的程序,请分析其结果。voidmain(){inta,b,c,x,y; /*定义a,b,c,x,y为整型变量*/a=300;b=500;c=a+b;x=a*b;y=a/b;/*a除以b,其商赋值给变量y*/printf("c=%d,x=%d,y=%d",c,x,y);}程序运行结果如右图第2章数据类型、运算符和表达式42.1C语言的数据类型2.1.1C语言数据类型概述1.基本数据类型(整型、实型、字符型)
2.构造数据类型(数组、结构体、共用体类型、枚举类型)3.指针类型4.空类型(void)
注意:在程序中用到的常量与变量必须是以上一种数据类型;正确地区分和使用不同的数据类型,可使程序运行时占用较少的内存,确保程序运行的正确性和可靠性。第2章数据类型、运算符和表达式52.1C语言的数据类型2.1.1C语言数据类型概述第2章数据类型、运算符和表达式62.1.2基本数据类型
基本数据类型是构成C语言的数据类型的最基本要素。基本数据类型包括:整型(int)
实型(单精度float和双精度double)
字符型(char)2.1C语言的数据类型第2章数据类型、运算符和表达式7整型数据的取值和取值范围类型说明符数的范围分配字节数
int-32768~327672字节
shortint/short-32768~327672字节
long-2147483648~21474836474字节unsignedint/unsigned0~655352字节unsignedshortint0~655352字节unsignedlongint0~4字节2.1C语言的数据类型第2章数据类型、运算符和表达式8
使用C的数据(变量或常量),应该搞清楚以下几点:(1)它的数据类型;(2)此类数据在内存中的存储形式、占用的字节数;(3)数据的取值范围;(4)数据能参与的运算;(5)数据的有效范围(是全局、局部)、生存周期(是动态还是静态变量)。01111111111111111例如:一个整型(int)数据的最大值符号位2.1C语言的数据类型第2章数据类型、运算符和表达式91.机器数:用“0”表示正数,“1”表示负数,其余位仍表示数值。把在机器内存储的正、负号数字化的数称为机器数。2.1.3各类数据在内存中的存放方式
机器数与原码、补码和反码表示
例如,C语言中的基本整型数据在计算机中通常用16位(即2个字节)来存储,如图所示的是十进制数67和-67在计算机中的存储形式。第2章数据类型、运算符和表达式102.原码表示法
原码表示方法中,数值用绝对值表示,在数值的最左边用“0”和“1”分别表示正数和负数,书写成[X]原表示X的原码。
例如,当n=16(即使用2个字节来存储),十进制数+67和-67的原码表示如图2-3所示,记为:[+67]原=0000000001000011[-67]原=10000000010000112.1.3各类数据在内存中的存放方式
第2章数据类型、运算符和表达式112.原码表示法从定义可以看出,在原码的表示中,有以下两个特点:(1)最高位为符号位,正数为0,负数为1,其余n-1位是X的绝对值的二进制表示。(2)0的原码有两种表示:[+0]原=0000000000000000[-0]原=1000000000000000因此,原码表示中,数值0不是唯一的。2.1.3各类数据在内存中的存放方式
第2章数据类型、运算符和表达式123.反码表示法
用[X]反表示X的反码。如果机器的字长为n,则反码的定义如下:
例如,当n=16,十进制数+67和-67的反码表示为:[+67]反=0000000001000011[-67]反=11111111101111002.1.3各类数据在内存中的存放方式
第2章数据类型、运算符和表达式133.反码表示法
由此可以看出,在反码的表示中,有以下特点:(1)正数的反码与原码相同,负数的反码是其绝对值的二进制表示按各位取反(0变1,1变0)所得的表示,其中符号位不变。(2)0在反码表示中也有两种表示:
[+0]反=0000000000000000[-0]反=1111111111111111由此可见,0在反码表示(即数值0)中也不是唯一的。2.1.3各类数据在内存中的存放方式
第2章数据类型、运算符和表达式144.补码表示法
用[X]补表示X的补码。设机器的字长为n,则补码的定义如下:
例如,当n=16,十进制数+67和-67的补码表示为:[+67]补=0000000001000011[-67]补=11111111101111012.1.3各类数据在内存中的存放方式
第2章数据类型、运算符和表达式154.补码表示法
在补码的表示中,有以下特点:(1)正数的补码与原码、反码相同,负数的补码是其绝对值的二进制表示按各位取反(0变1,1变0)加1,其中符号位不变,即为其反码+1。(2)0在补码表示中:[+0]补=[-0]补=0000000000000000,因此,数值0的补码表示是唯一的。说明:由于补码运算方便,所以在计算机中广泛使用。2.1.3各类数据在内存中的存放方式
第2章数据类型、运算符和表达式16
大多数计算机系统采用补码来表示整数。原因在于:使用补码,可以将符号位和其它位统一处理;同时,减法也可按加法来处理。另外,两个用补码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。2.1.3各类数据在内存中的存放方式
第2章数据类型、运算符和表达式17将一个负数的补码数转换成十进制数的步骤如下:(1)首先将各位取反。(2)将其转换为十进制数,并在前加一负号(3)对所得到的数再减1,即得到该数的十进制数。例如:求补码1111111110111101对应的十进制数,其步骤:取反:0000000001000010;转换为十进制数,加负号得:-66,再减1,则为-67。按照上述方法,不难求得: 补码1111111111111111对应的十进制数是:-1。 补码1000000000000000对应的十进制数是:-32768(计算机中整数是最小值)。
5.由补码数求对应的十进制数
2.1.3各类数据在内存中的存放方式
第2章数据类型、运算符和表达式定点数和浮点数
1.整数的表示——定点数
符号位数值部分如果计算机用N位来表示一个带符号的整数M,可写成:M=NsNn-1Nn-2…N2N1N0Ns为符号位M的取值范围:-2n≤M≤2n-1
例如,整数194采用定点数存储形式,如下图所示:
2.1.3各类数据在内存中的存放方式
第2章数据类型、运算符和表达式2.实数的表示——浮点数
在计算机中一个浮点数由两部分构成:阶码和尾数,阶码是整数,尾数是纯小数。即可表示为:M=2P×S
其中,P是一个二进制整数,S是二进制小数。这里称P为数M的阶码,阶码P指明了小数点的位置。S为数M的尾数,S表示了数M的全部有效数字。阶符PS表示阶码的正负,尾符SS确定数据的正负。2.1.3各类数据在内存中的存放方式
第2章数据类型、运算符和表达式
实型数据是采用浮点数的存放形式存储的。一般微型计算机中单精度(float类型)使用4个字节来存储,通常阶码及阶符占1个字节,尾数及尾符占3个字节,阶符和尾符各占1个二进制位。
float类型的数值范围是-2P~2P,其中P为7个二进制位表的最大数(1111111),即127,所以float类型的数值范围是-2P~2P,即-2127~2127,即-1038
~1038。
2.1.3各类数据在内存中的存放方式
第2章数据类型、运算符和表达式字符的存储形式——ASCII码
目前计算机中普遍采用的是ASCII(AmericanStandardCodeforInformationInterchange)码,即美国信息交换标准代码。ASCII码有7位版本和8位版本两种,国际上通用的是7位版本,7位版本的ASCII码有128个元素,只需用7个二进制位(27=128)表示,其中控制字符34个,阿拉伯数字10个,大小写英文字母52个,各种标点符号和运算符号32个。在计算机中实际用8位表示一个字符,最高位为“0”。标准ASCII码共128个符号(参见附录)。2.1.3各类数据在内存中的存放方式
第2章数据类型、运算符和表达式222.2常量2.2.1数值常量1.整型常量(1)十进制整常数
237-56801627(2)八进制整常数八进制整常数必须以0开头,即以0作为八进制数的前缀。
015(十进制为13)0101(十进制为65)
07908001定义:在程序运行时,其值不能被改变的量叫常量。如5,3.14159,‘a’
等不合法的八进制数不合法的八进制数第2章数据类型、运算符和表达式232.2常量(3)十六进制整数(前缀为0X)
0X2A(十进制为42)0XA0(十进制为160)
0XFFFF(十进制为65535)
不合法的十六进制整常数:
5A(无前缀0X)0X3H(含有非十六进制数码)
说明:若要表示长整型(long)整数,在数的最后加表示长整型的后缀修饰符号字母“l”
。如:1250125l
0X125l
等价于125、(125)8、(125)16
25和25l的区别,前者用2个字节存储,后者则使用4个字节存储。第2章数据类型、运算符和表达式242.2常量例2-2
通过以下例题来说明整型常量的三种表示方法及相互关系intmain(){intx=123,y=0123,z=0x123;printf("%d%d%d\n",x,y,z);/*以十进制形式%d输出*/printf("%o%o%o\n",x,y,z);/*以八进制形式%o输出*/printf("%x%x%x\n",x,y,z);/*以十六进制形式%x输出*/}第2章数据类型、运算符和表达式252.实型常量实型也称为浮点型,实型常量也称为实数或者浮点数。在C语言中,实数只采用十进制。(1)小数形式由数码0-9和小数点组成。例如:0.123.123123.0-123等均为合法的实数。(2)指数形式由十进制数,加阶码标志“e”或“E”以及阶码(只能为整数,可以带符号)组成。其一般形式为aEn
(a为十进制数、n为十进制整数),值为
a*10±n2.2常量第2章数据类型、运算符和表达式262.2常量例如:1.25E+31.25e+31.25×103
1250.0说明:当阶码为正数时,正号可以省略。即1.25E+3等价于1.25E3;
同一个实数可以有多种表示形式,例如:1250.0可以用0.0125E+5,0.125E+4,1.25E+3,12.5E+2,125E+1。一般将1.25×103称为“规范化的指数形式”。第2章数据类型、运算符和表达式27
一般PC机中单精度型占4个字节(32位)内存空间,其数值范围为3.4E-38~3.4E+38,只能提供7位有效数字。双精度型占8个字节(64位)内存空间,其数值范围为1.7E-308~1.7E+308,可提供16位有效数字。实型变量由于有效数字的限制,可能出现舍入误差。
实型常数不分单、双精度,都按双精度型处理。
单精度型float双精度型double实型数分为两类:2.2常量第2章数据类型、运算符和表达式282.2常量2.2.2字符常量
字符常量是用单引号括起来的一个字符。例如'a','b','=','+','?'都是合法字符常量。在C语言中,字符常量有以下特点:1.字符常量只能用单引号括起来,不能用双引号或其它括号;2.字符常量只能是单个字符,不能是字符串;3.字符可以是字符集中任意字符。但数字被定义为字符型之后就不能再作为数字参与数值运算。如‘5’和5是不同的。‘5’是字符常量,不能作为数值5参与运算。第2章数据类型、运算符和表达式292.2常量
字符值存放到一个字符变量中,实际是将字符的ASCII码值存放在变量的内存单元之中的。如‘A’的十进制ASCII码是65。若将字符‘A’存到内存变量中,实际存放形式是:01000001字符数据在内存中的存储形式及使用方法第2章数据类型、运算符和表达式302.2常量
在C语言中,字符数据与整型数据可以通用,允许对整型变量赋以字符值,也允许对字符变量赋以整型值。在输出时,允许把字符变量按整型量输出,也允许把整型量按字符量输出。整型量为二字节量,字符量为单字节量,当整型量按字符型量处理时,只有低八位字节参与处理。说明:voidmain(){intx=32770;chary;y=x;printf("%d\n",y);/*以十进制形式%d输出*/}第2章数据类型、运算符和表达式31
2.2常量2.2.3字符串常量C语言中的字符串常量是由一对双引号括起来的字符序列。每个字符串最后有一结束标志'\0'。例如:"ABC","A","123lkdf"
字符串常量在内存中存储时,系统自动在字符串的末尾加一个“串结束标志“,因此在程序中,长度为n个字符的字符串常量,在内存中占有n+1个字节的存储空间。第2章数据类型、运算符和表达式322.2常量例如:'a'与"a"是C语言中两种完全不同类型的数据。aa\0'a'与"a"在内存的存储形式注意:不要将字符常量和字符串常量混淆例如,字符串“ABCDEF”有6个字符,存储于内存中时,共占7个字节,最后一个字节为"\0"第2章数据类型、运算符和表达式33
转义字符是一种特殊的字符常量,以反斜线“\”开头,后跟一个或几个字符。转义字符主要用来表示用一般字符不便于表示的控制代码。常用的转义字符及其含义:
\n回车换行 \t横向跳到下一制表位置
\v竖向跳格 \b退格
\r回车 \\反斜线符“\”
\a鸣铃
\ddd1~3位八进制数所代表的字符
\xhh1~2位十六进制数所代表的字符2.2常量2.2.4转义字符第2章数据类型、运算符和表达式34例2-1:#include<stdio.h>intmain(){printf("abc\tde\bfghi\n");printf("a=65b=\101c=\x41\n");return0;}abcdfghia=65
b=Ac=A输出结果:2.2常量第2章数据类型、运算符和表达式352.2.5符号常量
符号常量是用一个符号表示一个多次常用的常量。
C语言中使用命令#define来定义:
#define符号常量名标识符常数表达式优点:符号常量使程序易于阅读和修改。2.2常量无分号例如,一个程序中多处用到学生人数60,当有学生人数改变为65,修改这个程序很困难。而使用符号常量,只要将#defineNUM60改为#defineNUM65,就可以了。第2章数据类型、运算符和表达式36例2-4
:求一个半径为r的球的体积和表面积的C程序#definePI3.14159/*定义PI为符号常量,值为3.1415*/intmain(){floatv,s,r;scanf(“%f”,&r);v=4.0/3.0*PI*r*r*rs=4*PI*r*r;printf("v=%f,s=%f\n",v,s);return0;}说明:(1)符号常量名常常用大写字母、变量名用小写字母。(2)符号常量不能在其作用域范围内重新赋值。2.2常量第2章数据类型、运算符和表达式372.2常量
有关符号常量的几点说明:
1)符号常量标识符:按C语言标识符的命名规则。为便于与一般变量区别,符号常量标识符名通常采用大写字母。
2)宏定义不是C语句,不必在行末加分号。如果加分号,会把分号当作符号串的一部分。
3)宏定义中的常数表达式可以是:值常量、在此前已声明过的符号常量、由这些常量与运算符组成的表达式。例如,
#definePI3.1515926535
#definePI22*PI
/*定义PI2符号常量,值为2*3.1415926535*/
第2章数据类型、运算符和表达式382.3变量
2.3.1变量的定义
变量是在程序运行时,其值能被改变的量变量的定义包括:变量名和相应的数据类型通过名字来引用一个变量,而数据类型则决定了该变量的存储方式和在内存中占据存储单元的大小
说明:变量名和变量值这两个概念的区别
intx=20;第2章数据类型、运算符和表达式39C语言中使用的变量都要作类型强制定义,即要求“先定义,后使用”的原则。其目的:
1)保证程序中变量名使用的正确性
2)编译程序为其分配相应的储存单元
3)保证运算的合法性变量定义形式:类型说明符变量名列表;2.3变量
charch;/*定义ch为字符型变量*/inti,j;/*定义i,j为基本整型变量*/floatx,y,z;/*定义x,y,z单精度实型变量*/doublesum,t;/*定义sum,t双精度实型变量*/第2章数据类型、运算符和表达式402.3.2变量的赋初值C语言中,当定义一个变量后,系统只是按定义的数据类型分配其相应的存储单元,并不对其单元初始化,如果在赋初值之前直接使用该变量,则是一个不定值。intmain(){intk;printf(“k=%d\n”,k);return0;}2.3变量
程序运行,输出k的值就是一个无意义的不定值,并在不同系统环境下运行的结果也可能完全不同。第2章数据类型、运算符和表达式41变量赋初值的一般形式为:(1)类型说明符
变量1=值1,变量2=值2,……;
(2)类型说明符
变量1,变量2,变量3;变量1=值1;变量2=值2;……例如:
inta=10,b=10,c=10
等价于inta,b,c;a=10;b=10;c=10;2.3变量第2章数据类型、运算符和表达式42注意:(1)在变量说明中不允许连续赋值,但在变量定义后,可以使用连续赋值语句初始化;如:inta=b=c=1;是不合法的;
inta,b,c;a=b=c=1;是合法的(2)C语言中变量定义后若没有赋值,系统并不自动赋0值,如果直接使用它,其值将是“不确定的”。2.3变量
第2章数据类型、运算符和表达式43整型数据的溢出intmain(){inta,b;a=32767;b=a+1;printf("a=%d,b=%d\n",a,b);return0;}运行结果是:a=32767,b=-32768
C语言中,数据超出其范围,即“溢出”,不报知错误信息,程序仍然能运行,但可能结果不正确的结果。2.3变量
a:0111111111111111->32767b:1000000000000000->-32768第2章数据类型、运算符和表达式442.4指针变量
指针是C语言中广泛使用的一种数据类型。
运用指针编程是C语言最主要的风格之一。
利用指针变量可以表示各种数据结构;能很方便地使用数组和字符串;并能象汇编语言一样处理内存地址,从而编出精练而高效的程序。指针极大地丰富了C语言的功能。学习指针是学习C语言中最重要的一环,能否正确理解和使用指针是我们是否掌握C语言的一个标志。指针也是C语言中最为困难的一部分,在学习中除了要正确理解基本概念,还必须要多编程,上机调试。第2章数据类型、运算符和表达式452.4.1地址与指针的概念
2.4指针变量
程序是由CPU控制和运行的,在执行过程中需要处理各种数据,这些数据被存放在内存中。
为了便于管理,内存空间被划分成若干个大小相同(1个字节)的存储单元,里面存放着各种数据。内存中每一个存储单元也有一个编号,这个编号被称为地址。通过地址就可以十分方便地访问指定的存储单元。变量的地址是存储它的第1个单元的编号。
常把变量的地址称为指针。
地址:内存单元的编号,通常一个字节一个编号。指针:内存单元的地址。第2章数据类型、运算符和表达式462.4指针变量
我们也称为指针第2章数据类型、运算符和表达式472.4.2变量的存储与访问
直接访问,即系统直接根据变量的地址找到相应的存储空间。
间接访问的基本思想为:将要访问变量a的地址存放在另一个变量p中,当需要访问变量a时,先取出变量p的内容即变量a的地址,再根据此地址找到变量a所对应的存储空间。能够存放其它变量地址的变量称作指针变量。变量的存储与访问
2.4指针变量
第2章数据类型、运算符和表达式482.4指针变量
一个指针是一个地址,是一个常量。一个指针变量却可以被赋予不同的指针值,是变量。但常把指针变量简称为指针。为了避免混淆,我们约定:“指针”是指地址,是常量,“指针变量”是指取值为地址的变量。定义指针变量的目的是为了通过指针去访问内存单元。注意:第2章数据类型、运算符和表达式492.4.3指针变量的定义
2.4指针变量
指针变量定义的一般形式:类型符*标识符;说明:
1)“*”直接修饰的“标识符”是指针变量。如:
int*p,x;/*p是指针变量,x是整型变量*/2)指针所指对象的类型称为指针的基准类型。如:
int*p1;/*p1的基准类型为整型,即p1所指向对象的类型是整型*/char*p2;/*p2的基准类型为字符型,即p2所指向对象类型是字符型*/第2章数据类型、运算符和表达式503)指针变量只能指向类型与其基准类型相同的变量。例如:intx,*p1=&x;chary,*p2=&y;
在以上两句中,p1可以指向x,但不能指向y;p2可以指向y,但不能指向x。
注意:既然指针变量的内容都是某个地址,为什么还要对其规定不同的基类型?这个问题仍然与上一节所讨论的变量的存储与访问过程有关。不同类型的变量所占据的存储空间大小不尽相同,而变量的地址仅仅是其存储空间的起始地址,系统需要综合变量地址和变量类型两方面的信息,才能正确访问变量的整个存储空间。
2.4指针变量
第2章数据类型、运算符和表达式512.4.4指针变量的初始化
指针变量同普通变量一样,使用之前不仅要定义说明,而且必须赋予具体的值。在最初学习变量的使用方法时,我们知道当定义一个变量后,系统会为其分配一块存储空间,但系统并不会自动初始化存储空间中的内容。2.4指针变量
例如以下程序:#include<stdio.h>intmain(){inta;printf("a=%d\n",a);return0;}
第2章数据类型、运算符和表达式52指针变量的说明1)指针变量所指向的存储空间恰好是一块空闲空间,即未被系统使用或未被分配给其他变量,此时不会出错。
2)指针变量所指向的存储空间正被系统使用或已被分配给其他变量,此时将会带来严重后果。以下程序就是对指针变量的一种错误引用。2.4指针变量
#include<stdio.h>intmain(){int*p;*p=5;printf("*p=%d\n",*p);return0;
}
第2章数据类型、运算符和表达式53
初始化指针变量的方法主要有以下3种:
1)将某个已经定义过的数据类型与指针变量基类型相同的变量地址赋值给指针变量。例如:inta,*p;p=&a;/*此处两语句可合并写成:inta,*p=&a;*/2)将某个已经初始化过的基类型相同的指针变量赋值给指针变量。例如:inta,*p1,*p2=&a;p1=p2;/*p2赋值给p1,让p1也指向p2所指向的变量*/3)使用malloc函数或calloc函数,给它们分配一个自由的内存空间地址。关于它们的使用,将在后面的章节进行介绍。
2.4指针变量
第2章数据类型、运算符和表达式542.4指针变量
指针变量同普通变量一样,使用之前不仅要定义说明,而且必须赋予具体的值。未经赋值的指针变量不能使用,否则将造成系统混乱,甚至死机。指针变量的赋值只能赋予地址,不能赋予任何其它数据,否则将引起错误。注意:(1)指针变量初始化的方法:
inta;int*p=&a;(2)赋值语句的方法:
inta,*p;p=&a;第2章数据类型、运算符和表达式552.4.5指针变量的访问
2.4指针变量
通过使用指针运算符*(或称间接访问运算符)可以间接访问指针变量所指向的变量。格式:*指针变量
获取变量地址可以通过取地址运算符&第2章数据类型、运算符和表达式562.4指针变量
例:intmain(){inta=5,*p=&a;printf("%d",*p);return0;}
注意:指针运算符*和指针变量说明中的指针说明符*是不相同。在指针变量说明中,*是类型说明符,表示其后的变量是指针类型。表达式中出现的*则是一个运算符用以表示指针变量所指的变量。两个*的意义相同么?第2章数据类型、运算符和表达式57例2-5
通过指针变量间接访问另一个变量。#include<stdio.h>intmain(){inta,b,*p1,*p2;a=5;b=8;p1=&a;p2=&b;printf("a=%d,b=%d\n",*p1,*p2);*p1=*p1+*p2; /*相当于a=a+b;*/printf("a+b=%d\n",*p1); /*相当于printf("a+b=%d\n",a);*/return0;}2.4指针变量
第2章数据类型、运算符和表达式582.4指针变量
intmain(){inta=1,b=2,*pa=&a,*pb=&b;
pa=pb;printf("a=%d\nb=%d\n*pa=%d\n*pb=%d\n",a,b,*pa,*pb);return0;}例如:1a&b&bpb2bpa执行pa=pb;1a&a&bpb2bpa初始化若改为*pa=*pb;有何不同?第2章数据类型、运算符和表达式592.4指针变量
intmain(){inta=1,b=2,*pa=&a,*pb=&b;*pa=*pb;printf("a=%d\nb=%d\n*pa=%d\n*pb=%d\n",a,b,*pa,*pb);return0;}例如:1a&a&bpb2bpa初始化2a&a&bpb2bpa执行*pa=*pb;第2章数据类型、运算符和表达式602.4指针变量
intmain(){inta,b,*p,*p1=&a,*p2=&b;scanf("%d%d",p1,p2);if(a<b){p=p1;p1=p2;p2=p;}printf("\na=%d,b=%d\n\n",a,b);printf("max=%d,min=%d\n",*p1,*p2);return0;}例如:输入a、b两个整数,按先大后小的顺序输出。5a&ap1&bp29b5a&bp1&ap29bp第2章数据类型、运算符和表达式612.4指针变量
指针变量可以赋予0值,p=0表明p是空指针,它不指向任何变量。在头文件"stdio.h"中有:#defineNULL0
在C程序中常使用int*p=NULL;让指针变量p为空指针。对指针变量赋0值和不赋值是不同的。指针变量未赋值时,可以是任意值,是不能使用的。否则将造成意外错误。而指针变量赋0值后,则可以使用,只是它不指向具体的变量而已。说明:62数据输入/输出的概念内存RAM从键盘将数据输入从数据文件读入将数据输出到屏幕将数据输出到文件数据输入/输出是相对计算机内存2.5标准输入/输出函数的用法第2章数据类型、运算符和表达式63
在C语言中所有的数据输入/输出都是由库函数完成的,因此都是函数语句。在C语言中使用库函数时,要使用预编译命令#include将相关的头文件(*.h)包含到用户源文件中。使用形式:
#include“头文件”
或
#include<头文件>
说明:
1.标准输入/输出头文件是:stdio.h2.printf()和scanf()函数不需要头包含文件2.5标准输入/输出函数的用法第2章数据类型、运算符和表达式642.5.1数据格式输入——scanf()函数scanf()的功能:从键盘上输入数据,该输入数据按指定的输入格式被赋给相应的输入项。函数一般格式为:
scanf("控制字符串",输入项地址列表);
控制字符串规定数据的输入格式,其内容由格式说明和普通字符两部分组成。
输入项地址列表由一个或多个变量地址组成,各变量地址之间用逗号“,”分隔。
scanf()中各变量要加地址操作符,表示如下:
&变量名2.5标准输入/输出函数的用法第2章数据类型、运算符和表达式65控制字符串的两个组成部分:格式说明和普通字符。1.格式说明格式说明规定输入项中的变量以何种类型的数据格式被输入的,形式是:%[<修饰符>]<格式字符>
格式字符意义举例输入形式d输入一个十进制整数scanf("%d",&a)15o输入一个八进制整数scanf("%o",&a)015x输入一个十六进制整数scanf("%x",&a)0x15f输入一个小数形式浮点数scanf("%f",&x)35680e输入一个指数形式浮点数scanf("%e",&x)3.568e+3c输入一个字符scanf("%c",&ch)As输入一个字符串scanf("%s",ps)ABCD2.5标准输入/输出函数的用法第2章数据类型、运算符和表达式66各修饰符是可选的,这些修饰符是:(1)字段宽度例:scanf("%3d",&a);输入123456,按宽度3输入一个整数123赋给变量a(2)l和h
可与d、o、x一起使用,l表示输入数据为长整数,h表示输入数据为短整数,例:scanf("%ld%hd",&x,&i);x按长整型读入,i按短整数读入。(3)字符*表示按规定格式输入但不赋予相应变量,作用是跳过相应的数据。例如:scanf(“%d%*d%d”,&x,&y);执行该语句,若输入为“123”,结果为x=1,y=3,2被跳过。2.5标准输入/输出函数的用法第2章数据类型、运算符和表达式672.普通字符(1)空格在有多个输入项时,一般用空格或回车作为分隔符,若以空格作分隔符,则当输入项中包含字符类型时,可能产生非预期的结果,例如:scanf("%d%c",&a,&ch);输入32q期望a=32,ch=q,但实际上,分隔符空格被读入并赋给ch。(2)可打印字符例如:scanf("%d,%d,%c",&a,&b,&ch);
当输入为:1,2,q即:a=1,b=2,ch=q
若输入为12q除a=1正确赋值外,对b与ch的赋值都不能正确赋值。2.5标准输入/输出函数的用法第2章数据类型、运算符和表达式68使用scanf函数还必须注意以下几点:(2)在输入多个数值数据时,若格式控制串中没有非格式字符作输入数据之间的间隔则可用空格或回车作间隔。(3)如果格式控制串中有非格式字符则输入时也要输入该非格式字符。例如:scanf("a=%d,b=%d,c=%d",&a,&b,&c);
则输入应为a=5,b=6,c=7(1)scanf函数中没有精度控制。scanf("%5.2f",&a);是非法的。(4)在输入字符数据时,若格式控制串中无非格式字符,则认为所有输入的字符均为有效字符。2.5标准输入/输出函数的用法第2章数据类型、运算符和表达式69
若输入为:def
则把'd'赋予a,‘
’赋予b,'e'赋予c。只有当输入为:def时,才能把'd'赋于a,'e'赋予b,'f'赋予c。如果在格式控制中加入空格作为间隔,如scanf(“%c%c%c”,&a,&b,&c);则输入时各数据之间要加空格。
例如:main(){chara,b,c;printf("inputcharactera,b,c\n");scanf("%c%c%c",&a,&b,&c);printf("%c%c%c\n",a,b,c);}2.5标准输入/输出函数的用法第2章数据类型、运算符和表达式70(5)如输入的数据与输出的类型不一致时,虽然编译能够通过,但结果将不正确。
intmain() {inta;printf("inputanumber\n"); scanf("%d",&a); printf("%ld",a);return0; }
由于输入数据类型为整型,而输出语句的格式串中说明为长整型,因此输出结果和输入数据不符。2.5标准输入/输出函数的用法第2章数据类型、运算符和表达式第3章简单的C程序设计71例.编写求梯形面积的程序,数据由键盘输入。分析:设梯形上底为A,下底为B,高为H面积为S,则S=(A+B)*H/2程序如下: intmain(){floata,b,h,s;printf("pleaseinputa,b,h:");
scanf("%f%f%f",&a,&b,&h);s=0.5*(a+b)*h;printf("a=%6.3fb=%6.3fh=%6.3f\n",a,b,h);printf("s=%8.4f\n",s);return0;}2.5标准输入/输出函数的用法722.5.2数据格式输出——printf()函数
格式化输出函数printf()功能:按控制字符串规定的格式,向输出设备输出各输出项。其基本格式为:printf(“控制字符串”,输出项列表)输出项可以是常量、变量、表达式,其类型与个数必须与控制字符串中格式字符的类型、个数一致、当有多个输出项时,各项之间用逗号分隔。控制字符串由格式说明和普通字符两部分组成。2.5标准输入/输出函数的用法第2章数据类型、运算符和表达式731.格式说明一般格式为:%[<修饰符>]<格式字符>格式字符意义举例输出结果d按十进制整数输出printf("%d",a)65o或O按八进制整数输出printf("%o",a)101x或X按十六进制整数输出printf("%x",a)41u按无符号整数输出printf("%u",a)65c按字符型输出printf("%c",a)As按字符串输出printf("%s","aba")abcf按浮点型小数输出printf("%f",x)3.141593e按科学计数法输出printf("%e",x)3.141593e+00g按e和f格式中较短的一种输出printf("%g",x)3.1415932.5标准输入/输出函数的用法第2章数据类型、运算符和表达式74注意:%o,%x,%u均输出无符号整数;单精度浮点数以%f形式输出时,小数6位,有效数字7位;双精度浮点数以%lf形式输出时,小数6位,有效数字16位;%e形式输出时小数6位,指数5位,其中e占1位,指数符号占1位,指数3位,并以规范化指数形式输出。如1.234560e+002。2.5标准输入/输出函数的用法第2章数据类型、运算符和表达式75(1)
字段宽度修饰符字段宽度修饰符用于确定数据输出的宽度、精度、小数位数、对齐方式等,用于产生更规范整齐的输出。
修饰符格式说明意义m%md以宽度m输出整型数,不足m时,左补空格0m%0md以宽度m输出整型数,不足m时,左补零m.n%m.nf以宽度m输出实型小数,小数位为n位
用十进制整数来表示输出的最少位数。若实际位数多于定义的宽度,则按实际位数输出;若实际位数少于定义的宽度则补以空格或0。2.5标准输入/输出函数的用法第2章数据类型、运算符和表达式76例如:intmain(){inta=123;floatx=12.345678;printf("%5d,%5.2f\n",a,x);printf("%2d,%2.1f\n",a,x);return0;}程序的运行结果如下:说明:当指定宽度小于数据的实际宽度时,对整数,按该数的实际宽度输出。对浮点数,相应小数位的数四舍五入。若度宽小于等于浮点数整数部分的宽度,则该浮点数按实际位数输出,但小数位数仍遵守宽度修饰符给出的值。2.5标准输入/输出函数的用法第2章数据类型、运算符和表达式77(2)对齐方式修饰符一般的输出数据为右对齐格式,加“-”号,变为“左对齐”方式。例如:voidmain(){inti=123;floata=12.34567;printf("%6d%10.4f\n",i,a);printf("%-6d%10.4f\n",i,a);printf("%6d%-10.4f\n",i,a);}程序运行结果如图所示:2.5标准输入/输出函数的用法第2章数据类型、运算符和表达式78(3)l和h
可以与输出格式字符d、f、u等连用,以说明是用long型或short型格式输出数据,如:%hd短整型%lf双精度型%ld长整型%hu无符号短整型2.5标准输入/输出函数的用法第2章数据类型、运算符和表达式79普通字符包括可打印字符和转义字符。可打印字符是说明字符,这些字符按原样显示在屏幕上。转义字符是不可打印的字符,它们其实是一些控制字符,控制产生特殊的输出效果。常用的有“\t”,“\n”,其中\t为水平制表符,作用是跳到下一个水平制表位,“\n”为回车换行符,遇到“\n”,显示自动换到新的一行。2.普通字符2.5标准输入/输出函数的用法第2章数据类型、运算符和表达式80例如:intmain(){inti=123;longn=456;floata=12.34567,y=20.5;printf("%d=4d\ta=%7.4f\n\tn=%lu\n",i,a,n);printf("y=%5.2f%\n",y);return0;}程序运行的输出结果:2.5标准输入/输出函数的用法第2章数据类型、运算符和表达式811.字符输出函数——putchar()putchar()函数的格式:
putchar(ch);
该函数的功能是向显示器终端输出一个字符。其中,ch可以是一个字符变量或常量,也可以是一个转义字符。说明:(1)putchar()函数只能用于单个字符的输出,且一次只能输出一个字符。(2)从功能角度printf()函数可以完全代替putchar()函数,其等价形式:printf("%c",ch)。2.5标准输入/输出函数的用法2.5.3字符数据非格式输入/输出函数第2章数据类型、运算符和表达式82getchar()函数的格式:getchar();
getchar()函数作用:从键盘输入一个字符。从功能上,scanf()函数可以完全代替getchar()函数。例:charc1; 则c1=getchar();
可使用等价语句:scanf("%c",&c1);2.字符输入函数——getchar()2.5标准输入/输出函数的用法第2章数据类型、运算符和表达式第3章简单的C程序设计83说明:(1)getchar()函数一次只能返回一个字符,即调用一次只能输入一个字符。(2)程序第一次执行getchar()函数时,系统暂停等待用户输入,直到按回车键结束,如果用户输入了多个字符,则该函数只取第一个字符,多余的字符(包括换行符'\n')存放在键盘缓冲区中,如果程序再一次执行getchar()函数,则程序就直接从键盘缓冲区读入,直到读完后,如果还有getchar()函数才会暂停,再次等待用户输入。2.5标准输入/输出函数的用法第3章简单的C程序设计84#include<stdio.h>intmain(){charc1,c2;c1=getchar();c2=getchar();putchar(c1);putchar(c2);
return0;}例如:当程序运行后:输入abcdef,输出为:ab2.5标准输入/输出函数的用法第3章简单的C程序设计85例.
编一程序,从键盘输入一个大写字母,要求改用小写字母输出(提示:大写字母对应的ASCII码序号比相应的小写字母的ASCII码序号小32)。#include"stdio.h"intmain(){charc1,c2;c1=getchar();printf("%c,%d\n",c1,c1);c2=c1+32;printf("%c,%d\n",c2,c2);
return0;}程序运行情况:A↙A,65a,972.5标准输入/输出函数的用法第3章简单的C程序设计86例.输入时间(小时,分和秒)然后输出其计多少秒。分析:hh代表小时,mm代表分钟,ss代表秒,tss代表总的秒数值,则:其总时间秒:tss=hh*3600+mm+60+ssintmain(){inthh,mm,ss;longtss;/*定义为长整型数据,因int整数的最大数据是32767*/printf("Enterhh:mm:ss=");/*提示用户输入数据*/scanf("%d:%d:%d",&hh,&mm,&ss);/*输入数据之间需用:分隔*/tss=hh*3600.0+mm*60+ss;printf("TheTotalsecond=%ld",tss);return0;}2.5标准输入/输出函数的用法第3章简单的C程序设计87例.编一程序,求一内半径R1=10cm,外半径R2=20cm的球环的体积。要求按四舍五入保留到小数点后4位。
#definePI3.1415926/*定义符号常量PI代表π*/intmain(){doubler1,r2;/*r1,r2表示球的内外半径*/doublevol;/*vol表示体积*/printf("Enterr1,r2=");scanf("%lf,%lf",&r1,&r2);/*输入double数据使用%lf格式控制*/vol=4.0/3.0*PI*(r2*r2*r2-r1*r1*r1);printf("V=%10.4lf",vol);return0;}2.5标准输入/输出函数的用法第3章简单的C程序设计88判断题1.printf函数中的格式符“%c”只能用于输出字符类型数据。练习
2.按格式符“%6.3f”输出i(i=123.45)时,输出结果为123.450。3.格式符“%f”不能用于输入
double类型数据。4.不能用printf()函数输出字符。对错错错第3章简单的C程序设计89填空题(1)inti=234,j=567;函数printf("%d%d\n",i,j)的输出结果是
。练习
(2)inti=234;floatx=-513.624;函数printf(“i=%5dx=%7.4f\n”,i,x)的输出结果是
。(3)floatalfa=60,pi=3.1415926535626;函数printf(“sin(%3.0f*%f/180)\n”,alfa,pi)的输出结果是
。234567i=234x=-512.6240sin(60*3.141593/180)第3章简单的C程序设计90(4)charch=’$’;floatx=153.45;函数printf(“%c%-8.2f\n”,ch,x)的输出结果是
。练习
(5)intd=27;函数printf(“%-5d,%-5o,%-5x\n”,d,d,d)的输出结果是
。(6)floatx1=13.24,x2=-78.32;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年度工程安装居间合同2篇
- 项目经理合作协议书 2篇
- 售房补充协议 3篇
- 化妆品销售合同简单范本
- 高二期中家长会课件
- 饮品购销合同书范本
- 2024年度高速公路沥青混凝土搅拌站租赁合同2篇
- 基于AR技术的虚拟展览服务合同(2024版)
- 股权转让协议书范本合同范本标准版
- 《技术员岗位职责》课件
- 天津2024年天津职业技术师范大学附属高级技术学校招聘笔试历年典型考题及考点附答案解析
- 第11课 物联网数据的获取 教学设计 2023-2024学年浙教版(2023)初中信息技术七年级下册
- 教育领域群众身边的不正之风和腐败问题整改措施(教师个人)
- 国开(浙江)2024年《用法律基础》形考作业1-4答案
- 水介质检验师预考附有答案
- 机械设备安装工艺标准
- (正式版)JTT 1496-2024 公路隧道施工门禁系统技术要求
- 2024春期国开电大《工作分析实务》形考任务1-3参考答案
- 技术文件编写格式标准
- 家电以旧换新应急预案和危机处理机制
- 《墙绘表现》课件-16-2《墙绘设计的基本原则及要点》
评论
0/150
提交评论