版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2025年C语言结构体与联合体操作练习题及答案一、结构体基础操作1.定义一个结构体`Employee`,包含以下成员:整数类型工号`id`(4字节)、字符数组姓名`name`(长度20)、双精度浮点类型月薪`salary`(8字节)、布尔类型是否转正`is_regular`(1字节)。要求:(1)写出结构体定义;(2)声明一个`Employee`类型变量`emp1`,使用指定成员初始化法赋值(工号1001,姓名"LiMing",月薪12500.5,已转正);(3)通过成员访问运算符修改`emp1`的月薪为13000.0,并输出所有成员值。答案:(1)结构体定义:```cstructEmployee{intid;charname[20];doublesalary;_Boolis_regular;//或使用int代替,需包含stdbool.h头文件};```(2)变量声明与初始化:```cstructEmployeeemp1={.id=1001,.name="LiMing",.salary=12500.5,.is_regular=1};```(3)修改与输出:```cemp1.salary=13000.0;printf("工号:%d\n姓名:%s\n月薪:%.1f\n是否转正:%s\n",emp1.id,,emp1.salary,emp1.is_regular?"是":"否");```二、嵌套结构体操作2.设计一个表示“会议”的结构体`Meeting`,包含以下嵌套结构:基础信息:结构体`BasicInfo`,包含字符串主题`topic`(长度50)、整数参与人数`attendee_num`;时间信息:结构体`TimeInfo`,包含短整型年份`year`、无符号字符型月份`month`、无符号字符型日期`day`、无符号字符型小时`hour`(0-23);要求:(1)定义`BasicInfo`、`TimeInfo`和`Meeting`结构体;(2)创建`Meeting`变量`m1`,主题为"Q3项目进度评审",参与人数15,时间为2025年9月15日14时;(3)编写函数`print_meeting`,输入`Meeting`类型指针,输出会议的完整信息(格式示例:"会议主题:Q3项目进度评审|参与人数:15|时间:2025-09-1514:00")。答案:(1)结构体定义:```cstructBasicInfo{chartopic[50];intattendee_num;};structTimeInfo{shortyear;unsignedcharmonth;unsignedcharday;unsignedcharhour;};structMeeting{structBasicInfobasic;structTimeInfotime;};```(2)变量创建:```cstructMeetingm1={.basic={.topic="Q3项目进度评审",.attendee_num=15},.time={.year=2025,.month=9,.day=15,.hour=14}};```(3)输出函数:```cvoidprint_meeting(conststructMeetingm){printf("会议主题:%s|参与人数:%d|时间:%d-%02hhu-%02hhu%02hhu:00\n",m->basic.topic,m->basic.attendee_num,m->time.year,m->time.month,m->time.day,m->time.hour);}```三、结构体数组与统计3.定义结构体`Product`,包含:字符串名称`name`(长度30)、无符号整型库存`stock`、浮点型单价`price`。要求:(1)声明长度为3的`Product`数组`products`,手动初始化数据如下:名称"笔记本",库存50,单价4999.9;名称"鼠标",库存120,单价99.5;名称"键盘",库存80,单价199.0;(2)遍历数组,计算所有商品的总库存和总价值(总价值=Σ(库存×单价));(3)查找单价最高的商品,输出其名称和单价。答案:(1)数组初始化:```cstructProduct{charname[30];unsignedintstock;floatprice;};structProductproducts[3]={{"笔记本",50,4999.9f},{"鼠标",120,99.5f},{"键盘",80,199.0f}};```(2)总库存与总价值计算:```cunsignedinttotal_stock=0;floattotal_value=0.0f;for(inti=0;i<3;i++){total_stock+=products[i].stock;total_value+=products[i].stockproducts[i].price;}```(3)查找单价最高商品:```cintmax_index=0;for(inti=1;i<3;i++){if(products[i].price>products[max_index].price){max_index=i;}}printf("单价最高商品:%s,单价:%.1f元\n",products[max_index].name,products[max_index].price);```四、动态内存分配操作结构体4.编写程序实现以下功能:(1)定义结构体`Student`,包含:长整型学号`id`、字符数组姓名`name`(长度15)、短整型年龄`age`;(2)从用户输入获取学生数量`n`(n≥1且n≤10);(3)使用`malloc`动态分配`n`个`Student`结构体的内存空间;(4)循环输入每个学生的学号、姓名、年龄(需处理姓名中的空格,使用`fgets`);(5)逆序输出所有学生信息(从第n个到第1个);(6)释放动态分配的内存。答案:```cinclude<stdio.h>include<stdlib.h>include<string.h>structStudent{longid;charname[15];shortage;};intmain(){intn;printf("请输入学生数量(1-10):");scanf("%d",&n);while(n<1||n>10){printf("输入错误,请重新输入:");scanf("%d",&n);}structStudentstudents=(structStudent)malloc(nsizeof(structStudent));if(students==NULL){printf("内存分配失败!\n");return1;}//清空输入缓冲区intc;while((c=getchar())!='\n'&&c!=EOF);for(inti=0;i<n;i++){printf("请输入第%d个学生的学号:",i+1);scanf("%ld",&students[i].id);while((c=getchar())!='\n'&&c!=EOF);//清空行缓冲printf("请输入第%d个学生的姓名(最多14字符):",i+1);fgets(students[i].name,sizeof(students[i].name),stdin);//去除fgets末尾的换行符if(students[i].name[strlen(students[i].name)1]=='\n'){students[i].name[strlen(students[i].name)1]='\0';}printf("请输入第%d个学生的年龄:",i+1);scanf("%hd",&students[i].age);while((c=getchar())!='\n'&&c!=EOF);}printf("\n逆序学生信息:\n");for(inti=n1;i>=0;i--){printf("学号:%ld,姓名:%s,年龄:%hd\n",students[i].id,students[i].name,students[i].age);}free(students);return0;}```五、联合体基础操作5.定义联合体`Data`,包含以下成员:有符号整型`i`(4字节);无符号整型`u`(4字节);单精度浮点型`f`(4字节);要求:(1)写出联合体定义;(2)创建`Data`变量`d`,为`d.f`赋值为123.45f,分别输出`d.i`、`d.u`、`d.f`的值(说明输出现象的原因);(3)为`d.u`赋值为0x80000000(十六进制),输出`d.i`的十进制值(说明符号位影响)。答案:(1)联合体定义:```cunionData{inti;unsignedintu;floatf;};```(2)赋值与输出:```cunionDatad;d.f=123.45f;printf("d.f=%.2f\n",d.f);//输出123.45printf("d.i=%d\n",d.i);//输出浮点数123.45的二进制按int解释的结果(如1094498611)printf("d.u=%u\n",d.u);//与d.i的二进制相同,无符号解释(如1094498611)```现象原因:联合体成员共享同一块内存(4字节),为`f`赋值后,`i`和`u`读取的是该内存的二进制位按各自类型解释的结果。(3)符号位影响:```cd.u=0x80000000;//二进制最高位为1(符号位)printf("d.i=%d\n",d.i);//输出-2147483648(有符号整型中最高位为符号位)```六、联合体与结构体结合6.设计一个传感器数据包结构体`SensorPacket`,要求:包含1字节的类型标识`type`(0表示温度,1表示湿度,2表示光照);联合体`Value`,包含:单精度浮点型温度`temp`(单位℃);无符号字符型湿度`hum`(百分比,0-100);无符号短整型光照`light`(单位lux);要求:(1)定义`Value`联合体和`SensorPacket`结构体;(2)创建三个`SensorPacket`变量,分别表示:温度25.6℃(type=0);湿度60%(type=1);光照1200lux(type=2);(3)编写函数`print_sensor`,根据`type`输出对应值(示例:"温度:25.6℃"或"湿度:60%"等)。答案:(1)结构体定义:```cunionValue{floattemp;unsignedcharhum;unsignedshortlight;};structSensorPacket{unsignedchartype;unionValueval;};```(2)变量创建:```cstructSensorPackets1={.type=0,.val={.temp=25.6f}};structSensorPackets2={.type=1,.val={.hum=60}};structSensorPackets3={.type=2,.val={.light=1200}};```(3)输出函数:```cvoidprint_sensor(conststructSensorPackets){switch(s->type){case0:printf("温度:%.1f℃\n",s->val.temp);break;case1:printf("湿度:%d%%\n",s->val.hum);break;case2:printf("光照:%dlux\n",s->val.light);break;default:printf("未知传感器类型\n");}}```七、联合体与位域结合7.设计一个设备状态寄存器的联合体`StatusReg`,要求:包含一个无符号整型`reg`(表示整个寄存器值,4字节);包含位域结构体`Bits`,包含:1位的电源状态`power`(0=关闭,1=开启);2位的工作模式`mode`(0=待机,1=运行,2=调试,3=故障);1位的错误标志`error`(0=无错误,1=有错误);28位的保留位`reserved`(需显式声明以填充剩余位);要求:(1)定义`Bits`位域结构体和`StatusReg`联合体;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年及未来5年中国家庭视频监控行业发展潜力预测及投资战略、数据研究报告
- 教练员管理制度规范
- 幼儿学校保安制度规范
- 规范工会筹备金管理制度
- 音体美规范教学管理制度
- 西餐厅厨房卫生规范制度
- 锁车器使用制度规范标准
- 学校文字规范使用制度
- 垃圾房管理制度与规范
- 医美物价管理制度规范
- 禁毒社工知识培训课件
- 家具展厅管理方案(3篇)
- 半成品摆放管理办法
- 周围性瘫痪的护理常规
- 电能质量技术监督培训课件
- 电子制造行业数字化转型白皮书
- 肿瘤患者双向转诊管理职责
- 福建省漳州市2024-2025学年高一上学期期末教学质量检测历史试卷(含答案)
- 定额〔2025〕2号文-关于发布2020版电网技术改造及检修工程概预算定额2024年下半年价格
- 管道穿越高速桥梁施工方案
- 2024版《中医基础理论经络》课件完整版
评论
0/150
提交评论