C语言题库第8章 结构体和共同体

合集下载

第8章练习 结构体与共用体

第8章练习     结构体与共用体

第十一章习题结构体与共用体1.以下C语言共用体类型数据的描述中,不正确的是( )A) 共用体变量占的内存大小等于所需内存最大的成员所占的内存B) 共用体类型可以出现在结构体类型定义中C) 在定义共用体变量的同时允许对第一个成员的值进行初始化D) 同一共用体中各成员的首地址不相同2.下列对结构体类型变量定义不正确的是( )A)struct teacher B) struct{ int num; { int num;int age; }teach1; int age; }teach1,teach2;C) struct D) struct teacher{ int num; { int num;int age; }teacher; int age; };struct teacher teach1; struct teacher teach1;3.若有定义:struct teacher{ int num;char name[10];char sex;int age;float score;}teacher1;则变量teacher1所占用的内存字节数是( )A) 5 B)14 C) 19 D) 204.以下程序的运行结果是( )#include <stdio.h>union Utype{ int i; float y; }u[2];void main(){ printf("sizeof(u):%d\n",sizeof(u)); }A)2 B) 4 C) 6 D) 85.设有以下定义语句:struct student{ int num; char name[10]; float score; }wang,zhang;则变量wang所占的内存字节数是( )A) 14 B) 16 C)18 D) 206.设有如下定义语句:union u_type{ int i; double x; float f; };struct str_type{ char str[100]; union u_type u[2]; };则语句“printf("%d",sizeof(struct str_type));”的输出结果是( )A)100 B) 116 C) 120 D) 200第 1 页共2 页7.下面程序的输出结果为( )#include <stdio.h>void main (){ enum Weekday {sun=7, mon=1, tue, wed, thu, fri, sat};enum Weekday day=sat;printf (“%d\n”, day); }A) 7 B) 6 C) 5 D) 48.对枚举类型进行定义,不正确的是( )A) enum b{1,2,3}; B)enum a{A,B,C}; C)enum c{D=3,E,F}; D) enum d{X=0,Y=5,Z=9};9.假定已有如下变量说明和枚举定义:char ch;int j, k;enum day{sun, mon, tue, wed, thu, fri, sat};int a[sat];判断下列语句是否符合语法规则,结果是( )char a; /*语句1*/j+k=j; /*语句2*/if(a[mon]>0) j++; /*语句3*/A)语句2错误,其他正确 B)语句1正确,其他错误C)语句3正确,其他错误 D) 语句1错误,其他正确10.若有以下说明和定义typedef int *INTEGERINTEGER p,*q;以下叙述正确的是( )A) p是int型变量B) p是基类型为int的指针变量C) q是基类型为int的指针变量D) 程序中可用INTEGER代替int类型名11.设有如下定义:typedef int *INTEGER;INTEGER p,*q;则( )是正确的叙述A)p是int型变量 B)q是基类型为int的指针变量C)p是基类型为int的指针变量 D) 程序中可用INTERGER代替int类型名12.若有以下类型说明,叙述正确的是( )typedef struct{ int num;char *name;int score;}STU, *PSTU;A) STU 是变量名 B) PSTU是变量名C) PSTU是指向结构体类型的STU的指针类型名 D) 类型说明语句有错误第 2 页共2 页。

c语言结构体共用体数据类型求大小例题

c语言结构体共用体数据类型求大小例题

c语言结构体共用体数据类型求大小例题(原创版)目录一、C 语言结构体和共用体的概念二、结构体和共用体的大小计算方法三、例题解析四、总结正文一、C 语言结构体和共用体的概念C 语言中,结构体和共用体是两种特殊的数据类型,它们都可以用来描述一个复合数据类型。

结构体和共用体的主要区别在于它们存储数据的方式不同。

结构体是一种复合数据类型,它可以包含多个不同类型的成员变量。

结构体中的成员变量按照定义的顺序排列,并且每个成员变量都有一个唯一的名字。

结构体可以看作是一个数据容器,它可以存储多个相关类型的数据。

共用体是一种特殊的结构体,它的每个成员变量都共享同一段内存空间。

共用体的每个成员变量都有一个基地址,它们之间的关系是连续的。

