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页,还剩43页未读 继续免费阅读

下载本文档

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

文档简介

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

2013.9第4章复杂信息的表示与处理C++程序设计教程内容提要数组二维数组多维数组字符串一维字符数组二维字符数组string类1结构体枚举4.1多个事物的多项特征多项事物的多个相同类型的特征,一个班级60位同学的三门课程的成绩多个矩形的位置、长和宽数学中的n维空间的多个点24.1.1二维数组1.二维数组的定义<类型><数组名>[<常量表达式1>][<常量表达式2>];例如intrectangle[60][2charmonths[12][20];constintN=100,M=3;doublescores[N][M+1];32.二维数组的使用<数组名>[<行标>][<列标>]intA[5][5]; intsum;A[0][0]=2; A[0][1]=7; A[0][2]=6; A[1][0]=8; A[1][1]=1; A[1][2]=3; A[2][0]=10;4

A[2][1]=5; A[2][2]=4; sum=A[0][0]+A[1][1]+A[2][2cout<<A[0][0]<<""<<A[1][1]<<""<<A[2][2]<<""<<sum<<endl;注意下标不能越界3.二维数组在计算内存中的存储 intA[5]; intB[3][4]; inti,j; for(i=0;i<5;i++) { A[i]=2*i+1; } for(i=0;i<3;i++) { for(j=0;j<4;j++) B[i][j]=(i+1)*(j+1); }5 intA[5]; intB[3][4]; inti,j; for(i=0;i<5;i++) { A[i]=2*i+1; } for(i=0;i<3;i++) { for(j=0;j<4;j++) B[i][j]=(i+1)*(j+1); }64.二维数组初始化<类型><数组名>[<行数>][<列数>]={<表达式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}};75.用一维数组存放矩阵元素intA[20]={4,1,6,2,17,3,11,18,20,14,15,19,5,7,9,8,10,12,16,13,};intB[5][4]={4,1,6,2,17,3,11,18,20,14,15,19,5,7,9,8,10,12,16,13,};A[k]=B[i][j],k=??????84.1.2.多维数组intA[5][4][3]doubleB[3][4][5][6]9想一想数组还有哪些具体应用?104.1.3二维字符数组及字符串的其他表示方法1.二维字符数组存放多个字符串 charweekday1[10]={"Sunday"}; charweekday2[7][10]={"Sunday","Monday","Tuesday","Wednesday","Thirsday","Friday","Satday"};【例4-1】用户输入阿拉伯数字表示的月份,如1,2或3等,请输出对应的英文表示的月份,如January,Febuary,March等。【问题分析】表示多个字符串使用二维字符数组。如果英文单词表示的月份与行标对应,问题就容易了,如January对应第1行。11【问题扩展】①容易编写表示星期几的数字转换为单词的程序。②编写程序,判断用户给定的日期是星期几。用户输入用数字表示的年、月、日,输出星期几的单词,如输入201322输出“Saturday”。122.用string类型的“变量”表示字符串string<对象1>,<对象2>,...;举例stringtext1,text2;//定义两个对象text1="SluicegatesatThreeGorgesDamopenedtodischargewater.";//text2="07-07-201209:04BJT";//:stringtext3("HeavyrainsacrosssouthernChinaarepushingwaterlevelsattheThreeGorgesDambeyondthefloodlevellimit.");13<对象>.<函数名>(<参数列表>);intk;k=text3.find("Heavy");对象操作函数〔方法〕char&at(intn);//返回第n个字符〔从0开始〕,constchar*c_str()const;//返回一个以null终止的char型字符串stringsubstr(intpos=0,intn=npos)const;//返回pos开始的n个字符组成的字符串。intfind(charc,intpos=0)const;//从pos开始查找字符c在当前字符串的位置。intfind(constchar*s,intpos=0)const;//从pos开始查找字符串s在当前串中的位置。14string&replace(intp0,intn0,constchar*s);//删除从p0开始的n0个字符,然后在p0处插入串s。string&insert(intp0,constchar*s);//在p0处插入字符串s。string&erase(intpos=0,intn=npos);//删除pos开始的n个字符,返回修改后的字符串。15【例4-2】使用string进行字符串的操作。设有两个句子:Heavyrainsarepushingwaterlevelsbeyondthelimit.SluicegatesatThreeGorgesDamopenedtodischargewater.开始由两个符号表示,请将它们合并为一段文字,然后查找其中的“Heavy”替换为“Strong”,最后显示处理过的文本。【问题分析】目的:练习使用string类表示字符串,先定义两个string对象,为它们赋值,用“+”号将它们连接起来,使用find函数查找“Heavy”的位置,使用erase函数删除该字符串,再使用insert函数插入“Strong”。16【源程序】使用string字符串的操作//例4-2用string类的对象表示和处理字符串#include<iostream>//包含需要的头文件#include<string>//使用string类需要包含头文件stringusingnamespacestd;//名字空间intmain()//主函数{ //定义并初始化字符串对象text1 stringtext1("Heavyrainsarepushingwaterlevelsbeyondthelimit."); stringtext2,text3;//定义但没有初始化话对象text2,text3 intk;//定义整型变量k17//为对象text2赋值 text2="SluicegatesatThreeGorgesDamopenedtodischargewater."; text3=text1+text2;// k=text3.find("Heavy"); text3.erase(k,sizeof("Heavy")-1); //删除Heavy text3.insert(k,"Strong"); cout<<text3<<endl; return0;}184.2多项特征整体描述表示一般班级的姓名、学号、年龄、分数charname[20];charnumber[20];intage;floatscore;存在的问题???194.2.1结构体类型的定义和使用1.结构体的定义struct<结构体名>{类型名1成员名表1;

类型名2成员名表2;......

类型名n成员名表n;};20

