结构类型Lesson9《程序设计基础》2下列定义数组的语句中,正确的是()。A)#defineN10intx[N];C)intx[0..10];有以下程序:#includestdio.hvoidmain(){intb[3][3]={0,1,2,0,1,2,0,1,2},i,j,t=1;for(i=0;i3;i++)for(j=i;j=i;j++)t+=b[i][b[j][i]];printf(%d\n,t);}程序运行后的输出结果是()。A)3B)4C)1D)9B)intN=10;intx[N];D)intx[];回顾《程序设计基础》3回顾以下数组定义中错误的是()。A)intx[2][3]={1,2,3,4,5,6};B)intx[2][3]={0};C)intx[][3]={{1,2,3},{4,5,6}};D)intx[2][3]={{1,2},{3,4},{5,6}};有以下程序:voidmain(){intx[3][2]={0},i;for(i=0;i3;i++)scanf(%d,x[i]);printf(%3d%3d%3d\n,x[0][0],x[0][1],x[1][0]);}若运行时输入:246回车,则输出结果为()。A)204B)200C)240D)246《程序设计基础》4charname[80][10]={Lisi,Wangwu,Rose,Mary};name01234567890Lisi\01Wangwu\02Rose\03Mary\0…79二维数组的存储printf(%s“,name[1]);intmartix[2][3]={9,8,7,6,5,4};martix01209871654《程序设计基础》5姓名学号性别数学外语语文平均升/留级丁一松1201M888594马小宁1202M677668陈明华1203M788990李江1204F989295王小珊1205F184552………………………………胡月明1250M878780学生成绩单每一栏用一种变量表示问题:如何描述“表格型”数据《程序设计基础》6用现有知识,每个数据项单独定义:#defineN80//定义全班人数charname[N][20],sex[N],up[N];//姓名、性别、/升/留级intchinese[N],math[N],eng[N];//三门功课成绩longnumber[N];//学号floatave[N];//平均成绩姓名学号性别数学外语语文平均升/留级丁一松1201M888594马小宁1202M677668陈明华1203M788990李江1204F989295王小珊1205F184552………………………………胡月明1250M878780学生成绩单问题:如何描述“表格型”数据《程序设计基础》7数组元素:name[i],number[i],sex[i],math[i]chinese[i],eng[i],ave[i],up[i]所存储的内容便是第i个学生的有关数据(i在0到N-1之间)问题:如何描述“表格型”数据姓名学号性别数学外语语文平均升/留级丁一松1201M888594马小宁1202M677668陈明华1203M788990李江1204F989295王小珊1205F184552………………………………胡月明1250M878780学生成绩单《程序设计基础》8缺点与程序其他数组、变量混杂在一起,很难区分究竟哪些数据是用来描述同一个学生的基本情况的。改进将描述同一独立事物的,相同或不同类型的相关数据“封装”在一起,组成结构类型(structure)。优点提高程序的易读性;准确的反映数据之间关系。问题:如何描述“表格型”数据《程序设计基础》9主要内容结构类型1typedef的用法2结构的嵌套3结构的位域4应用示例5《程序设计基础》10struct结构类型名{类型成员表(域)}变量名表;结构类型通常用来描述含有多个不同类型数据项的数据结点。1、结构类型定义关键字结构类型定义符列出所有成员,形如:类型成员名;//成员名是标识符《程序设计基础》11structComplex//复数{floatreal;floatimag;};structComplexp1,p2;struct结构类型名{类型成员名;类型成员名;…………….};struct结构类型名变量名表列;structstudent{charname[20];intnum;charsex;floatMath,Eng,Chinese;floatavg;charup;};structstudentstu1,stu2;形式一:先定义结构类型,再定义结构类型变量1.2、结构类型变量的定义《程序设计基础》12struct结构类型名{类型成员名;类型成员名;…………….}变量名表列;形式二:定义结构类型的同时定义结构变量structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}stu1,stu2;1.2、结构类型变量的定义《程序设计基础》13struct{类型成员名;类型成员名;…………….}变量名表列;形式三:直接定义结构类型变量struct{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}stu1,stu2;用无名结构体直接定义变量只能一次1.2、结构类型变量的定义《程序设计基础》14描述学生学习情况的结构类型变量定义structstudent{charname[20],up,sex;intchinese,math,eng;longnumber;floatave;}huang,zhao,class[50];定义结构类型的同时,定义结构变量和结构数组1.2、结构类型变量的定义《程序设计基础》15结构类型变量的成员也可称为域。结构类型的变量不能整体引用,通常按成员引用。引用格式为:结构变量名.成员名huang.number//学生huang的学号class[i].name//第i个学生的姓名成员变量能参与同类型变量所有运算!成员运算符,表示成员的所属关系1.3、结构类型变量的引用《程序设计基础》16例structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}stu1,stu2;stu1.num=1021;stu1.score=85.5;stu2.score+=10;stu2.age++;strcpy(stu1.name,“丁一松”);stu1.sex=‘M’;stu1.age=19;1.3、结构类型变量的引用《程序设计基础》17struct结构类型名{类型成员名;…………….};struct结构类型名结构类型变量={初始数据};例structstudent{intnum;charname[20];charsex;intage;charaddr[30];};structstudentstu1={1021,“WangLin”,‘M’,19,“200BeijingRoad”};1.4、结构类型变量的初始化形式一《程序设计基础》18struct结构类型名{类型成员名;…………….}结构类型变量={初始数据};例structstudent{intnum;charname[20];charsex;intage;charaddr[30];}stu1={1021,“WangLin”,‘M’,19,“200BeijingRoad”};形式二1.4、结构类型变量的初始化《程序设计基础》19例struct{intnum;charname[20];charsex;intage;charaddr[30];}stu1={1021,“WangLin”,‘M’,19,“200BeijingRoad”};struct{类型标识符成员名;…………….}结构类型变量={初始数据};形式三1.4、结构类型变量的初始化《程序设计基础》21(1)初始化时,要按定义时域的次序,依次给出初值;(2)各域的初值用逗号隔开,并且用一对花括号,将全部初值括起来形成一个整体;(3)后段缺少初值的域,其初值被自动定为0或'\0'。1.4结构类型变量的初始化《程序设计基础》22主要内容结构类型1typedef的用法2结构的嵌套3结构的位域4应用示例5《程序设计基础》23功能:用自定义名字为已有数据类型或类型定义式命名类型定义简单形式:typedeftypename;例typedefintINTEGER;类型定义语句关键字已有类型或类型定义式用户定义的类型名例typedeffloatREAL;类型定义后,与已有类型一样使用例INTEGERa,b,c;REALf1,f2;inta,b,c;floatf1,f2;说明:1.typedef没有创造新数据类型2.typedef是定义类型名,不能定义变量2、typedef的用法《程序设计基础》24用typedef定义结构类型名一般方式为:typedefstruct{成员表}结构类型名;typedefstruct{charnumber[12];charname[20];intChinese,math,eng;floatave;charup;}STUDENT;//定义结构类型studentSTUDENThuang,zhao,grp[50];//定义student类型变量和数组2、typedef的用法typedefstruct{intreal,imag;}Complex;//定义结构类型复数Complexa1,b1;//定义复数类型变量《程序设计基础》25主要内容结构类型1typedef的用法2结构的嵌套3结构的位域4应用示例5《程序设计基础》26注意,嵌套可使数据归属渠道清楚,但过多层嵌套会增加域名长度,使程序变得“臃肿”。3、结构的嵌套例structstudent{intnum;charname[20];charsex;struct{floatmath,eng,Chinese;}score;charaddr[30];}stu1;变量stu1的引用英语成绩课表示成:stu1.score.eng《程序设计基础》28主要内容结构类型1typedef的用法2结构的嵌套3结构的位域4应用示例5《程序设计基础》29结构类型中,可指定若干个(甚至全部)位域,位域的定义形式为:类型名位域名:域长;示例:定义存储工作人员信息的结构含有普通域:姓名(name)、年龄(age)、住址(addr结构类型)、应支付的工资(pay)位域(只占一位(bit)):该员是否已退休(state)、工资是否已发放(payoff)普通标识符所占位数(bit),0到8*sizeof(域类型)之间的整常数int、unsigned、char4、结构的位域《程序设计基础》30structworker_info{charname[20];//姓名intage;//年龄structaddraddress;//住址,已定义的结构类型addrfloatpay;//工资unsignedstate:1;//退休否,位域unsignedpayoff:1;//工资已发放否,位域}worker[100];//假定人数为100位域的定义形式为:类型名位域名:域长;4、结构的位域《程序设计基础》31structsample{intf1:4;intf2:2;//前两个域f1和f2存储在一个存储单元int:0;//无域名,表示给下面的域重新分配存储单元intf3:1;//f3存储在新的存储单元int:2;//无域名,表示留出两位不用intf4:1;}特殊用法:(1)缺少位域名,且域长为0;(2)缺少位域名,且域长不为0;4、结构的位域《程序设计基础》32主要内容结构类型1typedef的用法2结构的嵌套3结构的位域4应用示例5《程序设计基础》33例1用结构类型完成复数四则运算程序设计方法定