C++语言的基本成分 – 数据成分_第1页
C++语言的基本成分 – 数据成分_第2页
C++语言的基本成分 – 数据成分_第3页
C++语言的基本成分 – 数据成分_第4页
C++语言的基本成分 – 数据成分_第5页
已阅读5页,还剩71页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、计算概论计算概论A课程课程 程序设计部分程序设计部分C+C+语言基本成分(语言基本成分(1 1)崔崔 斌斌2 / 76问问 题题n为什么计算机能够完成计算任务?为什么计算机能够完成计算任务?n说说以下几个概念之间的关系:说说以下几个概念之间的关系:u内存、地址、存储单元、字节内存、地址、存储单元、字节n计算机程序为什么要先编译再运行?计算机程序为什么要先编译再运行?n说说程序中说说程序中“#include ”的含义。的含义。n判断题:判断题:u 函数是函数是C/C+程序的基本组成单位。程序的基本组成单位。u 每个程序中只能包含一个函数。每个程序中只能包含一个函数。u 每个程序中只能包含一个每个

2、程序中只能包含一个Main()函数。()函数。u 每个程序只能由一个文件组成。每个程序只能由一个文件组成。3 / 76简单程序的组成简单程序的组成/*/* example.cpp */*#includeusing namespace std;int main( )int number45 = 78, 56, 69, 31, 36, 67, 31, 47, 69, 34, 45, 74, 61, 82, 43, 41, 76, 79, 81, 66, 54, 50, 76, 51, 53, 28, 74, 39, 45, 61, 52, 41, 43, 75, 78, 84, 72, 51, 4

3、3, 64, 75, 81, 69, 55, 74;int max = 0;int i = 0;for(i = 0; i max)max = numberi;coutThe Maximal Number is:max;return 0; /函数结束返回函数结束返回注释注释预编译:文件包含命令预编译:文件包含命令声明名字空间声明名字空间函数体函数体变量定义变量定义循环控制语句循环控制语句赋值语句赋值语句运算表达式运算表达式输入输出语句输入输出语句函数名函数名每个程序中都包含哪些成分?每个程序中都包含哪些成分?5 / 76程序设计语言的构成程序设计语言的构成n语言的种类千差万别,但是,一般说来,基

4、语言的种类千差万别,但是,一般说来,基本成分不外四种:本成分不外四种:u 数据成分,用以描述程序中所涉及的数据;数据成分,用以描述程序中所涉及的数据;u 运算成分,用以描述程序中所包含的运算;运算成分,用以描述程序中所包含的运算;u 控制成分,用以表达程序中的控制构造;控制成分,用以表达程序中的控制构造;u 传输成分,用以表达程序中数据的传输;传输成分,用以表达程序中数据的传输;计算机科学技术百科全书计算机科学技术百科全书6 / 76简单程序的组成简单程序的组成/*/* example.cpp */*#includeusing namespace std;int main( )int numb

5、er45 = 78, 56, 69, 31, 36, 67, 31, 47, 69, 34, 45, 74, 61, 82, 43, 41, 76, 79, 81, 66, 54, 50, 76, 51, 53, 28, 74, 39, 45, 61, 52, 41, 43, 75, 78, 84, 72, 51, 43, 64, 75, 81, 69, 55, 74;int max = 0;int i = 0;for(i = 0; i max)max = numberi;coutThe Maximal Number is:max;return 0; /函数结束返回函数结束返回注释注释预编译:

6、文件包含命令预编译:文件包含命令声明名字空间声明名字空间函数体函数体变量定义变量定义控制语句控制语句赋值语句赋值语句运算表达式运算表达式数据成分数据成分运算成分运算成分输入输出成分输入输出成分控制成分控制成分函数名函数名C+程序设计的基本构成程序设计的基本构成 数据成分(基本数据成分)数据成分(基本数据成分)8 / 76计算机能够哪种类型的数据计算机能够哪种类型的数据?9 / 76n数制及数制转换数制及数制转换n整型数据整型数据n实型数据实型数据n字符型数据字符型数据n变量、常量变量、常量n输入、输出输入、输出10 / 76数制及数制转换n数制也称计数制,是指用一组固定的符号和数制也称计数制,

7、是指用一组固定的符号和统一的规则来表示数值的方法。通常按进位统一的规则来表示数值的方法。通常按进位的方法进行计数,也称为进位计数制。计算的方法进行计数,也称为进位计数制。计算机系统中几种常用进位计数制:机系统中几种常用进位计数制: 十位制(Decimal notation) 二进制(Binary notation) 八进制(Octal notation) 十六进制数(Hexdecimal notation)11 / 76数制及数制转换12 / 76例例: 十进制数十进制数253在不同数制下的表示在不同数制下的表示253 = 2102 + 5101 + 3100 = An2n + A(n-1)2

8、(n-1) + + A121 + A020 = Bm8m + B(m-1)8(m-1) + + B181 + B080 = Ck16k+C(k-1)16(k-1) +C1 161+C0 160AnA(n-1)A1A0 : 二进制数BmB(m-1)B1B0 : 十进制数CkC(k-1)C1C0 : 十六进制数数制及数制转换13 / 76 不同数制之间的转换,实质是基数间的转换。一般转换的原则是:如果两个有理数如果两个有理数相等,则两数的整数部分和小数部分一定相等,则两数的整数部分和小数部分一定分别相等。分别相等。因此,各数制之间进行转换时,通常对整数部分和小数部分分别进行转换。数制及数制转换14

9、 / 76整数的转换整数的转换数制及数制转换十进制数转换成二进制数十进制数转换成二进制数 把十进制数转换为二进制数的方法是:整数转换用“除除2取余法取余法”;小数转换用“乘乘2取整法取整法”。1111110115 / 76十进制数转换成二进制数十进制数转换成二进制数 将(0.745)10转换成四位二进制小数四位二进制小数,转换过程如下:0.7452 1.490 取出整数取出整数1 (最高位最高位)0.4902 0.980 取出整数取出整数00.9802 1.960 取出整数取出整数10.9602 1.920 取出整数取出整数1 (最低位最低位)0.920 转换结束转换结束 这里,第四次乘积的小

10、数部分不为0,但已满足题目所要求的精度精度,所以, (0.745)10 (0.1011)2。显然,在转换过程中,做的乘法次数越多,结果就越精确。小数的转换小数的转换数制及数制转换16 / 76整型数据的分类整型数据的分类n按照数据的表示范围分类按照数据的表示范围分类u基本型:以基本型:以int表示表示u短整型:以短整型:以short int或或short表示表示u长整型:以长整型:以long int 或或long 表示表示n按照数据有无符号分类按照数据有无符号分类u有符号型:表示某个范围内的整数有符号型:表示某个范围内的整数signed int; signed short; signed lo

11、ngu无符号型:表示某个范围内的正整数无符号型:表示某个范围内的正整数unsigned int;unsigned short;unsigned long17 / 76整型数据的范围整型数据的范围nC/C+标准标准没有具体规定以上各类数据所占内存字没有具体规定以上各类数据所占内存字节数,只要求节数,只要求long型数据长度不短于型数据长度不短于int型,型,short型型不长于不长于int型。型。nVC中每种类型所占内存空间和表示的范围中每种类型所占内存空间和表示的范围:18 / 76如何知道某种类型的数占多少字节?如何知道某种类型的数占多少字节?nsizeof 运算符运算符u用于计算某种类型的

12、对象在内存中所占的字节数。用于计算某种类型的对象在内存中所占的字节数。#include void main()coutsizeof(short int)=sizeof(short int)endl;coutsizeof(signed short int)=sizeof(signed short int)endl;coutsizeof(unsigned short int)=sizeof(unsigned short int)endl;coutsizeof(int)=sizeof(int)endl;coutsizeof(signed int)=sizeof(signed int)endl;cou

13、tsizeof(unsigned int)=sizeof(unsigned int)endl;coutsizeof(long int)=sizeof(long int)endl;coutsizeof(signed long int)=sizeof(signed long int)endl;coutsizeof(unsigned long int)=sizeof(unsigned long int)endl;19 / 76以不同的方式输出整数以不同的方式输出整数#include using namespace std;int main()int x = 010, y = 10, z = 0 x1

14、0;cout以十进制形式显示:以十进制形式显示:;coutx=x, y=y, z=zendl;cout以八进制形式显示:以八进制形式显示:;coutoctx=x,y=y,z=zendl;cout以十六进制形式显示:以十六进制形式显示:;couthexx=x,y=y,z=zendl;return 0;20 / 76整型数据的初始值整型数据的初始值n在在VC中,定义一个中,定义一个int类型的变量,而不给它赋值,类型的变量,而不给它赋值,会出现什么情况会出现什么情况?n例例:#include using namespace std;int main()int a;couta;return 0; 运

15、行结果为:运行结果为:-858993460当输出是个当输出是个很大的负数很大的负数时,检查一时,检查一下是否忘记下是否忘记赋值。赋值。21 / 76整型数据的溢出整型数据的溢出n在在VC中一个中一个int型变量的最大允许值为型变量的最大允许值为2147483647,如果再加如果再加1,会出现什么情况,会出现什么情况?n例:例:int main()int a,b;a=2147483647; b=a+1; couta“ ”b;return 0;n运行结果为:运行结果为:2147483647,-21474836480 1 1 1 1 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1

16、1 1 1 1 1 1 1 1 1 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0a:b:22 / 76整型数据的存储整型数据的存储n存储空间的分配存储空间的分配n8位有符号整数例位有符号整数例0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1有符号整数变量:有符号整数变量:无符号整数变量:无符号整数变量:1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 11 1 1 1 1 1 1 1 1 1 1 1 1 1 1 123 / 76

17、整型数据的存储整型数据的存储n原码、反码、补码原码、反码、补码u在计算机中,负数以其正值的补码形式表达。正数在计算机中,负数以其正值的补码形式表达。正数即在符号为补即在符号为补0.u原码:一个整数,按照绝对值大小转换成的二进制原码:一个整数,按照绝对值大小转换成的二进制数,称为原码。数,称为原码。u反码:将二进制数按位取反,所得的新二进制数称反码:将二进制数按位取反,所得的新二进制数称为原二进制数的反码。为原二进制数的反码。u补码补码: 反码反码+1u只有有符号的整数才有原码、反码和补码的只有有符号的整数才有原码、反码和补码的!24 / 76n用二进制中最小的数去对应最小的负数,最大的也相对应

18、用二进制中最小的数去对应最小的负数,最大的也相对应最大正数?最大正数?u不科学不科学n1个字节表示个字节表示256个数个数u表示范围:表示范围:-128-127。u简单理解:简单理解:最高位表示符号位,如果是最高位表示符号位,如果是0表示正数,如表示正数,如果是果是1表示负数,剩下的表示负数,剩下的7位用来储存数的绝对值的话,位用来储存数的绝对值的话,能表示能表示27个数的绝对值,再考虑正负两种情况,个数的绝对值,再考虑正负两种情况,27*2还还是是256个数。个数。n首先定义首先定义0在计算机中储存为在计算机中储存为00000000,对于正数我们依然,对于正数我们依然可以像无符号数那样换算,

19、从可以像无符号数那样换算,从00000001到到01111111依次表示依次表示1到到127。(原码原码)25 / 76n那负数是不是从那负数是不是从10000001到到11111111依次表示依次表示-1到到-127?u如果这样的话那么一共就只有如果这样的话那么一共就只有255个数了个数了(10000000的情的情况没有考虑在内况没有考虑在内)u10000000在计算机中表示最小的负整数,就是这里的在计算机中表示最小的负整数,就是这里的-128u实际上并不是从实际上并不是从10000001到到11111111依次表示依次表示-1到到-127,而是刚好相反的,从而是刚好相反的,从1000000

20、1到到11111111依次表示依次表示-127到到-1。n负整数在计算机中是以补码形式储存的,补码是怎么样表负整数在计算机中是以补码形式储存的,补码是怎么样表示的呢示的呢?26 / 76n引入另一个概念引入另一个概念反码反码u反码就是把负数的原码(负数的原码和和它的绝对值所反码就是把负数的原码(负数的原码和和它的绝对值所对应的原码相同,简单的说就是绝对值相同的数原码相对应的原码相同,简单的说就是绝对值相同的数原码相同)各个位按位取反,是同)各个位按位取反,是1就换成就换成0,是,是0就换成就换成1,u如如-1的原码是的原码是00000001,和,和1的原码相同,那么的原码相同,那么-1的反码的

21、反码就是就是11111110n而补码就是在反码的基础上加而补码就是在反码的基础上加1,即,即-1的补码是的补码是11111110+1=11111111u-1在计算机中是按在计算机中是按11111111储存的。储存的。n总结总结:u计算机储存有符号的整数时,是用该整数的补码进行储计算机储存有符号的整数时,是用该整数的补码进行储存的,存的,0的原码、补码都是的原码、补码都是0,正数的原码、补码可以特,正数的原码、补码可以特殊理解为相同,负数的补码是它的反码加殊理解为相同,负数的补码是它的反码加1。27 / 76n【例例1】+9的补码是的补码是00001001。u注:这个注:这个+9的补码是用的补码

22、是用8位的位的2进制来表示。补进制来表示。补码表示方式很多,还有码表示方式很多,还有16位位2进制补码表示形式进制补码表示形式,以及,以及32位位2进制补码表示形式等。进制补码表示形式等。n【例例2】求求-7的补码。的补码。u因为给定数是负数,则符号位为因为给定数是负数,则符号位为“1”。u后七位:后七位:-7的原码(的原码(10000111)按位取反(按位取反(11111000)(负数符号位不变)(负数符号位不变)加加1(11111001)u所以所以-7的补码是的补码是11111001。28 / 76n为什么使用补码形式:为什么使用补码形式:u一是为了防止一是为了防止0有有2个编码,个编码,

23、u其次就是为了把减法运算用加法运算表示出来,以达到其次就是为了把减法运算用加法运算表示出来,以达到简化电路的作用。简化电路的作用。在补码的系统,加法电路就可以处理有负数在补码的系统,加法电路就可以处理有负数的加法,不需另外处理减法的电路。而且,只要有电路负责数字的的加法,不需另外处理减法的电路。而且,只要有电路负责数字的变号(例如将变号(例如将 1 变换为变换为 -1),也可以用加法电路来处理减法。),也可以用加法电路来处理减法。n4位数例:位数例: 3 + (-1)0011 (3) + 1111 (-1) - 10010 (2) 结果结果 10010 似乎是错的,因为已经超过四似乎是错的,因

24、为已经超过四位位,不过若忽略掉(从右数起的)第不过若忽略掉(从右数起的)第 5 位位,结果,结果是是 0010 (2),和我们计算的结果一样。而且若,和我们计算的结果一样。而且若可以将二进制的可以将二进制的 0001 (1) 变号为变号为 1111 (-1),以,以上的式子上的式子就就可以计算减法:可以计算减法:3-1 = 2。29 / 76n问题?问题?u为什么用补码表示有符号整数为什么用补码表示有符号整数,比如比如8位整数位整数表示的范围是表示的范围是-128127,而不是,而不是-127128呢?呢?u为什么补码能这么巧妙实现了正负数的加减为什么补码能这么巧妙实现了正负数的加减运算?运算

25、?“模模”的概念的概念30 / 76#include using namespace std;int main()int x = 0 x7fffffff;cout以十六进制形式显示:以十六进制形式显示:;couthexx=xendl;cout以十进制形式显示:以十进制形式显示:;coutdecx=xendl;int y = 0 xffffffff;cout以十六进制形式显示:以十六进制形式显示:;couthexy=yendl;cout以十进制形式显示:以十进制形式显示:;coutdecy=yendl;int z = 0 x80000000;cout以十六进制形式显示:以十六进制形式显示:;co

26、uthexz=zendl;cout以十进制形式显示:以十进制形式显示:;coutdecz=zendl;return 0;以十六进制形式显示:以十六进制形式显示:x=7fffffff以十进制形式显示:以十进制形式显示:x=2147483647以十六进制形式显示:以十六进制形式显示:y=ffffffff以十进制形式显示:以十进制形式显示:y=-1以十六进制形式显示:以十六进制形式显示:z=80000000以十进制形式显示:以十进制形式显示:z=-214748364831 / 76实型数据的分类及范围实型数据的分类及范围n实型数据实型数据u 单精度型(单精度型(float型)型)u 双精度型(双精度

27、型(double型)型)u 长双精度型(长双精度型(long double型)型)n实型数据的范围(实型数据的范围(VC中)中)ufloat: 浮点型,占浮点型,占4个字节个字节范围:范围:-3.4*10383.4*1038,有效最高为有效最高为7位位udouble:双精度,占双精度,占8个字节个字节范围:范围:-1.7*103081.7*10308,有效为,有效为15位位ulong double:长双精度,占长双精度,占8个个字节(具体和机器和编字节(具体和机器和编译器相关)译器相关)范围:范围:-1.7*103081.7*10308,有效为,有效为15位位32 / 76问题?问题?nflo

28、at型可以表示的十进制范围是型可以表示的十进制范围是-3.402823466e38 3.402823466e38,而作为同为,而作为同为4个字节的定点数(整型)个字节的定点数(整型)却只能表示却只能表示-21474836482147483647的范围,使用同样的范围,使用同样的内存空间,浮点数却能比定点数表示大得多的范围的内存空间,浮点数却能比定点数表示大得多的范围,这是不是太神奇了?,这是不是太神奇了?n既然浮点数能表示这么大的范围,那么我们为何不使既然浮点数能表示这么大的范围,那么我们为何不使用浮点数来代替定点数呢?用浮点数来代替定点数呢?u浮点数实现起来比较复杂,有些处理器还专门配置了硬

29、件浮浮点数实现起来比较复杂,有些处理器还专门配置了硬件浮点运算单元用于浮点运算点运算单元用于浮点运算u根本原因是浮点数根本就无法取代定点数,因为精度问题。根本原因是浮点数根本就无法取代定点数,因为精度问题。鱼和熊掌不可兼得,浮点数表示了非常大的范围,但它失去鱼和熊掌不可兼得,浮点数表示了非常大的范围,但它失去了精度。了精度。33 / 76浮点型的存储方式浮点型的存储方式n浮点型的存储方式和其他类型有很大不同,而浮点型的存储方式和其他类型有很大不同,而不同编译器之间也存在差别,但大部分都遵从不同编译器之间也存在差别,但大部分都遵从IEEEIEEE数值标准数值标准。n一个浮点数一个浮点数a a由由

30、符号符号s s和和两个数两个数m m和和e e来表示:来表示:a = a = s s m m b be e,其,其的内存形式包含的内存形式包含3 3个部分:个部分:n1 1符号位符号位u浮点型的符号位只有一位,为其最高位。如果浮点型的符号位只有一位,为其最高位。如果该位为该位为1 1,则表示其为负数;如果该位为,则表示其为负数;如果该位为0 0,则,则表示其为非负数。表示其为非负数。34 / 76n2. 2. 指数位(指数偏差)指数位(指数偏差)u浮点型的指数位存储其科学计数法表示形式的指数部浮点型的指数位存储其科学计数法表示形式的指数部分。分。u指数位决定浮点型可存储的数值范围。但是,需要注

31、指数位决定浮点型可存储的数值范围。但是,需要注意的是,浮点型数据的内存形式中的指数位的值并非意的是,浮点型数据的内存形式中的指数位的值并非真正的指数值,真正的指数值为该类型的偏差值减去真正的指数值,真正的指数值为该类型的偏差值减去该存储值的结果。该存储值的结果。u偏差值是为了校正指数值而设定的,每种类型的偏差偏差值是为了校正指数值而设定的,每种类型的偏差值是固定的,不同类型的偏差值不同。值是固定的,不同类型的偏差值不同。u用长度为用长度为e个比特的无符号整数来表示所有的指数取个比特的无符号整数来表示所有的指数取值,这使得两个浮点数的指数大小的比较更为容易。值,这使得两个浮点数的指数大小的比较更

32、为容易。35 / 76n3. 3. 基数位(小数部分)基数位(小数部分)u基数位是浮点型的最后一部分,其位数决定精确基数位是浮点型的最后一部分,其位数决定精确度。度。ulong doublelong double型的基数位即为其科学计数法的基型的基数位即为其科学计数法的基数位的二进制表示形式。数位的二进制表示形式。ufloatfloat型和型和doubledouble型的基数位与型的基数位与long doublelong double型略型略有不同。由于科学计数法的基数表示为二进制时有不同。由于科学计数法的基数表示为二进制时,由于二进制中除了,由于二进制中除了0 0即为即为1 1,故可以确定其

33、整数,故可以确定其整数位肯定为位肯定为1 1。因此,为了得到多一位的存储空间。因此,为了得到多一位的存储空间,存储,存储floatfloat型和型和doubledouble型数据时,省去基数的型数据时,省去基数的整数位,而默认其整数位为整数位,而默认其整数位为1 1。36 / 76n在不同浮点型中,这三个部分所占空间不同,在不同浮点型中,这三个部分所占空间不同,下表列出了下表列出了GCC中各浮点类型的分段情况。中各浮点类型的分段情况。uGCC中中long double是是10位位37 / 7632位二进制的位二进制的float浮点类型为例浮点类型为例n它被分为它被分为3个部分,分别是符号位个部

34、分,分别是符号位S(sign bit)、)、指数偏差指数偏差E(exponent bias)和小数部分)和小数部分F(fraction),这三部分都是对应二进制码的。),这三部分都是对应二进制码的。n浮点表示的一般形式为:浮点表示的一般形式为:R=(S) * (1 + F) * 2e uR:实数,:实数,S:正负符号,:正负符号,F:小数部分,:小数部分, e:指数:指数,不同于指数偏差,不同于指数偏差)。38 / 76n符号位符号位S:占:占1位,位,0代表浮点数是正数,代表浮点数是正数,1代表浮点数是负数。代表浮点数是负数。n指数偏差指数偏差E:占:占8位,范围是位,范围是0255,e =

