当前位置:文档之家› C语言题库第8章 结构体和共同体

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

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

第八章结构体和共同体

一、单项选择

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

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

#define N 16

typedef 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

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

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

for(j=0;j

if(a[j].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

#define N 8

typedef 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

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

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

#include

#define N 8

struct 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

{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的花括号中填入所编写的若干语句。

试题程序:*/

#include

#include

#include

#define N 10

typedef struct ss

{ char num[10];

int s;

} STU;

fun(STU a[], STU *s)

{

/***********Begin**************/

/***********End**************/

}

int main()

{

FILE *wf,*in;

STU a[N]={{ "A01",81},{ "A02",89},{ "A03",66},{ "A04",87},{ "A05",77}, { "A06",90},{ "A07",79},{ "A08",61},{ "A09",80},{ "A10",71}},m;

int i;

printf("*****The original data*****\n");

for(i=0;i

printf("No=%s Mark=%d\n", a[i].num,a[i].s);

fun(a,&m);

printf("*****THE RESULT*****\n");

printf("The lowest :%s, %d\n",m.num,m.s);

/******************************/

in=fopen("in28.dat","r");

i=0;

while(!feof(in))

{

fscanf(in,"%s %d\n",a[i].num,&a[i].s);

i++;

}

fun(a,&m);

wf=fopen("out28.dat","w");

fprintf(wf,"%s %d\n",m.num,m.s);

fclose(wf);

fclose(in);

/*****************************/

return 0;

}

【参考代码】

int i;

*s=a[0]; /*先认为第1个值最小*/

for(i=0;i

if(s->s>a[i].s)

*s=a[i];

5. /*学生的记录由学生和成绩组成,N名学生的数据已在主函数中放入结构体数组s中,请编写函数fun,其功能是:

把分数最低的学生数据放在h所指的数组中。注意:分数最低的学生可能不止一个,函数返回分数最低的学生的人数。

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

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

试题程序:*/

#include

# define N 16

typedef struct

{ char num[10];

int s;

} STREC;

int fun (STREC *a,STREC *b)

{

/************Begin************/

/************End**************/

}

int main()

{

STREC s[N]={{"GA05",85},{"GA03",76},{"GA02",69},{"GA04",85},{"GA01",91},

{"GA07",72},{"GA08",64},

{"GA06",87},{"GA015",85},{"GA013",91},

{"GA012",64},{"GA014",91},{"GA011",91},{"GA017",64},{"GA018",64},{"GA016",7 2}};

STREC h[N];

int i,n;

FILE *out,*in;

n=fun(s,h);

printf("The %d lowest score:\n",n);

for(i=0;i

printf("%s %4d\n",h[i].num,h[i].s);

printf("\n");

/******************************/

in=fopen("in22.dat","r");

out=fopen("out22.dat","w");

i=0;

while(!feof(in))

{

fscanf(in,"%s %d\n",h[i].num,&h[i].s);

i++;

}

n=fun(s,h);

fprintf(out,"%d\n",n);

for(i=0;i

fprintf(out,"%4d\n",h[i].s);

fclose(in);

fclose(out);

/******************************/

return 0;

}

【参考代码】

int i,j=0,n=0,min;

min=a[0].s;

for(i=0;i

if(a[i].s

min=a[i].s;

for(i=0;i

if(a[i].s==min)

{

*(b+j)=a[i];j++;n++;

}

return n;

6. /*学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入结构体数组s中,请编写函数fun,

它的功能是:把分数最高的学生数据放在h所指的数组中。注意:分数高的学生可能不只一个,函数返回分数最高学生的人数。

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

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

试题程序: */

#include

#define N 16

typedef struct

{ char num[10];

int s ;

}STREC;

int fun (STREC *a, STREC *b)

{

/*************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}};

STREC h[N];

int i, n;

n=fun(s,h);

printf("The %d highest score :\n",n);

for (i=0; i

printf("%s %4d\n ",h[i].num,h[i].s); /*输出最高分学生的学号和成绩*/ printf("\n");

/******************************/

in=fopen("in27.dat","r");

i=0;

while(!feof(in))

{

fscanf(in,"%s %d\n",s[i].num,&s[i].s);

i++;

}

n=i;

n=fun(s,h);

wf=fopen("out27.dat","w");

fprintf(wf, "%d\n",n);

for (i=0; i

fprintf(wf,"%s %4d\n",h[i].num,h[i].s);

fclose(wf);

fclose(in);

/*****************************/

return 0;

}

【参考代码】

int i,j=0,max=a[0].s;

for(i=0;i

if(max

max=a[i].s;/*找出最大值*/

for(i=0;i

if(max==a[i].s) b[j++]=a[i];

/*找出成绩与max相等的学生的记录,存入结构体b中*/

return j;

/*返回最高成绩的学生人数*/

7. /*学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入结构体数组s中,请编写函数fun,

它的功能是:按分数的高低排列学生的记录,高分在前。注意:部分源程序给出如下。

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

试题程序: */

#include

#define N 16

typedef struct

{ char num[10];

int s ;

}STREC;

void fun (STREC a[])

{

/************Begin*************/

/************End**************/

}

int main ()

{

FILE *wf,*in;

STREC s[N]={{ "GA005",87},{"GA003",76},{"GA002",69},{"GA004",85},

{"GA001",99},{"GA007",72},{"GA008",61},{"GA006",88},

{"GA015",86},{"GA013",91},{"GA012",63},{"GA014",97},

{"GA011",66},{"GA017",64},{"GA018",62},{"GA016",74}};

int i,k;

fun(s);

printf("The data after sorted :\n");

for (i=0; i

printf("%s %4d\n",s[i].num,s[i].s);

/******************************/

in=fopen("in23.dat","r");

i=0;

while(!feof(in))

{

fscanf(in,"%s %d\n",s[i].num,&s[i].s);

i++;

}

k=i;

fun(s);

wf=fopen("out23.dat","w");

for (i=0; 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=1;i

for(j=0;j

if(a[j].s

{t=a[j];a[j]=a[j+1];a[j+1]=t;}

8. /*学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入结构体数组s中,请编写函数fun,它的功能是:

把低于平均分的学生数据放在b所指的数组中,低于平均分的学生人数通过形参n传回,平均分通过函数值返回。

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

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

#include

#define N 8

typedef struct

{ char num[10];

double s;

} STREC;

double fun(STREC *a, STREC *b, int *n)

{

/************Begin************/

/************End***************/

}

int main()

{

FILE *wf,*in;

STREC s[N]={{ "GA05 ",85},{ "GA03 ",76},{ "GA02 ",69},{ "GA04 ",85},

{ "GA01 ",91},{ "GA07 ",72},{ "GA08 ",64},{ "GA06 ",87}};

STREC h[N];

int i,n;

double ave;

ave=fun(s,h,&n);

printf("The %d student data which is lower than %7.3f:\n ", n,ave);

for(i=0;i

printf("%s %4.1f\n ",h[i].num,h[i].s);

printf("\n ");

/******************************/

in=fopen("in30.dat","r");

i=0;

while(!feof(in))

{

fscanf(in,"%s %lf\n",s[i].num,&s[i].s);

i++;

}

wf=fopen("out30.dat","w");

ave=fun(s,h,&n);

fprintf(wf, "%d %7.3f\n",n,ave);

for(i=0;i

fprintf(wf, "%s %4.1f\n",h[i].num,h[i].s);

fclose(in);

fclose(wf);

/*****************************/

return 0;

}

【参考代码】

int i,j=0;

double av=0.0;

for(i=0;i

av=av+a[i].s;

av=av/N; /*求平均值*/

for(i=0;i

if(a[i].s

*n=j; /*指针传回低于平均值的学生人数*/

return av; /*返回平均值*/

9. /*学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入结构体数组s中,请编写函数fun,它的功能是:

把分数最高的学生数据放在b所指的数组中,注意:分数最高的学生可能不止一个,函数返回分数最高的学生的人数。

注意: 部分源程序在如下。

请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入

你编写的若干语句。

给定源程序: */

#include

#define N 16

typedef struct

{ char num[10];

int s;

} STREC;

int fun( STREC *a, STREC *b )

{

/**************Begin*************/

/*************End***************/

}

int main()

{ STREC s[N]={{"GA05",85},{"GA03",76},{"GA02",69},{"GA04",85},

{"GA01",91},{"GA07",72},{"GA08",64},{"GA06",87},

{"GA015",85},{"GA013",91},{"GA012",64},{"GA014",91},

{"GA011",77},{"GA017",64},{"GA018",64},{"GA016",72}};

STREC h[N];

int i,n;

FILE *out,*in;

n=fun(s,h);

printf("The %d highest score :\n",n);

for(i=0;i

printf("%s %4d\n",h[i].num,h[i].s);

printf("\n");

out = fopen("out03.dat","w");

in=fopen("in03.dat","r");

i=0;

while(!feof(in))

{

fscanf(in,"%s %d\n",h[i].num,&h[i].s);

i++;

}

n=fun(s,h);

for(i=0;i

{

fprintf(out, "%s %d\n",h[i].num,h[i].s);

}

fclose(in);

fclose(out);

return 0;

}

10. /*学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入结构体数组s中,请编写函数fun,

它的功能是:把指定分数范围内的学生数据放在b所指的数组中,分数范围内的学生人数由函数值返回。

例如,输入的分数是60和69,则应当把分数在60到69的学生数据进行输出,包含60分和69分的学生数据。

主函数中把60放在low中,把69放在heigh中。注意:部分源程序给出如下。

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

试题程序: */

#include

#define N 16

typedef struct

{ char num[10];

int s ;

}STREC;

int fun (STREC *a, STREC *b, int l, int h )

{

/************Begin*************/

/************End************/

}

int main ()

{

FILE *wf,*in;

STREC s[N]={{ "GA005",85},{"GA003",76},{"GA002",69},{"GA004",85},

{"GA001",96},{"GA007",72},{"GA008",64},{"GA006",87},

{"GA015",85},{"GA013",94},{"GA012",64},{"GA014",91},

{"GA011",90},{"GA017",64},{"GA018",64},{"GA016",72}};

STREC h[N],tt;

int i, j,n, low, heigh, t;

printf("Enter 2 integer number low & heigh: ");

scanf("%d%d",&low,&heigh);

if(heigh

{t=heigh;heigh=low; low=t;}

n=fun(s,h,low, heigh);

printf("The student 's data between %d--%d:\n ",low, heigh);

for(i=0;i

printf("%s %4d\n ",h[i].num, h[i].s); /*输出指定分数范围内的学生记录*/

printf("\n ");

/******************************/

in=fopen("in26.dat","r");

i=0;

while(!feof(in))

{

fscanf(in,"%s %d\n",s[i].num,&s[i].s);

i++;

}

n=fun(s,h,80,98);

for(i=0;i

for(j=i+1;j

if(h[i].s>h[j].s)

{tt=h[i];h[i]=h[j];h[j]=tt;}

wf=fopen("out26.dat","w");

for(i=0;i

fprintf(wf, "%s %4d\n",h[i].num, h[i].s);

fclose(in);

fclose(wf);

/*****************************/

return 0;

}

【参考代码】

int i,j=0;

for(i=0;i

if(a[i].s>=l&&a[i].s<=h) /*将分数高于l,低于h的学生记录存于结构体数组b 中*/

b[j++]=a[i];

return j; /*返回分数范围内的学生人数*/

三、程序改错

1. /*下列给定程序中,函数fun的功能是:对N名学生的学习成绩,按从高到低的顺序找出前m(m<=10)名学生,

并将这些学生数据存放在一个动态分配的连续存储区中,此存储区的首地址作为函数值返回。

请改正程序中的错误,使它能得出正确的结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。

试题程序:*/

#include

#include

#include

#include

#define N 10

typedef struct ss

{ char num[10];

int s;

} STU;

STU *fun(STU a[], int m)

{ STU b[N],*t;

int i, j,k;

/**********ERROR**********/

*t=calloc(m,sizeof(STU));

for(i=0;i

for(k=0;k

{ for (i=j=0;i

if(b[i].s>b[j].s) j=i;

/**********ERROR**********/

t[k].num=b[j].num;

t[k].s=b[j].s;

b[j].s=0;

}

return t;

}

outresult(STU a[],FILE *pf)

{ int i;

for(i=0;i

fprintf(pf, "No=%s Mark=%d\n ",

a[i].num, a[i].s);

fprintf(pf, "\n\n ");

}

int main()

{ STU a[N]={{ "A01 ",81},{ "A02 ",89},{ "A03 ",66},{ "A04 ",87},{ "A05 ",77},

{ "A06 ",90},{ "A07 ",79},{ "A08 ",61},{ "A09 ",80},{ "A10 ",71}};

STU *pOrder;

int i, m;

printf("*****THE RESULT*****\n");

outresult(a,stdout);

printf("\nGive the number of the students who have better score: ");

scanf("%d",&m);

while(m>10)

{ printf("\nGive the number of the students who have better score: ");

scanf("%d",&m);

}

pOrder=fun(a,m);

printf("***** THE RESULT*****\n");

printf("The top :\n");

for(i=0;i

printf("%s %d\n",pOrder[i].num, pOrder[i].s);

free(pOrder);

return 0;

}

【改错1】t=calloc(m,sizeof(STU));

【改错2】t[k]=b[j];strcpy(t[k].num,b[j].num);

2. /*下列给定程序中的函数Creatlink的功能是:创建带头节点的单向链表,并为各节点数据域赋0到m-1的值。

请改正函数Creatlink中的错误,使它能得出正确的结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。

试题程序: */

#include

#include

typedef struct aa

{ int data;

struct aa *next;

} NODE;

NODE *Creatlink(int n, int m)

{ NODE *h=NULL,*p,*s;

int i;

s=(NODE *)malloc(sizeof(NODE));

h=s;

/**********ERROR**********/

p->next=NULL;

for(i=1;i

{ s=(NODE *) malloc(sizeof(NODE));

/**********ERROR**********/

s->data=rand()/m;

s->next=p->next;p->next=s; p=p->next;

}

s->next=NULL;

/**********ERROR**********/

return p;

}

outlink(NODE *h)

{ NODE *p;

p=h->next;

printf("\n The LIST :\n\n HEAD");

while(p)

{ printf("->%d",p->data);

p=p->next;}

printf("\n");

}

int main()

{ NODE *head;

head=Creatlink(8,22);

outlink(head);

return 0;

}

【改错1】 p=s;

【改错2】s->data=rand()%m;

【改错3】return h;

3. /*下列给定程序的功能是:建立一个带头节点的单向链表,并用随机函数为各节点数据域赋值。

函数fun的作用是求出单向链表节点(不包括头节点)数据域中的最大值,并且作为函数值返回。

请改正函数fun中的错误,使它能得出正确的结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构。

试题程序: */

#include

#include

typedef struct aa

{ int data;

struct aa *next;

} NODE;

fun (NODE *h)

{ int max=-1;

NODE *p;

/**********ERROR**********/

p=h;

while(p)

{ if(p->data>max)

max=p->data;

/**********ERROR**********/

p->next=h;

}

return max;

}

outresult(int s, FILE *pf)

{ fprintf(pf, "\nThe max in link :%d\n",s);

}

NODE *creatlink(int n, int m)

{ NODE *h,*p,*s;

int i;

h=p=(NODE *)malloc(sizeof(NODE));

h->data=9999;

for(i=1;i<=n;i++)

{ s=(NODE *) malloc(sizeof(NODE));

s->data=rand()%m; s->next=p->next;

p->next=s; p=p->next;

}

p->next=NULL;

return h;

}

outlink(NODE *h,FILE *pf)

{ NODE *p;

p=h->next;

fprintf(pf, "\n The LIST :\n\n HEAD");

while(p)

{

fprintf(pf, "->%d",p->data);

p=p->next;}

fprintf(pf, "\n");

}

int main()

{ NODE *head; int m;

head=creatlink(12,100);

outlink(head,stdout);

m=fun(head);

printf("\nThe RESULT :\n");

outresult(m,stdout);

return 0;

}

【改错1】p=h->next;

【改错2】p=p->next;

四、程序填空

1./*人员的记录由编号和出生年、月、日组成,N名人员的数据已在主函数中存入结构体数组std中,且编号唯一。函数fun的功能是:找出指定编号人员的数据,作为函数值返回,由主函数输出,若指定编号不存在,返回数据中的编号为空串。注意:部分源程序给出如下。请勿改动main函数和其他函数中的任何内容,仅在函数fun的横线上填入所编写的若干表达式或语句。

试题程序: */

#include

#include

#define N 8

typedef struct

{

char num[10];

int year,month,day;

}STU;

/**********FILL**********/

[1] fun(STU *std,char *num)

{

int i;

STU a={"",9999,99,99};

for(i=0;i<=N;i++)

/**********FILL**********/

if(strcmp(【2】,num)==0)

/**********FILL**********/

return (【3】);

return a;

}

int main()

{

std[N]={{"11111",1984,2,15},{"22222",1983,9,21},{"33333",1984,9,1},{"44444",198 3,7,15},

{"55555",1984,9,28},{"666666",1983,11,14},{"77777",1983,6,22},{"88888",1984 ,8,18}};

STU p;

char n[10]="666666";

p=fun(std,n);

if(p.num[0]==0)

{

printf("\nNot found!\n");

}

else

{

printf("\nSucceed!\n");

printf("%s %d-%d-%d\n",p.num,p.year,p.month,p.day);

}

return 0;

}

【空 1 】STU fun(STU *std,char *num)

【空 2 】std[i].num

【空 3 】std[i]

2. /*给定程序中,函数fun的功能是:将形参std所指结构体数组中年龄最大者的数据作为函数值返回,并在main函数中输出。

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

请勿改动main函数和其他函数中的任何内容,仅在函数fun的横线上填入所编写的若干表达式或语句。

试题程序: */

#include

typedef struct

{

char name[10];

int age;

}STD;

STD fun(STD std[],int n)

{

STD max;

int i;

/**********FILL**********/

max=【1】;

for(i=1;i

/**********FILL**********/

if(max.age<【2】)

max=std[i];}

return max;

}

int main()

{

STD std[5]={"aaa",17,"bbb",16,"ccc",18,"eee",15};

max=fun(std,5);

printf("\nThe result is: \n ");

/**********FILL**********/

printf("\nName :%s,Age :%d\n",【3】,max.age);

return 0;

}

【空 1 】std[0]

【空 2 】std[i].age

【空 3 】https://www.doczj.com/doc/2d9517562.html,

3. /*请补充函数fun,该函数的功能是:建立一个带头结点的单向链表并输出到文件"out70.dat"和屏幕上,各结点的值为对应的下标,链表的结点数及输出的文件名作为参数传入。注意:部分源程序给出如下。请勿改动main函数和其他函数中的任何内容,仅在函数fun的横线上填入所编写的若干表达式或语句。

试题程序: */

#include

#include

typedef struct ss

{

int data;

struct ss *next;

}NODE;

void fun(int n,char*filename)

{

NODE *h,*p,*s;

FILE *pf;

int i;

h=p=(NODE *)malloc(sizeof(NODE));

h->data=0;

for(i=1;i

{

s=(NODE *)malloc (sizeof (NODE));

/**********FILL**********/

s->data=【1】;

/**********FILL**********/

【2】;

/**********FILL**********/

p=【3】;

}

p->next=NULL;

if((pf=fopen(filename,"w"))==NULL)

{

printf("Can not open out98.dat!");

exit(0);

}

p=h;

fprintf(pf,"\n***THE LIST***\n");

printf("\n***THE LIST***\n");

while(p)

C语言结构体共用体选择题新

1、变量 a 所占的内存字节数是。(假设整型int 为 4 字节) structstu {charname[20]; longintn; intscore[4]; }a; A)28B)30 C)32D)46 C 2、下列程序的输出结果是 A)5B)6 C)7D)8 structabc {inta,b,c;}; main() {structabcs[2]={{1,2,3},{4,5,6}};intt; t=s[0].a+s[1].b; printf("%d\n",t); } B 3、有如下定义 structperson{charname[9];intage;}; structpersoncalss[4]={"Johu",17, "Paul",19, "Mary",18, "Adam",16,}; 根据以上定义,能输出字母M 的语句是________ 。 A)printf("%c\n",class[3].name); B)printf("%c\n",class[3].name[1]); C)printf("%c\n",class[2].name[1]); D)printf("%c\n",class[2].name[0]); D 4、以下程序的输出是________ 。 structst {intx;int*y;}*p; intdt[4]={10,20,30,40}; structstaa[4]={50,&dt[0],60,&dt[0],60,&dt[0],60,dt[0],}; main() {p=aa; printf("%d\n",++(p->x)); } A)10B)11 C)51D)60 C 6、以下程序的输出结果是________ 。 structHAR {intx,y;structHAR*p;}h[2]; main() {inth[0].x=1;h[0].y=2; h[1].x=3;h[1].y=4;

c语言结构体用法(转载)

C语言,结构体(struct) 用法 结构(struct) 结构是由基本数据类型构成的、并用一个标识符来命名的各种变量的组合。 结构中可以使用不同的数据类型。 1. 结构说明和结构变量定义 在T urbo C中, 结构也是一种数据类型, 可以使用结构变量, 因此, 象其它 类型的变量一样, 在使用结构变量时要先对其定义。 定义结构变量的一般格式为: struct 结构名 { 类型变量名; 类型变量名; ... } 结构变量; 结构名是结构的标识符不是变量名。 类型为第二节中所讲述的五种数据类型(整型、浮点型、字符型、指针型和 无值型)。 构成结构的每一个类型变量称为结构成员, 它象数组的元素一样, 但数组中 元素是以下标来访问的, 而结构是按变量名字来访问成员的。

下面举一个例子来说明怎样定义结构变量。 struct string { char name[8]; int age; char sex[2]; char depart[20]; float wage1, wage2, wage3, wage4, wage5; } person; 这个例子定义了一个结构名为string的结构变量person, 如果省略变量名 person, 则变成对结构的说明。用已说明的结构名也可定义结构变量。这样定义 时上例变成: struct string { char name[8]; int age; char sex[2]; char depart[20]; float wage1, wage2, wage3, wage4, wage5; }; struct string person; 如果需要定义多个具有相同形式的结构变量时用这种方法比较方便, 它先作 结构说明, 再用结构名来定义变量。 例如: struct string T ianyr, Liuqi, ...; 如果省略结构名, 则称之为无名结构, 这种情况常常出现在函数内部, 用这 种结构时前面的例子变成:

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

第八章结构体和共同体 一、单项选择 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 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 #define N 16 typedef 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

C语言结构体和共用体实验报告

实验九参考程序 实验 9- 1 /**************************************************************** * 实验 9.1 * * ( 1 )为某商店的商品设计合适的结构体 (PRODUCT) 。每一种商品包含编号 (number) 、 * 名称 (name) 、价格 (price) 、折扣 (discount)4 项信息,根据表 9-1 ,为这些信 息选择合适的数据类型。 * (2)建立 2个函数,以实现对商品的操作。 input 函数实现商品的输入; * display 函数显示商品信息。要求这 2个函数都以商品的结构体 (PRODUCT) 指针为 参数。 * (3 )在主函数中为商品键盘定义一个结构体变量 (keyboard) ,利用 input 函数实现键 盘信息的输入; * 定义一个结构体数组 (elec_device[3]) ,利用 input 函数实现冰箱、 空调、电视 信息的输入; * 最后利用 display 函数显示 4 种商品的信息。 * * 表 9-1 #include typedef struct _PRODUCT int iNumber; char strName[32]; float fPrice; float fDiscount; * 编号 名称 价格 折扣 *1010 键盘 89.50 0.85 *1021 冰箱 1024.00 0.95 *1022 空调 2058.50 0.90 *1023 电视 3001.88 0.95 *************************************************************** */

c语言结构体与共用体之间的区别

https://www.doczj.com/doc/2d9517562.html,/2005/03/25/12365.html 所谓共用体类型是指将不同的数据项组织成一个整体,它们在内存中占用同一段存储单元。其定义形式为: union 共用体名 {成员表列}; 7.5.1 共用体的定义 union data { int a ; float b ; d o u b l e c ; c h a r d ; } obj; 该形式定义了一个共用体数据类型union data ,定义了共用体数据类型变量o b j。共用体 数据类型与结构体在形式上非常相似,但其表示的含义及存储是完全不同的。先让我们看一个小例子。 [例7 - 8 ] union data /*共用体* / { int a; float b; double c; char d; } m m ; struct stud /*结构体* / { int a; float b; double c; char d; } ; m a i n ( ) { struct stud student printf("%d,%d",sizeof(struct stud),sizeof(union data)); } 程序的输出说明结构体类型所占的内存空间为其各成员所占存储空间之和。而形同结构体的

共用体类型实际占用存储空间为其最长的成员所占的存储空间。详细说明如图7 - 6所示。 对共用体的成员的引用与结构体成员的引用相同。但由于共用体各成员共用同一段内存 空间,使用时,根据需要使用其中的某一个成员。从图中特别说明了共用体的特点,方便程序设计人员在同一内存区对不同数据类型的交替使用,增加灵活性,节省内存。 7.5.2 共用体变量的引用 可以引用共用体变量的成员,其用法与结构体完全相同。若定义共用体类型为: union data /*共用体* / { int a; float b; double c; char d; } m m ; 其成员引用为:m m . a , m m . b , m m . c , m m . d 但是要注意的是,不能同时引用四个成员,在某一时刻,只能使用其中之一的成员。 [例7-9] 对共用体变量的使用。 m a i n ( ) { union data { int a; float b; double c; char d; } m m ; m m . a = 6 ; printf("%d\n",mm.a); m m . c = 6 7 . 2 ; p r i n t f ( " % 5 . 1 l f \ n " , m m . c ) ; m m . d = ' W ' ; m m . b = 3 4 . 2 ; p r i n t f ( " % 5 . 1 f , % c \ n " , m m . b , m m . d ) ; }

C语言中,头文件和源文件的关系

C语言中,头文件和源文件的关系(转) 简单的说其实要理解C文件与头文件(即.h)有什么不同之处,首先需要弄明白编译器的工作过程,一般说来编译器会做以下几个过程: 1.预处理阶段 2.词法与语法分析阶段 3.编译阶段,首先编译成纯汇编语句,再将之汇编成跟CPU相关的二进制码,生成各个目标文件(.obj文件) 4.连接阶段,将各个目标文件中的各段代码进行绝对地址定位,生成跟特定平台相关的可执行文件,当然,最后还可以用objcopy生成纯二进制码,也就是去掉了文件格式信息。(生成.exe文件) 编译器在编译时是以C文件为单位进行的,也就是说如果你的项目中一个C文件都没有,那么你的项目将无法编译,连接器是以目标文件为单位,它将一个或多个目标文件进行函数与变量的重定位,生成最终的可执行文件,在PC上的程序开发,一般都有一个main函数,这是各个编译器的约定,当然,你如果自己写连接器脚本的话,可以不用main函数作为程序入口!!!! (main .c文件目标文件可执行文件) 有了这些基础知识,再言归正传,为了生成一个最终的可执行文件,就需要一些目标文件,也就是需要C文件,而这些C文件中又需要一个main 函数作为可执行程序的入口,那么我们就从一个C文件入手,假定这个C文件内容如下: #include #include "mytest.h" int main(int argc,char **argv) { test = 25; printf("test.................%d/n",test); } 头文件内容如下: int test; 现在以这个例子来讲解编译器的工作: 1.预处理阶段:编译器以C文件作为一个单元,首先读这个C文件,发现第一句与第二句是包含一个头文件,就会在所有搜索路径中寻找这两个文件,找到之后,就会将相应头文件中再去处理宏,变量,函数声明,嵌套的头文件包含等,检测依赖关系,进行宏替换,看是否有重复定义与声明的情况发生,最后将那些文件中所有的东东全部扫描进这个当前的C文件中,形成一个中间“C文件” 2.编译阶段,在上一步中相当于将那个头文件中的test变量扫描进了一个中间C文件,那么test变量就变成了这个文件中的一个全局变量,此时就将所有这个中间C文件的所有变量,函数分配空间,将各个函数编译成二进制码,按照特定目标文件格式生成目标文件,在这种格式的目标文件中进行各个全局变量,函数的符号描述,将这些二进制码按照一定的标准组织成一个目标文件 3.连接阶段,将上一步成生的各个目标文件,根据一些参数,连接生成最终的可执行文件,主要的工作就是重定位各个目标文件的函数,变量等,相当于将个目标文件中的二进制码按一定的规范合到一个文件中再回到C文件与头文件各写什么内容的话题上:理论上来说C文件与头文件里的内容,只要是C语言所支持的,无论写什么都可以的,比如你在头文件中写函数体,只要在任何一个C文件包含此头文件就可以将这个函数编译成目标文件的一部分(编译是以C文件为单位的,如果不在任何C文件中包含此头文件的话,这段代码就形同虚设),你可以在C文件中进行函数声明,变量声明,结构体声明,这也不成问题!!!那为何一定要分成头文件与C文件呢?又为何一般都在头件中进行函数,变量声明,宏声明,结构体声明呢?而在C文件中去进行变量定义,函数实现呢??原因如下: 1.如果在头文件中实现一个函数体,那么如果在多个C文件中引用它,而且又同时编译多个C文件,将其生成的目标文件连接成一个可执行文件,在每个引用此头文件的C文件所生成的目标文件中,都有一份这个函数的代码,如果这段函数又没有定义成局部函数,那么在连接时,就会发现多个相同的函数,就会报错 2.如果在头文件中定义全局变量,并且将此全局变量赋初值,那么在多个引用此头文件的C文件中同样存在相同变量名的拷贝,关键是此变量被

c语言结构体共用体选择题新

c语言结构体共用体选择 题新 The pony was revised in January 2021

1、变量a所占的内存字节数是________。(假设整型i n t为4字节) struct stu { char name[20]; long int n; int score[4]; } a ; A) 28 B) 30 C) 32 D) 46 C 2、下列程序的输出结果是 A)5 B)6 C)7 D)8 struct abc {int a,b,c;}; main() {struct abc s[2]={{1,2,3},{4,5,6}};int t;

t=s[0].a+s[1].b; printf("%d\n",t); } B 3、有如下定义 struct person{ char name[9]; int age;}; struct person calss[4]={ "Johu",17, "Paul",19, "Mary",18, "Adam",16,}; 根据以上定义,能输出字母M的语句是________。 A) printf("%c\n",class[3].name); B) printf("%c\n",class[3].name[1]); C) printf("%c\n",class[2].name[1]); D) printf("%c\n",class[2].name[0]);

D 4、以下程序的输出是________。 struct st {int x;int *y;} *p; int dt[4]={10,20,30,40}; struct st aa[4]={50,&dt[0],60,&dt[0],60,&dt[0],60,dt[0],}; main() { p=aa; printf("%d\n",++(p->x)); } A) 10 B) 11 C) 51 D) 60 C 6、以下程序的输出结果是________。 struct HAR

c语言9结构体与共用体

九、结构体与共用体 (一) 选择题 1、C语言结构体类型变量在程序执行期间_________。 A.所有成员一直驻留在内存中 B.只有一个成员驻留在内存中 C.部分成员驻留在内存中 D.没有成员驻留在内存中 2、下面程序的运行结果是_________。 main() { struct cmplx{ int x; int y; }cnum[2]={1,3,2,7}; printf("%d\n",cnum[0].y/cnum[0].x*cnum[1].x); } A.0 B.1 C.3 D.6 3、设有如下定义: struct sk {int n; float x; }data ,*p; 若要使p指向data中的n域,正确的赋值语句是_________。 A.p=&data.n; B.*p=data.n; C.p=(struct sk *)&data.n; D.p=(struct sk *)data.n 4、以下对结构体变量stu1中成员age的非法引用是_________。 struct student {int age; int num; }stu1,*p; p=&stu1; A.stu1.age B.student.age C.p->age D.(*p).age 5、下面对typedef的叙述中不正确的是_________。

A.用typedef可以定义各种类型名,但不能用来定义变量 B.用typedef可以增加新类型 C.用typedef只是将已存在的类型用一个新的标识符来代表 D.使用typedef有利于程序的通用和移植 6、以下scanf函数调用语句中对结构体变量成员的不正确引用是_________。 struct pupil {char name[20]; int age; int sex; }pup[5],*p; p=pup; A.scanf("%s",pup[0].name); B.scanf("%d",&pup[0].age); C.scanf("%d",&(p->sex)); D.scanf("%d",p->age); 7、若有以下说明和定义 union dt {int a;char b;double c;}data; 以下叙述中错误的是_________。 A)data的每个成员起始地址都相同 B)变量data所占的内存字节数与成员c所占字节数相等 C)程序段:data.a=5;printf("%f\n",data.c);输出结果为5.000000 D)data可以作为函数的实参 8、有一下语句 struct s { int i1; struct s,*i2}; static struct s a[3]={1,&a[1],2,&a[2],3,&a[3]},*ptr; ptr=&a[1]; 则一下表达式结果为3的是_________. A.ptr->i1++ B. ptr++->i1 C.*ptr->i1 D. ++ptr->i1 9、C语言结构体类型变量在程序执行期间_________。 A.所有成员一只驻留在内存中 B.只有一个成员驻留在内存中 C.部分成员驻留在内存中 D.没有成员驻留在内存中 10、若定义了如下共用体变量x,则x所占用的内存字节数为_________。

c语言结构体共用体选择题新)

1、变量a所占的内存字节数是________。(假设整型int为4字节) struct stu { char name[20]; long int n; int score[4]; } a ; A) 28 B) 30 C) 32 D) 46 C 2、下列程序的输出结果是 A)5 B)6 C)7 D)8 struct abc {int a,b,c;}; main() {struct abc s[2]={{1,2,3},{4,5,6}};int t; t=s[0].a+s[1].b; printf("%d\n",t); } B 3、有如下定义 struct person{ char name[9]; int age;};

struct person calss[4]={ "Johu",17, "Paul",19, "Mary",18, "Adam",16,}; 根据以上定义,能输出字母M的语句是________。 A) printf("%c\n",class[3].name); B) printf("%c\n",class[3].name[1]); C) printf("%c\n",class[2].name[1]); D) printf("%c\n",class[2].name[0]); D 4、以下程序的输出是________。 struct st {int x;int *y;} *p; int dt[4]={10,20,30,40}; struct st aa[4]={50,&dt[0],60,&dt[0],60,&dt[0],60,dt[0],}; main() { p=aa; printf("%d\n",++(p->x)); } A) 10 B) 11 C) 51 D) 60 C

2017年计算机二级C语言的结构体和共用体考试考点

2017年计算机二级C语言的结构体和共 用体考试考点 更多计算机软件水平考试相关信息请访问计算机软件水平考试网。 【考点1】结构体类型的说明 结构体是若干个类型数据的集合, 结构体类型说明格式: struct 类型名{类型1 成员名1;类型2 成员名2;……};,以上整个部分是一个数据类型,与整型的int是同样地位。可用typedef把结构体类型替换成一个只有几个字母的简短标识符。 【考点2】结构体变量的定义 结构体变量是用说明的结构体类型所定义的一个变量,与结构体类型不是一回事。一个结构体变量所占字节数为其所有成员所占字节数之和。如struct stu{char name[10];int age;} a,b;则表明定义了两个结构体变量a,b,每个变量占14个字节。a,b与int i,j;中的变量i,j 是同样地位。typedef 考的很多(教材150页例6)。 【考点3】结构体成员的引用 引用成员可用以下3种方式:(1)结构体变量名.成员名;(2)

指针变量名->成员名:(3)(*指针变量名).成员名。点(.)称为成员运算符,箭头(->)称为结构指向运算符。 【考点4】共用体 共用体的使用格式与结构体相似,共用体定义的关键字为union,共用体所占字节数是所有成员中字节数的那个。 union TT { int a; char ch[2];} t1 ; main() {t1.a=0x1234; printf("%x\n",t1.ch[0] ); printf("%x\n",t1.ch[1] );} 考点一:sizeof (struct TT) = 2; 考点二:TT t1 ; t1.a=0x1234; 那么ch[0]=0x 34; ch[1]=0x12 结构体和共用体以及链表要掌握最简单的。typedef 考的很多,而且一定要知道如何引用结构体中的各个变量,链表中如何填加和删除节点,以及何如构成一个简单的链表,一定记住链表中的节点是有两个域,一个放数值,一个放指针。 【考点5】链表 链表是由一个个结点构成的,一个结点就是一个结构体变量。每个结点可以分为数据域与指针域两个部分,数据域用来存放要存储的

C语言结构体习题及答案

第9章结构体 1.定义以下结构体类型 struct s { int a; char b; float f; }; 则语句printf("%d",sizeof(struct s))的输出结果为【】。 A) 3 B) 7 C) 6 D) 4 2.当定义一个结构体变量时,系统为它分配的内存空间是【】 A)结构中一个成员所需的内存容量 B)结构中第一个成员所需的内存容量 C)结构体中占内存容量最大者所需的容量 D)结构中各成员所需内存容量之和 3.定义以下结构体类型 struct s { int x; float f; }a[3]; 语句printf("%d",sizeof(a))的输出结果为【】 A) 4 B) 12 C) 18 D) 6 4.定义以下结构体数组 struct c { int x; int y; }s[2]={1,3,2,7}; 语句printf("%d",s[0].x*s[1].x)的输出结果为【】 A) 14 B) 6 C) 2 D) 21 5.运行下列程序段,输出结果是【】 struct country { int num; char name[10]; }x[5]={1,"China",2,"USA",3,"France",4, "England",5, "Spanish"}; struct country *p; p=x+2; printf("%d,%c",p->num,(*p).name[2]); A) 3,a B) 4,g C) 2,U D) 5,S

6.下面程序的运行结果是【】。 struct KeyWord { char Key[20]; int ID; }kw[]={"void",1,"char",2,"int",3,"float",4,"double",5}; main() { printf("%c,%d\n",kw[3].Key[0], kw[3].ID); } A) i,3 B) n,3 C) f,4 D) l,4 7.定义以下结构体类型 struct student { char name[10]; int score[50]; float average; }stud1; 则stud1占用内存的字节数是【】。 A) 64 B) 114 C) 228 D) 7 8.如果有下面的定义和赋值,则使用【】不可以输出n中data的值。struct SNode { unsigned id; int data; }n,*p; p=&n; A) p.data B) n.data C) p->data D) (*p).data 9.根据下面的定义,能输出Mary的语句是【】。 struct person { char name[9]; int age; }; struct person class[5]={"John",17,"Paul",19,"Mary",18,"Adam",16}; A) printf("%s\n",class[1].name); B) printf("%s\n",class[2].name); C) printf("%s\n",class[3].name);

C语言结构体和共用体实验报告

实验九参考程序 实验9-1 /**************************************************************** *实验9.1 * *(1)为某商店的商品设计合适的结构体 (PRODUCT)。每一种商品包含编号(number)、 * 名称(name)、价格(price)、折扣(discount)4项信息,根据表9-1,为这些信息选择合适的数据类型。 *(2)建立2个函数,以实现对商品的操作。input函数实现商品的输入; * display函数显示商品信息。要求这2个函数都以商品的结构体(PRODUCT)指针为参数。 *(3)在主函数中为商品键盘定义一个结构体变量(keyboard),利用input函数实现键盘信息的输入; * 定义一个结构体数组(elec_device[3]),利用input函数实现冰箱、空调、电视信息的输入; * 最后利用display函数显示4种商品的信息。 * * 表9-1 * *编号名称价格折扣 *1010 键盘89.50 0.85 *1021 冰箱1024.00 0.95 *1022 空调2058.50 0.90 *1023 电视3001.88 0.95 * ****************************************************************/ #include typedef struct _PRODUCT { int iNumber; char strName[32]; float fPrice; float fDiscount; }PRODUCT,*PPRODUCT; void input(PRODUCT *pProduct); void display(PPRODUCT pProduct); void main() { int i; PRODUCT kyeboard;

C语言结构体与共用体过关题

班级 考号 姓名_________________试场号______________座位号______________ 装订线内不要答题 ◆◆◆◆◆◆◆◆◆◆装◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆订◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆线◆◆◆◆◆◆◆ 沅江市职业中专计算机专业《C 语言》试卷 结构体与共用体过关题 考生注意:本试卷共5大题,总分150 分,考试时间 90 分钟。 一、程序写结果题:本题共6题,每题5分,共30分。 1. 下面程序的输出是_______。 main() { enum em{em1=3,em2=1,em3}x ; char *aa[]={"AA","BB","CC","DD"}; x=em2; printf("%s%s%s\n",aa[em1],aa[x],aa[em3]);} 2. 下面程序的输出结果是________。 struct ks { int a; int *b;}; main() { struct ks s[5],*p; int n=1,i; for(i=0;i<5;i++) { s[i].a=n; s[i].b=&s[i].a; n=n+3; } p=&s[1]; printf("%d,%d\n",++(*p->b),*(s+2)->b);} 3.下面程序的输出是 Struct ab{int a[2];char b;float c;}; typedef union { long x[2]; int y[7]; char z[8]; struct ab b[4]; } MY; main() { MY them[10]; printf("%d\n",sizeof(them));} 4. 字符ˊ0ˊ的ASCII 码的十进制数为48,且数组的第0个元素在低位,则 以下程序的输出结果是 。 main() { union { int b[4]; long k ;char c[4];} a,*s=&a ; s->b[0]=0x3738; s->b[1]=0x3635; printf(〞%c\n 〞,s->c[1]);} 5.有以下程序输出结果是 struct stu {int num;char name[10];int age; }; void fun(struct stu *p) { p++; p->age=45; strcpy(p->name,”liming ”); } main() {struct stu ss[3]={{01,"zhang",20},{02,"Wang",19},{03,"zhao",18}}; fun(ss+1); printf(“%d,%s,%d\n ”,ss[2].num,ss[2].name,ss[2].age);} 6.设位段的空间分配由右到左,则以下程序的运行结果是 。 struct as { unsigned a : 2 ; unsigned b : 3 ; unsigned c : 4 ; } data ; main ( ) { unsigned char x=45; data.a=7 ; data.b=2 ; data.c=23; data.i=68; data.a=data.a&x; data.c=data.b^x; printf(“%d\n ”,data.a+data.b+data.c) ; } 二、程序填空题:本题共3题,每题10分,共30分。

C语言程序设计 结构体与共用体

一、选择题 1、定义结构类型时,下列叙述正确的是() A、系统会按成员大小分配每个空间 B、系统会按最大成员大小分配空间 C、系统不会分配空间 D、以上说法均不正确 2、已知结构类型变量x的初始化值为{“20”,30,40,35.5},请问合适的结构定义是() A、 Struct s{int no;int x,y,z}; B、 Struct s{char no[2];int x,y,z}; C、 Struct s{int no;float x,y,z}; D、Struct s{char no[2];float x,y,z}; 3、若程序中有定义struct abc{int x;char y;};abc s1,s2;则会发生的情况是() A、编译时会有错误 B、链接时会有错误 C、运行时会有错误 D、程序没有错误 4、已知学生记录描述为 struct student {int no; char name[20]; char set; struct {int year; int month; int day; }birth;}; struct student s; 设变量s中的“生日”应是“1984年11月11日”,下列对生日的正确赋值方式是( ). A)year=1984; B)birth.year=1984; month=11; birth.month=11; day=11; birth.day=11; C)s.year=1984; D)s.birth.year=1984; s.month=11; s.birth.month=11; s.day=11; s.birth.day=11; 5、当说明一个结构体变量时系统分配给它的内存是( ). A)各成员所需内存量的总和 B)结构中第一个成员所需内存量 C)成员中占内存量最大者所需的容量 D)结构中最后一个成员所需内存量 6、以下对结构体类型变量的定义中不正确的是( ). A)#define STUDENT struct student B)struct student STUDENT {int num; {int num; float age; float age; }std1; }std1; C)struct D)struct {int num; int num; float age; float age;

课题_c语言_文件操作_FILE结构体解释_涉及对操作系统文件FCB操作的解释

c语言_文件操作_FILE结构体解释_涉及对操作系统文件FCB操作的解释 1. 文件和流的关系 C将每个文件简单地作为顺序字节流(如下图)。每个文件用文件结束符结束,或者在特定字节数的地方结束,这个特定的字节数可以存储在系统维护的管理数据结构中。当打开文件时,就建立了和文件的关系。 在开始执行程序的时候,将自动打开3个文件和相关的流:标准输入流、标准输出流和标准错误。流提供了文件和程序的通信通道。例如,标准输入流使得程序可以从键盘读取数据,而标准输出流使得程序可以在屏幕上输出数据。打开一个文件将返回指向FILE结构(在stdio.h中定义)的指针,它包含用于处理文件的信息,也就是说,这个结构包含文件描述符。文件描述符是操作系统数组(打开文件列表的索引)。每个数组元素包含一个文件控制块(FCB, File Co ntrol Block),操作系统用它来管理特定的文件。 标准输入、标准输出和标准错误是用文件指针stdin、stdout和stderr来处理的。 2. C语言文件操作的底层实现简介 2.1 FILE结构体 C语言的stdio.h头文件中,定义了用于文件操作的结构体FILE。这样,我们通过fopen返回一个文件指针(指向FILE结构体的指针)来进行文件操作。可以在stdio.h(位于visual studio安装目录下的include文件夹下)头文件中查看FILE结构体的定义,如下: TC2.0中: typedef struct{ short level; /* fill/empty level of buffer */ unsigned flags; /* File status flags */ char fd; /* File descriptor */ unsigned char hold; /* Ungetc char if no buffer */ short bsize; /* Buffer size */ unsigned char*buffer; /* Data transfer buffer */ unsigned char*curp; /* Current active pointer */ unsigned istemp; /* Temporary file indicator */ short token; /* Used for validity checking */ } FILE; /* This is the FILE object */ VC6.0中: #ifndef _FILE_DEFINED struct_iobuf { char *_ptr; //文件输入的下一个位置 int _cnt; //当前缓冲区的相对位置 char *_base; //指基础位置(即是文件的其始位置) int _flag; //文件标志 int _file; //文件的有效性验证 int _charbuf; //检查缓冲区状况,如果无缓冲区则不读取 int _bufsiz; //???这个什么意思 char *_tmpfname; //临时文件名 }; typedef struct_iobuf FILE; #define_FILE_DEFINED #endif

计算机二级C语言结构体要点

结构体与共用体要点 一、概述 结构体(structure)是一种数据类型,它把互相联系的数据组合成一个整体。 把不同类型的数据组合成一个有机的整体,可以用结构体解决。 结构体中的每一项数据,称为结构体“成员”(member)或“分量”。 声明结构体类型的一般形式:struct 结构体名 {成员表列}; 声明各成员的形式:类型名成员名; 例如:学生数据struct student {int num; char name[20]; char sex; int age; float score; char addr[30]; }; 注意不要忽略最后的分号 student结构体类型占59个字节。 二、定义结构体类型变量的方法 1.先声明结构体类型再定义变量名 struct student student1, student2;要求指定为某一特定的结构体类型2.在声明类型的同时定义变量 struct 结构体名 {成员表列 }变量名表列; 例如:struct student {int num; char name[20]; char sex; int age; float score; char addr[30]; } student1, student2; 3.直接定义结构体类型变量 struct {成员表列 }变量名表列; 几点说明: (1)类型与变量是不同的概念; (2)结构体中的成员可单独使用,其作用与地位相当于普通变量; (3)成员也可以是一个结构体变量; (4)成员名与普通变量名相同,不代表同一对象。 三、结构体变量的引用 (1)不能将结构体变量整体进行输入和输出,只能对各个成员分别进行输入和输出。 printf("%d,%s,%c,%d,%f,%s\n",student1);错误 (2)引用成员的方式:结构体变量名.成员名

C语言基础-结构体和联合体

C语言基础-结构体和联合体 在C中, 结构也是一种数据类型, 可以使用结构变量, 因此, 象其它类型的变量一样, 在使用结构变量时要先对其定义。 定义结构变量的一般格式为: struct 结构名 { 类型变量名; 类型变量名; ... } 结构变量; 结构名是结构的标识符不是变量名。 类型为第二节中所讲述的五种数据类型(整型、浮点型、字符型、指针型和无值型)。 构成结构的每一个类型变量称为结构成员, 它象数组的元素一样, 但数组中元素是以下标来访问的, 而结构是按变量名字来访问成员的。 下面举一个例子来说明怎样定义结构变量。 struct string { char name[8]; int age; char sex[2]; char depart[20]; float wage1, wage2, wage3, wage4, wage5; } person; 这个例子定义了一个结构名为string的结构变量person, 如果省略变量名person, 则变成对结构的说明。用已说明的结构名也可定义结构变量。这样定义时上例变成: struct string { char name[8]; int age; char sex[2]; char depart[20]; float wage1, wage2, wage3, wage4, wage5; }; struct string person; 如果需要定义多个具有相同形式的结构变量时用这种方法比较方便, 它先作结构说明, 再用结构名来定义变量。 例如: struct string Tianyr, Liuqi, ...; 如果省略结构名, 则称之为无名结构, 这种情况常常出现在函数内部, 用这种结构时前面的例子变成: struct {

C语言中为什么要头文件和源文件分开写

对c&c++程序来说,基本上来说都是要把源文件和头文件分别编写。一般都是代表一个基本功能的源文件引用相应的头文件。 一个相关功能的模块可能有若干对源文件和头文件组成。这是基于组件编程的核心。 在我看来,他的好处是巨大的,是java不可比拟的,也是不可复制的: c语言中头文件中一般定义了函数的声明、结构体的定义、宏定义。(常量和全局变量最好放到源文件中) 1)从业务扩展性上看:头文件中放函数的声明,函数由源文件实现,这就是将面向接口编程:接口和实现分开,这在面对业务变更频繁的需求中技术实现的好处是显而易见的--只要定义出良好地、扩展性高的接口,实现是可以很方便的更换。 2)从程序架构上看:代码在在大型程序中需要分成不同的模块,单一模块中又可能分为不同的业务功能单元,他们间有很多相互的调用。 头文件中的方法声明、结构体定义、宏就都可以充当这部分的模块与模块间、业务功能单位间的接口调用。模块与模块间,功能单元与功能单元间都是面向接口的调用,耦合性低,这正是基于组件编程的核心思想。 3)从某些技术角度实现上看:头文件可通过宏定义来保证类定义、结构体定义、宏定义的唯一性。确实很方便,不容易出错。 在用makefile编译程序时,各个功能单元单独编译,构成中间文件.最终这些中间文件链接成可执行程序,在这些中间文件中重复引用同一头文件是不可避免的。但如果头文件有保护性编程就可以很容易保证类、结构体、宏定义的唯一性----最终链接成可执行程序时,可执行程序中代码区中只会有唯一的类、结构体、宏的定义,其他都因为不满足唯一性保护失效。这样的实现是不是很‘优雅’:)))?我不知道你是否是这样认为,至于我,我是这样认为,haha~

相关主题
文本预览
相关文档 最新文档