c++中信息的表达与数据运算(2016.5.21)_第1页
c++中信息的表达与数据运算(2016.5.21)_第2页
c++中信息的表达与数据运算(2016.5.21)_第3页
c++中信息的表达与数据运算(2016.5.21)_第4页
c++中信息的表达与数据运算(2016.5.21)_第5页
已阅读5页,还剩71页未读 继续免费阅读

下载本文档

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

文档简介

0西安交通大学计算机教学实验中心

2013.9第2章信息的表达与数据运算C++程序设计教程内容提要信息如何在程序中表示数据类型、常量、变量、数组、字符串数据如何运算运算符、表达式、赋值各种运算符、运算符的优先级混合运算不同数据类型、不同运算12.1信息的表达信息在程序设计中的表达2.1.1数据类型与常量已知距离6km,行驶时间为5分钟,计算行驶速度。数学算式:6÷(5.0÷60.0)=72(km/小时)cout<<6/(5.0/60.0));直接写出的数据是常量,6是整数,60.0是实数1.基本数据类型与字面常量整型int5长整型longint5L浮点型float5.0f双精度型double

5.0,1.0E-5字符char‘a’字符串chars[21];stringstr;“char”逻辑型booltruefalse转意字符\\n,\t,\’,\”,\02【例2-1】检查不同类型的数据在内存中占的字节数。编写程序,显示整型、长整型、字符型、逻辑型、浮点型和双精度型数据的类型名称和所占字节数。【问题分析】sizeof(),它计算括号中的类型、变量或表达式结果占的字节数。【算法描述】检查不同类型的数据在内存中占的字节数。①输出字符串’int’;②用sizeof(int)计算整型数占的字节数n;③输出n;④将整型依次改为长整型、字符型、逻辑型、浮点型和双精度型重复①~③3【源程序】/*example2-1Bytesofdatatype*///程序注释#include<iostream>//包含基本输入输出库头文件usingnamespacestd;//使用名字空间

