上机实训 结构体.docx
《上机实训 结构体.docx》由会员分享,可在线阅读,更多相关《上机实训 结构体.docx(13页珍藏版)》请在冰豆网上搜索。
上机实训结构体
实训七结构体和共用体
一、实验目的:
1.掌握结构体类型数据的定义和引用
2.能够用typedef说明一个新的类型
3.掌握函数之间结构体变量的数据传递
4.能够求出结构体数组中的最大值,平均值,及结构体数组中数据的排序
5.能够用结构体构成链表并且能够引用出链表中的数据
二、实验内容
1.结构体的定义和引用,启动VisualC++,输入以下程序
#include"stdio.h"
structstudent
{
longintnum;
charname[20];
charsex;
charaddr[20];
};
main()
{
structstudenta={89031,"lilin",'m',"123beijingroad"};
printf("no:
%ld\nname:
%s\nsex:
%c\naddr:
%s\n",a.num,a.name,a.sex,a.addr);
}
思考:
如果定义成结构体指针或结构体者数组的话,那么他们的成员又该如何引用?
如果是结构体指针程序变为:
main{
structstudentb={89031,"lilin",'m',"123beijingroad"},*a;
a=&b;
printf("no:
%ld\nname:
%s\nsex:
%c\naddr:
%s\n",a->num,a->name,a->sex,a->addr);
}
如果是结构体数组程序变为:
main()
{
structstudenta[2]={89031,"lilin",'m',"123beijingroad",89032,"lily",'f',"123shanghairoad"};
printf("no:
%ld\nname:
%s\nsex:
%c\naddr:
%s\n",a[0].num,a[1].name,a[0].sex,a[1].addr);
}
2.用typedef说明一个新的类型。
启动VisualC++,输入以下程序
#include"stdio.h"
typedefstruct
{
inta;
charb;
}ST;
main()
{
STy;
y.a=0;y.b=’A’;
printf(“y.a=%dy.b=%c”,y.a,y.b);
}
3.函数之间结构体变量的数据传递.
#include"stdio.h"
struct A
{ int a;char b[10];double c;};
struct A f(struct A t);
main()
{ struct A a={1001,"ZhangDa",1098.0};
a=f(a); printf("%d,%s,%6.1f\n",a.a,a.b,a.c);
}
struct A f(struct A t)
{ t.a=1002;strcpy(t.b,"ChangRong");t.c=1202.0;return t;}
思考:
如果把函数f(structA)中的returnt;去掉,输出的结果会是什么?
4.求结构体数组中的最大值。
学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入结构体数组s中,请编写函数fun,它的功能是:
把分数最高的学生数据放在b所指的数组中,注意:
分数最高的学生可能不止一个,函数返回分数最高的学生的人数。
请把下面的空填完整。
#include
#defineN16
typedefstruct
{charnum[10];
ints;
}STREC;
intfun(STREC*a,STREC*b)
{
inti,j=0,max=a[0].s;
for(i=0;iif(max<)
max=a[i].s;
for(i=0;iif(max==a[i].s)b[j++]=a[i];
return;
}
main()
{STRECs[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}};
STRECh[N];
inti,n;FILE*out;
n=fun(s,h);
printf("The%dhighestscore:
\n",n);
for(i=0;iprintf("%s%4d\n",h[i].num,h[i].s);
printf("\n");
out=fopen("c:
\\test\\out.dat","w");
fprintf(out,"%d\n",n);
for(i=0;ifprintf(out,"%4d\n",h[i].s);
fclose(out);
}
参考答案:
a[i].sj
5.以下程序把三个NODETYPE型的变量链接成一个简单的链表,并在while循环中输出链表结点数据域中的数据,请填空
#include
structnode
{intdata;structnode*next;};
typedefstructnodeNODETYPE;
main()
{NODETYPEa,b,c,*h,*p;
a.data=10;b.data=20;c.data=30;h=&a;
b.next=&b;b.next=&c;c.next=’\0’;
p=h;
while(p){printf(“%d”,p->data);;}
}
}
参考答案:
p=p->next;
三、上机作业
1、学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入结构体数组s中,请编写函数fun,它的功能是:
按分数的高低排列学生的记录,高分在前。
请把以下程序补充完整。
#include
#defineN16
typedefstruct
{charnum[10];
ints;
}STREC;
voidfun(STRECa[])
{
inti,j;
STRECt;
for(i=0;ifor(j=1;jif()
{
要填多行
}
}
main()
{
STRECs[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}};
inti;FILE*out;
fun(s);
printf("Thedataaftersorted:
\n");
for(i=0;i{if((i)%4==0)printf("\n");
printf("%s%4d",s[i].num,s[i].s);
}
printf("\n");
out=fopen("c:
\\test\\out.dat","w");
for(i=0;i{if((i)%4==0&&i)fprintf(out,"\n");
fprintf(out,"%4d",s[i].s);
}
fprintf(out,"\n");
fclose(out);
}
参考答案:
a[i].s2.请输出以下程序的结果:
typedef struct
{ int num;double s;} REC;
void fun1(REC x)
{ x.num=23;x.s=88.5; }
main()
{ REC a={16,90.0};
fun1(a);
printf("%d\n",a.num);
}
参考答案:
16
3填空,本程序的功能是,输出结构体指针变量a的值。
#include"stdio.h"
structstudent
{
longintnum;
charname[20];
charsex;
charaddr[20];
};
main{
structstudentb={89031,"lilin",'m',"123beijingroad"},*a;
a=&b;
printf("no:
%ld\nname:
%s\nsex:
%c\naddr:
%s\n",);
}
参考答案:
a->num,a->name,a->sex,a->addr
4.填空题:
学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入结构体数组s中,请编写函数fun,它的功能是:
把分数最低的学生数据放在h所指的数组中,注意:
分数最低的学生可能不止一个,函数返回分数最低的学生的人数。
#include
#defineN16
typedefstruct
{charnum[10];
ints;
}STREC;
intfun(STREC*a,STREC*b,)
{
inti,k=0,min;
min=a[0].s;
for(i=0;imin=a[i].s;
for(i=0;iif(a[i].s=min)
b[k++]=a[i];
return;
}
main()
{
STRECs[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}};
STRECh[N];
Inti,n;
FILE*out;
n=fun(s,h);
printf("The%dlowestscore:
\n",n);
for(i=0;iprintf(“%s%4d\n”,h[i].num,h[i].s);
printf("\n");
out=fopen("out14.dat","w");
fprintf(out,"%d\n",n);
for(i=0;ifprintf(out,"%4d",h[i].s);
fclose(out);
}
参考答案:
if(a[i].s
上机作业二:
真题再现
1.(2010-03-36)设有定义
structcomplex
{intreal,unreal;}datal={1,8},data2;
则以下赋值语句中的错误的是B
A)data2=data1;B)data2=(2,6);
C)data2.real1=data1.real;D)data2.real=data1.unreal;
2.(2010-03-37)有以下程序
#include
#include
structA
{inta;charb[10];doublec;};
voidf(structAt);
main()
{structAa={1001,”ZhangDa”,1098.0};
f(a);printf(”%d,%s,%6.1f\n”,a.a,a.b,a.c);
}
voidf(structAt)
{t.a=1002;strcpy(t.b,”ChangRong”);t.c=1202.0;}
程序运行后的输出结果是A
A)1001,ZhangDa,1098.0B)1002,ChangRong,1202.0
C)1001,ChangRong,1098.0D)1002,ZhangDa,1202.0
3.(2010-03-38)有以下定义和语句
structworkers
{intnum;charname[20];charc;
srruct
{intday;intmonth;intyear;}s;
};
structworkersw,*pw;
pw=&w
能给w中year成员赋1980的语句是D
A)*pw.year=1980;B)w.year=1980;
C)pw->year=1980;D)w.s.year=1980;
4.(2009-03-37)有以下程序
#include
struct ord
{ int x,y;} dt[2]={1,2,3,4};
main()
{ struct ord *p=dt;
printf (“%d,”,++p->x); printf(“%d\n”,++p->y);
}
程序的运行结果是B
A)1,2 B)2,3 C)3,4 D)4,1
5.(2009-03-36)有以下程序
#include
#define PT 3.5;
#define S(x) PT*x*x;
mian()
{ int a=1, b=2; printf(“%4.1f\n”,S(a+b));}
程序运行后输出的结果是D
A)14.0 B)31.5 C)7.5 D)程序有错无输出结果
6.(2010-03-35)以下程序
#include
#defineSUB(a)(a)-(a)
main()
{inta=2,b=3,c=5,d;
d=SUB(a+b)*c;
printf(”%d\n”,d);
}
程序运行后的结果是C
A)0B)-12C)-20D)10
7.(2009-09-36)下面结构体的定义语句中,错误的是B
A)structord{intx;inty;intz;};structorda;
B)structord{intx;inty;intz;}structorda;
C)structord{intx;inty;intz;}a;
D)struct{intx;inty;intz;}a;
8.(2009-09-38)有以下程序
#include
#include
structA
{inta;charb[10];doublec;};
structAf(structAt);
main()
{structAa={1001,”ZhangDa”,1098.0};
a=f(a);jprintf(“%d,%s,%6.1f\n”,a.a,a.b,a.c);
}
structAf(structAt)
(t.a=1002;strcpy(t.b,”ChangRong”);t.c=1202.0;returnt;)
程序运行后的输出结果是D
A)1001,ZhangDa,1098.0
B)1001,ZhangDa,1202.0
C)1001,ChangRong,1098.0
D)1001,ChangRong,1202.0
9.(2009-09-12填)(12)设有定义:
structperson
{intID;charname[12];}p;
请将scanf(“%d”,【12】);语句补充完整,使其能够为结构体变量p的成员ID正确读入数据。
答案:
&p.ID
10.(2009-09-14填)有以下程序
#include
typedefstruct
{intnum;doubles}REC;
voidfun1(RECx){x.num=23;x.s=88.5;}
main()
{RECa={16,90.0};
fun1(a);
printf(“%d\n”,a.num);
}
程序运行后的输出结果是【14】16
11.(2009-09-35)有以下程序
#include
#definef(x)x*x*x
main()
{inta=3,s,t;
s=f(a+1);t=f((a+1));
printf(“%d,%d\n’,s,t);
}
程序运行后的输出结果是A
A)10,64
B)10,10
C)64,10
D)64,64
12.(2009-04-14填)下列程序的运行结果为【14】
#include
#include
struct A
{int a;char b[10];double c;};
void f (struct A *t);
main()
{struct A a=(1001,”ZhangDa”,1098,0);
f(&a);printf(“&d,&s,&6,if\n”,a.a,a.b,a.c);
}
void f(struct A *t)
{strcpy(t->b,”ChangRong”); }
答案:
1001,ChangRong,1098.0
13.(2009-04-15填)以下程序把三个NODETYPE型的变量链接成一个简单的链表,并在while循环中输出链表结点数据域中的数据,请填空
#include
struct node
{int data; struct node *next;};
typedef struct node NODETYPE;
main()
{NODETYPE a,b,c,*h,*p;
a. data=10;b.data=20;c.data=30;h=&a;
b. next=&b;b.next=&c;c.next=’\0’;
p=h;
while(p){printf(“&d”,p->data);【15】;}
}
答案:
p=p->next