structStudent{charnumber[20];charname[20];intage;floatscore;};StructStudenthuagong[30];Studenthuagong[30];2.结构体变量的声明和初始化struct<结构体名><变量列表>;structStudentzhang,li;struct<结构体名><变量1>={<数据列表>},<变量2>={<数据列表>},...;structStudentcheng={"0101","王鹏",20,98},wang;21结构体变量的其他声明方法①定义结构体时同时声明变量。structDate{intyear,month,day;}today={2013,2,2},tomorrow;②省略结构体名structRectangle{doublelength,width;}rect1={10,20},rect2,rect3;223.结构体变量的使用cheng={"0101","王鹏",20,98}X分量运算符、成员运算符“.”<结构体名>.<成员名>【例4-3】结构体的使用。本例说明结构体的定义、嵌套,结构体变量定义、初始化、输入、赋值和输出等。23#include<iostream>usingnamespacestd;//结构体的定义,一般在main函数之外structDate//结构体Date{intyear,month,day;};//注意最后的分号structStudent//结构体Student{ charnumber[20]; charname[20]; Datebirthday;//结构体的嵌套,成员是另一个结构体变量 floatscore;};//注意最后的分号

24intmain() structStudentcheng={"0101","王鹏",1993,1,1,98},wang,zhang; cin>>wang.number>>; cin>>wang.birthday.year>>wang.birthday.month>>wang.birthday.day>>wang.score;zhang=wang;cout<<wang.number<<"\t"<<<<"\t";// cout<<wang.birthday.year<<"."<<wang.birthday.month<<"."<<wang.birthday.day; cout<<"\t"<<wang.score<<endl;

cheng.birthday.month=2;//

cout<<cheng.number<<"\t"<<<<"\t";// cout<<cheng.birthday.year<<"."<<cheng.birthday.month<<"."<<cheng.birthday.day; cout<<"\t"<<cheng.score<<endl;