intmain()//主函数{ intn;//说明用n表示整数 n=sizeof(shortint);//计算类型大小,将所占字节数赋值给符号n cout<<"shortint"<<n<<endl;//显示 n=sizeof(int);//整型 cout<<"int"<<n<<endl;4 n=sizeof(longint);//长整型 cout<<"longint"<<n<<endl; n=sizeof(char);//字符串 cout<<"char"<<n<<endl; n=sizeof(bool);//逻辑型(布尔型) cout<<"bool"<<n<<endl; n=sizeof(float);//浮点型 cout<<"float"<<n<<endl; n=sizeof(double);//双精度型 cout<<"double"<<n<<endl; return0; //程序结束,}5【例2-2】以下列格式使用前面列出的10种转义字符,看得到什么效果。 cout<<"1abcde\n#12345\n";其中,字符串常量中开头1是序号,以后要依次替换为2,3,4…10;中间的\n是转义字符,以后依次换为\r,\t,\f等。【思路扩展】输出9个大小不等的整数,分3行、3列输出,要求每列的数据对齐,如何实现?62.符号常量const<数据类型><标识符>=<数值>;constdoublePI=3.1415926;constintN=3,M=5;行末有分号★#define<标识符><数值>#definePAI3.1415926行末无分号★用符号常量是编程的好习惯74.字符和整数的关系‘a’,字符,内存中存的数值是97‘1’,字符,内存中存的数值是491,整数,内存中存的数值是1cout<<97;cout<<(char)97;?结果怎样?Cout<<‘a’;Cout<<(int)’a’;?结果怎样?Charc;C=57;cout<<‘|’<<c<<‘|’;?结果怎样?C=9;cout<<‘|’<<c<<‘|’;?结果怎样?82.1.2单项特征的表达——变量1.变量的定义inti,j,k;//定义三个整型变量doubleradius,area; //定义两个双精度型变量charc1,c2; //定义两个字符型变量boolflag; //定义一个布尔型变量2.变量的初始化inta=5*2;//复制初始化inta(5*2);//直接初始化9变量的赋值和使用doublelength,width,area; //变量的定义length=6.0; //变量的赋值width=3.2; //变量的赋值area=length*width; //表达式中使用变量,结果赋给变量areacout<<area; //area在表达式中被使用变量:定义、赋值、使用★10【例2-3】说明下列程序中的错误之处/*example2-3findingerror*///程序注释#include<iostream>//包含基本输入输出库头文件usingnamespacestd;//使用名字空间intmain()//主函数{ doublePI=3.1415926; doubler;doublearea; area=PI*r*r; cin>>r; cout<<"area\t"<<area<<endl; return0; //程序结束,}112.1.3多个相同类型的特征的表示——数组一个变量表示一个事物的单个特征数组表示一组相同类型的特征1.向量的表示——一维数组的定义的使用一维数组的定义<类型><标识符>[<大小>];constintN=100,M=20;//定义两个整型常量N和Mdoublelength[30],width[30];//定义两个数组length和width,intscore[N*M];//定义数组score,大小用常量表达式表示,实际大小为200doubleaverage[N]; //定义数组average,大小用符号常量表示12一维数组的使用数组中的元素,下标,下标越界intx[30]; //定义数组intsum; //定义变量x[0]=1; //将数组x的第1个元素设置为1x[1]=3; //将数组x的第2个元素设置为3x[2]=5; //将数组x的第3个元素设置为5sum=x[0]+x[1]+x[2]; //对数组的前三个元素求和cout<<sum<<endl; //输出和cin>>x[0]>>x[1]>>x[2]; //输入数组的前三个元素sum=x[0]+x[1]+x[2]; //再次对数组的前三个元素求和cout<<x[0]<<“”<<x[1]<<“”<<x[2]<<“\n”;//输出三个元素,用空格隔开,用\n控制换行,与endl效果相同cout<<sum<<endl; //再次输出和。由于输入会改变x[0],x[1],x[2]的值,所以这次的和可能会与前面的和不同了13数组不能整体输入、输出intlength[10],width[10]; //定义两个数组,中间用逗号隔开cin>>length; //错误,数组不能整体输入cin>>length[10]; //错误,下标超界。使用length[-1]也是错误的width=length; //错误,数组不能整体赋值cout<<length; //错误,数组不能整体输出14一维数组的初始化<类型><数组名>[<常量表达式>]={<表达式1>,<表达式2>,...};doublea=11.2,b=21.7;//定义两个双精度变量并初始化doubleaverage[30]={21.0,2012.7,7.5+2.3,a*b};//定义数组并初始化,数据项有常量和表达式doubleroom[]={401,402,403,404,405,606,407,408,409,411};一维数组在内存中的存储按2行存储(行优先)152.矩阵的表示——二维数组16用一维数组表示矩阵?intM[9]={2,7,6,8,1,3,10,5,4};M[i*3+j]=A[i][j];M[i*N+j]=A[i][]j,N为矩阵A的列数二维数组<类型><数组名>[<行数>][<列数>;intA[5][5]; //定义5行*5列的二维数组,实际只用了3行3列intsum;A[0][0]=2; //为第1行第1列元素赋值A[0][1]=7; //为第1行第2列元素赋值A[0][2]=6; //为第1行第3列元素赋值…A[2][0]=10; //为第3行第1列元素赋值A[2][1]=5; //为第3行第2列元素赋值A[2][2]=4; //为第3行第3列元素赋值sum=A[0][0]+A[1][1]+A[2][2];//对角元素求和cout<<A[0][0]<<""<<A[1][1]<<""<<A[2][2]<<""<<sum<<endl;17二维数组初始化<类型><数组名>[<行数>][<列数>]={<表达式1>,<表达式2>,...};inta=9;intB[3][3]={a+1,a+2,a+3,a+4,a+5,a+6,a+7,a+8,a+9};/intA[5][4]={2,7,6,8,1,3,10,5,4};intA[][3]={2,7,6,8,1,3,10,5,4};intA[3][3]={{2,7,6},{8,1,3},{10,5,4}};intA[3][3]={{2,7},{8,1},{10,5}};183.多维数组intA[5][4][3];//定义三维数组doubleB[3][4][5][6];//定义4维数组19思考题什么问题的表示用数组更方便2.1.4文字信息的表达——字符串1.用字符数组表示字符串【例2-4】用户从键盘输入一个四个小写字母组成的英文单词,将其转换为大写,然后显示到屏幕上。【算法】将长度为4的小写字母的单词转换为大写。①用字符数组str表示字符串。②输入字符串str。③将str的每个元素减去32。④输出字符串。20【源程序】将长度为4的小写字母的单词转换为大写#include<iostream>//包含需要的头文件usingnamespacestd;//名字空间intmain()//主函数{ charstr[5];//定义字符数组用于存放字符串 constintc=32;//定义常量,表示大小写字母的ASCII值的差 cin>>str;//输入字符串 str[0]=str[0]-c;//转换第1个字母 str[1]=str[1]-c;//转换第2个字母 str[2]=str[2]-c;//转换第3个字母 str[3]=str[3]-c;//转换第4个字母 cout<<str<<endl;//输出字符串 return0;}21字符、字符数组在内存中的存储字符、字符数组、字符串的联系与区别用字符数组存储的字符串可以整体输入、整体输入,但不能整体赋值222.用string类型的“变量”表示字符串包含头文件stringstring<对象1>,<对象2>,...;stringtext1,text2;//定义两个对象text1="SluicegatesatThreeGorgesDamopenedtodischargewater.";//text2="07-07-201209:04BJT";//使用“=”号为对象赋值stringtext3("HeavyrainsacrosssouthernChinaarepushingwaterlevelsattheThreeGorgesDambeyondthefloodlevellimit.");23使用成员函数对字符串进行操作<对象>.<函数名>(<参数列表>);【例2-5】使用string进行字符串的操作。设有两个句子:Heavyrainsarepushingwaterlevelsbeyondthelimit.SluicegatesatThreeGorgesDamopenedtodischargewater.开始由两个符号表示,请将它们合并为一段文字,然后查找其中的“Heavy”替换为“Strong”,最后显示处理过的文本。24【源程序】#include<iostream>//包含需要的头文件#include<string>//使用string类需要包含头文件stringusingnamespacestd;//名字空间intmain()//主函数{ //定义并初始化字符串对象text1 stringtext1("Heavyrainsarepushingwaterlevelsbeyondthelimit."); stringtext2,text3;//定义但没有初始化话对象text2,text3 intk;//定义整型变量k25//为对象text2赋值 text2="SluicegatesatThreeGorgesDamopenedtodischargewater."; text3=text1+text2;//使用“+”运算合并两个字符串,并赋值给text3 k=text3.find(“Heavy”); //在text3中查找“Heavy”,将得到的位置赋给k//将text3中k开始的sizeof("Heavy")-1)个字符删除//sizeof("Heavy")是计算Heavy占的字节数,为6,减1是字符个数text3.erase(k,sizeof("Heavy")-1); //删除Heavy text3.insert(k,"Strong"); //将在text3中位置k处插入字符串"String" cout<<text3<<endl; //显示合并、替换后的字符串 return0;}262.2数据的运算运算符(操作符)、运算数(操作数)、表达式表达式可以嵌套2.2.1算术运算1.算术运算符、算术表达式2.算术符合运算符a+=b;//等价于a=a+b

