结构体和共用体习题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
习题六
1. 从下列四个选项中选择一个正确的填入括号中。
(1)在说明一个结构体变量时系统分配给它的存储空间是(D)。
A该结构体中第一个成员所需存储空间
B该结构体中最后一个成员所需存储空间
C该结构体中占用最大存储空间的成员所需存储空间
D该结构体中所有成员所需存储空间的总和
(2)在说明一个共用体变量时系统分配给它的存储空间是(D )。
A该共用体中第一个成员所需存储空间
B该共用体中最后一个成员所需存储空间
C该共用体中占用最大存储空间的成员所需存储空间
D该共用体中所有成员所需存储空间的总和
(3)共用体类型在任何给定时刻, (B)。
A所有成员一直驻留在内存中
B只有一个成员驻留在内存中
C部分成员驻留在内存中
D没有成员驻留在内存中
(4)以下定义结构体类型的变量st1,其中不正确的是(A )
A typedef stuct student
{
int num;
int age;
}STD;
STD st1;
B struct student
{
int num,age;
}st1;
C struct
{
int num;
float age;
}st1;
D struct student
{
int num;
int age;
};
struct student st1;
(5)已知职工记录描述为:
struct workers
{
int no;
char name[20];
char sex;
struct
{
int day;
int month;
int year;
}birth;
};
struct workers w;
设变量w中的”生日”应是”1993年10月25日”,下列对”生日”的正确赋值方式是(C)。
A day=25; month=10; year=1993;
B w.day=25w.month=10; w.year=1993;
C w.birth.day=25; w.birth.month=10; w.birth.year=1993;
D birth.day=25; birth.month=10; birth.year=1993;
(6)设有如下定义:
struct sk
{
int a;
float b;
}data,*p;
若有p=&data;则对data中的a成员的正确引用是(B)。
A (*p).data.a
B (*p).a
C p->data.a
D p.data.a
2.填空
(1)若有以下说明和定义且数组w和变量k已正确赋值,则对w数组中第k个元素中各成员的正确引用形式是w[k-1].b、w[k-1].c 、w[k-1].d 。
struct aa
{
int b;
char c;
double d;
};
struct aa w[10];
int k=3;
(2)若有以下说明和定义,则对x.b成员的另外两种引用形式是x->b-> 和p.b. 。
struct st
{
int a;
struct st *b;
}*p, x;
p=&x;
3.阅读下面程序,写出运行结果。
(1)98765432,ffffffcc
#include <stdio.h>
main( )
{
struct byte
{
int x;
char y;
};
union
{
int i[2];
long j;
char m[2];
struct byte d;
}r,*s=&r;s->j=0x98765432;
printf("%x,%x\n",s->d.x,s->d.y);
}
(2)结果:1,minicomputer
#include <stdio.h>
struct tree
{
int x;
char *s;
}t;
func(struct tree t )
{
t.x=10;
t.s="computer";
return(0);
}
main()
{
t.x=1;
t.s="minicomputer";
func(t);
printf("%d,%s\n",t.x,t.s);
}
#include <stdio.h>..................................................结果:.0,<null>
struct tree
int x;
char *s;
}t;
func(struct tree t )
{
t.x=10;
t.s="computer";
return(0);
}
main()
{
//t.x=1;
//t.s="minicomputer";
func(t);
printf("%d,%s\n",t.x,t.s);
}
(3)结果:34,12
#include <stdio.h>
main()
{
union
{
char s[2];
int i;
}a;
a.i=0x1234;
printf("%x,%x\n",a.s[0],a.s[1]);
}
(4)结果:1,2,30
#include <stdio.h>
struct st
{
int x;
int *y;
}*p;
int s[]={10,20,30,40};
struct st a[]={1,&s[0],2,&s[1],3,&s[2],4,&s[3]};
main()
{
p=a;
printf("%d,",p->x);
printf("%d,",(++p)->x);
printf("%d,",*(++p)->y);
(5)结果:8
typedef union{
long a[2];
int b;
char c[8];
}TY;
TY our;
main()
{
printf(“%d\n”,sizeof(our));
}
4. 编写程序输入一个学生记录, 记录包含学号、姓名、性别和成绩信息,从键盘输入这些数据,并且显示出来。
#include<stdio.h>
struct student
{
int no;
char name[20];
char sex[2];
float score;
}stu1;
main()
{
printf("*********请输入该学生的学号、姓名、性别和成绩:\n");
scanf("%d %s %s %f",&stu1.no,,stu1.sex,&stu1.score);
printf("学号:%d\n 姓名:%s\n 性别:%s\n 成绩:%f\n",stu1.no,,stu1.sex,stu1.score);
}
/*5.有若干运动员,每个运动员包括编号、姓名、性别、年龄、身高、体重。
如果性别为男,参赛项目为长跑和登山;
如果性别为女,参赛项目为短跑、跳绳。
用一个函数输入运动员信息,用另一个函数输出运动员的信息
,再建立一个函数求所有参赛运动员每个项目的平均成绩。
*/
#include<stdio.h>
#include<string.h>
char items1[2]={'长跑','登山'};
char items2[2]={'短跑','跳绳'};
void InputAthInfo();
void outputAthInfo();
void items_Avg();
struct athlete
{
int num;
char name[10];
char sex;
int age;
float height;
float weight;
char items[2];
}ath[2];
void InputAthInfo()
{
int i;
for( i=0;i<2;i++)
{
printf("请输入第%d个运动员的信息:",i);
scanf("编号:%d\n 姓名:%s\n 性别:%c\n 年龄:%d\n 身高:%f\n 体重:%f\n ",&ath[i].num ,ath[i].name,ath[i].sex,&ath[i].age,&ath[i].height,&ath[i].weight);
}
}
void outputAthInfo()
{ int j;
printf("编号\t 姓名\t 性别\t 年龄\t 身高\t 体重\t 项目\n" );
for(j=0;j<2;j++)
{
if(ath[j].sex=='m'||ath[j].sex=='M')
strcpy(ath[j].items ,items1);
else
strcpy(ath[j].items,items2);
//printf("第%d个运动员的信息是:",j)
printf("%d\t %s\t %c\ t%d\t %f\t %f\t %s\t %s\t",ath[j].num,ath[j].name,ath[j].sex,ath[j].age,ath[j].height,ath[j].weight,ath[ j].items[0],ath[j].items[1]);
}
}
void items_Avg()
{
int i;
float sum1=0,sum2=0,avg1,avg2;
for(i=0;i<2;i++)
{
sum1+=ath[i].items[0];
avg1=sum1/2;
sum2+=ath[i].items[1];
avg2=sum2/2;
}
printf("%-3f%-3f",avg1,avg2);
}
void main()
{
void InputAthInfo();
void outputAthInfo();
void items_Avg();
}
6.一个班有30名学生,每个学生的数据包括学号、姓名、性别、及2门课的成绩,现从键盘上输入这些数据,并且要求:
(1) 输出每个学生2门课的平均分。
(2) 输出每门课的全班平均分。
(3) 输出姓名为”zhangliang”的学生的2门课的成绩。
/*6.一个班有30名学生,每个学生的数据包括学号、姓名、性别、及2门课的成绩,现从
键盘上输入这些数据,并且要求:
(1) 输出每个学生2门课的平均分。
(2) 输出每门课的全班平均分。
(3) 输出姓名为”zhangliang”的学生的2门课的成绩。
*/
#include<stdio.h>
#include<string.h>
#define N 2
void Input_Info();
void score_avg();
void everyStu_avgScore();
void score_zhangliang();
void main()
{
Input_Info();
score_avg();
everyStu_avgScore();
score_zhangliang();
}
struct student
{
int no;
char name[20];
char sex[2];
float score1;
float score2;
}stu[N];
void Input_Info()
{
int i;
printf("*************输入该班所有人的信息:(学号、姓名、性别、数学成绩、英语成绩,并用空格隔开)\n");
//printf("学号\t 姓名\t 性别\t 数学\t 英语");
for(i=0;i<N;i++)
{
printf("请输入第%d个人的信息:\n",i);
scanf("%d %s %s %f %f",&stu[i].no,stu[i].name,stu[i].sex,&stu[i].score1,&stu[i].sco re2);
}
}
void everyStu_avgScore()//(1) 输出每个学生2门课的平均分。
{
float oneself_avg[N]={0.0f};
int i;
for(i=0;i<N;i++)
oneself_avg[i]=(stu[i].score1+stu[i].score2)/2;
for(i=0;i<N;i++)
printf("第%d个学生的两门课平均分为%5.2f\n",i,oneself_avg[i]);
}
void score_avg()//(2) 输出每门课的全班平均分
{
float sum1=0.0f,avg1,sum2=0.0f,avg2;
int i;
for(i=0;i<N;i++)
{
sum1+=stu[i].score1;
sum2+=stu[i].score2;
}
avg1=(sum1)/2;
avg2=(sum2)/2;
printf("该班的数学平均成绩为%5.2f,英语平均分为%5.2f\n",avg1,avg2);
}
void score_zhangliang()//(3) 输出姓名为”zhangliang”的学生的2门课的成绩。
{
int i;
for(i=0;i<N;i++)
{
if(stu[i].name=="zhangliang")
// printf("\n");
printf("\n zhangliang同学的两门课成绩分别为:%5.2f %5.2f",stu[i].score1,stu[i].score2 );
}
}
7. 定义枚举类型money,用枚举元素代表人民币的面值。
包括1,2,5分;1,2,5角,1,2,5,10,50,100元。
enum money
{
fen1,fen2,fen5,jiao1,jiao2,jiao5,yuan1,yuan2,yuan5,yuan10,yuan20,yuan50,yuan100 }。