35、 E - 127,e为正值表明转为正值表明转换成二进制码后,按科学计数法表达时向左移动了换成二进制码后,按科学计数法表达时向左移动了e位,位, 负值负值表明向右移动了表明向右移动了e位。位。n小数部分小数部分F:占:占23位,实际上是将浮点数转换成二进制码,再按位,实际上是将浮点数转换成二进制码,再按科学计数法表达,将其小数部分存在科学计数法表达,将其小数部分存在F上,由于二进制码按科学上,由于二进制码按科学计数法表达后,只要值不为计数法表达后,只要值不为0,整数部分就必然为,整数部分就必然为1,所以可以,所以可以省略整数部分。省略整数部分。n例如,例如,3.75的二进制码为的二进制码为11.

36、11,将该二进制码按科学计数法表,将该二进制码按科学计数法表达为达为1.111,则向左移动了,则向左移动了1u即即e=1,E=e+127=128,uF记录的便是小数部分,实际为记录的便是小数部分,实际为111000.000。39 / 76n例例1: float型浮点数型浮点数0.5转化成转化成32位二进制浮点数位二进制浮点数。u0.5的二进制码为的二进制码为0.1,按科学技术法写为,按科学技术法写为1.0*2-1,即,即向右移向右移1位,则位,则e=-1,则,则E=e+127=126,126的二进制的二进制码为码为01111110。u而而1.0把整数部分的把整数部分的1去掉后,剩下小数部分为去