共用体的大小等于其最大成员变量的大小。

二、结构体和共用体的大小计算方法结构体和共用体的大小计算方法相同,都是按照定义的顺序依次计算每个成员变量的大小,并累加得到总体大小。

需要注意的是,结构体和共用体的大小通常会进行对齐处理,以提高数据访问的效率。

三、例题解析假设有一个结构体如下:```cstruct example {int a;char b;float c;};```首先,我们需要知道每个成员变量的大小。

在 32 位系统下,int 类型占用 4 个字节,char 类型占用 1 个字节,float 类型占用 4 个字节。

因此,结构体 example 的大小为:```size = 4(int a 的大小) + 1(char b 的大小) + 4(float c 的大小)= 9```接下来,我们需要考虑对齐问题。

在 32 位系统下,数据对齐的粒度是 4 个字节。

因此,结构体 example 的大小应该为 4 的倍数。

由于 9 不是 4 的倍数,所以需要进行对齐处理。

将结构体 example 的大小调整为 12,这样每个成员变量都可以从 4 的倍数地址开始存储。

```size = 12```因此,结构体 example 的大小为 12 字节。

C语言结构体与共同体

C语言结构体与共同体

C语言结构体与共同体C语言中结构体和共同体是两种用于组织和管理数据的重要概念。

它们可以帮助程序员更有效地管理和操作数据,提高程序的可读性和可维护性。

一、结构体(Structures)结构体是一种由不同类型的数据成员组成的数据类型,它允许程序员将不同类型的数据组织在一起并使用一个名称来引用它们。

结构体可以包含各种数据类型,例如整数、字符、数组或甚至其他结构体。

结构体的定义通过使用关键字struct来实现。

例如,下面的代码定义了一个名为Person的结构体,其中包含姓名、年龄和性别这三个成员:```cstruct Personchar name[50];int age;char gender[10];};```结构体定义可以在程序的任何地方,通常在函数外部定义,使得它在整个程序中都可见。

结构体的创建和初始化可以使用以下格式:```cstruct Person p1; // 创建名为p1的结构体变量struct Person p2 = {"John", 25, "Male"}; // 创建名为p2的结构体变量并初始化其成员```结构体成员可以通过`.`操作符来访问,例如:```cprintf("Name: %s\n", );```结构体可以作为函数的参数传递,也可以作为函数的返回值。

通过传递结构体作为参数,可以避免传递多个参数,提供了一种有效地传递多个相关数据的方法。

例如,下面的代码演示了一个函数,该函数接受一个名为p的Person结构体作为参数,并打印出其成员的值:```cvoid printPerson(struct Person p)printf("Name: %s\n", );printf("Age: %d\n", p.age);printf("Gender: %s\n", p.gender);```二、共同体(Unions)共同体是一种特殊类型的结构体,它允许不同类型的成员共享同一块内存空间。

《C语言程序设计》第八章 结构体、共同体和枚举

《C语言程序设计》第八章 结构体、共同体和枚举

{ max=stud[ i ].score;temp= i;} p=stud + temp; printf ( “\n The maximum score:\n” ); printf ( “No:%d \nname:%s\nscore:%4.1f\n”,p->num,p->name,
p->score );
}a ;
main() { a.ch[ 0 ]=13;
a.ch[ 1 ]=0;
printf (“%d\n”,a.i );
}
A. 13
B. 14
C. 208
D. 209
8.10 下面对 typedef 的叙述中不正确的是( )。 A.用 typedef 可以定义各种类型名但不能用来定义变量 B.用 typedef 可以增加新类型 C.用 typedef 只是将已存在的类型用一个新的标识符来代表 D.使用 typedef 有利于程序的通用和移植
对后一种举例如下: struct student {┇
}; struct student stud,arr[3],*p; 结构体变量的引用有三种形式:
106
第八章
结构体、共同体和枚举
1. 结构体变量名.成员名 2. (*指针变量名).成员名 3. 指针变量名->成员名 其中圆点(.)称为成员运算符,箭头(->)称为结构 指向运算符,C 语言中,圆点运算符和箭头运算符都是优先 级最高的运算符。 结构体变量的输入和输出,它必须按成员项逐个地输入 或输出,不能将结构体变量作整体地输入或输出。 共用体类型,是指将不同的成员项存放于同一段内存单 元,共用体的大小与其组成成员中字节数最大的那个成员相 同。共用体变量的定义与引用类似于结构体变量的定义与引 用。枚举类型指明这种类型的变量取值只能是指定的若干个 枚举常量之一。每个枚举常量代表一个具体的值。 用 typedef 可定义新的类型名来代替已有的类型名。其方法如下: 1. 先按定义变量的方法写出定义体; 2. 将变量名换成新类型名; 3. 在最前面加上 typedef; 4. 用新类型名去定义变量。

