实验八教案含答案.docx
《实验八教案含答案.docx》由会员分享,可在线阅读,更多相关《实验八教案含答案.docx(30页珍藏版)》请在冰豆网上搜索。
实验八教案含答案
第八课
教学内容:
结构体变量和结构体数组处理类算法
教学目的:
掌握结构体变量和结构体数组处理类算法的考题
教学内容:
一、结构体变量和结构体数组处理类算法的考题特点
1.此类算法主要以填空题和程序设计题为考查形式。
2.在填空和改错题中容易考到的知识:
(1)结构体变量的运算:
C规定只有同类型的结构体变量才能整体赋值运算。
(2)结构体变量成员的运算:
使用分量运算符访问最低一级成员,且成员的性质决定了整个结构体变量成员可以进行的运算。
如成员是int型,则可以进行int型变量可以的运算;如成员是数组,则成员数组名仅带表成员数组的首地址,可带下标访问成员数组的元素。
注意运算符优先级最高的四个运算符是:
()、[]、.、->,它们的结合方向是左结合。
(3)结构体数组:
性质同普通数组,不同的是结构体数组的元素可以再包含多个不同类型的成员。
(4)指向结构体变量的指针:
可以用形如:
p->num或(*p).num的形式访问其指向结构体变量的成员。
(5)参数传递方式:
结构体变量的值或结构体变量的地址,注意实参和形参的对应关系。
3.编程题中所涉及的算法有:
修改、查找、排序,方法同普通数组的运算,但其处理的对象一般是结构体变量的成员,注意其表示方法。
三、课堂练习
第一套
1、程序填空题(在被调函数中修改并输出结构体变量的值)
程序通过定义学生结构体变量,存储了学生的学号、姓名和3门课的成绩。
函数fun的功能是将形参a所指结构体变量中的数据赋给函数中的结构体变量b,并修改b中的学号和姓名,最后输出修改后的数据。
例如:
a所指变量中的学号、姓名、和三门课的成绩依次是:
10001、"ZhangSan"、95、80、88,则修改后输出b中的数据应为:
10002、"LiSi"、95、80、88。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:
源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
#include
#include
structstudent
{longsno;
charname[10];
floatscore[3];
};
voidfun(structstudenta)
{structstudentb;inti;
/**********found**********/
b=__1__;//a同类型的结构体变量可以整体赋值
b.sno=10002;
/**********found**********/
strcpy(__2__,"LiSi");//b.name成员数组的名字代表该成员存储空间的首地址
printf("\nThedataaftermodified:
\n");
printf("\nNo:
%ldName:
%s\nScores:
",b.sno,b.name);
/**********found**********/
for(i=0;i<3;i++)printf("%6.2f",b.__3__);//score[i]
printf("\n");
}
main()
{structstudents={10001,"ZhangSan",95,80,88};
inti;
printf("\n\nTheoriginaldata:
\n");
printf("\nNo:
%ldName:
%s\nScores:
",s.sno,s.name);
for(i=0;i<3;i++)printf("%6.2f",s.score[i]);
printf("\n");
fun(s);//单向值传递
}
2、程序设计题(在结构体数组中查找指定学号的学生数据)
学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入结构体数组s中,请编写函数fun,它的功能是:
函数返回指定学号的学生数据,指定的学号在主函数中输入。
若没找到指定学号,在结构体变量中给学号置空串,给成绩置-1,作为函数值返回。
(用于字符串比较的函数是strcmp)。
注意:
部分源程序在文件PROG1.C中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
#include
#include
#defineN16
typedefstruct
{charnum[10];
ints;
}STREC;
STRECfun(STREC*a,char*b)
{inti;
STRECc;
for(i=0;iif(strcmp(b,a[i].num)==0)
{c=a[i];break;}
if(i>=N)
{strcpy(c.num,"");c.s=-1;}
returnc;
}
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",77},{"GA017",64},{"GA018",64},{"GA016",72}};
STRECh;
charm[10];
inti;FILE*out;
printf("Theoriginaldata:
\n");
for(i=0;i{if(i%4==0)printf("\n");
printf("%s%3d",s[i].num,s[i].s);
}
printf("\n\nEnterthenumber:
");gets(m);
h=fun(s,m);
printf("Thedata:
");
printf("\n%s%4d\n",h.num,h.s);
printf("\n");
}
第二套
1、程序填空题(通过被调函数输出结构体变量各成员的值)
程序通过定义并赋初值的方式,利用结构体变量存储了一名学生的信息。
函数fun的功能是输出这位学生的信息。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:
源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
#include
typedefstruct
{intnum;
charname[9];
charsex;
struct{intyear,month,day;}birthday;
floatscore[3];
}STU;
/**********found**********/
voidshow(STU___1___)//tt
{inti;
printf("\n%d%s%c%d-%d-%d",tt.num,tt.name,tt.sex,tt.birthday.year,tt.birthday.month,tt.birthday.day);
for(i=0;i<3;i++)
/**********found**********/
printf("%5.1f",___2___);//tt.score[i]
printf("\n");
}
main()
{STUstd={1,"Zhanghua",'M',1961,10,8,76.5,78.0,82.0};
printf("\nAstudentdata:
\n");
/**********found**********/
show(___3___);//std
}
2、程序设计题(查找成绩最低的学生记录)
已知学生的记录由学号和学习成绩构成,N名学生的数据已存入a结构体数组中。
请编写函数fun,函数的功能是:
找出成绩最低的学生记录,通过形参返回主函数(规定只有一个最低分)。
注意:
部分源程序存在文件PROG1.C文件中。
请勿改动主函数main和其它函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
#include
#include
#defineN10
typedefstructss
{charnum[10];ints;}STU;
fun(STUa[],STU*s)
{inti;
STUmin=a[0];
for(i=1;iif(min.s>a[i].s)
min=a[i];
*s=min;
}
main()
{STUa[N]={{"A01",81},{"A02",89},{"A03",66},{"A04",87},{"A05",77},{"A06",90},{"A07",79},{"A08",61},{"A09",80},{"A10",71}},m;
inti;
printf("*****Theoriginaldata*****\n");
for(i=0;iprintf("No=%sMark=%d\n",a[i].num,a[i].s);
fun(a,&m);
printf("*****THERESULT*****\n");
printf("Thelowest:
%s,%d\n",m.num,m.s);
}
三、课后练习
1、程序填空题(在被调函数中修改结构体变量的值并返回其值)
程序通过定义学生结构体变量,存储了学生的学号、姓名和3门课的成绩。
函数fun的功能是将形参a中的数据进行修改,把修改后的数据作为函数值返回主函数进行输出。
例如:
传给形参a的数据中,学号、姓名、和三门课的成绩依次是:
10001、"ZhangSan"、95、80、88,修改后的数据应为:
10002、"LiSi"、96、81、89。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:
源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
#include
#include
structstudent
{longsno;
charname[10];
floatscore[3];
};
/**********found**********/
__1__fun(structstudenta)//structstudent
{inti;
a.sno=10002;
/**********found**********/
strcpy(__2__,"LiSi");//a.name
/**********found**********/
for(i=0;i<3;i++)__3__+=1;//a.score[i]
returna;
}
main()
{structstudents={10001,"ZhangSan",95,80,88},t;
inti;
printf("\n\nTheoriginaldata:
\n");
printf("\nNo:
%ldName:
%s\nScores:
",s.sno,s.name);
for(i=0;i<3;i++)printf("%6.2f",s.score[i]);
printf("\n");
t=fun(s);
printf("\nThedataaftermodified:
\n");
printf("\nNo:
%ldName:
%s\nScores:
",t.sno,t.name);
for(i=0;i<3;i++)printf("%6.2f",t.score[i]);
printf("\n");
}
2、程序填空题(在被调函数中修改结构体变量的值)
给定程序通过定义并赋初值的方式,利用结构体变量存储了一名学生的学号、姓名和3门课的成绩。
函数fun的功能是将该学生的各科成绩都乘以一个系数a。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:
源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
#include
typedefstruct
{intnum;
charname[9];
floatscore[3];
}STU;
voidshow(STUtt)
{inti;
printf("%d%s:
",tt.num,tt.name);
for(i=0;i<3;i++)
printf("%5.1f",tt.score[i]);
printf("\n");
}
/**********found**********/
voidmodify(___1___*ss,floata)//STU
{inti;
for(i=0;i<3;i++)
/**********found**********/
ss->___2___*=a;//score[i]
}
main()
{STUstd={1,"Zhanghua",76.5,78.0,82.0};
floata;
printf("\nTheoriginalnumberandnameandscores:
\n");
show(std);
printf("\nInputanumber:
");scanf("%f",&a);
/**********found**********/
modify(___3___,a);//&std
printf("\nAresultofmodifying:
\n");
show(std);
}
3、程序填空题(在被调函数中修改结构体变量值并返回其地址)
程序通过定义学生结构体变量,存储了学生的学号、姓名和3门课的成绩。
函数fun的功能是将形参a所指结构体变量s中的数据进行修改,并把a中地址作为函数值返回主函数,在主函数中输出修改后的数据。
例如:
a所指变量s中的学号、姓名、和三门课的成绩依次是:
10001、"ZhangSan"、95、80、88,修改后输出t中的数据应为:
10002、"LiSi"、96、81、89。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:
源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
#include
#include
structstudent
{longsno;
charname[10];
floatscore[3];
};
/**********found**********/
__1__fun(structstudent*a)//structstudent*
{inti;
a->sno=10002;
strcpy(a->name,"LiSi");
/**********found**********/
for(i=0;i<3;i++)__2__+=1;//a->score[i]
/**********found**********/
return__3__;//a
}
main()
{structstudents={10001,"ZhangSan",95,80,88},*t;
inti;
printf("\n\nTheoriginaldata:
\n");
printf("\nNo:
%ldName:
%s\nScores:
",s.sno,s.name);
for(i=0;i<3;i++)printf("%6.2f",s.score[i]);
printf("\n");
t=fun(&s);
printf("\nThedataaftermodified:
\n");
printf("\nNo:
%ldName:
%s\nScores:
",t->sno,t->name);
for(i=0;i<3;i++)printf("%6.2f",t->score[i]);
printf("\n");
}
4、程序填空题(在被调函数中通过形参指针修改结构体变量的值)
程序通过定义学生结构体变量,存储了学生的学号、姓名和3门课的成绩。
函数fun的功能是对形参b所指结构体变量中的数据进行修改,最后在主函数中输出修改后的数据。
例如:
b所指变量t中的学号、姓名、和三门课的成绩依次是:
10002、"ZhangQi"、93、85、87,修改后输出t中的数据应为:
10004、"LiJie"、93、85、87。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:
源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
#include
#include
structstudent
{longsno;
charname[10];
floatscore[3];
};
voidfun(structstudent*b)
{inti;
/**********found**********/
b__1__=10004;//->sno
/**********found**********/
strcpy(b__2__,"LiJie");//->name
}
main()
{structstudentt={10002,"ZhangQi",93,85,87};
inti;
printf("\n\nTheoriginaldata:
\n");
printf("\nNo:
%ldName:
%s\nScores:
",t.sno,t.name);
for(i=0;i<3;i++)printf("%6.2f",t.score[i]);
printf("\n");
/**********found**********/
fun(__3__);//&t
printf("\nThedataaftermodified:
\n");
printf("\nNo:
%ldName:
%s\nScores:
",t.sno,t.name);
for(i=0;i<3;i++)printf("%6.2f",t.score[i]);
printf("\n");
}
5、程序填空题(在结构体数组中找出年龄最大的数据)
给定程序中,函数fun的功能是:
将形参std所指结构体数组中年龄最大者的数据作为函数值返回,并在main函数中输出。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:
源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
#include
typedefstruct
{charname[10];
intage;
}STD;
STDfun(STDstd[],intn)
{STDmax;inti;
/**********found**********/
max=___1___;//std[0]
for(i=1;i/**********found**********/
if(max.age<___2___)max=std[i];//std[i].age
returnmax;
}
main()
{STDstd[5]={"aaa",17,"bbb",16,"ccc",18,"ddd",17,"eee",15};
STDmax;
max=fun(std,5);
printf("\nTheresult:
\n");
/**********found**********/
printf("nName:
%s,Age:
%d\n",___3___,max.age);//max.name
}
6、程序填空题(对结构体中的数据按姓名从小到大排序)
程序通过定义学生结构体数组,存储了若干名学生的学号、姓名和3门课的成绩。
函数fun的功能是将存放学生数据的结构体数组,按照姓名的字典序(从小到大)排序。
请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。
注意:
源程序存放在考生文件夹下的BLANK1.C中。
不得增行或删行,也不得更改程序的结构!
#include
#include
structstudent
{longsno;
charname[10];
floatscore[3];
};
voidfun(structstudenta[],intn)
{
/**********found**********/
__1__t;//structstudent
inti,j;
/**********found**********/
for(i=0;i<__2__;i++)//n-1
for(j=i+1;j/**********found**********/
if(strcmp(__3__)>0)//a[i].name,a[j].name
{t=a[i];a[i]=a[j];a[j]=t;}
}
main