第9章 第6节:联合体(练习)-《C语言程序设计》(电子工业出版社)上好课

2026-06-29
| 2份
| 30页
| 35人阅读
| 0人下载

内容正文:

9.6节:联合体 一、单项选择题 1.联合体最核心的特征是( ) A. 所有成员拥有独立内存空间 B. 全部成员共享同一块起始内存 C. 成员必须是相同数据类型 D. 占用内存等于所有成员字节之和 2.现有定义union Data{short a; char b; float c;};,该联合体变量占用内存字节数由( )决定 A. short 成员 a,占 2 字节 B. char 成员 b,占 1 字节 C. float 成员 c,占 4 字节 D. 4+1+4=9 字节 3.在C语言中,定义联合体类型必须使用的关键字是() A. struct B. enum C. union D. typedef 4.关于联合体和结构体在内存分配上的主要区别,下列说法正确的是() A. 结构体成员共享内存,联合体成员各自占用独立内存 B. 联合体成员共享同一块内存,结构体成员各自占用独立内存 C. 两者都是成员共享同一块内存 D. 两者都是成员各自占用独立内存,没有区别 5.设有定义 union U { int x; char y[4]; } u;。若执行 u.y[0]=1; u.y[1]=0; u.y[2]=0; u.y[3]=0;,在小端模式下,u.x 的值是() A. 1 B. 16777216 C. 0 D. 不确定 6.联合体变量定义的合法形式是() A. union { int a; float b; } B. union data { int a; float b; }; data x; C. union data { int a; float b; } x; D. data { int a; float b; } x; 7.以下关于联合体赋值的描述,错误的是() A. 可以给联合体的整型成员赋值 B. 可以给联合体的字符成员赋值 C. 可以将一个联合体变量直接赋值给另一个同类型的联合体变量 D. 可以同时给联合体的两个不同成员赋值并让它们都保持有效 8.使用指向联合体的指针访问成员时,应使用的运算符是() A. . B. -> C. * D. & 9.设有 union Data { int k; char c; } a;,执行 a.k = 256; 后,a.c 的值是()(假设小端模式) A. 256 B. 1 C. 0 D. -1 10.若定义 typedef union { long x[2]; int y[4]; char z[8]; } MY_TYPE;,则 MY_TYPE 是() A. 一个联合体变量 B. 一个联合体类型名 C. 一个结构体类型名 D. 一个宏定义 二、填空题。 1.在C语言中,无论联合体包含多少个成员,所有成员的______地址都是相同的,且都等于该联合体变量的首地址。 2.在任意时刻,联合体变量中只有______个成员是有效的(即被赋值的),对其中一个成员赋值会覆盖其他成员的数据。 3.对于联合体变量 u 及其成员 m,表达式 &u 的值与表达式 ______ 的值在数值上是相等的。 4.当将联合体变量作为参数传递给函数时,默认采用______传递的方式,即在函数内部修改形参不会影响实参的值。 5.在定义联合体类型时,右花括号 } 后面必须紧跟一个______符号,表示类型定义的结束。 三、阅读程序题。 1.写出下列程序段的输出结果:________________。 #include <stdio.h> union Test { int a; char b; }; int main() { union Test t; t.a = 10; t.b = 20; printf("%d", t.a); return 0; } 2.写出下列程序段的输出结果:________________。 #include <stdio.h> union Data { int i; char c[4]; }; int main() { union Data d; d.c[0] = 1; d.c[1] = 0; d.c[2] = 0; d.c[3] = 0; printf("%d", d.i); return 0; } 3.写出下列程序段的输出结果:________________。 #include <stdio.h> union Data { int i; char c[4]; }; int main() { union Data d; d.c[0] = 0; d.c[1] = 1; d.c[2] = 0; d.c[3] = 0; printf("%d", d.i); return 0; } 4.写出下列程序段的输出结果:________________。 #include <stdio.h> union Mix { int x; short y; }; int main() { union Mix m; m.x = 0x12345678; m.y = 0xABCD; printf("%x", m.x); return 0; } 5.写出下列程序段的输出结果:________________。 #include <stdio.h> struct S { int a; union { char c; int b; } u; }; int main() { struct S s; s.a = 100; s.u.b = 200; printf("%d %d", s.a, s.u.c); return 0; } 6.写出下列程序段的输出结果:________________。 #include <stdio.h> union U { int i; char c; }; int main() { union U arr[2]; arr[0].i = 0x00000001; arr[1].i = 0x00000002; char *p = (char *)arr; printf("%d %d", p[0], p[4]); return 0; } 7.写出下列程序段的输出结果:________________。 #include <stdio.h> enum Type { INT, CHAR }; union Data { int i; char c; }; struct Var { enum Type t; union Data d; }; int main() { struct Var v; v.t = INT; v.d.i = 65; printf("%c", v.d.c); return 0; } 8.写出下列程序段的输出结果:________________。 #include <stdio.h> void func() { static union U { int a; char b; } u = { .b = 'X' }; printf("%d", u.a); } int main() { func(); return 0; } 9.写出下列程序段的输出结果:________________。 #include <stdio.h> union U { int a; int b; }; int main() { union U u; u.a = 10; u.b = 20; printf("%d", u.a); return 0; } 10.写出下列程序段的输出结果:________________。 #include <stdio.h> struct A { char c; int i; }; union B { struct A s; char arr[8]; }; int main() { union B b; b.arr[0] = 'H'; printf("%c", b.s.c); return 0; } 11.写出下列程序段的输出结果:________________。 #include <stdio.h> union U { struct { char a; char b; } s; short k; }; int main() { union U u; u.k = 0x0506; printf("%d", u.s.a + u.s.b); return 0; } 12.写出下列程序段的输出结果:________________。 #include <stdio.h> struct Inner { char c; int i; }; union U { struct Inner s; char arr[8]; }; int main() { union U u = {0}; u.arr[0] = 3; u.arr[4] = 8; printf("%d %d", u.s.c, u.s.i); return 0; } 13.写出下列程序段的输出结果:________________。 #include <stdio.h> union U { char c[3]; int i; }; int main() { union U arr[2]; arr[0].c[0] = 1; arr[0].c[1] = 2; arr[0].c[2] = 3; arr[1].c[0] = 4; arr[1].c[1] = 5; arr[1].c[2] = 6; char *p = (char *)arr; printf("%d %d", p[3], p[4]); return 0; } 14.写出下列程序段的输出结果:________________。 #include <stdio.h> struct A { char x; }; union B { struct A a; int y; }; struct C { union B b; char z; }; int main() { struct C c = {0}; c.b.y = 0x12345678; c.z = 0xAA; printf("%x", c.b.a.x); return 0; } 15.写出下列程序段的输出结果:________________。 #include <stdio.h> union U { int i; short s[2]; }; void flip(union U *u) { short temp = u->s[0]; u->s[0] = u->s[1]; u->s[1] = temp; } int main() { union U u; u.i = 0x00010002; flip(&u); printf("%x", u.i); return 0; } 四、编程题。 1. 图书与期刊资料管理系统:图书馆的资料分为图书和期刊两种,它们的共同属性有书名和出版年份,不同属性为图书有作者和ISBN号,期刊有期号和主办单位。请编写程序,输入N份资料的信息(先输入类型字符B代表图书、J代表期刊,再输入对应数据),然后以整齐的表格形式输出所有资料,输出时需根据类型显示不同的特有属性。 2.员工与兼职人员薪资结算系统:某公司人员分为正式员工和兼职人员,共同属性有姓名和工号,薪资计算方式不同:正式员工为固定月薪,兼职人员为按小时计费(时薪和当月工作时长)。请编写程序,输入若干人员数据(先输入类型F代表正式、P代表兼职,再输入对应数据),计算每个人的当月应发薪资,并以表格形式输出姓名、工号、人员类型及应发薪资。 3.几何图形属性记录器:设计一个程序来记录不同几何图形的属性,图形分为圆和矩形,共同属性为图形名称,不同属性为圆有半径,矩形有长和宽。程序要求用户输入N个图形的信息(先输入Circle或Rect,再输入对应数据),然后输出每个图形的名称、类型以及其关键尺寸参数。 4.学生与教师信息登记表:学校的人员分为学生和教师,共同属性有姓名和年龄,不同属性为学生有学号和班级,教师有工号和职称。请编写程序,输入N个人的信息(先输入类型S代表学生、T代表教师,再输入对应数据),然后以表格形式输出所有人的详细信息。 5.轿车与卡车车辆信息库:车辆分为轿车和卡车,共同属性有品牌和生产年份,不同属性为轿车有座位数,卡车有载重吨位。请编写程序,输入N辆车的信息(先输入类型C代表轿车、T代表卡车,再输入对应数据),然后以表格形式输出所有车辆的详细信息。 原创精品资源学科网独家享有版权,侵权必究! 学科网(北京)股份有限公司 $ 9.6节:联合体 一、单项选择题 1.联合体最核心的特征是( ) A. 所有成员拥有独立内存空间 B. 全部成员共享同一块起始内存 C. 成员必须是相同数据类型 D. 占用内存等于所有成员字节之和 【答案】B 【解析】联合体所有成员共用同一块内存,同一时刻仅能有效存储一个成员数据。 2.现有定义union Data{short a; char b; float c;};,该联合体变量占用内存字节数由( )决定 A. short 成员 a,占 2 字节 B. char 成员 b,占 1 字节 C. float 成员 c,占 4 字节 D. 4+1+4=9 字节 【答案】C 【解析】联合体总大小等于内部占用字节最大的成员,float占4字节,整体占4字节。 3.在C语言中,定义联合体类型必须使用的关键字是( ) A. struct B. enum C. union D. typedef 【答案】C 【解析】union 是定义联合体(共用体)的关键字。struct 用于结构体,enum 用于枚举,typedef 用于类型重命名。 4.关于联合体和结构体在内存分配上的主要区别,下列说法正确的是( ) A. 结构体成员共享内存,联合体成员各自占用独立内存 B. 联合体成员共享同一块内存,结构体成员各自占用独立内存 C. 两者都是成员共享同一块内存 D. 两者都是成员各自占用独立内存,没有区别 【答案】B 【解析】这是联合体最核心的特征。联合体的所有成员起始地址相同,共享同一块内存区域;而结构体的每个成员都有自己独立的内存空间。 5.设有定义 union U { int x; char y[4]; } u;。若执行 u.y[0]=1; u.y[1]=0; u.y[2]=0; u.y[3]=0;,在小端模式下,u.x 的值是( ) A. 1 B. 16777216 C. 0 D. 不确定 【答案】A 【解析】在小端模式下,低位字节存储在低地址。y[0] 对应 x 的最低8位。将 y[0] 设为1,其余为0,则整数 x 的二进制表示即为 1。 6.联合体变量定义的合法形式是( ) A. union { int a; float b; } B. union data { int a; float b; }; data x; C. union data { int a; float b; } x; D. data { int a; float b; } x; 【答案】C 【解析】A选项只定义了类型没定义变量;B选项在C语言中定义变量需加 union 关键字;D选项语法错误。C选项是在定义类型的同时定义了变量 x,完全合法。 7.以下关于联合体赋值的描述,错误的是( ) A. 可以给联合体的整型成员赋值 B. 可以给联合体的字符成员赋值 C. 可以将一个联合体变量直接赋值给另一个同类型的联合体变量 D. 可以同时给联合体的两个不同成员赋值并让它们都保持有效 【答案】D 【解析】联合体在同一时刻只能保存一个成员的有效值。虽然语法上可以连续赋值,但后一次赋值会覆盖前一次的内容,无法让两个成员同时保持各自独立的有效值。 8.使用指向联合体的指针访问成员时,应使用的运算符是( ) A. . B. -> C. * D. & 【答案】B 【解析】通过指针访问结构体或联合体成员,统一使用箭头运算符 ->。点运算符 . 用于变量直接访问。 9.设有 union Data { int k; char c; } a;,执行 a.k = 256; 后,a.c 的值是( )(假设小端模式) A. 256 B. 1 C. 0 D. -1 【答案】C 【解析】的十六进制是 0x0100。在小端模式下,低地址(a.c 所在位置)存储的是 00,高地址存储的是 01。所以 a.c 读取低地址的一个字节,值为 0。 10.若定义 typedef union { long x[2]; int y[4]; char z[8]; } MY_TYPE;,则 MY_TYPE 是( ) A. 一个联合体变量 B. 一个联合体类型名 C. 一个结构体类型名 D. 一个宏定义 【答案】B 【解析】typedef 的作用是为数据类型定义一个新的别名。这里 MY_TYPE 代表了那个匿名联合体类型。 二、填空题。 1.在C语言中,无论联合体包含多少个成员,所有成员的______地址都是相同的,且都等于该联合体变量的首地址。 【答案】起始(或首) 【解析】这是联合体内存模型的基础。与结构体不同,联合体成员不是依次排列的,而是重叠存放的,起点一致。 2.在任意时刻,联合体变量中只有______个成员是有效的(即被赋值的),对其中一个成员赋值会覆盖其他成员的数据。 【答案】一(或1) 【解析】由于共享内存,写入一个成员会破坏其他成员的二进制表示,因此逻辑上同一时间只能存储一种类型的数据。 3.对于联合体变量 u 及其成员 m,表达式 &u 的值与表达式 ______ 的值在数值上是相等的。 【答案】&u.m 【解析】因为成员 m 的起始地址就是联合体 u 的起始地址。 4.当将联合体变量作为参数传递给函数时,默认采用______传递的方式,即在函数内部修改形参不会影响实参的值。 【答案】值 【解析】C语言中,除非传递的是指针,否则基本数据类型和聚合类型(如结构体、联合体)通常都是值传递,会生成一份副本。 5.在定义联合体类型时,右花括号 } 后面必须紧跟一个______符号,表示类型定义的结束。 【答案】分号(或 ;) 【解析】这是定义联合体类型时的语法格式要求。 三、阅读程序题。 1.写出下列程序段的输出结果:________________。 #include <stdio.h> union Test { int a; char b; }; int main() { union Test t; t.a = 10; t.b = 20; printf("%d", t.a); return 0; } 【答案】20 2.写出下列程序段的输出结果:________________。 #include <stdio.h> union Data { int i; char c[4]; }; int main() { union Data d; d.c[0] = 1; d.c[1] = 0; d.c[2] = 0; d.c[3] = 0; printf("%d", d.i); return 0; } 【答案】1 3.写出下列程序段的输出结果:________________。 #include <stdio.h> union Data { int i; char c[4]; }; int main() { union Data d; d.c[0] = 0; d.c[1] = 1; d.c[2] = 0; d.c[3] = 0; printf("%d", d.i); return 0; } 【答案】256 4.写出下列程序段的输出结果:________________。 #include <stdio.h> union Mix { int x; short y; }; int main() { union Mix m; m.x = 0x12345678; m.y = 0xABCD; printf("%x", m.x); return 0; } 【答案】1234abcd 5.写出下列程序段的输出结果:________________。 #include <stdio.h> struct S { int a; union { char c; int b; } u; }; int main() { struct S s; s.a = 100; s.u.b = 200; printf("%d %d", s.a, s.u.c); return 0; } 【答案】100 -56 6.写出下列程序段的输出结果:________________。 #include <stdio.h> union U { int i; char c; }; int main() { union U arr[2]; arr[0].i = 0x00000001; arr[1].i = 0x00000002; char *p = (char *)arr; printf("%d %d", p[0], p[4]); return 0; } 【答案】1 2 7.写出下列程序段的输出结果:________________。 #include <stdio.h> enum Type { INT, CHAR }; union Data { int i; char c; }; struct Var { enum Type t; union Data d; }; int main() { struct Var v; v.t = INT; v.d.i = 65; printf("%c", v.d.c); return 0; } 【答案】A 8.写出下列程序段的输出结果:________________。 #include <stdio.h> void func() { static union U { int a; char b; } u = { .b = 'X' }; printf("%d", u.a); } int main() { func(); return 0; } 【答案】88 9.写出下列程序段的输出结果:________________。 #include <stdio.h> union U { int a; int b; }; int main() { union U u; u.a = 10; u.b = 20; printf("%d", u.a); return 0; } 【答案】20 10.写出下列程序段的输出结果:________________。 #include <stdio.h> struct A { char c; int i; }; union B { struct A s; char arr[8]; }; int main() { union B b; b.arr[0] = 'H'; printf("%c", b.s.c); return 0; } 【答案】H 11.写出下列程序段的输出结果:________________。 #include <stdio.h> union U { struct { char a; char b; } s; short k; }; int main() { union U u; u.k = 0x0506; printf("%d", u.s.a + u.s.b); return 0; } 【答案】11 12.写出下列程序段的输出结果:________________。 #include <stdio.h> struct Inner { char c; int i; }; union U { struct Inner s; char arr[8]; }; int main() { union U u = {0}; u.arr[0] = 3; u.arr[4] = 8; printf("%d %d", u.s.c, u.s.i); return 0; } 【答案】3 8 13.写出下列程序段的输出结果:________________。 #include <stdio.h> union U { char c[3]; int i; }; int main() { union U arr[2]; arr[0].c[0] = 1; arr[0].c[1] = 2; arr[0].c[2] = 3; arr[1].c[0] = 4; arr[1].c[1] = 5; arr[1].c[2] = 6; char *p = (char *)arr; printf("%d %d", p[3], p[4]); return 0; } 【答案】0 4 14.写出下列程序段的输出结果:________________。 #include <stdio.h> struct A { char x; }; union B { struct A a; int y; }; struct C { union B b; char z; }; int main() { struct C c = {0}; c.b.y = 0x12345678; c.z = 0xAA; printf("%x", c.b.a.x); return 0; } 【答案】78 15.写出下列程序段的输出结果:________________。 #include <stdio.h> union U { int i; short s[2]; }; void flip(union U *u) { short temp = u->s[0]; u->s[0] = u->s[1]; u->s[1] = temp; } int main() { union U u; u.i = 0x00010002; flip(&u); printf("%x", u.i); return 0; } 【答案】20001 四、编程题。 1. 图书与期刊资料管理系统:图书馆的资料分为图书和期刊两种,它们的共同属性有书名和出版年份,不同属性为图书有作者和ISBN号,期刊有期号和主办单位。请编写程序,输入N份资料的信息(先输入类型字符B代表图书、J代表期刊,再输入对应数据),然后以整齐的表格形式输出所有资料,输出时需根据类型显示不同的特有属性。 【参考代码】 #include <stdio.h> typedef union { struct { char author[20], isbn[20]; } book; struct { int issue; char org[20]; } journal; } Info; typedef struct { char type; char title[20]; int year; Info info; } Material; int main() { int n, i; scanf("%d", &n); Material m[n]; for(i = 0; i < n; i++) { scanf(" %c", &m[i].type); if(m[i].type == 'B') scanf("%s %d %s %s",m[i].title,&m[i].year,m[i].info.book.author,m[i].info.book.isbn); else scanf("%s %d %d %s",m[i].title,&m[i].year,&m[i].info.journal.issue,m[i].info.journal.org); } printf("Type Title Year Detail1 Detail2 "); for(i = 0; i < n; i++) { if(m[i].type == 'B') printf("Book %-10s %-6d %-12s %s ",m[i].title,m[i].year,m[i].info.book.author,m[i].info.book.isbn); else printf("Journal%-10s %-6d %-12d %s ",m[i].title,m[i].year,m[i].info.journal.issue,m[i].info.journal.org); } return 0; } 2.员工与兼职人员薪资结算系统:某公司人员分为正式员工和兼职人员,共同属性有姓名和工号,薪资计算方式不同:正式员工为固定月薪,兼职人员为按小时计费(时薪和当月工作时长)。请编写程序,输入若干人员数据(先输入类型F代表正式、P代表兼职,再输入对应数据),计算每个人的当月应发薪资,并以表格形式输出姓名、工号、人员类型及应发薪资。 【参考代码】 #include <stdio.h> typedef union { float salary; // 正式员工月薪 struct { float rate, hours; } part; // 兼职时薪和工时 } Pay; typedef struct { char name[15]; int id; char type; Pay pay; } Employee; int main() { int n, i; scanf("%d", &n); Employee e[n]; for(i = 0; i < n; i++) { scanf(" %c", &e[i].type); if(e[i].type == 'F') scanf("%s %d %f", e[i].name, &e[i].id, &e[i].pay.salary); else scanf("%s %d %f %f", e[i].name, &e[i].id, &e[i].pay.part.rate, &e[i].pay.part.hours); } printf("Name ID Type Salary "); for(i = 0; i < n; i++) { float total = (e[i].type == 'F') ? e[i].pay.salary : (e[i].pay.part.rate * e[i].pay.part.hours); printf("%-12s %-6d %-9s %.2f ", e[i].name, e[i].id, (e[i].type=='F'?"Full-time":"Part-time"), total); } return 0; } 3.几何图形属性记录器:设计一个程序来记录不同几何图形的属性,图形分为圆和矩形,共同属性为图形名称,不同属性为圆有半径,矩形有长和宽。程序要求用户输入N个图形的信息(先输入Circle或Rect,再输入对应数据),然后输出每个图形的名称、类型以及其关键尺寸参数。 【参考代码】 #include <stdio.h> #include <string.h> typedef union { float radius; struct { float len, wid; } rect; } Geo; typedef struct { char name[15]; char type[10]; Geo g; } Shape; int main() { int n, i; scanf("%d", &n); Shape s[n]; char flag[10]; for(i = 0; i < n; i++) { scanf("%s", flag); if(strcmp(flag, "Circle") == 0) { strcpy(s[i].type, "Circle"); scanf("%s %f", s[i].name, &s[i].g.radius); } else { strcpy(s[i].type, "Rect"); scanf("%s %f %f", s[i].name, &s[i].g.rect.len, &s[i].g.rect.wid); } } printf("Name Type Dimensions "); for(i = 0; i < n; i++) { if(strcmp(s[i].type, "Circle") == 0) printf("%-12s %-8s R: %.2f ", s[i].name, s[i].type, s[i].g.radius); else printf("%-12s %-8s L: %.2f W: %.2f ", s[i].name, s[i].type, s[i].g.rect.len, s[i].g.rect.wid); } return 0; } 4.学生与教师信息登记表:学校的人员分为学生和教师,共同属性有姓名和年龄,不同属性为学生有学号和班级,教师有工号和职称。请编写程序,输入N个人的信息(先输入类型S代表学生、T代表教师,再输入对应数据),然后以表格形式输出所有人的详细信息。 【参考代码】 #include <stdio.h> typedef union { struct { int sid; char class[15]; } student; struct { int tid; char title[15]; } teacher; } Detail; typedef struct { char type; char name[15]; int age; Detail d; } Person; int main() { int n, i; scanf("%d", &n); Person p[n]; for(i = 0; i < n; i++) { scanf(" %c", &p[i].type); if(p[i].type == 'S') scanf("%s %d %d %s", p[i].name, &p[i].age, &p[i].d.student.sid, p[i].d.student.class); else scanf("%s %d %d %s", p[i].name, &p[i].age, &p[i].d.teacher.tid, p[i].d.teacher.title); } printf("Type Name Age ID Class/Title "); for(i = 0; i < n; i++) { if(p[i].type == 'S') printf("Student %-12s %-6d %-7d %s ", p[i].name, p[i].age, p[i].d.student.sid, p[i].d.student.class); else printf("Teacher %-12s %-6d %-7d %s ", p[i].name, p[i].age, p[i].d.teacher.tid, p[i].d.teacher.title); } return 0; } 5.轿车与卡车车辆信息库:车辆分为轿车和卡车,共同属性有品牌和生产年份,不同属性为轿车有座位数,卡车有载重吨位。请编写程序,输入N辆车的信息(先输入类型C代表轿车、T代表卡车,再输入对应数据),然后以表格形式输出所有车辆的详细信息。 【参考代码】 #include <stdio.h> typedef union { int seats; float load; } Spec; typedef struct { char type; char brand[15]; int year; Spec s; } Vehicle; int main() { int n, i; scanf("%d", &n); Vehicle v[n]; for(i = 0; i < n; i++) { scanf(" %c", &v[i].type); if(v[i].type == 'C') scanf("%s %d %d", v[i].brand, &v[i].year, &v[i].s.seats); else scanf("%s %d %f", v[i].brand, &v[i].year, &v[i].s.load); } printf("Type Brand Year Seats/Load "); for(i = 0; i < n; i++) { if(v[i].type == 'C') printf("Car %-12s %-6d %-10d ", v[i].brand, v[i].year, v[i].s.seats); else printf("Truck %-12s %-6d %-10.1f ", v[i].brand, v[i].year, v[i].s.load); } return 0; } 原创精品资源学科网独家享有版权,侵权必究! 学科网(北京)股份有限公司 $

资源预览图

第9章 第6节:联合体(练习)-《C语言程序设计》(电子工业出版社)上好课
1
第9章 第6节:联合体(练习)-《C语言程序设计》(电子工业出版社)上好课
2
第9章 第6节:联合体(练习)-《C语言程序设计》(电子工业出版社)上好课
3
所属专辑
由于学科网是一个信息分享及获取的平台,不确保部分用户上传资料的 来源及知识产权归属。如您发现相关资料侵犯您的合法权益,请联系学科网,我们核实后将及时进行处理。