37、掉后,剩下小数部分为0,之后补之后补0至至23位,构成位,构成F。所以。所以0.5的的32位二进制浮位二进制浮点数为:点数为:0 01111110 0000000000000000000000040 / 76n例例2:float型浮点数型浮点数125.5转化成转化成32位二进制浮点数位二进制浮点数。u125.5的整数和小数部分的二进制码分别为的整数和小数部分的二进制码分别为1111101和和0.1,u于是于是125.5的二进制码为的二进制码为1111101.1,按科学技术法写,按科学技术法写为为1.1111011*26,即向左移,即向左移6位,则位,则e=6,E=e+127=133,133的二

38、进制码为的二进制码为10000101。u而而1.1111011把整数部分的把整数部分的1去掉后,剩下小数部分为去掉后,剩下小数部分为1111011,之后补,之后补0至至23位,构成位,构成F。u所以所以125.5的的32位二进制浮点数为:位二进制浮点数为:0 10000101 1111011000000000000000041 / 76实型数据的舍入误差实型数据的舍入误差n由于实型变量是由有限的存储单元组成的,因此能由于实型变量是由有限的存储单元组成的,因此能提供的有效数字总是有限的,在有效位以外的数字提供的有效数字总是有限的,在有效位以外的数字将被舍去。由此可能会产生一些误差。将被舍去。由此