c语言结构体与共同体

c语言结构体与共同体

struct date {int month,day,year;};
struct student { int num; char name[20]; char sex; int age; struct date birthday; char addr[30]; }student1,student2;
struct student { long number; char name[20]; char sex; int age; float score; char addr[30];}; struct student stu[3];
结构体数组的物理含义:
表示实体(或记录)的个数。
结构体数组的初始化
4、要点:
方法一: struct student { int number; char name[20]; char sex; int age; float score; char addr[30]; }student1,student2;
方法二: struct student { int number; char name[20]; char sex; int age; float score; char addr[30]; }; struct student student1,student2;
student1
student2 struct student所占存储空间的 大小为:
各成员变量所占存储单元字节数 之和。sizeof(student)
结构体类型变量的引用
一、原则:通过结构体的成员来引用结构体变量。 二、成员的引用方法为:结构体变量名.成员名 三、要点: 1.结构体变量不能整体输入输出,只能对它的成员进行操作。 如:student1.num; 2.如果成员本身又是一个结构体类型,则要使用若干个成员运算符, 逐级找到最底层的成员。 如:student1.birthday.day 3.成员变量可以象一般的变量一样进行各种运算,只是在运算时要 加上“.”运算符。 4.可以引用成员的地址。

2016C语言习题全集及答案:第八单元结构体和共用体

2016C语言习题全集及答案:第八单元结构体和共用体

第八单元结构体和共用体一、选择题1、说明一个结构体变量时系统分配给它的内存是。

A. 各成员所需要内存量的总和B. 结构体中第一个成员所需内存量C. 成员中占内存量最大者所需的容量D. 结构中最后一个成员所需内存量2、 C 语言结构体类型变量在程序执行期间。

A. 所有成员一直驻留在内存中B. 只有一个成员驻留在内存中C. 部分成员驻留在在内存中D. 没有成员驻留在内存中3、设有以下说明语句struct stu { int a ; float b ; } stutype ;则下面的叙述不正确的是。

A. struct 是结构体类型的关键字B. struct stu 是用户定义的结构体类型C. stutype 是用户定义的结构体类型名D. a 和b 都是结构体成员名4、程序中有下面的说明和定义struct abc { int x;char y;}struct abc s1,s2;则会发生的情况是。

A. 编译出错B. 程序将顺利编译、连接、执行C. 能顺利通过编译、连接、但不能执行D. 能顺利通过编译、但连接出错5、有如下定义struct person { char name[9]; int age;};struct person class[10]={ " Johu", 17,"Paul", 19,"Mary", 18,"Adam",16};根据上述定义,能输出字母M 的语句是。

A. prinft(" %c\n",class[3].name);B. printf(" %c\n",class[3].name[1]);C. prinft(" %c\n",class[2].name[1]);D. printf(" %c\n",class[2].name[0]);6、下面程序的输出是。

C语言程序设计课件源程序及习题答案第8章结构体和共用体及其应用

C语言程序设计课件源程序及习题答案第8章结构体和共用体及其应用

