8 结构体&共用体
8 结构体&共用体
11侧:输出下表 学号姓名性别数学英语计算机|c语言通信网平均分 101张三 80 98 86 90 88.8 102李四M8289 94 81 91 87.4 103 王五F927886 79 89 84.8 104何六M89 81 78 63 76 774 105周七F98 69 91 85 67 82 106 用什么 ·缺点 按行处理如何定义数据 类型呢? ?stu30]; 2
2 例1:输出下表 学号 姓名 性别 数学 英 语 计算机 C语言 通信网 平均分 101 张三 M 80 90 98 86 90 88.8 102 李四 M 82 89 94 81 91 87.4 103 王五 F 92 78 86 79 89 84.8 104 何六 M 89 81 78 63 76 77.4 105 周七 F 98 69 91 85 67 82 106 … … •用什么样的数据类 型存储?•缺点? •分配内存不集中,寻址效率不高 •对数组进行赋初值时,容易发生 错位 •结构显得比较零散,不容易管理 按行处理如何定义数据 类型呢? ? stu [30];
结构体类型 C语言没有为我们提供相应的数据类型, 但我们可以根据需要自己定义数据~结构类型 根据题意,我们定义如下的结构体的成员 struct !注意: struct student 是一个数据类型
3 结构体类型 ▪ C语言没有为我们提供相应的数据类型, 但我们可以根据需要自己定义数据类型。 ▪ 根据题意,我们定义如下的结构体类型: struct student {int num; char name[20]; char sex; float score[5]; float aver; }; •结构类型 的成员 !!!注意: struct student 是一个数据类型
结构体变量的定义 struct student stu[30] 含义:定义一个一维数组,有30个元素,其 数据类型为 struct student 为了方便后边的使用,我们可以用 typedef 为这个数据类型起个别名, typedef struct student STU STU和其它类型一样使用。 ???下列语句什么含义? STU a; STU stul[30]:
4 结构体变量的定义 ▪ struct student stu[30]; ▪ 含义:定义一个一维数组,有30个元素,其 数据类型为struct student ▪ 为了方便后边的使用,我们可以用typedef 为这个数据类型起个别名, ▪ typedef struct student STU; ▪ STU 和其它类型一样使用。 ◼ ???下列语句什么含义? STU a;STU stu1[30];
内存分配 n共30个数组元素,每个数组元素分配多 少字节? sh可用 sizeof(struct student)求得 stuo1o1张三M8090 98 86 90 88.8 stu1][102李四M828994 81 91 87.4 stu2]103王五F9278:6 79 89 84.8 su3]104何六M89 81 78 63 76 77 stu4105周七F|m1 85 67 82 106 那每个学生的学 号、姓名、∴又 如何表示呢?
5 内存分配 ▪ 共30个数组元素,每个数组元素分配多 少字节? ▪ 可用sizeof(struct student )求得. 101 张三 M 80 90 98 86 90 88.8 102 李四 M 82 89 94 81 91 87.4 103 王五 F 92 78 86 79 89 84.8 104 何六 M 89 81 78 63 76 77.4 105 周七 F 98 69 91 85 67 82 106 … … stu stu[0] stu[1] stu[2] stu[3] stu[4] …… •那每个学生的学 号、姓名、…又 如何表示呢?
引用结构体变量的成员 n结构体变」 注意区分: 结构体类型; 使用外 结构体变量; 中每 个成员结构体变量的成员 例 stu[i]. nul stu[]. name 翁都是变量,与它同类型变量同样使用
6 引用结构体变量的成员 ▪ 结构体变量的成员(member),也称元素 (element)或域(filed)。 ▪ 使用引用运算符 . 对结构类型变量stu[i]中每 个成员进行引用 ▪ 例: ▪ stu[i].num stu[i].name ▪ 它们都是变量,与其它同类型变量同样使用。 注意区分: •结构体类型; •结构体变量; •结构体变量的成员
例1的实现 算法 定义结构体类型 定义结构体变量 输入表6-4 输出表6-4
7 例1的实现 ▪ 算法 ▪ 定义结构体类型 ▪ 定义结构体变量 ▪ 输入表6-4 ▪ 输出表6-4
例1(1) #include struct student [int num:/学号 char name[20]:姓名* char sex;/性别:m-男,f-女刘 float score[5]:成绩* float aver;/平均分* :/*定义结构体类型 struct studen↑,一般都定义为全局可用 的数据类型*/ pede struct student STU/为数据类型起别名*/ void maino t int i,j: float sum STU stul3o];供定义结构体变量*
8 例1 (1) #include struct student {int num; /* 学号 */ char name[20]; /* 姓名 */ char sex; /* 性别:m-男,f-女 */ float score[5]; /* 成绩 */ float aver; /* 平均分 */ }; /* 定义结构体类型 struct student ,一般都定义为全局可用 的数据类型*/ typedef struct student STU;/*为数据类型起别名*/ void main() { int i,j; float sum; STU stu[30];/* 定义结构体变量 */
例1(2) for(i=0;i<30:i++)/输入每个学生的信息*/ [printf please input the number n: ) scan If %od, &stu[]. num): getchar printf please input the name \n scanf(%5", stu[i] name): getchar printf f or m(female or mail)?\n:): scanf( %c", &stu[i]. sex) printf( please input 5 scores: \n forj=0<5:j+)输入5门课的成绩* scanf(%f",&stu[i]. scoreLjD) sum=0:/下边计算5门课的平均分,并存放在相应成员变量中 for(=0j<5小*+ sum+=stu[]. score[]: stu[i]. aver=sum/5; printf("num\tname\t\t sex c1 c2 c3 c4 c5 aver \n") for(i=O<30:++)/*输出学生基本信息 pntf(‰ts%%3.0%0%3.0%3.0%3.0%4.1fn stu[i]. num, stu[i] name, stu[i]. sex, stu[i]. score[1, stu[i]. score[21 stu[i]. score[3], stu[i]. score[4], stu[i]. score[5], stu[i]. average)
9 例1 (2) for(i=0;i<30;i++) /* 输入每个学生的信息 */ {printf(“please input the number\n:”); scanf(“%d”,&stu[i].num);getchar(); printf(“please input the name\n:”); scanf(“%s”, stu[i].name);getchar(); printf(“f or m(female or mail)?\n:”); scanf(“%c”,&stu[i].sex); printf(“please input 5 scores:\n:”); for(j=0;j<5;j++) /*输入5门课的成绩*/ scanf(“%f”,&stu[i].score[j]); sum=0; /*下边计算5门课的平均分,并存放在相应成员变量中*/ for(j=0;j<5;j++) sum+=stu[i].score[j]; stu[i].aver=sum/5; } printf("num\tname\t\t sex c1 c2 c3 c4 c5 aver\n"); for(i=0;i<30;i++) /* 输出学生基本信息 */ {printf("%d\t%s\t %c %3.0f %3.0f %3.0f %3.0f %3.0f %4.1f\n", stu[i].num, stu[i].name, stu[i].sex, stu[i].score[1], stu[i].score[2], stu[i].score[3], stu[i].score[4], stu[i].score[5], stu[i].average); }
输入写成函数 void工npu( sTU al, int n) int i, J float sum for(i=O<n;i+-)/输入每个学生的信息* (printfcplease input the number \n: ) scan &stu[i]. num): getchar printf please input the name \n: ScO tut] name) 2: getchar printfCf or m(female or mail)?\n:"): scar nfsc, &stu[i]. sex) lease input 5 scores: \ or(=05:)/输入5门课的成绩* sum0:下边计算5课的平均芬,并存放在相应成员变量中 for(j=o: j<NUMOFCOURSE j++) sum+=stu[i]. score stu[i]. aver=sum/ NUMOFCOURSE: 10
10 输入写成函数 void Input( STU a[],int n) { int i,j; float sum; for(i=0;i<n;i++) /* 输入每个学生的信息 */ {printf(“please input the number\n:”); scanf(“%d”,&stu[i].num);getchar(); printf(“please input the name\n:”); scanf(“%s”, stu[i].name);getchar(); printf(“f or m(female or mail)?\n:”); scanf(“%c”,&stu[i].sex); printf(“please input 5 scores:\n:”); for(j=0;j<5;j++) /*输入5门课的成绩*/ scanf(“%f”,&stu[i].score[j]); sum=0; /*下边计算5门课的平均分,并存放在相应成员变量中 */ for(j=0;j<NUMOFCOURSE;j++) sum+=stu[i].score[j]; stu[i].aver=sum/ NUMOFCOURSE; } }