;a-=b;//等价于a=a-b

;a*=b;//等价于a=a*b

;a/=b;//等价于a=a/b

;a%=b;//等价于a=a%b

;272.2.2关系运算>(大于)>=(大于等于)<(小于)<=(小于等于)==(等于)!=(不等于)关系表达式5>3,2+5<4,a+b>c,'a'<'b‘表达式的值bool型,值true,flasetrue,false与1,0,非零,其他表达式值的关系282.2.3逻辑运算符和表达式&&(与)、||(或)、!(非)“短路求值”(short-circuitevaluation)【例2-7】判断闰年。用户输入年份,如果为闰年输出1;如果不是,输出0。判断闰年的规则为:(1)能被4整除且不能被100整除的为闰年。(如2004年是,1900年不是);(2)能被400整除的是闰年。(如2000年是,1900年不是)。29【源程序】#include<iostream> //包含需要的头文件usingnamespacestd; //名字空间intmain() //主函数{ intyear; //定义整型变量表示年份 boolresult; //定义逻辑变量表示判断结果 cout<<"请输入年份:"; //提示信息 cin>>year; //输入年份 result=(year%4==0&&year%100!=0)||(year%400==0);//计算逻辑表达式,结果赋给逻辑变量result cout<<“闰年判断结果:”<<result<<endl;//打印结果,result为true显示1,//result为false显示0 return0;}30【思路扩展】(1)能根据运行结果判断两个年份是否闰年吗?(2)看程序的输出行,其中输出的是result这个变量,这个变量的值是逻辑值,true或false,而运行结果却是1或0。事实上,条件、逻辑表达式的计算结果实际为一个整数值,或者为1或者为0。反过来,整数0可以表示fasle,非0可以表示!false即true。这也是信息的表示问题,是约定。(3)编程判断用户输入的数是否满足

