《高级程序语言》PPT课件.ppt
1,第二讲 基本数据类型,教材:C程序设计导论,2,本讲重点,掌握C的几种基本数据类型。掌握标识符的概念,熟悉变量和符号常量先定义后使用的特点。熟练掌握整型、长整型、短整型、无符号整型数据的定义与存储特点。熟练掌握单精度、双精度浮点数的定义与存储特点。熟练掌握字符型数据的定义与存储特点,并熟悉整型数据与字符型数据间的关系。掌握定义变量的同时赋初值的方法。掌握不同类型数据间的混合运算规则。,3,一个程序应包括对数据的描述和对数据处理的描述。1对数据的描述,即数据结构。数据结构是计算机学科的核心课程之一,有许多专门著作论述,本课程就不再赘述。在C语言中,系统提供的数据结构,是以数据类型的形式出现的。2对数据处理的描述,即计算机算法。算法是为解决一个问题而采取的方法和步骤,是程序的灵魂。为此,著名计算机科学家沃思(Nikiklaus Wirth)提出一个公式:数据结构+算法=程序 实际上,一个程序除了数据结构和算法外,还必须使用一种计算机语言,并采用结构化方法来表示。,4,2.1 字符集及词法约定,一、字符集C语言中可用到的字符集有:数字:、。字母:大、小写英文字母,注意C程序中严格区分大小写字母,如 A和a是不同的字符。空白符:空格符、制表符、换行符和换页符统称为空白符。它们主要用于分隔单词,一般无其它特殊意义。图形符号:29个图形(可见)符号,即!“#%:?_|主要用作各种运算符。转义字符:程序中有时需要用到某些不可见或难以打印的字符,C语言中采用转义字符来表示,如:“n”表示一个换行符;字符“”被称为转义符,表示其后的字符“n”具有特定的含义。(常用的转义字符及其含义参看课本字符常量),5,2.1 字符集及词法约定,二、词法约定C语言中共有六类单词:注释符、标识符、关键字、常量、运算符和标点符。注释符注释符是以“/*”开头、以“*/”结束的一个字符串,其作用是对相应程序段的功能作一个注解。标识符用于标识变量名、符号常量名、数组名、函数名、类型名、文件名或其他各种由用户定义的对象名的有效字符序列。标识符的组成:由字母、数字和下划线组成。必须由字母或下划线中任一字符开头。标准C 规定有效长度为前31个字符。例如,以下为合法的标识符:nameNAME_a1x1Sum_2以下不是合法的标识符:12a以数字开头#we以#开头num$1包含$字符sum 1中间有空格,6,标识符命名规则(1)有效字符:只能由字母、数字和下划线组成,且以字母或下划线开头。(2)有效长度:随系统而异,但至少前个字符有效。如果超长,则超长部分被舍弃。例如,由于student_name和student_number的前个字符相同,有的系统认为这两个变量,是一回事而不加区别。在TC V2.0中,变量名(标识符)的有效长度为个字符,缺省值为。标识符命名的良好习惯见名知意:所谓“见名知意”是指,通过变量名就知道变量值的含义。通常应选择能表示数据含义的英文单词(或缩写)作变量名,或汉语拼音字头作变量名。例如,name/xm(姓名)、sex/xb(性别)、age/nl(年龄)、salary/gz(工资)。,7,2.1 字符集及词法约定,二、词法约定关键字 又称保留字,指具有特定含义、专门用作系统的特定成分的一类标识符。C语言的关键字不能用作变量名。标准语言中共有个关键字,按用途分为类:数据类型:如char int等 存储类:如auto return等流程控制:如if else switch等 运算符:sizeof(关键字参看书16)注意关键字不能用作一般标识符,即不允许用作变量名或函数名等。C语言的关键字都是小写的。例如else是关键字,但ELSE就不是关键字。常量在程序运行过程中,其值不能被改变的量称为常量。运算符C语言中含有相当丰富的运算符。运算符与变量、函数一起组成表达式,表示各种运算功能。运算符由一个或多个字符组成。标点符C语言中的标点符共有13个,即:()*,:=;.#,8,2.2 常量,1、常量的定义:在程序运行过程中,其值保持不变的量。常量的类型:根据字面形式可将常量区分为不同的类型。2、整型常量:C语言表示整型常量的方法有以下三种:十进制整数:用不带任何修饰的整数表示。如123、-456、0等;八进制整数:以数字0开头的整数。如0123、-011等;十六进制整数:以数字0 x开头的整数。如0 x123、0 x2ef;C语言中普通整型常量在机器中占用一个字长,但由于各机器字长不同,所以整数所能表示的数值范围也不同。系统根据整型常量的具体数值确定其类型。使用整型常量时要注意是否超出数值表示范围之外,例如在一个16位字长的机器上,十进制整数的表示范围是-3276832767,那么0200000和0 x10000均为超出表示范围的长整型常量。,9,整型变量 1.分类 根据占用内存字节数的不同,整型变量又分为类:(1)基本整型(类型关键字为int)。(2)短整型(类型关键字为short int)。(3)长整型(类型关键字为long int)。(4)无符号整型。无符号型又分为无符号基本整型(unsigned int)、无符号短整型(unsigned short)和无符号长整型(unsigned long)三种,只能用来存储无符号整数。2.占用内存字节数与值域 上述各类型整型变量占用的内存字节数,随系统而异。在16位操作系统中,一般用字节表示一个int型变量,且long型(字节)int型(字节)short型(字节)。,2.2 常量,10,显然,不同类型的整型变量,其值域不同。占用内存字节数为n的(有符号)整型变量,其值域为:-2n*8-1(2n*8-1-1);无符号整型变量的值域为:0(2n*8-1)。例如,PC机中的一个int型变量,其值域为-22*8-1(22*8-1-1),即-3276832767;一个unsigned型变量的值域为:0(22*8-1),即065535。,2.2 常量,11,3.分类(1)基本整型。在16位机中,用2字节存储,其数据范围与int型变量一样。(2)长整型(在数值后面加“L(l)”)。对超出基本整型值域的整型常量,可使用长整型常量表示,其取值范围可达-(-)。例如,123l、315等。.类型匹配规则类型匹配规则为:一个整型常量,可以赋给能容纳下其值的整型变量。例如,其值在-(-)的整型常量,可以赋给int型变量和long int型变量;其值在-(-)的整型常量,就只能赋给long int型变量。注意:常量无unsigned型。但一个非负整型常量,只要它的值不超过相应变量的值域(即取值范围),也可以赋给unsigned型变量。,12,2.2 常量,整型常量后缀 无符号整型后缀:u或U,如986u、0 xfedU都是无符号整型常量。长整型后缀:l或L,如:0234l1、9666L都是长整型常量。二者可以同时使用,例如:9999LU、077777LU3、实型常量(浮点数)十进制数形式的浮点数:由数字和小数点组成。如:123.456、0.123、123.0、0.0、123.等。指数形式的浮点数:用字母e表示十进制指数中的10。如:123e3(表示123*103)、6.E5、.123e+4都是合法的浮点常量。注意:e字母前必须有数字,且e后的指数必须为整型。如:e3、2.1e3.5、.e3为不合法。浮点常量如不带后缀,如上所示,都是双精度类型(double)。浮点常量可带后缀f或F,如3.14f,那么其类型为单精度浮点型(float)浮点常量可带后缀l或L,如3.14L,那么其类型为长双精度型(long double),13,语言的实型常量,分为两种:(1)单精度型。类型关键字为float,一般占字节(位)、提供位有效数字。(2)双精度型。类型关键字为double,一般占个字节、提供1516位有效数字。.表示形式实型常量即实数,在语言中又称浮点数,其值有两种表达形式:(1)十进制形式。例如3.14、9.8。(2)指数形式:E(e)。例如3.0+5等。,14,2.2 常量,4、字符常量:C语言规定以单引号包围的单个字符为字符常量。如:A、a、2、!等。注意:请区别A和a的不同;中的字符引用的是该字符的ASCII码值。字符常量的存放形式与整数的存放形式相类似,所以C中的字符数据与整型数据之间具有相通性。转义字符常量(也称控制字符常量)用开头的特殊形式的字符常量,用以产生一个动作。如:n、r、t、v、123等。请同学们理解并记忆常用的转义字符,学会其使用方法。,15,2.转义字符语言还允许使用一种特殊形式的字符常量,就是以反斜杠“”开头的转义字符。注意:如果反斜杠或单引号本身作为字符常量,必须使用转义字符:、。案例2.1 用转义字符输出可打印字符和不可打印字符。/*案例代码文件名:AL_1.C*/*程序功能:用转义字符输出可打印字符和不可打印字符*/main()printf(“x4Fx4Bx21n”);/*等价于printf(“OK!n”);*/printf(“x15 xABn”);程序运行结果如下:!,16,转义字符常量,转义字符 功能 例AL_2.C:n 换行 void main()t 横向跳格 printf(?ab?c?derftgn);v 竖向跳格 printf(htbtj?kn);b 退格 r 回车 程序在屏幕上的输出结果为:f 走纸换页 f gde“”字符 h j?k“”字符 注:横向和纵向跳格均以8个字符为1格。ddd 1至3位八进制数所代表的字符xhh 1至2位十六进制数所代表的字符,17,5、字符串常量 C语言中用双引号将一串字符括起来称为字符串常量。如“asee”、“011”、“We are studying C”等。字符串常量可以看作是一个数组,这个数组的每个元素是一个字符。编译程序在编译源程序时自动在每个字符串末尾放空字符0,作为字符串结束标记。要点:请区别”A”与A的不同。因为它们各自在内存中存放的长度不同。“A”A,2.2常量,ASCII码为0的字符,18,6、符号常量1)含义:用一个标识符表示的常量。2)定义方法:#define 符号常量 数值 例:#define PRICE 30 作用是定义符号常量PRICE的值为30,在程序任何用到PRICE符号常量的地方,系统将自动用常量30代替。3)使用要点:为区分符号常量与变量的不同,通常符号常量用大写字母表示(但不是必须)。例 2.1 求圆的周长和面积(CH02-01.C)#include#define PI 3.14159/*宏定义*/void main(void)/*主函数*/float c,s,i;printf(输入圆的半径:);scanf(%f,2.2常量,19,2.3 变量,1、变量的含义:在程序执行过程中,其值可以被改变的量。变量的构成:变量名、变量值。(注意区分变量名和变量值:存储单元地址与存储单元内容),例:int a,b,c;/*说明a,b,c为整型变量*/char cc;/*说明cc为字符变量*/double x,y;/*说明x,y为双精度实型变量*/C语言要求,程序里使用的每个变量都必须“先定义,后使用”。不同类型的变量应分开定义。在同一程序的同一部分,不允许对同一变量做重复定义,也就是说,不允许有同名的变量。,20,2.3 变量,2、变量的初始化:在定义变量同时可以对变量赋予初值。例如:int i1=3,i2=4;float f1,f2=3.5;,还可以在定义后赋初值。例如:int i1,i2;/*定义整型变量i1和i2*/i1=3;i2=4;/*为i1赋初值为3,i2赋初值为4*/,21,2.3 变量,3、左值和右值:左值(lvalue):在C语言中表示位于赋值运算符左边的值,左值通常指可以定位的值,即有地址的值,可以用来存储其它的值。右值(rvalue):在C语言中表示位于赋值运算符右边的值。例:int i=5;,22,2.3 变量,3、左值和右值:x=5;5=x;C中有些运算符仅仅需要右值,例如“+”的两侧、赋值运算符的右边;有些运算符仅仅需要左值,例如赋值运算符“=”的左边;有些运算符需要操作数同时有右值与左值的角色,例如+或-。,23,2.4 基本数据类型,C语言的数据类型,24,2.4 基本数据类型,1、整型int基本整型short int 短整型,可简写为shortlong int 长整型,可简写为long unsigned int 无符号整型,可简写为unsigned unsigned short 无符号短整型 unsigned long 无符号长整型 整型存储特点:C语言没有具体规定各类型数据所占内存的字节数,根据机型不同而不同,一般以一个机器字长存放一个int 型数据(见P25表2.2),即2Byte。,25,整型数据可表示的数据范围,如果值在-32768至32767之间,可以赋值给int,long int型变量。如果值超出上述范围在-2147483648至2147483647内,可以赋值给long int型变量。只有数值后面加上“l”或“L”的常量才认为是长整型常量,如123L。无符号型变量只能存放不带符号的整数,而不能存放负数。无符号型整型变量中可以存放的数的范围比一般整型变量中数的范围扩大一倍。,26,整型数据的溢出,例,阅读以下程序(在TURBO C中运行)(AL_03.C)#include void main(void)int a,b;a=32767;b=a+1;printf(“a=%d,b=%d”,a,b);,因为a+1的类型为int类型,其表示范围为-3276832767;而a+1在16位计算机中的结果表示成二进制为1000 0000 0000 0000,最高位表示符号位,该二进制码是补码形式,是-32768的补码。,程序运行结果为:A=32767,b=-32768,为什么b的取值不是32768?,27,整型数据的溢出,/*第一种改法*/(AL_4.C)#include void main(void)long a,b;a=32767;b=a+1;printf(“a=%ld,b=%ldn”,a,b);,如何更改?,注意printf中%d是用于输出int类型数据的,应该改为%ld.,/*第二种改法*/(AL_5.C)#include void main(void)int a;long b;a=32767;b=a+1L;printf(“a=%d,b=%ld”,a,b);,28,2.4 基本数据类型-字符型,2、字符类型(存储ASCII码字符或8位二进制数)定义变量方式:char 字符变量名 如:1)char c1,c2;c1=d;c2=s;2)unsigned char sum;字符数据在内存中的存放形式:字符数据在内存中存放的是它的ASCII编码,通常占用一个字节。当以字符格式输出时,输出为字符;当以整型输出时,输出为整型数。char数值范围-128127unsigned char 数值范围0255,29,2.4 基本数据类型-字符型,例CH02_02.C:#include void main(void)char c1,c2;c1=a;c2=A;printf(“c1=%c,c2=%cn”,c1,c2);printf(“c1=%d,c2=%dn”,c1,c2);程序输出为:c1=a,c2=A 说明:字符数据与整型数据之间可以相互赋值。c1=97,c2=65 字符数据可以字符或整型数据两种方式输出。,30,例:将两个小写字母转换成大写字母。(AL_6.C)#include void main(void)char c1,c2;c1=a;c2=b;c1=c1-32;c2=c2-32;printf(“c1=%c,c2=%cn”,c1,c2);程序输出为:c1=A,c2=B,31,允许对字符数据进行算术运算,此时就是对它们的ASCII码值进行算术运算。字符数据的算术运算。/*案例代码文件名:AL_7.C*/*程序功能:字符数据的算术运算*/main()char ch1,ch2;ch1=a;ch2=B;/*字母的大小写转换*/printf(“ch1=%c,ch2=%cn”,ch1-32,ch2+32);/*用字符形式输出一个大于256的数值*/printf(ch1+200=%dn,ch1+200);printf(ch1+200=%cn,ch1+200);printf(ch1+256=%dn,ch1+256);printf(ch1+256=%cn,ch1+256);,32,程序运行结果:ch1=A,ch2=bch1+200=297ch1+200=)ch1+256=353ch1+256=a 程序演示思考题:用字符形式输出一个大于256的数值,会得到什么结果?(见例AL_8.C)2.6.3 字符串常量1.字符串常量的概念和字符串长度字符串常量是用一对双引号括起来的若干字符序列。字符串中字符的个数称为字符串长度。长度为0的字符串(即一个字符都没有的字符串)称为空串,表示为“”(一对紧连的双引号)。,33,例如,“How do you do.”、“Good morning.”等,都是字符串常量,其长度分别为14和13(空格也是一个字符)。如果反斜杠和双引号作为字符串中的有效字符,则必须使用转义字符。例如:(1)C:msdosv6.22 C:msdosv6.22(2)I say:Goodbye!I say:Goodbye!“2.字符串的存储C语言规定:在存储字符串常量时,由系统在字符串的末尾自动加一个0作为字符串的结束标志。注意:在源程序中书写字符串常量时,不必加结束字符0,否则画蛇添足。如果有一个字符串为“CHINA”,则它在内存中的实际存储如下所示:最后一个字符0是系统自动加上的,它占用字节而非字节内存空间。,34,综上所述,字符常量A与字符串常量A是两回事:(1)定界符不同:字符常量使用单引号,而字符串常量使用双引号;(2)长度不同:字符常量的长度固定为1,而字符串常量的长度,可以是0,也可以是某个整数;(3)存储要求不同:字符常量存储的是字符的ASCII码值,而字符串常量,除了要存储有效的字符外,还要存储一个结束标志0。,35,2.4 基本数据类型-浮点型,3、浮点型:用于存放实型(浮点型)数据的变量,其基本关键字为float。定义变量方法:单精度实型变量的定义:float 实型变量名;双精度实型变量的定义:double 实型变量名;长双精度型变量的定义:long double 实型变量名;如:float x,y;double z;存储特点:在PC机中 float型变量一般占4B内存空间,并提供6位有效数字;double型变量一般占8B内存空间,并提供12位有效数字;long double型变量一般占16B内存空间,并提供24位有效数字。,36,不同类型数据之间的混合运算:排序标准:数据类型所占内存存储空间的长度,37,不同类型数据之间的混合运算,一、自动转换的原理1、要点:以数据类型所占内存存储空间的长度最大者为准。如:int+char+float float 2B 1B 4B 4B2、例:设一表达式中含有int,long,unsigned,char类型的常数和变量,则表达式的最后结果是 D。(A)int(B)char(C)unsigned(D)long Note:int(2B),char(1B),unsigned(2B),long(4B),38,二、强制类型转换1、功能:由用户根据自己的要求来决定数据类型的转换结果。2、格式:(类型名)表达式 注意()不可缺少。3、应用:(1)为满足运算的要求:如:int i=3;float x=13.6;(int)x%i;(13%3=1)(2)提高运算精度:如:int i=10;float x;x=i/3+25.5;(3+25.5=28.5)或 x=(float)i/3+25.5;(3.33+25.5=28.83)4、例:,39,例(ch02_03.c)#include void main()float x;int i;x=3.6;i=(int)x;printf(“x=%f,i=%d”,x,i);程序的运行结果为:x=3.600000,i=3注意:x本身的值和类型都没有改变,强制类型转换只改变数值的类型和值,不改变变量的类型和值。,40,2.5 数据输入输出-输出函数,1、putchar()函数 功能:将一个字符输出到标准输出设备。格式:putchar(c)使用要点:putchar(c)中的c可以是字符型或整型数据;c=98;putchar(c)输出字符变量c的值 putchar(a)输出字符常量 putchar(0 x41)输出字符常量(16进制)使用输出函数需要调用C的标准I/O库函数,故需用预编译命令:#include putchar()也可以输出一个控制字符或其它转义字符。如:putchar(n)输出一个换行符 putchar(101)输出字符A putchar()输出字符单引号,41,例#include void main(void)char a,b,c;a=B;b=o;c=y;putchar(a);putchar(b);putchar(c);输出结果为:Boy,42,2、printf()函数(展开课本讲)功能:按指定的格式向终端输出若干任意类型的数据。格式:printf(格式控制,输出表列)如:printf(“x=%d”,x)使用要点格式控制部分的用法(下页)。输出表列:可以是合法的常量、变量和表达式,输出表列中的各输出项之间要用“,”分隔。当格式符个数少于输出项时,多余的输出项不予输出。若格式符多于输出项时,各系统的处理有所不同,TC对于缺少的项将输出不定值。每次调用printf()函数之后,将得到一个整型的函数值,该值等于正常输出的字符个数。,2.5 数据输入输出-输出函数,43,printf()函数的格式控制,格式控制字符是用双引号括起来的字符串,用来确定输出项的格式和需要原样输出的字符串。其组成形式为:“普通字符串%+0 m.nl格式控制字符”其中:输出数据项的顺序一般按从左至右的顺序输出。格式控制中的普通字符串,照原样输出;如:printf(“a=%d,b=%d”,a,b);%:为C语言规定的标记符;+:指定输出数据的对齐方式:+为右对齐(可缺省),-为左对齐;0:指定输出的数据中不使用的位置是否填数字“0”;m.n(数据输出宽度),l(输出long型数据);格式控制字符用于指定数据的输出形式,可以包含转义字符;用两个连续的“%”表示输出字符“%”。,44,格式控制字符,45,(1)printf(“%4d,%4d”,a,b);若a=123,b=12345 则输出为:123,12345 如果数据位数小于m,则左端补空格,若大于m,则按实际输出。(2)long a=135790;printf(“%ld”,a);长整型数据应采用%ld格式输出,若采用%d格式则出错。(3)int a=-1;printf(“%d,%o”,a,a);输出为:-1,177777 对于八进制输出不会输出带符号的数据,长整型数据用%lo格式输 出,也可以指定宽度。如:printf(“%lo,%8o”,a,a);(4)int a=-1;printf(“%x,%o,%d”,a,a,a);输出结果为:ffff,177777,-1 同样,也可以用%lx输出长整型数据或指出输出宽度,如:printf(“%lx,%12x”,(long)a,a),46,例(ch02_04.c):#include void main(void)unsigned int a=65535;int b=-2;printf(“a=%d,%o,%x,%un”,a,a,a,a);printf(“b=%d,%o,%x,%un”,b,b,b,b);输出为a=-1,177777,ffff,65535b=-2,177776,fffe,65534,47,例:字符输出#include void main(void)char c=a;int k=97;printf(“%c,%dn”,c,c);printf(“%c,%dn”,k,k);输出为:a,97a,97,48,例:输出字符串printf(“%s”,”china”);输出字符串chinaprintf(“%7sn”,”china”);输出字符串chinaprintf(“%3sn”,”china”);输出字符串chinaprintf(“%5.3sn”,”china”);输出字符串chiprintf(“%-5.3sn”,”china”);输出为chi,49,例:实型数据(ch02_05.c)#include void main(void)float x,y,z;double a,b;x=11111.111;y=22222.222;z=123.456;b=2222222222222.222222222;printf(“%fn%fn”,x+y,a+b);printf(“%10f,%10.2fn”,z,z);printf(“%en”,z);printf(“%gn”,z);,50,1、getchar()函数功能:从标准输入设备上读入一个字符。格式:getchar()使用要点:getchar()函数本身没有参数,其函数值就是从输入设备得到的一个字符;由getchar()获得的字符可以赋值给一个字符或整型变量,也可以作为表达式的一部分;如:c=getchar();putchar(getchar();printf(“%c”,getchar();使用getchar()函数要调用C的标准I/O库函数,应在程序首部加上:#include,2.5 数据输入输出-输入函数,51,例:#include void main(void)char c;c=getchar();printf(“%cn%dn”,c,c);输入 a输出 a 97,52,2、scanf()函数 功能:将从终端(键盘)输入的数据传送给对应的变量。格式:scanf(格式控制,输入项地址表)说明:格式控制的含义同printf函数,“%格式控制字符”。输入项地址表由若干个地址组成,代表每一个变量在内存的地址。表示为:&变量(或数组与字符串的首地址)每次调用scanf()函数后,函数将得到一个整型函数值,此值等于正常输入数据的个数。,2.5 数据输入输出-输入函数,53,scanf()函数的使用要点,1、格式符的个数必须与输入项的个数相等,数据类型必须从左至右一一对应。2、scanf()函数中常用的格式符有:3、用户可以指定输入数据的域宽,系统将自动按此域宽截取所读入的数据,如:scanf(“%3d%3d”,是错误的。5、输入实型数据时,可以不带小数点,即按整型数方式输入。,54,scanf()函数的使用要点,6、从终端输入数值数据时,遇下述情况系统将认为该项数据结束:遇到空格、回车符或制表符(TAB),故可用它们作为数值数据间的分隔符;遇到宽度结束,如“%4d”表示只取输入数据的前4列。遇到非法输入,如:假设a为整型变量,ch为字符型变量,对于:scanf(“%d%c”,输入boy b赋值给a,赋值给b,o赋值给c,55,scanf()函数的使用要点,8、如果格式控制字符串中除了格式说明之外,还包含其它字符,则输入数据时,在与之对应的位置上也必须输入与这些字符相同的字符。如:scanf(“Enter a number:%d”,若输入12 345 67 则12赋给a,67赋给b,而345没有赋给任何数据。10、在标准C中不使用%u格式符,对unsigned型数据以%d,%x,%o 格式输入。,56,例:(ch02_06.c)#include void main(void)int a,b,c;char x,y,z;scanf(“%c%c%c”,57,THE END,