return0;}254.结构体变量所占得内存大小一个字符占一个字节,一个整数占4个字节,那么以下结构体:structSHAPE{charname;intx;inty;charclassification;};占几个字节呢?26#include<iostream>usingnamespacestd;structSHAPE1{charname;intx;inty;charclassification;};//为节省篇幅,写在一行,不推荐structSHAPE2{charname;doublex;inty;charclassification;};structSHAPE3{charname;doublex;doubley;charclassification;};intmain(){ cout<<sizeof(SHAPE1)<<""<<sizeof(SHAPE2)<<""<<sizeof(SHAPE3)<<endl; return0;}27使用sizeof(<类型名>)或sizeof(<变量名>)结构体数组1.结构体数组的定义struct<结构体名><结构体数组名>[<数组大小>];例如structStudenthuagong[50];2.结构体数组的使用<结构体数组名>[<整型表达式>]huagong[i].number、huagong[i].name、huagong[i].score注意下标范围二维、三维、更多维283.结构体数组的初始化struct<结构体名><结构体数组名>[<数组大小>]={<结构体类型值列表>};structStudenthuagong[50]={{"1301","zhao",{1994,5,8},98}, {"1302","qian",{1995,6,12},96}, {"1303","sun",{1994,12,2},97} }; structStudenthuagong[]={{"1301","zhao",{1994,5,8},98}, {"1302","qian",{1995,6,12},96}, {"1303","sun",{1994,12,2},97}}; 29【例4-4】成绩统计。使用结构体数组,保存一个班级〔不超过100人〕的三门课程的成绩。每个数组元素记录一个人的学号、姓名及高等数学、英语、程序设计等三门课程的成绩和平均成绩。每个人的信息从键盘输入,输入全0信息表示结束〔以姓名为”0”作为判别依据〕,平均成绩自动计算,对成绩进行从大到小排序后输出。【问题分析】30插入排序的算法①设待排序元素用数组A[i]表示,i=0,1,...,N-1;②对i=1,N-1//控制N-1次插入,每次插入的元素为A[i]③tmp=A[i]//把A[i]保存在临时变量tmp中④对j=i-1,i-2,...,0//与前面i个元素比较假设tmp<A[j],那么//小于前面的元素,A[j+1]=A[j]//前面元素后移否那么//不小于前面的元素转⑤⑤A[j]=tmp//放在当前j指位置⑥结束//N-1次插入后结束31【算法描述】①定义相应的变量、数组,N=0;②输入第N+1个人的信息〔平均成绩不输入〕;③如果姓名是”0”,转⑥;否那么,继续④;④计算平均成绩;⑤N=N+1;⑥排序;⑦通过循环,按数组的顺序输出每个人的信息。⑧结束。32【源程序】#include<iostream>#include<cstring>usingnamespacestd;//结构体的定义structStudent//结构体Student{ charnumber[10];//学号 charname[20]; //姓名 floatscore[3];//三门课程成绩floataverage;//平均成绩};//注意最后的分号334.3取有限值的特征的描述——枚举性别的取值为{男,女}方向的取值为{东,南,西,北}星期的取值是{Sun,Mon,Tes,Wed,Thu,Fri,Sat}表示?限制?运算?341.枚举类型的定义枚举类型的定义格式为:enum<枚举类型名>{枚举常量表};枚举元素enumColor{RED,YELLOW,BLUE,WHITE,BLACK};enumWeek{Sun,Mon,Tes,Wed,Thu,Fri,Sat};enumCoin{PENNY=1,NICKEL=5,DIME=10,QUARTER=25HALF_DOLLAR=50,DOLLAR=100};enumColor{RED,YELLOW,BLUE=1,WHITE,BLACK};enumWeek{Sun=7,Mon=1,Tes,Wed,Thu,Fri,Sat};35注意,枚举常量实际是以标识符形式表示的整型量而不是字符串,或字面常量enumSelection{{'A','B','C','D'};错误

enumbYear={2015,2016,2017,2018,2019,2020};错362.枚举变量的声明enum<枚举类型名><枚举变量列表>;enumCOLORbackground,foreground;Weekbegin,end;enumWeek{Sun=7,Mon=1,Tes,Wed,Thu,Fri,Sat}begin,end;enum{Sun=7,Mon=1,Tes,Wed,Thu,Fri,Sat}begin,end;373.枚举变量的使用①可以将枚举常量或相同类型的枚举变量赋值给枚举变量;②不允许将整数赋给枚举变量,但可以使用强制类型转换后赋给枚举变量;③不用类型的枚举变量之间不能相互赋值;④可将枚举变量、常量赋值给整型变量;⑤枚举变量可以参加数学运算,结果是数值型;⑥枚举变量不能直接输入;⑦枚举变量可以直接输出,但输出的是变量的整数值,而不是枚举常量名;38【例4-5】枚举变量的使用规那么演示394.4综合实例4.4.1矩阵运算【例4-6】矩阵相乘。用户输入AM×N,BN×K两个矩阵的元素,计算它们的乘积并输出。其中M,N,K也由用户输入,它们均不超过20。【问题分析】40问题扩展①这是一个正确的程序,但不是一个好的程序,请同学们讨论这个程序有哪些缺乏?如何处理?②关于矩阵的典型运算还有两个矩阵的和、差,求矩阵的逆矩阵、转置矩阵,矩阵元素的最大值、最小值,各行的最大、最小值,对角线的乘积、和等等,总之是通过下标操作数组的元素。414.4.2字符串处理【例4-7】取子字符串。用户输入一个字符串,然后输入起始位

温馨提示

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

评论

0/150

提交评论