,是则显示1,不是则显示0。312.2.4自增运算符和自减运算符++,--单目运算inti;++i;i++;【例2-8】请分析下列程序每个语句执行后i,j的值是多少?inti=0,j=0;j=++i;j=i++;322.2.5位运算符和位运算表达式1.按位与intx=11,y=7,z;z=x&y

;11的二进制表示:000000000000000000000000000010117的二进制表示:0000000000000000000000000000011100000000000000000000000000001011&00000000000000000000000000000111--------------------------------------------------------------00000000000000000000000000000011则,z=x&y的结果十进制表示为3。33【思考题】能否通过“与”运算使一个数的指定位为1或为0?如果不能为什么?如果能,如何实现,请举例说明。342.按位或intx=11,y=7,z;z=x|y

;00000000000000000000000000001011|00000000000000000000000000000111

---------------------------------------------------------00000000000000000000000000001111则,z=x|y的结果的十进制表示为15。按位或运算可以方便地将一个数的某些二进制位设置为1。如果两个数代表两个集合,则“或”运算相当于它们的“并”运算353.按位异或intx=11,y=7,z;z=x^y

;00000000000000000000000000001011^00000000000000000000000000000111

----------------------------------------------------------00000000000000000000000000001100则,z=x^y的结果十进制表示为12。在同一数据上两次异或一个值,结果变回原来的值364.按位取反intx=11,z;z=~x