1
Y 调用函数fnGetKey() iKey=fnGetKey();
N iKey==LEFT||iKey==RIGHT
Y 输出left&right
iKey==UPPER||iKey==DOWN N
Y
输出up&down
iKey==ESC N
Y 结束
小结:
1.C最初引入共用体的目的,一是节省存储空间,另外是可以 将一种类型的数据不通过显式类型转换而作为另一种类型数据 使用,如问题8.9的解决方法。
试一试 问题8.5:
修改问题8.2,要求在函数中实现计算、 比较平均分并且显示平均分数较高的学 生信息的功能。
问题8.6:
修改问题8.4,在函数中将N个学生的数据输 入并统计总分和求出最高分的学生并显示。
主函数流程图
想一想
在问题8.3的代码中,如果要求对输入 数据对输入的年、月、日进行合法性校 验,比如年是在1989-2019年之间, 月是在1-12之间,日是1-30之间, 怎么解决?如果进一步要求根据月份而 确定每月的天数,又该怎么办呢
一般的引用形式为:
数组名[下标].成员名
问题8.4:试一试
一个学习小组有N名学生,学生的信息 包含学号、姓名、语文、数学、英语三 门课的成绩,从键盘上输入N名学生的 信息,要求统计总成绩并显示总分最高 的学生信息。
解题步骤
1. 以学生的信息数据项为成员,定义结 构体类型和相应的结构体数组
2. 循环输入每个学生的信息,统计总成 绩,存储在结构体数组中
练一练
尝试编写学生管理系统,定义学生信息 的结构体类型,分别用函数实现数据输 入、数据输出、计算每个人的平均分, 进行排序和成绩插入等操作。

结构体与共同体习题

