内容正文:
编写说明:湖南省普通高校对口招生专业理论考试《计算机应用类专业综合考纲百套卷》,依据《湖南省普通高校对口招生计算机应用类专业综合知识基本要求及考试大纲》编写。每门课程均分三层训练:基础层(具象化支架)拆解考点为微目标,紧扣考纲 “掌握”“理解” 要求编写考点训练卷;巩固层(关联性支架)强化知识交叉与场景关联,按考纲专题编专题训练卷;应用层(引导性支架)聚焦真题突破,结合知识模块与教材编写课程综合卷。
本试卷是第94卷,按《计算机编程语言——C语言》范围和要求编写。具体内容为:①结构体变量的定义和引用;②结构体数组、共用体和枚举类型。
湖南省《计算机应用类专业综合考纲百套卷》 第94卷
《计算机编程语言——C语言》
结构体和共用体
专题训练卷
考试时间60分钟 满分100分
班级________姓名________学号________成绩________
一、单项选择题(本大题共15小题,每题2分,共30分)
1.设有以下定义,则下列代码中合法访问 num 成员的是( )
struct Info {
char ch;int num;double score;};
struct Info data = {'A',12,88.5};
A. Info.num B. data->num C. data.num D. data [0].num
2.关于同类型结构体变量赋值,下列说法正确的是( )
A. 两个同类型结构体变量,可直接使用 = 完成整体赋值拷贝
B. 结构体变量不允许整体赋值,只能逐个成员赋值
C. 结构体初始化列表的成员数量必须大于结构体总成员数
D. 不同类型结构体变量之间可直接整体赋值
3.设有以下定义,则以下语句语法完全合法、可正常运行的是( )
struct Book{
char name[20];int page;};
struct Book b1 = {"C语言",120}, b2;
A. b2 = {"Python",99}; B. b2.name = "Java";
C. b2 = b1; D. b2.page = b1.name;
4.设有以下定义,则数组元素 stu[4].id 的值为( )
struct Student{int id;} stu[5] = {{1},{2},{3}};
A. 随机垃圾值 B. 4 C. 0 D. 3
5.下列枚举类型定义完全符合 C 语言语法规范、可正常编译的是( )
A. enum Week {Mon=1,Tue,Wed=5,Thu};
B. enum Week {1,2,3,4};
C. enum Week {Mon;Tue;Wed};
D. enum Week {Mon="周一",Tue};
6.设有定义:enum Color{Red,Green=5,Blue};,则枚举常量 Blue 对应的整型数值是( )
A. 2 B. 6 C. 3 D. 5
7.关于共用体内存布局,下列描述正确的是( )
A. 共用体占用内存 = 内部所有成员占用字节之和
B. 共用体内所有成员共享同一块起始内存空间
C. 共用体每个成员拥有独立互不重叠的内存地址
D. 共用体不支持同时存放 char、int、double 多种基础类型
8.设有以下定义,若不考虑内存对齐,union TagU 占用字节为( )
struct Tag{short a;char b;};
union TagU{struct Tag t;double num;};
A. 3 B. 8 C. 11 D. 9
9.设有以下定义,则下列语句无法通过编译的是( )
struct Person{char name[10];int age;} p1 = {"Li",18}, p2;
A. p2 = p1; B. p2.age = p1.age + 2;
C. p2.name = p1.name; D. printf ("% s",p1.name);
10.设有以下定义,正确访问 point 成员的写法是( )
struct Game{
char name[16];
union Score{
int point;
float rate; } sc;
};
struct Game g = {"LOL",{98}};
A. g.sc.point B. g.Score.point
C. g.point D. sc.point
11.下列代码无法正常输出字符串 "Mimi" 的是( )
struct Cat{int age;char name[8];};
struct Cat c1 = {2,"Mimi"};
A. printf ("% s",c1.name);
B. char s [8] = c1.name; printf ("% s",s);
C. puts (c1.name);
D. int i;for(i=0;c1.name [i]!='\0';i++) putchar (c1.name [i]);
12.设有以下定义,则s[1].lv、s[1].score的值依次为( )
struct Score{
enum Level{Low,Mid,High} lv;
int score; } s[2] = {{Mid,75},{High}};
A. High、0 B. 2、0 C. High、随机值 D. 2、75
13.执行以下程序的输出结果是( )
#include <stdio.h>
struct Fruit{
int weight;
union Tag{
short size;
double price;}t;
};
int main(void)
{ struct Fruit f = {200,{15}};
printf("%d",f.t.size);
return 0; }
A. 200 B. 15 C. 0 D. 随机小数
14.执行以下程序的输出结果是( )
#include <stdio.h>
struct Book{ int page;};
void change(struct Book s)
{ s.page = 999;}
int main(void)
{ struct Book b = {120};
change(b);
printf("%d",b.page);
return 0; }
A. 120 B. 999 C. 0 D. 随机值
15.执行以下程序的输出结果是( )
#include <stdio.h>
struct Car{int id;};
int main(void)
{ struct Car c1 = {88},c2;
c2 = c1;
c1.id = 99;
printf("%d",c2.id);
return 0; }
A. 88 B. 99 C. 0 D. 随机数
二、阅读程序,写出运行结果(本大题共10小题。每空2分,合计20分)
1.下列程序的运行结果是__________________。
#include <stdio.h>
struct Goods{
int id;
char name[5];
}g[3] = {{101,"Apple"}};
int main(void)
{
int i;
for(i=0;i<3;i++){
if(g[i].id == 0){
g[i].name[0] = 'Z';
}
}
printf("%c%d",g[2].name[0],g[1].id);
return 0; }
2.下列程序的运行结果是__________________。
#include <stdio.h>
struct Block{
int data[3];
union{
short s;
double f;
};
};
void modify(struct Block b){
int i;
for(i=0;i<3;i++){
b.data[i] += 10;
}
b.s = 200;
}
int main(void)
{
struct Block b1 = {10,20,{50}};
struct Block b2 = b1;
modify(b1);
printf("%d",b2.data[2]);
return 0; }
3.下列程序的运行结果是__________________。
#include <stdio.h>
struct Toy{
union U{
int code;
char str[3];
}u;
int stock;
}toy[2] = {{ {150}, 25 }};
int main(void)
{
int i,total=0;
for(i=0;i<2;i++){
total += toy[i].stock;
}
printf("%d",total);
return 0; }
4.下列程序的运行结果是__________________。
#include <stdio.h>
union FourByte{
char buf[4];
int num;
};
int getSum(union FourByte u){
int sum=0,i;
for(i=0;i<4;i++)
sum += u.buf[i];
return sum;
}
int main(void)
{ int k;
union FourByte u;
u.num = 0;
for(k=0;k<4;k++)
u.buf[k] = k * 4;
printf("%d",getSum(u));
return 0; }
5.下列程序的运行结果是__________________。
#include <stdio.h>
struct Apple{
int size[3];
union U{
short weight;
double price;
}u;
};
int main(void)
{
struct Apple a1 = {{5, 10}};
struct Apple a2;
int i;
a1.u.weight = 200;
a2 = a1;
for(i = 0; i < 3; i++)
a1.size[i] *= 3;
if(a1.u.weight == a2.u.weight)
a2.u.weight += 100;
printf("%d", a2.u.weight);
return 0;
}
6.下列程序的运行结果是__________________。
#include <stdio.h>
struct Layer{
int num;
union U{
char arr[4];
int val;
}u;
};
void loopChange(struct Layer l){
int i;
for(i=0;i<4;i++)
l.u.arr[i] += 5;
}
int main(void)
{
struct Layer l1 = {10,{20}};
loopChange(l1);
printf("%d",l1.u.arr[0]);
return 0; }
7.下列程序的运行结果是__________________。
#include <stdio.h>
struct Box {
int data[4];
union Tag {
short sh;
int n;
} tag;
};
int main(void) {
struct Box b1 = {{1, 3, 5}};
struct Box b2;
int i;
b1.tag.sh = 120;
b2 = b1;
for (i = 0; i < 4; i++) {
if (i % 2 == 0)
b1.data[i] *= 2;
}
if (b1.tag.sh == b2.tag.sh) {
b2.tag.n += 36;
}
printf("%d %d", b1.data[3], b2.tag.sh);
return 0;
}
8.下列程序的运行结果是__________________。
#include <stdio.h>
union ByteGroup{
char c[4];
int number;
};
int countOdd(union ByteGroup u){
int cnt=0,i;
for(i=0;i<4;i++){
if(u.c[i] % 2 != 0)
cnt++;
}
return cnt;
}
int main(void)
{ int k;
union ByteGroup u;
u.number = 0;
for(k=0;k<4;k++)
u.c[k] = k+1;
printf("%d",countOdd(u));
return 0; }
9.下列程序的运行结果是__________________。
#include <stdio.h>
struct Record
{
int score[5];
union Unit
{
short level;
unsigned int power;
} attr;
};
int getEvenSum(struct Record r)
{
int s = 0, i;
for(i = 0; i < 5; i++)
{
if(r.score[i] % 2 == 0)
s += r.score[i];
}
return s;
}
int main(void)
{
struct Record r1 = {{13, 26, 9, 44}};
struct Record r2;
int i;
r1.attr.level = 175;
r2 = r1;
for(i = 1; i < 4; i += 2)
r1.score[i] = r1.score[i] / 2;
if(getEvenSum(r1) != getEvenSum(r2))
r2.attr.level += 45;
printf("%d %d", r1.score[4], r2.attr.level);
return 0;
}
10.下列程序的运行结果是__________________。
#include <stdio.h>
struct BoxData
{
int data[5];
union ShortInt
{
short sh;
int n;
} tag;
};
int main(void)
{
struct BoxData b1 = {{11, 22, 33}};
struct BoxData b2;
int i;
b1.tag.sh = 148;
b2 = b1;
for(i = 0; i < 5; i++)
{
if(i % 3 == 0)
b1.data[i] = b1.data[i] / 11;
}
if(b1.tag.sh == b2.tag.sh)
b2.tag.n = b2.tag.n + 52;
printf("%d %d", b1.data[4], b2.tag.sh);
return 0;
}
三、程序填空。按照题目要求,将正确内容填入答题卡相应位置,使程序完整(每空2分,共计30分)
1.下列程序的功能是:使用枚举定义月份,结合日期结构体,输入年月,输出该月份一共有多少天。
#include <stdio.h>
enum Month {Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec};
struct Date
{ int year;
enum Month mon;};
int isLeap(int y)
{
return _________①________;
}
int main()
{ struct Date d;
int m,days;
printf("请输入年份、月份(1-12):");
scanf("%d %d", &d.year, &m);
d.mon=________②_______;
switch(d.mon)
{ case Jan:case Mar:case May:case Jul:case Aug:case Oct:case Dec: days = 31; break;
case Apr:case Jun:case Sep:case Nov: days = 30; break;
case Feb: days = ___________③_________ break;
default: days = 0;
}
printf("该月总天数:%d 天
", days);
return 0; }
2.下列程序的功能是:使用枚举区分图形类型,结构体存储图形参数,实现矩形、正方形两种图形的面积计算,根据输入的图形类型自动计算面积。
#include <stdio.h>
enum Shape {SQUARE, RECT};
_________①________
{ enum Shape type;
int x;
int y;};
int main()
{ struct Figure f;
int sel;
printf("选择图形:0-正方形 1-矩形:");
scanf("%d", &sel);
f.type = sel;
if(________②________)
{ printf("请输入正方形边长:");
scanf("%d", &f.x);
printf("正方形面积:%d
", ________③______);
}
else
{ printf("请输入矩形长、宽:");
scanf("%d %d", &f.x, &f.y);
printf("矩形面积:%d
", f.x * f.y);
}
return 0; }
3.下列程序的功能是:循环录入 3 件商品数据存入订单内部结构体数组,遍历全部商品累加库存大于 10 的商品单价总和,最终打印订单号、全部商品信息、符合条件商品金额总和。
#include <stdio.h>
struct Goods
{
int id;
char name[16];
int stock;
int price;
};
struct Order
{
int orderId;
struct Goods item[3];
int totalMoney;
};
int calcSum(struct Goods arr[], int len)
{
int sum = 0, i;
for(i = 0; i < len; i++)
{
if(__________①__________)
{
_________②_________
}
}
return sum;
}
int main(void)
{
struct Order ord;
int i;
printf("请输入订单号:");
scanf("%d", &ord.orderId);
for(i = 0; i < 3; i++)
{
printf("请输入第%d件商品 编号 名称 库存 单价:
", i+1);
scanf("%d %s %d %d", &ord.item[i].id, ord.item[i].name, &ord.item[i].stock, &ord.item[i].price);
}
ord.totalMoney = __________③___________
printf("
=====订单信息=====
");
printf("订单号:%d
", ord.orderId);
for(i = 0; i < 3; i++)
{
printf("商品%d:编号%d,名称%s,库存%d,单价%d
",i+1,ord.item[i].id,ord.item[i].name,ord.item[i].stock,ord.item[i].price);
}
printf("库存大于10的商品总价格:%d
", ord.totalMoney);
return 0;
}
4.下列程序的功能是:录入 3 本图书信息,自定义函数接收结构体数组,找出价格最高的图书并返回该结构体,主函数打印最贵图书全部信息。
#include <stdio.h>
struct Book
{
int id;
char name[20];
int page;
float price;
};
struct Book getMaxPrice(________①_______)
{
struct Book max = arr[0];
int i;
for(i = 1; i < len; i++)
{
if(___________②___________)
{
max = arr[i];
}
}
return max;
}
int main(void)
{
struct Book bk[3], maxBook;
int i;
for(i = 0; i < 3; i++)
{
printf("输入第%d本书 书号 书名 页数 价格:
",i+1);
scanf("%d %s %d %f", ___________③_________);
}
maxBook = getMaxPrice(bk, 3);
printf("
价格最高图书信息:
");
printf("书号:%d 书名:%s 页数:%d 价格:%.2f
",
maxBook.id,maxBook.name,maxBook.page,maxBook.price);
return 0;
}
5.下列程序的功能是:录入订单与两个日期,自定义函数接收两个日期结构体,判断发货日期是否晚于下单日期,输出判断结果。
#include <stdio.h>
struct Date
{
int year;
int month;
int day;
};
struct OrderInfo
{
int orderId;
struct Date buy;
struct Date send;
};
int isDelay(struct Date b, struct Date s)
{
if(___________①_________)
return 1;
else if(s.year == b.year && ________②_______)
return 1;
else if(s.year == b.year && s.month == b.month _______③______)
return 1;
return 0;
}
int main(void)
{ int res;
struct OrderInfo ord;
printf("输入订单号:");
scanf("%d", &ord.orderId);
printf("输入下单日期 年 月 日:");
scanf("%d %d %d", &ord.buy.year, &ord.buy.month, &ord.buy.day);
printf("输入发货日期 年 月 日:");
scanf("%d %d %d", &ord.send.year, &ord.send.month, &ord.send.day);
res = isDelay(ord.buy, ord.send);
printf("订单%d:", ord.orderId);
if(res == 1)
printf("发货日期晚于下单日期
");
else
printf("发货日期早于/等于下单日期
");
return 0;
}
四、阅读程序:修改程序中的错误,不得增行或删行,也不得更改程序结构。请在答题卡中指出错误代码所在的行号,并给出该行修改后的程序代码。(每空2分,共计20分)
1.下列程序的功能是:录入 6 个整数,自定义函数接收单个结构体值判断是否自守并回填标记;遍历输出全部自守数,统计总数。以下程序只允许修改两行。
L1.#include <stdio.h>
L2.struct NumInfo
L3.{ int num;
L4. long powNum;
L5. int isAuto;};
L6.struct NumInfo judgeAuto(struct NumInfo n)
L7.{ int val = n.num,ori,mod;
L8. long square = (long)val * val;
L9. n.powNum = square;
L10. ori = val;
L11. mod = 1;
L12. while(val > 0)
L13. { mod *= 10;
L14. val /= 10; }
L15. if(square / mod == ori)
L16. n.isAuto = 1;
L17. else
L18. n.isAuto = 0;
L19. return n;
L20. }
L21. int main(void)
L22.{
L23. struct NumInfo arr[6];
L24. int i, count = 0;
L25. for(i = 0; i < 6; i++)
L26. {
L27. printf("输入第%d个正整数:", i + 1);
L28. scanf("%d", &arr[i].num);
L29. arr[i] = judgeAuto(arr[i]);
L30. }
L31. printf("
====所有自守数信息====
");
L32. for(i = 0; i < 6; i++)
L33. {
L34. if(arr[i] == 1)
L35. {
L36. printf("数字:%d 平方:%ld
", arr[i].num, arr[i].powNum);
L37. count++;
L38. }
L39. }
L40. printf("自守数总共有:%d 个
", count);
L41. return 0;
L42.}
2.下列程序的功能是:录入 5 个数,函数接收结构体值生成反转数并设置标记;打印全部回文,统计数量。以下程序只允许修改两行。
L1.#include <stdio.h>
L2.struct PalinNum
L3.{
L4. int num;
L5. int revNum;
L6. int isPalin;
L7.};
L8.struct PalinNum checkPalin(struct PalinNum p)
L9.{
L10. int temp = p.num;
L11. int rev = 0;
L12. while(temp > 0)
L13. {
L14. rev = rev * 10 + temp % 100;
L15. temp /= 10;
L16. }
L17. p.revNum = rev;
L18. if(rev != p.num)
L19. p.isPalin = 1;
L20. else
L21. p.isPalin = 0;
L22. return p;
L23.}
L24.int main(void)
L25.{
L26. struct PalinNum arr[5];
L27. int i, cnt = 0;
L28. for(i = 0; i < 5; i++)
L29. {
L30. printf("输入第%d个正整数:", i + 1);
L31. scanf("%d", &arr[i].num);
L32. arr[i] = checkPalin(arr[i]);
L33. }
L34. printf("
====回文数字====
");
L35. for(i = 0; i < 5; i++)
L36. {
L37. if(arr[i].isPalin == 1)
L38. {
L39. printf("原数:%d 反转:%d
", arr[i].num, arr[i].revNum);
L40. cnt++;
L41. }
L42. }
L43. printf("回文总数:%d
", cnt);
L44. return 0;
L45.}
3.下列程序的功能是:循环录入 7 个正整数,依次调用函数完成该数字所有十进制位累加和的运算;遍历数组打印全部数字与对应各位和,最后单独筛选并打印所有各位累加和大于 20 的数字。以下程序只允许修改三行。
L1.#include <stdio.h>
L2.struct DigitSum
L3.{
L4. int oriNum;
L5. int sum;
L6.};
L7.struct DigitSum calcDigit(DigitSum d)
L8.{
L9. int temp = d.oriNum;
L10. int s = 0;
L11. while(temp < 0)
L12. {
L13. s += temp % 10;
L14. temp /= 10;
L15. }
L16. d.sum = s;
L17. return d;
L18.}
L19.int main(void)
L20.{
L21. struct DigitSum arr[7];
L22. int i;
L23. for(i = 0; i < 7; i++)
L24. {
L25. printf("输入第%d个正整数:", i + 1);
L26. scanf("%d", arr[i].oriNum);
L27. arr[i] = calcDigit(arr[i]);
L28. }
L29. printf("
====全部数字与各位和====
");
L30. for(i = 0; i < 7; i++)
L31. printf("数字%d 和:%d
", arr[i].oriNum, arr[i].sum);
L32. printf("
各位和大于20的数字:");
L33. for(i = 0; i < 7; i++)
L34. {
L35. if(arr[i].sum > 20)
L36. printf("%d ", arr[i].oriNum);
L37. }
L38. return 0;
L39.}
4.下列程序的功能是:程序内部预定义 8 个整数存入结构体数组,自定义函数接收单个结构体值,通过循环整除判断数字是否为质数,回填标记并返回;程序自动遍历数组完成全部数字判定,遍历打印所有质数,最后输出数组内质数总个数。以下程序只允许修改三行。
L1.#include <stdio.h>
L2.struct NumTag
L3.{
L4. int val;
L5. int isPrime;
L6.};
L7.struct NumTag checkPrime(struct NumTag n)
L8.{
L9. int num = n.val,flag,i;
L10. if(num <= 1)
L11. {
L12. n.isPrime = 1;
L13. return n;
L14. }
L15. flag = 1;
L16. for(i = 2; i * i <= num; i++)
L17. {
L18. if(num % i == 0)
L19. {
L20. flag = 0;
L21. continue;
L22. }
L23. }
L24. n.isPrime = flag;
L25. return n;
L26.}
L27.int main(void)
L28.{
L29. struct NumTag arr[8] = {{2},{3},{4},{9},{11},{15},{17},{20}};
L30. int i, count = 0;
L31. for(i = 0; i < 8; i++)
L32. arr[i] = checkPrime(arr[i]);
L33. printf("数组内质数:");
L34. for(i = 0; i < 8; i++)
L35. {
L36. if(!arr[i].isPrime)
L37. {
L38. printf("%d ", arr[i].val);
L39. count++;
L40. }
L41. }
L42. printf("
质数总数:%d
", count);
L43. return 0;
L44.}
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
学科网(北京)股份有限公司
学科网(北京)股份有限公司
$
编写说明:湖南省普通高校对口招生专业理论考试《计算机应用类专业综合考纲百套卷》,依据《湖南省普通高校对口招生计算机应用类专业综合知识基本要求及考试大纲》编写。每门课程均分三层训练:基础层(具象化支架)拆解考点为微目标,紧扣考纲 “掌握”“理解” 要求编写考点训练卷;巩固层(关联性支架)强化知识交叉与场景关联,按考纲专题编专题训练卷;应用层(引导性支架)聚焦真题突破,结合知识模块与教材编写课程综合卷。
本试卷是第94卷,按《计算机编程语言——C语言》范围和要求编写。具体内容为:①结构体变量的定义和引用;②结构体数组、共用体和枚举类型。
湖南省《计算机应用类专业综合考纲百套卷》 第94卷
《计算机编程语言——C语言》
结构体和共用体
专题训练卷
考试时间60分钟 满分100分
班级________姓名________学号________成绩________
一、单项选择题(本大题共15小题,每题2分,共30分)
1.设有以下定义,则下列代码中合法访问 num 成员的是( )
struct Info {
char ch;int num;double score;};
struct Info data = {'A',12,88.5};
A. Info.num B. data->num C. data.num D. data [0].num
【答案】C
【解析】.运算符用于普通结构体变量访问成员,正确;
A 错误:Info是结构体类型名,必须搭配结构体变量才能访问成员;
B 语法本身合法,但->运算符仅用于结构体指针变量,data是普通结构体变量,变量类型不匹配,无法编译;
D 语法用于结构体数组元素访问,data不是数组,场景不匹配。
2.关于同类型结构体变量赋值,下列说法正确的是( )
A. 两个同类型结构体变量,可直接使用 = 完成整体赋值拷贝
B. 结构体变量不允许整体赋值,只能逐个成员赋值
C. 结构体初始化列表的成员数量必须大于结构体总成员数
D. 不同类型结构体变量之间可直接整体赋值
【答案】A
【解析】C 语言标准规定,同类型结构体支持直接整体赋值;初始化列表成员数量≤结构体成员总数;类型不同结构体不能直接整体拷贝。
3.设有以下定义,则以下语句语法完全合法、可正常运行的是( )
struct Book{
char name[20];int page;};
struct Book b1 = {"C语言",120}, b2;
A. b2 = {"Python",99}; B. b2.name = "Java";
C. b2 = b1; D. b2.page = b1.name;
【答案】C
【解析】仅变量初始化阶段允许大括号整体赋初值,运行过程中不支持,A 错误;字符数组名为常量地址,不支持直接字符串赋值,B 错误;int 与字符数组类型不兼容,D 错误;同结构体变量整体赋值符合 C 标准。
4.设有以下定义,则数组元素 stu[4].id 的值为( )
struct Student{int id;} stu[5] = {{1},{2},{3}};
A. 随机垃圾值 B. 4 C. 0 D. 3
【答案】C
【解析】C 语言初始化规则:结构体数组部分初始化时,所有未显式赋值的成员自动初始化为 0。
5.下列枚举类型定义完全符合 C 语言语法规范、可正常编译的是( )
A. enum Week {Mon=1,Tue,Wed=5,Thu};
B. enum Week {1,2,3,4};
C. enum Week {Mon;Tue;Wed};
D. enum Week {Mon="周一",Tue};
【答案】A
【解析】枚举常量必须是合法标识符,分隔符为逗号,只能赋值整型常量;B 常量直接写数字非法;C 分隔符误用分号;D 不能给枚举常量赋值字符串。
6.设有定义:enum Color{Red,Green=5,Blue};,则枚举常量 Blue 对应的整型数值是( )
A. 2 B. 6 C. 3 D. 5
【答案】B
【解析】枚举默认从 0 依次自增,Red=0;Green 手动赋值为 5,后续常量自动在前一个数值基础上 + 1,因此 Blue=6。
7.关于共用体内存布局,下列描述正确的是( )
A. 共用体占用内存 = 内部所有成员占用字节之和
B. 共用体内所有成员共享同一块起始内存空间
C. 共用体每个成员拥有独立互不重叠的内存地址
D. 共用体不支持同时存放 char、int、double 多种基础类型
【答案】B
【解析】共用体核心特性:全部成员共用同一片内存,占用内存大小等于占用字节最多的成员;A 是结构体的内存特征。
8.设有以下定义,若不考虑内存对齐,union TagU 占用字节为( )
struct Tag{short a;char b;};
union TagU{struct Tag t;double num;};
A. 3 B. 8 C. 11 D. 9
【答案】B
【解析】结构体 Tag 总占用 3 字节,小于 double 的 8 字节;共用体取最大成员长度,整体占用 8 字节。
9.设有以下定义,则下列语句无法通过编译的是( )
struct Person{char name[10];int age;} p1 = {"Li",18}, p2;
A. p2 = p1; B. p2.age = p1.age + 2;
C. p2.name = p1.name; D. printf ("% s",p1.name);
【答案】C
【解析】数组名是地址常量,不支持直接使用=完成字符数组拷贝,如需复制字符串必须使用 strcpy 函数。
10.设有以下定义,正确访问 point 成员的写法是( )
struct Game{
char name[16];
union Score{
int point;
float rate; } sc;
};
struct Game g = {"LOL",{98}};
A. g.sc.point B. g.Score.point
C. g.point D. sc.point
【答案】A
【解析】嵌套结构体 + 共用体访问规则:外层结构体变量。共用体成员变量名。共用体内成员。Score 是共用体类型名,不能直接访问。
11.下列代码无法正常输出字符串 "Mimi" 的是( )
struct Cat{int age;char name[8];};
struct Cat c1 = {2,"Mimi"};
A. printf ("% s",c1.name);
B. char s [8] = c1.name; printf ("% s",s);
C. puts (c1.name);
D. int i;for(i=0;c1.name [i]!='\0';i++) putchar (c1.name [i]);
【答案】B
【解析】字符数组是数组类型,不能直接使用=整体拷贝初始化,该行代码编译失败。
12.设有以下定义,则s[1].lv、s[1].score的值依次为( )
struct Score{
enum Level{Low,Mid,High} lv;
int score; } s[2] = {{Mid,75},{High}};
A. High、0 B. 2、0 C. High、随机值 D. 2、75
【答案】B
【解析】枚举 Low=0,Mid=1,High=2;第二个结构体仅初始化 lv 成员,score 未显式赋值,自动清零,因此 lv=2,score=0。
13.执行以下程序的输出结果是( )
#include <stdio.h>
struct Fruit{
int weight;
union Tag{
short size;
double price;}t;
};
int main(void)
{ struct Fruit f = {200,{15}};
printf("%d",f.t.size);
return 0; }
A. 200 B. 15 C. 0 D. 随机小数
【答案】B
【解析】嵌套共用体初始化给 short 成员赋值 15,正常通过.t.size访问输出 15。
14.执行以下程序的输出结果是( )
#include <stdio.h>
struct Book{ int page;};
void change(struct Book s)
{ s.page = 999;}
int main(void)
{ struct Book b = {120};
change(b);
printf("%d",b.page);
return 0; }
A. 120 B. 999 C. 0 D. 随机值
【答案】A
【解析】结构体作为函数参数是值传递,函数内修改的是副本,原变量不受影响。
15.执行以下程序的输出结果是( )
#include <stdio.h>
struct Car{int id;};
int main(void)
{ struct Car c1 = {88},c2;
c2 = c1;
c1.id = 99;
printf("%d",c2.id);
return 0; }
A. 88 B. 99 C. 0 D. 随机数
【答案】A
【解析】同类型结构体赋值是内存拷贝,二者内存完全独立;修改 c1 不会影响 c2 的值。
二、阅读程序,写出运行结果(本大题共10小题。每空2分,合计20分)
1.下列程序的运行结果是__________________。
#include <stdio.h>
struct Goods{
int id;
char name[5];
}g[3] = {{101,"Apple"}};
int main(void)
{
int i;
for(i=0;i<3;i++){
if(g[i].id == 0){
g[i].name[0] = 'Z';
}
}
printf("%c%d",g[2].name[0],g[1].id);
return 0; }
【答案】Z0
2.下列程序的运行结果是__________________。
#include <stdio.h>
struct Block{
int data[3];
union{
short s;
double f;
};
};
void modify(struct Block b){
int i;
for(i=0;i<3;i++){
b.data[i] += 10;
}
b.s = 200;
}
int main(void)
{
struct Block b1 = {10,20,{50}};
struct Block b2 = b1;
modify(b1);
printf("%d",b2.data[2]);
return 0; }
【答案】50
3.下列程序的运行结果是__________________。
#include <stdio.h>
struct Toy{
union U{
int code;
char str[3];
}u;
int stock;
}toy[2] = {{ {150}, 25 }};
int main(void)
{
int i,total=0;
for(i=0;i<2;i++){
total += toy[i].stock;
}
printf("%d",total);
return 0; }
【答案】25
4.下列程序的运行结果是__________________。
#include <stdio.h>
union FourByte{
char buf[4];
int num;
};
int getSum(union FourByte u){
int sum=0,i;
for(i=0;i<4;i++)
sum += u.buf[i];
return sum;
}
int main(void)
{ int k;
union FourByte u;
u.num = 0;
for(k=0;k<4;k++)
u.buf[k] = k * 4;
printf("%d",getSum(u));
return 0; }
【答案】24
5.下列程序的运行结果是__________________。
#include <stdio.h>
struct Apple{
int size[3];
union U{
short weight;
double price;
}u;
};
int main(void)
{
struct Apple a1 = {{5, 10}};
struct Apple a2;
int i;
a1.u.weight = 200;
a2 = a1;
for(i = 0; i < 3; i++)
a1.size[i] *= 3;
if(a1.u.weight == a2.u.weight)
a2.u.weight += 100;
printf("%d", a2.u.weight);
return 0;
}
【答案】300
6.下列程序的运行结果是__________________。
#include <stdio.h>
struct Layer{
int num;
union U{
char arr[4];
int val;
}u;
};
void loopChange(struct Layer l){
int i;
for(i=0;i<4;i++)
l.u.arr[i] += 5;
}
int main(void)
{
struct Layer l1 = {10,{20}};
loopChange(l1);
printf("%d",l1.u.arr[0]);
return 0; }
【答案】20
7.下列程序的运行结果是__________________。
#include <stdio.h>
struct Box {
int data[4];
union Tag {
short sh;
int n;
} tag;
};
int main(void) {
struct Box b1 = {{1, 3, 5}};
struct Box b2;
int i;
b1.tag.sh = 120;
b2 = b1;
for (i = 0; i < 4; i++) {
if (i % 2 == 0)
b1.data[i] *= 2;
}
if (b1.tag.sh == b2.tag.sh) {
b2.tag.n += 36;
}
printf("%d %d", b1.data[3], b2.tag.sh);
return 0;
}
【答案】0 156
8.下列程序的运行结果是__________________。
#include <stdio.h>
union ByteGroup{
char c[4];
int number;
};
int countOdd(union ByteGroup u){
int cnt=0,i;
for(i=0;i<4;i++){
if(u.c[i] % 2 != 0)
cnt++;
}
return cnt;
}
int main(void)
{ int k;
union ByteGroup u;
u.number = 0;
for(k=0;k<4;k++)
u.c[k] = k+1;
printf("%d",countOdd(u));
return 0; }
【答案】2
9.下列程序的运行结果是__________________。
#include <stdio.h>
struct Record
{
int score[5];
union Unit
{
short level;
unsigned int power;
} attr;
};
int getEvenSum(struct Record r)
{
int s = 0, i;
for(i = 0; i < 5; i++)
{
if(r.score[i] % 2 == 0)
s += r.score[i];
}
return s;
}
int main(void)
{
struct Record r1 = {{13, 26, 9, 44}};
struct Record r2;
int i;
r1.attr.level = 175;
r2 = r1;
for(i = 1; i < 4; i += 2)
r1.score[i] = r1.score[i] / 2;
if(getEvenSum(r1) != getEvenSum(r2))
r2.attr.level += 45;
printf("%d %d", r1.score[4], r2.attr.level);
return 0;
}
【答案】0 220
10.下列程序的运行结果是__________________。
#include <stdio.h>
struct BoxData
{
int data[5];
union ShortInt
{
short sh;
int n;
} tag;
};
int main(void)
{
struct BoxData b1 = {{11, 22, 33}};
struct BoxData b2;
int i;
b1.tag.sh = 148;
b2 = b1;
for(i = 0; i < 5; i++)
{
if(i % 3 == 0)
b1.data[i] = b1.data[i] / 11;
}
if(b1.tag.sh == b2.tag.sh)
b2.tag.n = b2.tag.n + 52;
printf("%d %d", b1.data[4], b2.tag.sh);
return 0;
}
【答案】0 200
三、程序填空。按照题目要求,将正确内容填入答题卡相应位置,使程序完整(每空2分,共计30分)
1.下列程序的功能是:使用枚举定义月份,结合日期结构体,输入年月,输出该月份一共有多少天。
#include <stdio.h>
enum Month {Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec};
struct Date
{ int year;
enum Month mon;};
int isLeap(int y)
{
return _________①________;
}
int main()
{ struct Date d;
int m,days;
printf("请输入年份、月份(1-12):");
scanf("%d %d", &d.year, &m);
d.mon=________②_______;
switch(d.mon)
{ case Jan:case Mar:case May:case Jul:case Aug:case Oct:case Dec: days = 31; break;
case Apr:case Jun:case Sep:case Nov: days = 30; break;
case Feb: days = ___________③_________ break;
default: days = 0;
}
printf("该月总天数:%d 天
", days);
return 0; }
【答案】①(y%4==0 && y%100!=0) || (y%400==0)
②m-1 ③isLeap(d.year) ? 29 : 28;
2.下列程序的功能是:使用枚举区分图形类型,结构体存储图形参数,实现矩形、正方形两种图形的面积计算,根据输入的图形类型自动计算面积。
#include <stdio.h>
enum Shape {SQUARE, RECT};
_________①________
{ enum Shape type;
int x;
int y;};
int main()
{ struct Figure f;
int sel;
printf("选择图形:0-正方形 1-矩形:");
scanf("%d", &sel);
f.type = sel;
if(________②________)
{ printf("请输入正方形边长:");
scanf("%d", &f.x);
printf("正方形面积:%d
", ________③______);
}
else
{ printf("请输入矩形长、宽:");
scanf("%d %d", &f.x, &f.y);
printf("矩形面积:%d
", f.x * f.y);
}
return 0; }
【答案】①struct Figure ②f.type == SQUARE ③f.x * f.x
3.下列程序的功能是:循环录入 3 件商品数据存入订单内部结构体数组,遍历全部商品累加库存大于 10 的商品单价总和,最终打印订单号、全部商品信息、符合条件商品金额总和。
#include <stdio.h>
struct Goods
{
int id;
char name[16];
int stock;
int price;
};
struct Order
{
int orderId;
struct Goods item[3];
int totalMoney;
};
int calcSum(struct Goods arr[], int len)
{
int sum = 0, i;
for(i = 0; i < len; i++)
{
if(__________①__________)
{
_________②_________
}
}
return sum;
}
int main(void)
{
struct Order ord;
int i;
printf("请输入订单号:");
scanf("%d", &ord.orderId);
for(i = 0; i < 3; i++)
{
printf("请输入第%d件商品 编号 名称 库存 单价:
", i+1);
scanf("%d %s %d %d", &ord.item[i].id, ord.item[i].name, &ord.item[i].stock, &ord.item[i].price);
}
ord.totalMoney = __________③___________
printf("
=====订单信息=====
");
printf("订单号:%d
", ord.orderId);
for(i = 0; i < 3; i++)
{
printf("商品%d:编号%d,名称%s,库存%d,单价%d
",i+1,ord.item[i].id,ord.item[i].name,ord.item[i].stock,ord.item[i].price);
}
printf("库存大于10的商品总价格:%d
", ord.totalMoney);
return 0;
}
【答案】①arr[i].stock > 10 ②sum += arr[i].price;
③calcSum(ord.item, 3);
4.下列程序的功能是:录入 3 本图书信息,自定义函数接收结构体数组,找出价格最高的图书并返回该结构体,主函数打印最贵图书全部信息。
#include <stdio.h>
struct Book
{
int id;
char name[20];
int page;
float price;
};
struct Book getMaxPrice(________①_______)
{
struct Book max = arr[0];
int i;
for(i = 1; i < len; i++)
{
if(___________②___________)
{
max = arr[i];
}
}
return max;
}
int main(void)
{
struct Book bk[3], maxBook;
int i;
for(i = 0; i < 3; i++)
{
printf("输入第%d本书 书号 书名 页数 价格:
",i+1);
scanf("%d %s %d %f", ___________③_________);
}
maxBook = getMaxPrice(bk, 3);
printf("
价格最高图书信息:
");
printf("书号:%d 书名:%s 页数:%d 价格:%.2f
",
maxBook.id,maxBook.name,maxBook.page,maxBook.price);
return 0;
}
【答案】①struct Book arr[], int len
②arr[i].price > max.price
③&bk[i].id, bk[i].name, &bk[i].page, &bk[i].price
5.下列程序的功能是:录入订单与两个日期,自定义函数接收两个日期结构体,判断发货日期是否晚于下单日期,输出判断结果。
#include <stdio.h>
struct Date
{
int year;
int month;
int day;
};
struct OrderInfo
{
int orderId;
struct Date buy;
struct Date send;
};
int isDelay(struct Date b, struct Date s)
{
if(___________①_________)
return 1;
else if(s.year == b.year && ________②_______)
return 1;
else if(s.year == b.year && s.month == b.month _______③______)
return 1;
return 0;
}
int main(void)
{ int res;
struct OrderInfo ord;
printf("输入订单号:");
scanf("%d", &ord.orderId);
printf("输入下单日期 年 月 日:");
scanf("%d %d %d", &ord.buy.year, &ord.buy.month, &ord.buy.day);
printf("输入发货日期 年 月 日:");
scanf("%d %d %d", &ord.send.year, &ord.send.month, &ord.send.day);
res = isDelay(ord.buy, ord.send);
printf("订单%d:", ord.orderId);
if(res == 1)
printf("发货日期晚于下单日期
");
else
printf("发货日期早于/等于下单日期
");
return 0;
}
【答案】①s.year > b.year
②s.month > b.month
③&& s.day > b.day
四、阅读程序:修改程序中的错误,不得增行或删行,也不得更改程序结构。请在答题卡中指出错误代码所在的行号,并给出该行修改后的程序代码。(每空2分,共计20分)
1.下列程序的功能是:录入 6 个整数,自定义函数接收单个结构体值判断是否自守并回填标记;遍历输出全部自守数,统计总数。以下程序只允许修改两行。
L1.#include <stdio.h>
L2.struct NumInfo
L3.{ int num;
L4. long powNum;
L5. int isAuto;};
L6.struct NumInfo judgeAuto(struct NumInfo n)
L7.{ int val = n.num,ori,mod;
L8. long square = (long)val * val;
L9. n.powNum = square;
L10. ori = val;
L11. mod = 1;
L12. while(val > 0)
L13. { mod *= 10;
L14. val /= 10; }
L15. if(square / mod == ori)
L16. n.isAuto = 1;
L17. else
L18. n.isAuto = 0;
L19. return n;
L20. }
L21. int main(void)
L22.{
L23. struct NumInfo arr[6];
L24. int i, count = 0;
L25. for(i = 0; i < 6; i++)
L26. {
L27. printf("输入第%d个正整数:", i + 1);
L28. scanf("%d", &arr[i].num);
L29. arr[i] = judgeAuto(arr[i]);
L30. }
L31. printf("
====所有自守数信息====
");
L32. for(i = 0; i < 6; i++)
L33. {
L34. if(arr[i] == 1)
L35. {
L36. printf("数字:%d 平方:%ld
", arr[i].num, arr[i].powNum);
L37. count++;
L38. }
L39. }
L40. printf("自守数总共有:%d 个
", count);
L41. return 0;
L42.}
【答案】①L15. if(square % mod == ori)
②L34. if(arr[i].isAuto == 1)
2.下列程序的功能是:录入 5 个数,函数接收结构体值生成反转数并设置标记;打印全部回文,统计数量。以下程序只允许修改两行。
L1.#include <stdio.h>
L2.struct PalinNum
L3.{
L4. int num;
L5. int revNum;
L6. int isPalin;
L7.};
L8.struct PalinNum checkPalin(struct PalinNum p)
L9.{
L10. int temp = p.num;
L11. int rev = 0;
L12. while(temp > 0)
L13. {
L14. rev = rev * 10 + temp % 100;
L15. temp /= 10;
L16. }
L17. p.revNum = rev;
L18. if(rev != p.num)
L19. p.isPalin = 1;
L20. else
L21. p.isPalin = 0;
L22. return p;
L23.}
L24.int main(void)
L25.{
L26. struct PalinNum arr[5];
L27. int i, cnt = 0;
L28. for(i = 0; i < 5; i++)
L29. {
L30. printf("输入第%d个正整数:", i + 1);
L31. scanf("%d", &arr[i].num);
L32. arr[i] = checkPalin(arr[i]);
L33. }
L34. printf("
====回文数字====
");
L35. for(i = 0; i < 5; i++)
L36. {
L37. if(arr[i].isPalin == 1)
L38. {
L39. printf("原数:%d 反转:%d
", arr[i].num, arr[i].revNum);
L40. cnt++;
L41. }
L42. }
L43. printf("回文总数:%d
", cnt);
L44. return 0;
L45.}
【答案】①L14. rev = rev * 10 + temp % 10;
②L18. if(rev == p.num)
3.下列程序的功能是:循环录入 7 个正整数,依次调用函数完成该数字所有十进制位累加和的运算;遍历数组打印全部数字与对应各位和,最后单独筛选并打印所有各位累加和大于 20 的数字。以下程序只允许修改三行。
L1.#include <stdio.h>
L2.struct DigitSum
L3.{
L4. int oriNum;
L5. int sum;
L6.};
L7.struct DigitSum calcDigit(DigitSum d)
L8.{
L9. int temp = d.oriNum;
L10. int s = 0;
L11. while(temp < 0)
L12. {
L13. s += temp % 10;
L14. temp /= 10;
L15. }
L16. d.sum = s;
L17. return d;
L18.}
L19.int main(void)
L20.{
L21. struct DigitSum arr[7];
L22. int i;
L23. for(i = 0; i < 7; i++)
L24. {
L25. printf("输入第%d个正整数:", i + 1);
L26. scanf("%d", arr[i].oriNum);
L27. arr[i] = calcDigit(arr[i]);
L28. }
L29. printf("
====全部数字与各位和====
");
L30. for(i = 0; i < 7; i++)
L31. printf("数字%d 和:%d
", arr[i].oriNum, arr[i].sum);
L32. printf("
各位和大于20的数字:");
L33. for(i = 0; i < 7; i++)
L34. {
L35. if(arr[i].sum > 20)
L36. printf("%d ", arr[i].oriNum);
L37. }
L38. return 0;
L39.}
【答案】①L7.struct DigitSum calcDigit(struct DigitSum d)
②L11. while(temp > 0)
③L26. scanf("%d", &arr[i].oriNum);
4.下列程序的功能是:程序内部预定义 8 个整数存入结构体数组,自定义函数接收单个结构体值,通过循环整除判断数字是否为质数,回填标记并返回;程序自动遍历数组完成全部数字判定,遍历打印所有质数,最后输出数组内质数总个数。以下程序只允许修改三行。
L1.#include <stdio.h>
L2.struct NumTag
L3.{
L4. int val;
L5. int isPrime;
L6.};
L7.struct NumTag checkPrime(struct NumTag n)
L8.{
L9. int num = n.val,flag,i;
L10. if(num <= 1)
L11. {
L12. n.isPrime = 1;
L13. return n;
L14. }
L15. flag = 1;
L16. for(i = 2; i * i <= num; i++)
L17. {
L18. if(num % i == 0)
L19. {
L20. flag = 0;
L21. continue;
L22. }
L23. }
L24. n.isPrime = flag;
L25. return n;
L26.}
L27.int main(void)
L28.{
L29. struct NumTag arr[8] = {{2},{3},{4},{9},{11},{15},{17},{20}};
L30. int i, count = 0;
L31. for(i = 0; i < 8; i++)
L32. arr[i] = checkPrime(arr[i]);
L33. printf("数组内质数:");
L34. for(i = 0; i < 8; i++)
L35. {
L36. if(!arr[i].isPrime)
L37. {
L38. printf("%d ", arr[i].val);
L39. count++;
L40. }
L41. }
L42. printf("
质数总数:%d
", count);
L43. return 0;
L44.}
【答案】①L12. n.isPrime = 0;
②L21. break;
③L36. if(arr[i].isPrime == 1)
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
学科网(北京)股份有限公司
学科网(北京)股份有限公司
$