;~00000000000000000000000000001011-----------------------------------------------------------z11111111111111111111111111110100375.左移位运算intx=179,z;z=x<<4;00000000000000000000000010110011<<400000000000000000000101100110000结果z的十进制形式为2864。一个数每左移一位,相当于将这个数乘以2。左移运算常和按位或运算一起使用,用于将两个数的内容拼接在一起。386.右移位运算intx=179,z;z=x>>3;00000000000000000000000010110011>>300000000000000000000000000010110结果z的十进制形式为22。一个数每右移一位,相当于将这个数除以2。右移运算常和按位与运算一起使用,用于从一个数中分离出某些二进制位。例如,取x的第三个字节,可以将其右移八位,和0x00FF做“与”运算。39【例2-9】判断文件属性的模拟。用户从键盘输入[0,63]内的整数,表示一个文件的属性,从低位开始,它的每个二进制位一次表示只读位、隐藏位、系统位、卷标位、子目录位、归档位。请判断该文件具有哪些属性,不具有哪些属性。有用1表示,没有用0表示。40【源程序】//例2-9判断文件属性的模拟#include<iostream> //包含需要的头文件usingnamespacestd; //名字空间intmain() //主函数{ intattribute;//定义整型变量,表示属性字节的值 inta0=1,a1=2,a2=4,a3=8,a4=16,a5=32;//定义6个变量并初始化,//表示各属性位的位权 cin>>attribute; //输入属性字节的十进制值41 //"与"运算保留了相应位的值。"=="运算比较是否与该位为1时的值相等。 //相等表示该属性有效,结果为true,显示效果为1; //不相等表示该位无效,结果为fasle,显示效果为0。cout<<"只读:"<<((attribute&a0)==a0)<<endl;cout<<"隐藏:"<<((attribute&a1)==a1)<<endl; cout<<"系统:"<<((attribute&a2)==a2)<<endl; cout<<"卷标:"<<((attribute&a3)==a3)<<endl; cout<<"目录:"<<((attribute&a4)==a4)<<endl; cout<<"归档:"<<((attribute&a5)==a5)<<endl; cout<<endl; return0;}42【程序验证】题目要求输入的数在0-63之间,但程序中并没有体现这一限制。如果输入167,也能输出结果,这一结果是怎么计算出来的呢?如果输入负数呢?怎么解决这一问题呢?怎样让用户知道输入是否正确呢?【思路扩展】一个变量表示一个数或字符。一个位可以表示两种状态事物的一种状态,例如开关的“开”或“关”状态。如果用一位表示一个开关,控制一盏灯,那么一个字节就可以控制8盏等,一个整型变量就可以控制32盏等。用多个整型变量就可以控制更多的等。请同学们想一想,位运算还可以用在什么地方呢?437.复合位运算符442.2.6三目条件运算符45<逻辑表达式>

?<表达式1>

:<表达式2>doublet

;inty

;y=(t>=0

?1

:0);【例2-10】100以内整数加法练习系统。编写程序,自动产生两个小于100的整数,显示给用户,并让用户输入它们的和。如果用户计算正确,显示“正确,祝贺!”,如果不正确,显示“错误,加油啊”。?自动产生小于100的整数?46【源程序】#include<iostream>//包含头文件cout,cin需要#include<cmath>//包含头文件,rand()需要usingnamespacestd;//名字空间intmain()//主函数{ inta,b,c;//分别表示两个数及它们的和 intinput;//存放用户输入的和 charright[]="正确,祝贺!";//保存字符串 charwrong[]="错误,加油啊!";//保存字符串 a=rand()%100;//产生小于100的随机数 b=rand()%100;//产生小于100的随机数47 c=a+b;//计算和 cout<<a<<"+"<<b<<"=?";//显示两个数并提示用户输入 cin>>input;//用户输入的和 cout<<(input==c?right:wrong);//根据正确与否显示不同的信息 input==c?cout<<right:cout<<wrong;// cout<<endl; return0;}?随机数,伪随机数,随机数种子#include<ctime>srand(time(0));rand();482.2.7运算符的优先级小括号、下标、访问对象单目运算算术运算比较运算逻辑运算?号运算符合运算表2-3结合方向好习惯:运用小括号492.2.8不同类型数据的混合运算char→int→unsigned→long→unsignedlong→float→double相同类型数据的运算强制类型转换inta;charb;a=65;b='a';cout<<(char)a<<int(b);502.3程序设计实例【例2-11】海伦公式计算三角形的面积。用户输入三角形的三条边长a,b,c,用海伦公式计算三角形的面积。

其中,,三边长可能为实数。提示:?51【算法描述】海伦公式计算三角形的面积用a,b,c表示三角形的三个边长。①输入a,b,c三个数;②计算s=(a+b+c)/2;③计算面积

;④输入面积A。52【源程序】#include<iostream>//包含基本输入输出库头文件#include<cmath>usingnamespacestd;//使用名字空间

