C++数组 结构体 联合体



《C++数组 结构体 联合体》由会员分享,可在线阅读,更多相关《C++数组 结构体 联合体(56页珍藏版)》请在装配图网上搜索。
1、单击以编辑母版标题样式,,单击以编辑母版文本样式,,第二级,,第三级,,第四级,,第五级,,,*,第四章 数组、结构体及联合体,§4.1 数 组,一. 数组的概念,——构结类型,1.数组——具有相同性质的一组数据的有序集合,,如: 英语成绩: E[1], E[2], .... E[40],,计算机成绩: C[1], C[2], .... C[40],,{ E[i] 〔i=1,2,...,40 表示学号)},,2. 数组元素——数组中的每一项数据。,,如: E[3] 表示第3号学生的英语成绩,,下标,元素越多,数组越大,3. 数组的维数——下标
2、的项数,,E[i] 〔i=1,2,...,40 表示学号) ———一维数组,,score[i][j] (i=1,2,...,40; j=1,2,3)————二 维数组,,如:i—学号;j—学科号(1-英语,2-数学,3-物理〕,,那么:score[3][2]——3号学生的数学成绩,,1. 一维数组的定义,表示元素的个数〔从0开始编号〕,如:定义,,float a[10]; 即:a[0], a[1], a[2], ... , a[9],注意:,类型说明符 数组名[常量表达式],1. 常为整形,或字符型,2. 不能含有
3、变量,main( ),,{ int n;,,scanf(“%d〞,,,float e[n];,,......,解决:根据实际情况,选一个稍大的数。,,main( ),,{float e[60];,,......,类型说明符 数组名[常量表达式 ],二. 一维数组的定义与使用,形式,,2 . 一维数组元素的引用,,1) 不能一次引用整个数组, 只能引用数组元素 。引用多个数组元素时,,,常借助于,循环,。,,2) 数组元素的使用与一般的变量相似。,,3) 数组元素的引用形式:,,,数组名[下标 ],整形常量或整形表达式,例4-1,,将一个数组中的值按逆序重新存放。例如,原来顺序为
4、8,6,5,4,1。要求改为1, 4, 5, 6, 8。,,解: a[0] a[1] a[2] a[3] a[4],,1 4 5 6 8,a[0] a[1] a[2] a[3] a[4] a[5],原那么,,法一:,,#include〞stdio.h〞,,void main( ),,{int a[10],i,j,t;,,printf(“input datd\n〞);,,for (i=0; i<=9; i++),,{printf(“a[%d]=“,i);,,scan
5、f(“%d〞,,,},,for(i=0,j=9; i<=j; i++,j--),,{t=a[i];,,a[i]=a[j];,,a[j]=t;},,for(i=0;i<=9;i++),,printf(“a[%d]=%d “,i,a[i]);,,},法二:借助于另一个数组作缓冲,,#include〞iostream.h〞,,void main( ),,{int a[10],b[10],i,j,t;,,cout<<“input datd\n〞;,,for (i=0; i<=9; i++),,{cout<<“a[“<>a[i];,,},,for(i=0; i<=9;
6、 i++),,b[9-i]=a[i];,,for(i=0; i<=9; i++),,a[i]=b[i];,,for(i=0;i<=9;i++),,cout<<“a[“<
7、..... a[9]=0,,3. 对所有元素赋初值时,可不指定长度,,int a[ ]={1,2,3};,,即:a[0]=1 a[1]=2 a[2]=3 默认只有三个元素,,解# include"iostream.h",,main(),,{ int a[11];,,int i, j, t;,,cout<<"input 10 data:\n";,,for(i=1; i<=10;i++),,{cout<<"a["<>a[i]; },,for(i=1;i<=9;i++),,for(j=i+1;j<=10;j++),,if(a[i]>a[j]),,
8、{t=a[i]; a[i]=a[j];a[j]=t;},,cout<<"the sorted data:\n";,,for(i=1; i<=10;i++),,cout<<"a["<=a[10],,插入数介于a[0]与a[10]之间,#include"iostream.h",,void main(
9、),,{int i,j,x,t;,,int a[11]={1,3,5,7,9,11,13,15,17,19};,,cout<<"input the data:\n";,,cin>>x;,,if(x>=a[9]) a[10]=x;,,if(x<=a[0]),,{for(i=9;i>=0;i--),,a[i+1]=a[i];,,a[0]=x;},,if(x>a[0]&&xx) {t=i; break;},,for(j=9;j>=t; j--),,a[j+1]=a[j];,,a[t]=x;,,},for(i=0;i<=
10、10;i++),,cout<<"a["<
11、 “按行存放〞,a[0][0] a[0][1] a[0][2] a[0][3],,a[1][0] a[1][1] a[1][2] a[1][3],,a[2][0] a[2][1] a[2][2] a[2][3],a[2][3],a[2][2],a[0][0],a[0][2],a[0][1],.....,高,低,3).多维数组的定义,与二维数组的方法相同,如: 三维数组 float b[2][3][4];,a[0][3],a[1][0],a[1][1],a[1][2],a[1][1],a[1][3],第一行,第二
12、行,三. 二维数组的定义与使用,,2. 二维数组的使用——与一维数组相似,数组名[下标][下标],整型表达式,变量,常量,3. 二维数组的初始化,1) . 分组给二维数组赋初值,,int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};,a[0][0] a[0][1] a[0][2] …... a[2][2] a[2][3],只能引用数组元素 。引用多个数组元素时, 常借助于,循环,。,2). 对所有元素赋初值(按数组元素的顺序),,int a[3][4]={1,2,3,4,5,6,7,8,
13、9,10,11,12};,,a[0][0] a[0][1] a[0][2] …... a[2][2] a[2][3],,3). 对局部元素赋初值,,int a[3][4]={{1},{5},{9}};,1 0 0 0,,5 0 0 0,,9 0 0 0,int a[3][4]={{1},{0,6},{0,0,11}};,1 0 0 0,,0 6 0 0,,0 0 11 0,4).
14、对全部元素赋初值时,第一维(行)长度可以省略,,int a[ ][4]={1,2,3,4,5,6,7,8,9,10,11,12};,int a[3][4] ={1,2,3,4,5,6,7,8,9,10,11,12};,即:4个元素一组,int a[ ][4]={{1,2},{},{0,10}};,1 2 0 0,,0 0 0 0,,0 10 0 0,,4. 二维数组程序举例,,注:,常借助于双重循环,,例4-4,1 2 3,,4 5 6,1 4,,2 5,,3 6,a=,b=,#incl
15、ude〞stdio.h〞,,voidmain(),,{int a[2][3]={{1,2,3},{4,5,6}}, b[3][2], i, j;,,printf(“Array a :\n〞);,,for(i=0;i<2;i++),,{for(j=0;j<3;j++),,printf(“% d〞,a[i][j]);,,printf(“\n〞);},,for(i=0;i<2;i++),,for(j=0;j<3;j++),,b[j][i]=a[i][j];,,printf(“Array b :\n〞);,,for(i=0;i<3;i++),,{for(j=0;j<2;j++),,printf(
16、“% d〞,b[i][j]);,,printf(“\n〞);},,},,,,for(i=0;i<2;i++),,{for(j=0;j<3;j++),,printf(“% d〞,a[i][j]);,,b[j][i]=a[i][j];,,},,printf(“\n〞);},也可以,,将3*4矩阵,按行排序(从小到大)存放,2 1 4 3,,10 11 8 7,,6 5 12 9,1 2 3 4,,5 6 7 8,,9 10 11 12,解:,2维,1维,排序,2维,1维,一维序号
17、=行号*列数+,,列号,二维行号= 一维序号/ 列数,,二维列号= 一维序号% 列数,例4-5,,# include"iostream.h",,void main(),,{int a[3][4]={2,1,4,3,10,11,8,7,6,5,12,9};,,int b[12],i,j,t;,,,,for(i=0;i<3;i++),,for(j=0;j<4;j++),,b[i*4+j]=a[i][j];,,,,for(i=0;i<=10;i++),,for(j=i+1;j<=11;j++),,if(b[i]>b[j]),,{t=b[i];,,b[i]=b[j];,,b[j]=t;},,for
18、 (i=0;i<=11;i++),,a[i/4][i%4]=b[i];,,,for(i=0;i<3;i++),,{for(j=0;j<4;j++),,cout<a[j/4][j%4]),,{t= a[i/4][i%4];,,a[i
19、/4][i%4]> a[j/4][j%4],,a[j/4][j%4] =t;},,,for(i=0;i<3;i++),,{for(j=0;j<4;j++),,cout<
20、j;,,for(i=0;i<=9;i++),,{a[i][0]=1;,,a[i][i]=1;},,for(i=2;i<=9;i++),,for(j=1;j<=(i-1);j++),,a[i][j]=a[i-1][j-1]+a[i-1][j];,,for(i=0;i<=9;i++),,{for(j=0;j<=i;j++),,cout< 21、‘ ‘ ; a[3]=‘i’; a[4]=‘s’ a[5]=‘ ‘; a[6]=‘a’;,,a[7]=‘ ’ ; a[8]=‘b’; a[9]=‘o ‘ ; a[10]=‘o’; a[11]=‘k’;,I,t,,i,s,,a,,b,o,o,k,a[0] a[1] a[2] ...... a[10] a[11],注:∵字符型与整型通用,∴ char a[10]; int a[10];,等价,char 数组名[常量表达式] 22、;,char 数组名[常量表达式] [常量表达式];,四. 字 符 数 组,,2. 字符数组的初始化,与数值型数组相似,一维:,二维,char a[12]={‘I’, ‘t’, ‘ ’, ‘i’, ‘s’, ‘ ’, ‘a’ , ‘b’, ‘o’, ‘o’, ‘o’, ‘k’ },char a[3][3]={{‘ ’, ‘ ’, ‘,*,’, ‘ ’, ‘,*,’, ‘,*,’, ‘,*,’ , ‘,*,’, ‘,*,’},char a[][3]={{‘ ’, ‘ ’, ‘,*,’, ‘ ’, ‘,*,’, ‘,*,’, ‘,*,’ , ‘,*,’, ‘,*,’},等价 23、,3. 字符数组的引用,,——与数值型数组相似,只能引用元素〔单个字符〕,不能引用整个数组,借助于循环,例7.7,,输出一个钻石图形,# include “iosteam.h〞,,void main(),,{,,char diamond[][5]={{‘ ’,‘ ’,‘*’},{‘ ’,‘*’,‘ ’,‘*’},{‘*’,‘ ’,‘ ’,‘ ’,‘*’}, {‘ ’,‘*’,‘ ’,‘*’},,,{‘ ’,‘ ’,‘*’} };,,int i,j;,,for(i=0;i<5;i++),,{ for(j=0;j<5;j++),,cout< 24、,,},,},,,,,,*,*,*,,,,,*,*,,*,,*,*,,注意其作用,例4-7,,4. 字符串和字符数串结束标志,字符串,多个字符,用,字符数组,表示字符串,字符串的持点: 最后一个字符为,‘\0’,字符串结束标志,char a[13]={‘I’, ‘t’, ‘ ’, ‘i’, ‘s’, ‘ ’, ‘a’ , ‘ ’, ‘b’, ‘o’, ‘o’, ‘k’,,’\0’,};,char a[13]={“it is a book〞};,char a[13]= “it is a book〞;,char a[]={“it is a book〞} 25、;,char a[]= “it is a book〞;,等价,最后一个元素自动加,‘\0’,小结: 1 . 用字符数组表示字符串。如定义时指定长度, 那么数组长度>字符串长度;,,2. 数组中放的是字符还是字符串, 关键看最后一个元素,为‘\0’ 那么为字符串,,不为‘\0’ 那么只能是假设干个字符,字符数组,多个元素(字符),最后一个元素 赋为,‘\0’,,5. 字符数组的输入输出,两种方法,1.,对字符数组中的每一个元素,逐一输入、输出。采用循环实现,。,2.,以字符串的形式,对整个字符数组输入、输出,。,1). 逐个输入、输出单个字符——与引用数组元素相同,, 26、例:输入一段文字,转换成大写输出。,#include“stdio.h〞,,void main(),,{char ch[200];,,int i,j;,,for(i=0;(ch[i]=getchar())!=‘\n’;i++),,if (ch[i]>=‘a’&&ch[i]<=‘z’),,ch[i]=ch[i]-32;,,for(j=0;j<=i-1;j++),,putchar(ch[j]);,,putchar(‘\n’);,,},,2). 对整个字符串输入、输出——采用 cin cout,,scanf(“%s〞,....)、print 27、f(“%s〞,...),,,(1),输出,:,结果,:It is a book,例2 char a[]={’c’, ’h’,’i’, ’\0’, ’n’, ’a’, ’\0’, ’\0’};,,printf(“%s〞, a);,或: char a[13]={‘I’, ‘t’, ‘ ’, ‘i’, ‘s’, ‘ ’, ‘a’ , ‘ ’, ‘b’, ‘o’, ‘o’, ‘k’, ’\0’ };,,printf(“%s〞, a);,例1: char a[]={“It is a book〞};,,printf(“%s〞, a);,注意:用数组名, 28、结果,:chi,输出至第一个‘\0’结束,用printf(“%s〞,数组名),注意:用数组名,注意:用数组名,用cout<<,数组名,char a[]={“It is a book〞};,,cout<>a;),,输入:china,输入不能超过5个字符,a[0] a[1] a[2] a[3] a[4] a[5],‘c’,‘h’,‘a’,‘i’,‘n,‘\0 29、’,自动加‘\0’,例: char a[20];,,scanf(“%s〞,a);(或:cin>>a;),,输入:How are you?,‘H’,‘o’,‘w’,‘\0’,,,a[0] a[1] a[2] a[3] ...... a[19],遇“空格〞认为输入结束,自动加‘\0’,%s,格式默认两种情况表示输入完成: 1)回车, 2)空格,cin>>,数组名,或,,6. 字符串处理函数,1). 字符串输出函数 puts( ),,puts(字符串/字符数组名〕,2). 字符串输入函数 gets( ),,gets(字符数组名〕,, 30、注: 以回车键作为输入结束,故字符串中可含有空格,程序开头用“文件包含〞命令:,,#include“stdio.h〞,3). 字符串连接函数 strcat( ),,strcat(字符数组1,字符串或字符数组2〕,4). 字符串拷贝函数,,strcpy( ),,strcpy(,字符数组名1,字符串或字符数组名2),后者内容替代前者内容。常用于字符串赋值,前者+后前 放入前者中,程序开头用“文件包含〞命令:,,#include“string.h〞,,5). 字符串比较函数 strcmp( ),,strcmp(字符串1或字符数组名1,字符串 31、2或字符数组名2 〕,,规那么:1〕从左至右,逐个字符比较,直到出现不同字符或‘\0’为止,,2〕结果: 第一个不相同字符的ASCⅡ 码之差,串1=串2 结果=0,,串1>串2 结果>0,,串1<串2 结果<0,如: strcmp(“china〞,“chain〞),∵ ‘i’>’a’,,∴,结果为:105-97=8,6). 测字符串长度函数 strlen( ),,strlen(字符串或字符数组名〕,,求字符串的长度〔不包括‘\0’),7). strlwr(字符串),,将字符串中的大写字母变成小定字母,8). strupr(字符串,),, 32、将字符串中的小写字母变成大定字母,程序开头用“文件包含〞命令:,,#include“string.h〞,,7. 字符数组应用举例,编写一个程序, 将两个字符串连接起来,不用strcat函数。,A,B,\0,D,C,,,E,F,\0,H,G,,,,,,#include〞iostream.h〞,,# include 〞stdio.h〞,,void main(),,{int i,k;,,char s1[20],s2[10];,,cout<<“input string s1: \n〞;,,gets(s1);,,cout<<“input string s1: \n〞;,,gets(s2);,,f 33、or (i=0; s1[i]!=‘\0’;i++) ;,,k=i;,,for (i=0; s2[i]!=‘\0’;i++),,s1[k+i]=s2[i];,,s1[k+i]=‘\0’;,,puts(s1);,,},s1,s2,为什么这样做?,解:,例4-8,,例4-9 对一组姓名〔设为6个〕按字母大小排序〔A Z或a z〕,解:,一个姓名由多个字符组成,故用字符数组表示,,多个姓名由二维字符数组表示,# incude〞iostream.h〞,,#include“string.h〞,,main(),,{char n[6][30]={{“Li〞},{“Zhang〞} 34、,{“Zheng〞},{“Huang〞},{“Jiang〞},{“Zhao〞}};,,char t[30];,,int i,j;,,for (i=0;i<=4;i++),,for(j=i+1;j<=5;j++),,if(strcmp(n[i],n[j])>0),,{strcpy(t,n[i]);,,strcpy(n[i],n[j]);,,strcpy(n[j],t);},,for(i=0;i<=5;i++),,{ cout< 35、.,H,u,a,n,,g,\0,,......,J,i,a,n,,g,\0,,......,Z,h,a,o,,\0,,,......,n[6][30],n[0],n[2],n[3],n[4],n[5],n[1],引用一行,即引用一个姓名,使用“行名〞,,第8章第7节,1. 数组元素作为参数的参数,——与变量作为函数的参数相似,被调用函数中: 形参——用变量,,主调函数中: 实参——用数组元素,例4-10 比较两个数组中对应元的大小,#include〞iostream.h〞,,int large(int x, int y),,{int flag;,,if(x>y) flag=1;,, 36、else if (x 37、e if(large(a[i],b[i])==0 m++;,,else k++;},,,cout<<“ l,m,k=“< 38、组作函数参数,,2.,,数组名作为参数的参数,第8章第7节,被调用函数中: 形参 —— 数组名,,主调函数中: 实参 —— 数组名,传值内容:,传整个数组。即将数组中的所有元素,从主调函数传给被调用函数。,例4-11,**求一个数组前n,个元素的平均值。,#include〞iostream.h〞,,float average( float a[], int m),,{int i;,,float aver,sum=0.0;,,for(i=0;i<=m-1;i++),,sum=sum+a[i];,,aver=sum/m;,,return(av 39、er);,,},void main(),,{float average(float a[],int m);,,float score[10],ave;,,int i,n;,,cout<<“input array a\n〞;,,for(i=0;i<=9;i++),,{cout<<“score[“<>score[i];},,cout<<“\ninput n=〞;,,cin>>n;,,ave=average(score,n);,,cout<<“ave=“< 40、, 类型一致;,,2).元素个数, 可以相同或不一致,,要求: 实参数组元素个数≥形参数组元素个数,,3). 形参数组可以不指定元素个数, 以增加通用性;,,4).传数值的方式———,传递地址。,传递地址,∵数组名是数组的首地址〔第一个元素在内存所占单元的编号〕,,∴用数组名作函数参数,相当于:,实参数组首地址,形参数组首地址,故:,传,实参数组各个元素,形参数组各个元素,1000,1001,1002,1003,1004,1005,1006,1007,.......,score[0],score[1],score[2],score[9],a[0],a[1],a[2],a[9],低地址, 41、高地址,内存单元地址,首地址,共占相同的内存单元,结论:,形参数组元素值的改变 实参数组元素值,,影响,,第8章第7节,例4-12,写一个函数,使输入一个字符串反序存放,在主函数中输入输出字符串。,# include “stdio.h〞,,# include “string.h〞,,void f(char a[]),,{int i,j,k;,,char b;,,i=j=0;,,while(a[i]!=‘\0’),,i++;,,k=i-1;,,for(i=0, j=k; i 42、d main(),,{void f(char a[]);,,char b[30];,,printf(“input a srting :\n〞);,,gets(b);,,f(b);,,printf(“resulte is:\n〞);,,puts(b);,,},为什么??,,3.,,多维数组作参数的参数,1). 多维数组的元素作函参数,被调用函数中: 形参——用变量,,主调函数中: 实参——用数组元素,2). 数组名作函参数,被调用函数中: 形参 —— 数组名,,主调函数中: 实参 —— 数组名,与一维数组相似,注:(1). 被调用 43、函数中,定义函数时,形参数组的第一维大小可省略;,,int max_value (int array[ ][4]),省略,(2). 实参数组元素个数≥形参数组元素个数,,例4-13 写一个函数,使给定的一个二维数组〔3×3〕转置,即行列互换。,# include "iostream.h",,# include"iomanip.h",,void f(int a[3][3]),,{int i,j,b;,,for (i=0;i<=2;i++),,for(j=0;,j
44、!!,viod main(),,{int c[][3]={{1,2,3},{4,5,6},{7,8,9}};,,int i,j;,,cout<<"source array is:\n";,,for(i=0;i<=2;i++),,{ for(j=0;j<=2;j++),,cout< 45、字符型,,枚举型,根本数据类型,只能定义单一的数据种类,在实际应用中,希望将这些根本类型根据某种需要, 组成一个整体, 从而得到一种新的数据类型。 结构体类型,采用,结构体(类型)——由根本数据类型,组合而成的一种数据类型。,如:要表示学生的情况,学号 num 10010 (int),,姓名 name Liming (char),,性别 sex M (char),,年龄 age 18 46、 (int),,分数 score 90.0 (float),10010,Liming,F,18,90.0,结构体类型的定义,struct,结构体名,,{ 类型符 成员名1;,,类型符 成员名2;,,......,,类型符 成员名n;},形式,注:,,1)结构体、成员的命名规格与变量相同;,,2) “成员〞又名“分量〞或“域〞,§4.2 结 构 (体),一.概 述,,例,:,,struct,student,,,{ int,num,;,,char,name[30],;,,char,sex,;,,int,age,;,, 47、float,score,;};,结构体名(,是类型名,而非变量名,),成员名,三种方法,1). 先定义结构体类型, 再定义变量,struct student,,{ int num;,,char name[30};,,char sex;,,int age;,,float score;},;,,,student stu1, stu2;,,,分号不能少,定义结构体类型,变量名,类型名,二.,,结构体类型变量的定义,,2. 同时定义,struct,student,,{ int num;,,char name[30};,,char sex;,,int age;,,float s 48、core;},stu1, stu2;,变量名,类型名,无分号,3. 直接定义,struct,,{ int num;,,char name[30};,,char sex;,,int age;,,float score;},stu1, stu2;,无类型名,变量名,说明:,1). 注意,结构体类型,与,结构体变量,的不同含义;,student,stu1,stu2,;,,int,a, b,;,比较,2). 结构体的成员可以是另一个结构体类型;,,即: 结构体中又包含结构体,3). 成员名与程序中其他变量同名时, 互不干抚。,下一页,,age,exame,English, 49、Math,sex,name,num,如:,struct,score,,{float english;,,float math;};,,struct student,,{int num;,,char name[30];,,char sex;,,int age;,,,score,exame;,,} stu1,stu2;,,struct student,,{int num;,,char name[30];,,char sex;,,int age;,,float,exame[2],;,,} stu1,stu2;,或:,定义类型,使用已定义的结构体,,1. 引用原那么,— 50、—只能引用成员,不能引用整个结构体变量,方法,:,结构体变量名. 成员名,成员运算符。优先级最高,左结合,例如:,stu1. num ——,引用结构体变量stu1中的成员num,2. 使用,——结构体变量中成员的使用与一般的变量〔或数组〕相同。,stu2. score=stu1.score; strcpy (stu2.name, stu1.name);,,sum=stu1.score+stu2.score;,三.,,结构体类型变量的引用,特例,: 具有相同结构的两个结构体变量可整体赋值,stu2=stu1;,stu2.num 51、 ←stu1.num,,stu2.name ←stu1.name,,......,,stu2.score ←stu1.score,相当于,,3. 成员又是结构体类型,——只能引用最低级别的成员,例:,,ave= (,stu1,.,exame,.,english,+,stu2,.,exame,.,english,)/2.0;,struct,score,,{float english;,,float math;};,,struct student,,{int num;,,char name[30];,,char sex;,,int age;,,score,exame;,,} st 52、u1,stu2;,,在定义结构体变量时赋初值,struct student,,{ int num;,,char name[30};,,char sex;,,int age;,,float score;};,,student stu1={1001,“Liming〞,’M’,18, 90.0},例1,例2,struct student,,{ int num;,,char name[30};,,char sex;,,int age;,,float score;} stu1={1001,“Liming〞,’M’,18, 90.0};,例3,struct,,{ int num 53、;,,char name[30};,,char sex;,,int age;,,float score;} stu1={1001,“Liming〞,’M’,18, 90.0};,注意:,,初始值的顺序、类型与成员要一致,分开定义时赋初值,同时定义时赋初值,直接定义时赋初值,四.,,结构体类型变量的初始化,,—数组中的每一个元素都属于同一种类型的结构体,1. 结构体数组的定义,第1种方法,struct student,,{ int num;,,char name[30};,,char sex;,,int age;,,float score;},;,,student,stu[1 54、0],;,,,struct student,,{ int num;,,char name[30};,,char sex;,,int age;,,float score;},stu[10];,,struct,,{ int num;,,char name[30};,,char sex;,,int age;,,float score;},stu[10];,,第2种方法,第3种方法,2. 结构体数组的初始化,——,定义结构体数组时,给各元素的成员赋初值,struct student,,{ int num;,,char name[30};,,char sex;,,int 55、age;,,float score;};,,student stu[10]={{1001,“Liming〞,’M’,18, 90.0},,,{1002,“wangfan〞,’F’,18,87.5};,,......,,};,,,多种方法,五.,,结构体类型数组,,struct student,,{ int num;,,char name[30};,,char sex;,,int age;,,float score;} stu[10]={{1001,“Liming〞,’M’,18, 90.0};,,{1002,“wangfan〞,’F’,18,87.5};,,......,,}; 56、,3,.,结构体数组的使用,1)符合数组引用方法: 只能引用元素,,2)符合结构体变量的引用原那么: 只能引用成员,,例4-14 10个学生, 每个学生包括学号、姓名、3门课的分数,,,求:1〕全班每门课的学科平均分;,,2〕找出成绩最好〔平均成绩〕的学生,输出姓名、学号、各科分,,数和平均分,英语,C程序,数学,90,70,82,82,64,75,70,78,85,......,......,......,ave[0],ave[1],ave[2],stu[0],stu[1],stu[2],......,(90+ 57、70+82)/3.0=80.7,(82+64+75)/3.0=73.7,(70+78+85)/3.0=77.7,......,学生平均分,科目平均分,,# include〞iostream.h〞,,void main(),,{srtuct student,,{int num;,,char name[30];,,float score[3];,,};,,student stu[10];,,float ave[3], aves,,int i,j,k;,,for (i=0;i<10;i++),,{cout<<“input data of No. “<< i< 58、tu[i].num<< stu[i].name< 59、].score[1]+stu[0].score[2])/3.0;,,k=0;,,for (i=0; i<10;i++),,if ((stu[i].score[0]+stu[i].score[1]+stu[i].score[2])/3.0>aves),,{aves=(stu[i].score[0]+stu[i].score[1]+stu[i].score[2])/3.0;,,k=i;},,,cout<<“average=〞<< ave[0]<<‘\,’<< ave[1]<<‘\,’<< ave[2];,,cout<<“the data of student with maxium average 60、 score “< 61、iostream.h〞,,# include “stdio.h〞,,struct student,,{int no;,,char na[30];,,float s[3];};,,void main(),,{void print(student stu[], int n);,,student stu[5];,,int i, j;,,for(i=0; i<=4; i++),,{cout<<“input data of No. %d 〞<>stu[i].no >> stu[i].na >> ,,},,print (stu, 5);,,},,,,void print ( 62、student stu[], int n),,{int i, j;,,for(i=0; i<=n-1; i++),,{cout<<“input data of No. %d 〞<
63、在起始位置(首地址)相同的一段存贮单元, 即多种数据共用一段内存。(但同一时刻,只能放一种类型的数据 ),2. 共用体类型及共用体变量的的定义,2).,同时定义,union,共用体名,,{成员表列,,},变量表列;,union,data,,{int i;,,char ch;,,float f;,,},a,b,c,;,3). 直接定义,union,,{int i;,,char ch;,,float f;,,},a,b,c,;,union,,,{成员表列,,},变量表列;,1).,分开定义,(先定义类型,后定义变量),union,共用体名,,{成员表列,,};,,共用体名 变量表列;,un 64、ion,data,,{int i;,,char ch;,,float f;,,};,,data,a,b,c,;,,,3. 共用体类型与结构体类型的区别,结构体,—— 多种类型数据的组合,成员同时存在;,,一个结构体变量占内存:成员字节总和。,,共用体,—— 成员不同时存在,某一时刻只有一个成员占用内存。,,一个共用体变量占内存:成员中最长字节,union,data,,{int i;,,char ch;,,float f;,,} a,b,c;,struct,data,,{int i;,,char ch;,,float f;,,} x,y,z;,占字节数:2+1+4=7字节,占字节数:max 65、{2,1,4}=4字节,二. 共用体变量的引用,只能引用成员,不能引用共用体变量,cout<<,a.i,;,,cout<<,a,三. 共用体类型数据的特点,1. 某一时刻只能放一种数据;并且是最近一次放入的数据。,,2. 共用体变量和各成员的地址相同;,,3. 共用体变量不能初始化,union,,{ int i;,,char ch;,,float f;},a={1,’a’,1.5},4. 共用体变量不能用作 函数参数〔新标准可以〕,5. 可以定义共用体数组,union,,{ int i;,,char ch;,,float f;},a[10];,6. 共用体、结构体可以嵌套, 66、共用体中包含结构体;,,结构体中包含共用体。,四. 共用体的应用,1. 同一个数据区间,根据不同的情况,存放不同类型的数据。,例,4-16,,教师数据: 身份证号,姓名,性别,职业,工资,,学生数据: 身份证号,姓名,性别,职业,班级,,类型不同,整型数,字符串,,# include〞iostream.h",,struct p,,{char c[20];,,char na[30];,,char sex;,,char job;,,union{ int w;,,char cla[20];} ca;,,};,,,void main(),,{ struct p m[2];,,int i; float f;,,cout<<"input data: ";,,for(i=0; i<2; i++),,{cin>>m[i].c>>m[i].na>>,,if(m[i].job=='t'|| m[i].job=='T'),,cin>>m[i].ca.w;,,else cin>>m[i].ca.cla;,,},,for(i=0; i<2; i++),,{cout<
- 温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。