实验十结构体与联合体一实验目的1)掌握结构体变量及结构体数组的定义和赋值方法;2)掌握结构体变量成员和结构体数组元素成员的引用方法;3)掌握指向结构体类型数据的指针作函数参数时函数间传递数据的方法;4)了解联合体的定义与一般使用方法。二程序示例[源程序2-1]设有3个候选人,10份选票;每次输入一个得票的候选人的名字,要求输出各人得票结果。1#include<stdio.h>2int main()3(4structperson//结构体person定义5t6char name[16];7int count;8eader[3]="Li"o,"zhang"o,"Wang"o}9int i,j, k;10char name[16];11for(i=1; i<=10; i++)12113gets(name);//字符串输入14for(j=0;j<3;j++)15(16if(strcmp(name,leader[i].name)==0)//字符比对17leaderlijl.count++;11819120for(k=0; k<3; k++)21printf("%s, %d\n", leader[k].name, leader[k].count);22return 0;
实验十 结构体与联合体 一 实验目的 1) 掌握结构体变量及结构体数组的定义和赋值方法; 2) 掌握结构体变量成员和结构体数组元素成员的引用方法; 3) 掌握指向结构体类型数据的指针作函数参数时函数间传递数据的方法; 4) 了解联合体的定义与一般使用方法。 二 程序示例 [源程序 2-1] 设有 3 个候选人,10 份选票;每次输入一个得票的候选人的名字, 要求输出各人得票结果。 1 #include <stdio.h> 2 int main() 3 { 4 struct person //结构体 person 定义 5 { 6 char name[16]; 7 int count; 8 }leader[3]={"Li",0,"zhang",0,"Wang",0}; 9 int i, j, k; 10 char name[16]; 11 for(i=1; i<=10; i++) 12 { 13 gets(name); //字符串输入 14 for(j=0;j<3;j++) 15 { 16 if(strcmp(name, leader[j].name)==0) //字符比对 17 leader[j].count++; 18 } 19 } 20 for(k=0; k<3; k++) 21 printf("%s, %d\n", leader[k].name, leader[k].count); 22 return 0;
231[程序输入]zhang<回车>zhang<回车>zhang<回车>zhang<回车>Li<回车>Li<回车>Wang<回车>Wang<回车>zhang<回车>Li<回车>[程序输出]Li, 3zhang, 5Wang,2[程序分析]本例程序中定义了一个结构体数组leader,共三个元素,并做了初始化赋值。在程序中使用双重for循环语句,分别对10张投票(使用循环变量i)和三个候选人(使用循环变量i)进行了统计和比较。最后使用for循环(使用循环变量k)依次将每个候选人的得票输出。在实现的过程中,使用了""运算符来操作结构体变量中的成员,操作方式包括运算、读取数据。[源程序2-2]计算一组学生的平均成绩和不及格人数。用结构体指针变量作函数参数编程。1#include<stdio.h>2struct stu34int num;5char *name;6char sex;7float score;
23 } [程序输入] zhang<回车> zhang <回车> zhang<回车> zhang <回车> Li<回车> Li <回车> Wang<回车> Wang<回车> zhang <回车> Li<回车> [程序输出] Li, 3 zhang, 5 Wang, 2 [程序分析] 本例程序中定义了一个结构体数组 leader,共三个元素,并做了初始化赋值。 在程序中使用双重 for 循环语句,分别对 10 张投票(使用循环变量 i)和三个候选 人(使用循环变量 j)进行了统计和比较。最后使用 for 循环(使用循环变量 k)依次将 每个候选人的得票输出。在实现的过程中,使用了"."运算符来操作结构体变量中 的成员,操作方式包括运算、读取数据。 [源程序 2-2] 计算一组学生的平均成绩和不及格人数。用结构体指针变量作函数 参数编程。 1 #include <stdio.h> 2 struct stu 3 { 4 int num; 5 char *name; 6 char sex; 7 float score;
81;9voidave(structstu*ps)//定义平均值函数10 {11int c=0, i;12float ave, s = 0;13for(i = 0; i< 5; i++, ps++)11415s += ps->score;16if(ps->score<60)17C += 1;18119printf("s=%f)n",s);20ave=s/5;21printf("average = %f/ncount = %d)n", ave, c);22123 int main()24 {25struct stu boy[5] ={(101,"Li ping",'M', 45]26[102, "Zhang ping",'M', 62.5],27[103,"He fang","F",92.5],28[104, "Cheng ling", 'F', 88],29[105,"Wang ming","M',58} );30struct stu *ps;31ps = boy;32ave(ps);//调用平均值函数33return O;34 1[程序输出]S=346.000000average = 69.199997count = 2[程序分析]
8 }; 9 void ave(struct stu *ps) //定义平均值函数 10 { 11 int c = 0, i; 12 float ave, s = 0; 13 for(i = 0; i < 5; i++, ps++) 14 { 15 s += ps->score; 16 if(ps->score<60) 17 c += 1; 18 } 19 printf("s=%f\n",s); 20 ave = s / 5; 21 printf("average = %f\ncount = %d\n", ave, c); 22 } 23 int main() 24 { 25 struct stu boy[5] = { {101, "Li ping", 'M', 45}, 26 {102, "Zhang ping", 'M', 62.5}, 27 {103, "He fang", 'F', 92.5}, 28 {104, "Cheng ling", 'F', 88}, 29 {105, "Wang ming", 'M', 58} }; 30 struct stu *ps; 31 ps = boy; 32 ave(ps); //调用平均值函数 33 return 0; 34 } [程序输出] s = 346.000000 average = 69.199997 count = 2 [程序分析]
程序中定义了函数ave,其形参为结构体指针变量ps。main函数定义了结构体数组boy及结构体指针变量ps,并把boy的首地址赋予ps,使ps指向boy数组。main函数调用函数ave时,将实参ps的值传给函数ave的形参ps,使得实参ps与形参ps都指向数组boy的o元素。函数ave通过形参ps间接访问数组boy的元素。在函数ave中完成计算平均成绩和统计不及格人数的工作并输出结果。同时本例展示了如何使用“->”运算符操作结构体变量成员的方法。例如ps->score。[源程序2-2]联合体的使用。1#include<stdio.h>23uniondatat//联合体声明4int n;5char ch;6short m;7;89int main()1011uniondataa;//联合体定义12printf("%d, %d)n", sizeof(a), sizeof(union data) );13a.n=0x40;//对联合体成员n赋值14printf("%x, %c, %hxin", a.n, a.ch, a.m);15a.ch="9;//对联合体成员ch赋值16printf("%x, %c, %hx)n", a.n, a.ch, a.m);17a.m=0x2059;//对联合体成员m赋值18printf("%X, %c, %hx)n",a.n, a.ch, a.m);19a.n=0x3E25AD54;//对联合体成员n赋值20printf("%x, %c, %hx)n", a.n, a.ch, a.m);2122return O;231
程序中定义了函数 ave,其形参为结构体指针变量 ps。main 函数定义了结构 体数组 boy 及结构体指针变量 ps,并把 boy 的首地址赋予 ps,使 ps 指向 boy 数 组。main 函数调用函数 ave 时,将实参 ps 的值传给函数 ave 的形参 ps,使得实 参 ps 与形参 ps 都指向数组 boy 的 0 元素。函数 ave 通过形参 ps 间接访问数组 boy 的元素。在函数 ave 中完成计算平均成绩和统计不及格人数的工作并输出结 果。同时本例展示了如何使用“->”运算符操作结构体变量成员的方法。例如 ps->score。 [源程序 2-2] 联合体的使用。 1 #include <stdio.h> 2 3 union data{ //联合体声明 4 int n; 5 char ch; 6 short m; 7 }; 8 9 int main() 10 { 11 union data a; //联合体定义 12 printf("%d, %d\n", sizeof(a), sizeof(union data) ); 13 a.n = 0x40; //对联合体成员 n 赋值 14 printf("%X, %c, %hX\n", a.n, a.ch, a.m); 15 a.ch = '9'; //对联合体成员 ch 赋值 16 printf("%X, %c, %hX\n", a.n, a.ch, a.m); 17 a.m = 0x2059; //对联合体成员 m 赋值 18 printf("%X, %c, %hX\n", a.n, a.ch, a.m); 19 a.n = 0x3E25AD54; //对联合体成员 n 赋值 20 printf("%X, %c, %hX\n", a.n, a.ch, a.m); 21 22 return 0; 23 }
[程序输出]4, 440, @, 4039, 9, 392059,Y,20593E25AD54,T,AD54[程序分析]本程序示例不仅验证了联合体(共用体)的长度,还说明联合体成员之间会相互影响,修改一个成员的值会影响其他成员。联合体data为例,其各个成员在内存中的分布如下图所示:data3427成员n、ch、m在内存中“对齐”到一头,对ch赋值修改的是前一个字节,对m赋值修改的是前两个字节,对n赋值修改的是全部字节。也就是说,ch、m会影响到n的一部分数据,而n会影响到ch、m的全部数据。值得注意的是,在某一时刻,联合体内有且仅有一个成员的数据为有效值。三、程序编写定义结构体类型,分别编写函数实现复数的加、减运算,在主函数中调用这些函数进行计算并输出计算结果。要求:1.采用动态内存分配;2.最终结果小数点后保留1位
[程序输出] 4, 4 40, @, 40 39, 9, 39 2059, Y, 2059 3E25AD54, T, AD54 [程序分析] 本程序示例不仅验证了联合体(共用体)的长度,还说明联合体成员之间会相 互影响,修改一个成员的值会影响其他成员。联合体 data 为例,其各个成员在 内存中的分布如下图所示: data ch m n 4 3 2 1 成员 n、ch、m 在内存中“对齐”到一头,对 ch 赋值修改的是前一个字 节,对 m 赋值修改的是前两个字节,对 n 赋值修改的是全部字节。也就是说, ch、m 会影响到 n 的一部分数据,而 n 会影响到 ch、m 的全部数据。值得注 意的是,在某一时刻,联合体内有且仅有一个成员的数据为有效值。 三、程序编写 定义结构体类型,分别编写函数实现复数的加、减运算,在主函数中调 用这些函数进行计算并输出计算结果。要求: 1. 采用动态内存分配; 2. 最终结果小数点后保留 1 位