intmain()//主函数{ doublea,b,c;//定义双精度变量 doubles,A; cout<<"Pleaseinputthreeedgesa,b,c=";//输入提示 cin>>a>>b>>c; //输入 s=(a+b+c)/2.0; //计算s A=sqrt(s*(s-a)*(s-b)*(s-c)); //计算面积 cout<<"Theareais"<<A<<endl; //打印面积return0; //程序结束,}53【思考题】①计算s的右边的表达式注意什么问题,还可以怎样书写?②程序中怎么有两个a(一个大写A,一个小写a)呢?54【例2-12】构造一个5位数的反序数。例如,用户输入12345,构造出54321并输出。【算法描述】构造5位的反序数。用n表示输入的原5位数,用m表示构造出的新5位数。①输入五位数n;②依次分离出个位、十位、百位、千位和万位,分别用a,b,c,d,e表示;③用式子(((a*10+b)*10+c)*10+d)*10+e构造新的五位整数;④输出新数。55【源程序】#include<iostream>//包含基本输入输出库头文件#include<cmath>usingnamespacestd;//使用名字空间

intmain()//主函数{ intn,m;//n,m表示输入的数和反序后的数 chara,b,c,d,e;//分别表示原数的个、十、百、千、万位 cout<<"Pleaseinputafive-digitnumber";//输入提示 cin>>n;//输入一个五位整数 a=n%10;//分离个位 n=n/10; b=n%10; //分离个十位56n=n/10; c=n%10; //分离百位 n=n/10; d=n%10; //分离千位 n=n/10; e=n%10; //分离万位 m=(((a*10+b)*10+c)*10+d)*10+e;//构造新数 cout<<"Theinversednunberis"<<m<<endl;//输出return0;//程序结束,}57【思路扩展】(1)e和最后的n有什么关系?最后的求余有必要吗?(2)本例中,不用n=n/10;这种方式,分离十位还可以写成b=n/10%10,类似地,分离其他位呢?(3)有兴趣的同学可以考虑:用户任意输入一个数,构造其反序数并输出。(4)如果一个数的反序数与它相等,那么这就是一个回文数。修改上面的程序,判断用户输入的数是不是回文数。58【例2-13】一位数的整数形式和ASCII形式的转换。编写程序,用户输入一位数,存入整型变量,然后将其转换为字符存入字符型变量,打印字符变量及其代表字符的ASCII值。整型转换为字符型是什么意思?1整型——1,字符型——49用途:例如输入一句话“西安城墙景区门票目前为40元,拟上涨至55元,问上涨的百分比是多少?”请自动计算注意,在句子中“40”,“50”是字符型的59【源程序】#include<iostream>//包含基本输入输出库头文件usingnamespacestd;//使用名字空间

intmain()//主函数{ intn; //声明整型变量 charc; //声明字符型变量 cout<<"Pleaseinputadigit";//输入提示 cin>>n; //输入 c=n+'0'; //数字转换为字符 cout<<c<<"ASCII"<<(int)c<<endl;//以字符和数值形式打印return0;//程序结束,}60【思考题】(1)编写程序,将数字字符转换为数值(将一个字符型的数字,转换为一个整型的数字)。(2)使用集成环境的跟踪功能,观察int和char型数据在内存中的值。612.3.4启闭指定设备【例2-14】大型超市中,在顾客不是很多时,收银台经常是隔一个打开一个。设这些收银台除操作员密码外,还由控制室统一控制,只有控制室打开该设备后操作员才能使用。设每个设备用一个二进制位表示,1表示开启,0表示关闭。用户输入一个无符号整数表示初始的状态,编写程序分别将这个数的二进制的奇数位置成0和置成1(从最低位开始为第1位),以十六进制形式打印设置后的两个数。62【算法描述】①输入无符号整数a②设奇数位为0的数为odd0=0x55555555,奇数位为1的数为odd1=0xAAAAAAA③将a分别与odd0,odd1做“与”运算和“或”运算,结果用a0,a1表示;④输出a0,a1的十六进制形式。63#include<iostream>//包含基本输入输出库头文件usingnamespacestd;//使用名字空间

intmain()//主函数{ unsignedinta; //声明无符号整型变量,保存原数 unsignedintodd0=0x55555555;//奇数位0

温馨提示

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

评论

0/150

提交评论