结构体与共同体习题
A.25 B.30 C.18 D.8
4、若已建立下面的链表结构,指针p,s分别指向图中所示的结点,则不能将所指的结点插入到链表末尾的语句组是( )。
节点总是插入在链表的末尾。链表的头指针作为函数值返回。链表最后一个节点的next域放入NULL,作为链表结束的标志。data为字符型数据域,next为指针域。读入时字符以#表示输入结束(#不存入链表)。请填空。
int y[4];
char z[8];
} MYTYPE;
MYTYPE them;
main()
{ printf("%d\n",sizeof(them));
}
A.32 B.16 C.8 D.24
6.以下函数creatlist用来建立一带头节点的单链表,链表的结构如下图所示,新的
A. s->next=null;p=p->next;p->next=s;
B. p=p->next;s->next=p->next=;p->next=s;
C. p=p->next;s->next=p;p->next=s;
char *aa[]={"AA","BB","CC","DD"};
printf("%s%s%s\n",aa[em1],aa[em2],aa[em3]);
}
D. p=(*p).next;(*s).next=(*p).next;(*p).next=s;
5、下列程序的执行结果为( )。
struct s1
{ char *s;
int i;
struct s1 *sip;
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第八章结构体和共同体一、单项选择1. 若有以下定义:struct link{int data;struct link *next;}a,b,c,*p,*q;且变量a和b之间已有如下图所示的链表结构,若指针p指向a,指针q指向c。

则能把c插入到a和b之间形成新的链表的语句是( C )2. 若有以下程序段:int a=1,b=2,c=3;struct dent {int n ; int *m ;} s[3] = {{101,&a},{102,&b},{103,&c}};struct dent *p=s ;则以下表达式中值为2的是( D )。

3. 下面程序的运行结果是( D )。

#iunclude<stdio.h>int main ( ) {struct complx {int x; int y ;}cnum[2]={1,3,2,7} ;printf(“%d\n”,cnum[0].y/cnum[0].x*cnum[1].x) ;return 0;}二、程序设计1. /*学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入结构体数组s 中,请编写函数fun,它的功能是:按分数的高低排列学生的记录,高分在前。

注意:部分源程序给出如下。

请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。

试题程序: */#include <stdio.h>#define N 16typedef struct{ char num[10];int s ;}STREC;void fun (STREC a[]){/*********Begin*********//*********End**********/}int main (){FILE *wf,*in;STREC s[N]={{ "GA005",85},{"GA003",76},{"GA002",69},{"GA004",85},{"GA001",91},{"GA007",72},{"GA008",64},{"GA006",87},{"GA015",85},{"GA013",91},{"GA012",64},{"GA014",91},{"GA011",66},{"GA017",64},{"GA018",64},{"GA016",72}};int i;fun(s);printf("The data after sorted :\n");for (i=0; i<N; i++)printf("%s %4d\n",s[i].num,s[i].s);printf("\n");/******************************/in=fopen("in001.dat","r");i=0;while(!feof(in)){fscanf(in,"%s %d",s[i].num,&s[i].s);i++;}fun(s);wf=fopen("out.dat","w");for (i=0; i<N; i++)fprintf(wf,"%s %4d\n",s[i].num,s[i].s);fclose(wf);fclose(in);/*****************************/return 0;}【参考代码】int i,j;STREC t;for(i=0;i<N;i++)for(j=0;j<N-1-i;j++)if(a[j].s<a[j+1].s){t=a[j];a[j]=a[j+1];a[j+1]=t;}2. /*某学生的记录由学号、8门课成绩和平均分组成,学号和8门课的成绩已在主函数中给出。

请编写fun函数,它的功能是:求出该学生的平均分放在记录的ave成员中。

请自己定义正确的形参。

例如,若学生的成绩是85.5,76,69.5,85,91,72,64.5,87.5,则他的平均分应当是78.875。

注意:部分源程序给出如下。

请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。

试题程序: */#include <stdio.h>#define N 8typedef struct{ char num[10];double s[N];double ave;} STREC;void fun(STREC *p){/************Begin*************//************End**************/}int main(){FILE *wf,*in;STREC s={ "GA005 ",85.5,76,69.5,85,91,72,64.5,87.5};int i;printf("The %s's student data:\n", s.num); /*输出学号*/for(i=0;i<N;i++)printf("%4.1f\n",s.s[i]); /*输出各科成绩*/printf("\nave=%7.3f\n", s.ave); /*输出平均分*//******************************/in=fopen("in24.dat","r");wf=fopen("out24.dat","w");fscanf(in,"%s\n",s.num);for(i=0;i<8;i++)fscanf(in,"%lf\n",&s.s[i]);fun(&s);fprintf(wf,"ave=%7.3f\n", s.ave);fclose(in);fclose(wf);/*****************************/return 0;}【参考代码】int i;p->ave=0.0;for(i=0;i<N;i++)p->ave=p->ave+p->s[i];/*求各门成绩的总和*/p->ave=p->ave/N; /*求平均分*/3. /*N名学生的成绩已在主函数中放入一个带头节点的链表结构中,h指向链表的头节点。

请编写函数fun,它的功能是:求出平均分,由函数值返回。

例如,若学生的成绩是85,76,69,91,72,64,87,则平均分应当是78.625。

注意:部分源程序给出如下。

请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。

试题程序:*/#include<stdlib.h>#include<stdio.h>#define N 8struct slist{ double s;struct slist *next;};typedef struct slist STREC;double fun(STREC *h){/***********Begin***************//***********End**************/}STREC *creat(double *s) /*创建链表*/{STREC *h,*p,*q;h=p=( STREC*)malloc(sizeof(STREC));p->s=0;while(i<N){q=( STREC*)malloc(sizeof(STREC));q->s=s[i];i++;p->next=q;p=q;}p->next=0;return h;}outlist(STREC *h){STREC *p;p=h->next;printf("head ");do{printf("->%4.1f ",p->s);p=p->next; /*输出各成绩*/}while(p!=NULL);printf("\n\n");}int main(){FILE *wf,*in;double s[N]={85,76,69,85,91,72,64,87},ave;int i;STREC *h;h=creat(s);outlist(h);ave=fun(h);printf("ave=%6.3f\n ",ave);/******************************/in=fopen("in25.dat","r");i=0;while(!feof(in)){fscanf(in,"%d\n",&s[i]);i++;}h=creat(s);outlist(h);ave=fun(h);wf=fopen("out25.dat","w");fprintf(wf,"%6.3f\n",ave);fclose(wf);fclose(in);/*****************************/return 0;}【参考代码】double av=0.0;STREC *p=h->next;/*p直接指向"头节点"的下一个节点,即第一个成绩*/while(p!=NULL){av=av+p->s; /*求总分数*/p=p->next;}return av/N; /*返回平均值*/4. /*已知学生的记录由学号和学习成绩构成,N名学生的数据已存入a结构体数组中。

请编写函数fun,该函数的功能是:找出成绩最低的学生记录,通过形参返回主函数(规定只有一个最低分)。

已给出函数的首部,请完成该函数。

注意:部分源程序给出如下。

请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。

相关文档
最新文档