39、可能会产生一些误差。n例:实型数据的舍入误差例:实型数据的舍入误差main()float a,b; a = 123456.789e5; b = a + 20 ; printf(%f,b); na+20的理论值应是的理论值应是12345678920,而一个实型变量只能保证的有效而一个实型变量只能保证的有效数字是数字是7位有效数字;位有效数字;n运行程序得到的运行程序得到的a和和b的值是的值是12345678848.000000n应当避免将一个很大的数和一个很小的数直接相加或相减,应当避免将一个很大的数和一个很小的数直接相加或相减,否则就会否则就会“丢失丢失”小的数。小的数。42 / 76Floa

40、t, double, 精度精度#include using namespace std;int main( )float a, b;double c;a = 12345.6789;c = a;cout a = a endl;cout c = c endl; cout.setf(ios:fixed | ios:showpoint); cout.precision(5);cout a = a endl; cout c = c endl;c = 12345.6789;cout c = c endl;return 0;43 / 76布尔型布尔型n布尔类型布尔类型(bool)是是C+新增的类型,只能取新

41、增的类型,只能取true 和和false 两两个值,分别对应整数的个值,分别对应整数的1 和和0。#include void main()bool b1=true,b2=false;coutb1=true 时,时,b1=b1endl;coutb2=false 时,时,b2=b2endl;int i;couti;b1=i3;cout3 时,时,b1=b1endl;b2=(bool)-100;coutb2=-100 时,时,b2=b23 时,时,b1=1b2=-100 时,时,b2=144 / 76字符型数据字符型数据n字符型常量字符型常量u用用单引号括起来的单个字符。单引号括起来的单个字符。如如

42、 a, x, D, #u一些特殊的字符常量,一些特殊的字符常量,以以 开头开头的字符序列,有特殊的含的字符序列,有特殊的含义义, 故故叫转义叫转义符,如:符,如:n表示换行表示换行#include using namespace std;int main( ) char a = a; coutaendl; coutThis is the first line ! n; coutan; return 0;45 / 76C+中的转义字符中的转义字符46 / 76字符型数据字符型数据n一个字符占一个字节一个字符占一个字节u字符要字符要转化成数字存储转化成数字存储;u一个字符变量只能存放一个字符;一个

43、字符变量只能存放一个字符;u字符与字符串是不同的数据类型;字符与字符串是不同的数据类型;不能用字符变量来存放字符串;不能用字符变量来存放字符串;n字符数据的存储形式字符数据的存储形式u在内存中字符变量的存储形式是在内存中字符变量的存储形式是ASCII码码47 / 76ASCII码码nASCII码码(America Standard Code for Information Interchange,美国信息交换标准码,美国信息交换标准码)u美国国家标准学会(美国国家标准学会(American National Standards Institute ANSI) 制定制定u早期使用早期使用7 位表

44、示,只规定了位表示,只规定了128个最常用的个最常用的英文字符;英文字符;u现在则使用现在则使用8个位,共可表示个位,共可表示256个不同的文个不同的文字与符号;字与符号;u在此基础上发展了在此基础上发展了16bits的的Unicode48 / 76字符型数据字符型数据49 / 76字符型数据字符型数据n由于存储类型和整型相同由于存储类型和整型相同u字符数据和整型数据可以相互赋值字符数据和整型数据可以相互赋值uASCII码可以和整数一样进行运算码可以和整数一样进行运算u字符和整型均可以以两种形式输出字符和整型均可以以两种形式输出int a=32;char b=a; int c = b-a; /

45、结果为结果为 65char a=6+256; /溢出!因为溢出!因为a只能占用只能占用8位,最大位,最大256 /输出:输出: 与与 a = 6; 相同相同50 / 76数数 组组n什么是数组什么是数组u 问题:有问题:有26个数,写个数,写 程序找出其中最大的数。程序找出其中最大的数。u 解:先要找个结构存下这解:先要找个结构存下这26个数个数 int a, b, c, d, e, f, g, h, i, j, , z;u 新问题:实在是太麻烦!新问题:实在是太麻烦!n数组是良好的解决方案!数组是良好的解决方案!u int a26 = 78, 56, 69, 31, 36, 67, 31,

46、47, 69, 34, 45, 74, 61, 82, 43, 41, 76, 79,; 51 / 76简单程序简单程序#includeusing namespace std;int main( )int number45 = 78, 56, 69, 31, 36, 67, 31, 47, 69, 34, 45, 74, 61, 82, 43, 41, 76, 79, 81, 66, 54, 50, 76, 51, 53, 28, 74, 39, 45, 61, 52, 41, 43, 75, 78, 84, 72, 51, 43, 64, 75, 81, 69, 55, 74;int max

47、 = 0;int i = 0;for(i = 0; i max)max = numberi;coutThe Maximal Number is:max;return 0; /函数结束返回函数结束返回52 / 76数数 组组n定义其他类型的数组并附初始值定义其他类型的数组并附初始值u int a26;u float a26;u bool a26;u char a26 = a, b, c, , z;n数组的使用数组的使用u 要使用第要使用第n个数:个数:an-1; an-1 = 1+2;u 注意:对数组注意:对数组an,只能使用,只能使用a0 an-1; an不能用;不能用;53 / 76字符类型

48、与字符串常量字符类型与字符串常量n字符串常量字符串常量u用双引号括起来的字符序列。如:用双引号括起来的字符序列。如:u“How do you do”, “CHINA”, “a”, “$ 123.34” 等等n字符串可以一次输出,如:字符串可以一次输出,如:ucout“How do you do n”;n注意注意a是字符常量,是字符常量,“a”是字符串常量,二者是字符串常量,二者不同不同54 / 76看看这段程序看看这段程序#include using namespace std;int main( )int int_char_a = a;int int_char_b = ab; coutdec

49、int_char_a = int_char_aendl;couthexint_char_a = int_char_aendl;coutdecint_char_b = int_char_bendl;couthexint_char_b = int_char_bb59 / 76C+ 语言的语言的 保留字保留字n在在程序里具有语言程序里具有语言预先定义好的特殊意义预先定义好的特殊意义,因此不能用,因此不能用于其他目的,不能作为普通的名字使用于其他目的,不能作为普通的名字使用。uC+保留字:保留字:60 / 76变量的命名变量的命名n匈牙利命名法匈牙利命名法u由由Microsoft的著名开发人员、的著名

50、开发人员、Excel的主要设计者的主要设计者查查尔斯尔斯西蒙尼西蒙尼在他的博士论文中提出来的,由于西蒙在他的博士论文中提出来的,由于西蒙尼的国籍是匈牙利,所以这种命名法叫尼的国籍是匈牙利,所以这种命名法叫匈牙利命名法匈牙利命名法。nC标识符的命名规则:标识符的命名规则:1. 标识符的名字以一个或者多个标识符的名字以一个或者多个小写字母开头小写字母开头,用这些,用这些字母来字母来指定数据类型指定数据类型。2. 在标识符内,前缀以后就是一个或者多个在标识符内,前缀以后就是一个或者多个第一个字母第一个字母大写大写的单词,这些单词清楚地指出了源代码内那个的单词,这些单词清楚地指出了源代码内那个对对象的

51、用途象的用途。n如:如:chGrade; nLength; bEnable; strStudentName61 / 76Examplen计算计算n用到的数学函数用到的数学函数 sqrt(x), pow(x,n);#include #include using namespace std;int main() int a = 2, b = 3, c = 4, d = 2;int nPow1 = pow(a,b), nPow2 = pow(4,2);float fResult = sqrt(nPow1+nPow2); cout fResult; return 0;n输出:输出:4.89898234

52、2 62 / 76常常 量量n常量常量u在程序运行过程中,其值在程序运行过程中,其值保持不变的量保持不变的量n字面常量字面常量u1,0,123,4.6, 1.23;n符号常量符号常量u用一个标识符代表一个常用一个标识符代表一个常量的,称为符号常量量的,称为符号常量#include int main( )const float PI=3.14159f;float r, area;cinr;area = r * r * PI;cout“area = ”area;return 0;63 / 76常量有类型吗?常量有类型吗?n整型常量的后缀整型常量的后缀un = 10000L; /长整型常量长整型常量

53、um = -0 x88abL; /长整型十六进制常量长整型十六进制常量uk = 10000U; /无符号整型常量无符号整型常量ui = 07777LU; /无符号长整型八进制常量无符号长整型八进制常量n浮点型常量的后缀浮点型常量的后缀ux = 3.1415F /单精度浮点型常量单精度浮点型常量uy = 3.1415L /长双精度浮点型常量长双精度浮点型常量n说明:说明:u浮点型常量默认为浮点型常量默认为double 型;型;uU, L, F均可以小写;均可以小写;64 / 76C 程序的程序的 基本字符基本字符n一个一个C 程序程序 = 一个符合规定形式的基本字符序列一个符合规定形式的基本字符

54、序列nC 语言基本字符包括:语言基本字符包括:1. 数字字符,数字字符,0,1,2,3,4,5,6,7,8,9;2. 大小写拉丁字母:大小写拉丁字母:az,AZ;3. 其他一些可打印(可以显示)的字符(如各种标点符其他一些可打印(可以显示)的字符(如各种标点符号、运算符号、括号等),号、运算符号、括号等),包括:包括:!%&*()_-+=:;,.?/|4. 还有一些特殊字符,如空格符、换行符、制表符等。还有一些特殊字符,如空格符、换行符、制表符等。空格符、换行符、制表符等统称为空白字符。空白字符空格符、换行符、制表符等统称为空白字符。空白字符在程序中主要用于分隔其他成分。在程序中主要用

55、于分隔其他成分。65 / 76输入输入/输出输出n如何从程序中输出信息?如何从程序中输出信息?ucout“Webcome to Beijing!”endl;cout是是输出流对象输出流对象(支持输出的东西)(支持输出的东西) “ x;ucin是输入流对象(支持输出的东西)是输入流对象(支持输出的东西)u “”(提取操作符)(提取操作符)u空格、空格、Tab、回车符作为分隔符、回车符作为分隔符66 / 76控制输出控制输出固定小数点输出固定小数点输出#include #include using namespace std;int main() double x = 35.54767;cout

56、x endl;/缺省输出缺省输出6位位cout setprecision(7)x endl; /输出输出7位位cout fixed; /按定点输出按定点输出cout x endl;/fixed缺省,小数点后面输出缺省,小数点后面输出7位位coutsetprecision(0)xendl;/小数点后面小数点后面0位位coutsetprecision(1)xendl; /小数点后面小数点后面1位位coutsetprecision(2)xendl;coutsetprecision(3)xendl;coutresetiosflags(ios:fixed)endl; /取消定点取消定点cout x en

57、dl;/恢复恢复setprecision(3)return 0;67 / 76控制输出控制输出位数控制位数控制#include #include using namespace std;int main() double x = 35.54767;cout setw(10) x endl;/输出占输出占10位,包括小数点位,包括小数点cout setw(10)setprecision(7)x endl;cout fixed; /按定点输出按定点输出cout x endl; /小数点后面输出小数点后面输出7位,位,setw(n)只控制一次只控制一次coutsetprecision(0)xendl

58、; /小数点后面小数点后面0位位coutsetprecision(1)xendl; /小数点后面小数点后面1位位coutsetprecision(2)xendl;coutsetw(10)setprecision(3)xendl;coutresetiosflags(ios:fixed); /取消定点取消定点cout x endl;/恢复恢复setprecision(3)return 0;68 / 76#include #include using namespace std;int main()float c;double d,e;c = 1.234567f;d = 1.234567890123

59、45;e = c + d;cout c “ ” d endl; /缺省都是缺省都是6位位/单精度最多输出单精度最多输出7位,双精度最多位,双精度最多16位,此处输出位,此处输出8位位coutsetprecision(8)c d endl;cout setw(10) this endl;cout setw(10) e endl;return 0;69 / 76说明说明n不加任何说明不加任何说明cout一个浮点数,共输出一个浮点数,共输出6位。位。u 例:例:cout 22.0/7; / 3.14286n coutsetprecision(n);单独使用,设置整个数据的长度,不包括单独使用,设置整个数据的长度,不包括小数点小数点ucout setprecision(3)22.0/7 endl;/3.14n coutfixedsetprecision(n);结合使用,设置小数点后面的精度结合使用,设

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论