《C语言程序设计》实 验 报 告5.docx
《《C语言程序设计》实 验 报 告5.docx》由会员分享,可在线阅读,更多相关《《C语言程序设计》实 验 报 告5.docx(31页珍藏版)》请在冰豆网上搜索。
《C语言程序设计》实验报告5
《C语言程序设计》实验报告(5)
学号:
姓名:
班级:
成绩:
实验名称:
结构体与共用体综合实验
实验地点:
实验室
所使用的工具软件及环境:
WindowsXP系统;VisualC++6.0
一、实验目的:
1) 熟悉结构体与共用体的正确用法:
2)理解结构体与共用体的特殊性;
二、实验内容:
按题目要求编程并上机调试程序。
1、VC++6.0上机介绍(请参考VC++5.0完成,)
2、课堂练习
一、填空题
38.1/*给定程序中,函数fun的功能是:
将形参指针所指结构体数组中的三个元素按num成员进行升序排列。
请勿改动主函数main与其他函数中的任何内容,仅在横线上填写所需的若干表达式或语句。
注意:
部分源程序给出如下。
*/
#include
typedefstruct
{
intnum;
charname[10];
}PERSON;
voidfun(PERSONstudent[])
{
PERSONa;
if(student[0].num>student[1].num)
{
a=student[0];
student[0]=student[1];
student[1]=a;
}
if(student[0].num>student[2].num)
{
a=student[0];
student[0]=student[2];
student[2]=a;
}
if(student[1].num>student[2].num)
{
a=student[1];
student[1]=student[2];
student[2]=a;
}
}
main()
{
PERSONstudent[]={5,"Rose",2,
"Charl",6,"Kate"};
inti;
fun(student);
printf("\nTheresultis:
\n");
for(i=0;i<3;i++)
printf("%d,%s\n",student[i].num,
student[i].name);
getch();
}
程序运行结果示例:
41.1/*给定程序中,函数fun的功能是:
将形参student所指结构体数组中年龄最小者的数据作为函数值返回,并在main函数中输出。
请勿改动主函数main与其他函数中的任何内容,仅在fun函数的横线上填写所需的若干表达式或语句。
注意:
部分源程序给出如下?
*/
#include
typedefstruct
{
charname[10];
intage;
}STUDENT;
STUDENTfun(STUDENTstudent[],intn)
{
STUDENTmin;
inti;
min=student[0];
for(i=1;iif(min.age>student[i].age)
min=student[i];
returnmin;
}
main()
{
STUDENTstudent[3]={"alice",17,
"baren",16,"caren",18};
STUDENTmin;
min=fun(student,3);
printf("\nTheminageresult\n");
printf("\nName:
%s,Age:
%d\n",min.name,
min.age);
getch();
}
程序运行结果示例:
79.1/*已知学生的记录由学号和学习成绩组成,N名学生的数据已存入student结构体中,给定程序的功能是找出成绩最高的学生记录,通过形参返回主函数。
请勿改动主函数main与其他函数中的任何内容,仅在fun函数的横线上填写所需的若干表达式或语句。
注意:
部分源程序给出如下。
*/
#include
#include
#defineN10
typedefstructs
{
charnum[10];
ints;
}student;
fun(studentSTU[],student*s)
{
studenta;
inti;
a=STU[0];
for(i=1;iif(STU[i].s>a.s)
a=STU[i];
*s=a;
}
main()
{
studentSTU[N]=
{
{"01",81},{"02",89},{"03",66},
{"04",87},{"05",77},{"06",90},{"07",79},{"08",61},{"09",80},{"10",71}},m;
inti;
printf("Theoriginaldata\n");
for(i=0;iprintf("No=%sMark=%d\n",STU[i].
num,STU[i].s);
fun(STU,&m);
printf("Thehighst:
%s,%d\n",m.num,
m.s);
getch();
}
程序运行结果示例:
95.1/*请补充函数fun,该函数的功能是建立一个带头结点的单向链表并输出到文件file.dat和屏幕上,各结点的值为对应的下标,链表的结点数及输出的文件名作为参数传入。
请勿改动主函数main与其他函数中的任何内容,仅在fun函数的横线上填写所需的若干表达式或语句。
注意:
部分源程序给出如下。
*/
#include
#include
typedefstructs
{
intdata;
structs*next;
}NODE;
voidfun(intn,char*filename)
{
NODE*h,*p,*s;
FILE*f;
inti;
h=p=(NODE*)malloc(sizeof(NODE));
h->data=0;
for(i=1;i{
s=(NODE*)malloc(sizeof(NODE));
s->data=i;
p->next=s;
p=p->next;
}
p->next=NULL;
if((f=fopen(filename,"w"))==NULL)
{
printf("Cannotopenfile.dat!
");
exit(0);
}
p=h;
fprintf(f,"THELIST\n");
printf("THELIST\n");
while(p)
{
fprintf(f,"%3d",p->data);
printf("%3d",p->data);
if(p->next!
=NULL)
{
fprintf(f,"->");
printf("->");
}
p=p->next;
}
fprintf(f,"\n");
printf("\n");
fclose(f);
p=h;
while(p)
{
s=p;
p=p->next;
free(s);
}
}
main()
{
char*filename="file.dat";
intn;
printf("\nPleaseinputn:
");
scanf("%d",&n);
fun(n,filename);
getch();
}
程序运行结果示例:
二、改错题
35.2/*下列给定程序是建立一个带头结点的单向链表,并用随机函数为各结点赋值。
函数fun的功能是将单向链表结点(不包括头结点)数据域为偶数的值累加起来,并且作为函数值返回。
请修改函数fun中的错误,得出正确的结果。
注意:
不要改动main函数,不能增行或删行,也不能更改程序的结构?
*/
#include
#include
#include
typedefstructa
{
intdata;
structa*next;
}NODE;
intfun(NODE*h)
{
intsum=0;
NODE*p;
p=h->next;
/*******error*********/
while(p!
=NULL)
{
if(p->data%2==0)
sum+=p->data;
/*******error*********/
p=p->next;
}
returnsum;
}
NODE*link(intn)
{
NODE*h,*p,*s;
inti;
h=p=(NODE*)malloc(sizeof(NODE));
for(i=1;i{
s=(NODE*)malloc(sizeof(NODE));
s->data=rand()%16;
s->next=p->next;
p->next=s;
p=p->next;
}
p->next=NULL;
returnh;
}
printlink(NODE*h)
{
NODE*p;
p=h->next;
printf("\n\nTHELIST:
\n\nHEAD");
while(p)
{
printf("->%d",p->data);
p=p->next;
}
printf("\n");
}
main()
{
NODE*head;
intsum;
head=link(5);
printlink(head);
sum=fun(head);
printf("\nTheresultSUM=%d",sum);
getch();
}
程序运行结果示例:
44.2/*下列给定程序中,函数的功能是:
对N名学生的学习成绩,按从高到低的顺序找出前m(m≤10)名学生,并将这些学生数据存放在一个动态分配的连续存储区中,将此存储区的首地址作为函数值返回。
请修改函数fun中的错误,得出正确的结果。
注意:
不要改动main函数,不能增行或删行,也不能更改程序的结构。
*/
#include
#include
#include
#defineN10
typedefstructs
{
charnum[10];
ints;
}STUDENT;
STUDENT*fun(STUDENTa[],intm)
{
STUDENTb[N],*t;
inti,j,k;
/********error********/
t=(STUDENT*)malloc(sizeof(STUDENT));
for(i=0;ib[i]=a[i];
for(k=0;k{
for(i=j=0;iif(b[i].s>b[j].s)
j=i;
/********error********/
strcpy(t[k].num,b[j].num);
t[k].s=b[j].s;
b[j].s=0;
}
returnt;
}
printresult(STUDENTa[],FILE*pf)
{
inti;
for(i=0;ifprintf(pf,"No=%sMark=%d\n",
a[i].num,a[i].s);
fprintf(pf,"\n\n");
}
main()
{
STUDENTa[N]=
{
{"01",81},{"02",89},{"03",66},
{"04",87},{"05",77},{"06",90},{"07",79},{"08",61},{"09",80},{"10",71}
};
STUDENT*Order;
inti,m;
printf("*****TheOriginaldata*****\n");
printresult(a,stdout);
printf("\nGivethenumberofthestudentswhohavebetterscore:
");
scanf("%d",&m);
while(m>10)
{
printf("\nGivethenumberofthestudentswhohavebetterscore:
");
scanf("%d",&m);
}
Order=fun(a,m);
printf("*****THERESULT*****\n");
printf("Thetop:
\n");
for(i=0;iprintf("%s%d\n",Order[i].num,
Order[i].s);
free(Order);
getch();
}
程序运行结果示例:
88.2/*下列给定程序中的函数link的功能是:
创建带头结点的单向链表,并为各结点数据域赋0到max-1的值。
请修改函数link中的错误,得出正确的结果。
注意:
不要改动main函数,不能增行或删行,也不能更改程序的结构。
*/
#include
#include
#include
typedefstructa
{
intdata;
structa*next;
}NODE;
NODE*link(intn,intmax)
{
NODE*h=NULL,*p,*s;
inti;
s=(NODE*)malloc(sizeof(NODE));
h=s;
/******error**********/
p=s;
for(i=1;i{
s=(NODE*)malloc(sizeof(NODE));
/*******error*********/
s->data=rand()%(max-1);
s->next=p->next;
p->next=s;
p=p->next;
}
s->next=NULL;
/********error********/
returnh;
}
printlink(NODE*h)
{
NODE*p;
p=h->next;
printf("\n\nTHELIST:
\n\nHEAD");
while(p)
{
printf("->%d",p->data);
p=p->next;
}
printf("\n");
}
main()
{
NODE*head;
head=link(10,20);
printlink(head);
getch();
}
程序运行结果示例:
89.2/*下列给定程序是建立一个带头结点的单向链表,并用随机函数为各结点数据域赋值。
函数fun的作用是求出单向链表结点(不包括头结点)数据域中的最大值,并且作为函数值返回。
请修改函数fun中的错误,得出正确的结果。
注意:
不要改动main函数,不能增行或删行,也不能更改程序的结构?
*/
#include
#include
#include
typedefstructa
{
intdata;
structa*next;
}NODE;
fun(NODE*h)
{
intmax=-1;
NODE*p;
/*******error*********/
p=h->next;
while(p)
{
if(p->data>max)
max=p->data;
/*******error*********/
p=p->next;
}
returnmax;
}
printresult(ints,FILE*pf)
{
fprintf(pf,"\nThemaxinlink:
%d\n",s);
}
NODE*link(intn,intm)
{
NODE*h,*p,*s;
inti;
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;
returnh;
}
printlink(NODE*h,FILE*pf)
{
NODE*p;
p=h->next;
fprintf(pf,"\nTHELIST:
\n\nHEAD");
while(p)
{
fprintf(pf,"->%d",p->data);
p=p->next;
}
fprintf(pf,"\n");
}
main()
{
NODE*head;
intm;
head=link(12,100);
printlink(head,stdout);
m=fun(head);
printf("\nTHERESULT:
\n");
printresult(m,stdout);
getch();
}
程序运行结果示例:
三、设计题
17.3/*学生的记录由学号和成绩组成,M名学生的数据已在主函数中放入结构体数组student中,请编写函数fun,它的功能是按分数的高低排列学生的记录,高分在前。
请勿改动主函数main与其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
注意:
部分源程序给出如下。
*/
#include
#defineM10
typedefstruct
{
charnum[10];
ints;
}SCORE;
voidfun(SCOREa[])
{
inti,j;
SCOREk;
for(i=0;ifor(j=i+1;jif(a[i].s{
k=a[i];
a[i]=a[j];
a[j]=k;
}
}
main()
{
SCOREstudent[M]={{"002",69},{"004",
85},{"001",91},{"007",72},{"008",64},{"006",87},{"015",85},{"012",64},{"014",91},{"011",66}};
inti;FILE*out;
fun(student);
printf("Thedataaftersorted:
\n");
for(i=0;i{
if((i)%4==0)
printf("\n");
printf("%s%4d",student[i].num,
student[i].s);
}
printf("\n");
out=fopen("outfile.dat","w");
for(i=0;i{
if((i)%4==0&&i)
fprintf(out,"\n");
fprintf(out,"%4d",student[i].s);
}
fprintf(out,"\n");
fclose(out);
getch();
}
程序运行结果示例:
41.3/*学生的记录由学号和成绩组成,M名学生的数据已在主函数中放入结构体数组stu中,请编写函数fun,它的功能是:
函数返回指定学号的学生数据,指定的学号在主函数中输入。
若没找到指定学号,在结构体变量中给学号置空串,给成绩置-1,作为函数值返回(用于字符串比较的函数是strcmp)。
请勿改动主函数main与其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
注意:
部分源程序给出如下。
*/
#include
#include
#defineM10
typedefstruct
{
charnum[10];
ints;
}SCORE;
SCOREfun(SCORE*p,char*q)
{
SCOREa;
inti;
for(i=0;iif(strcmp(p[i].num,q)==0)
{a=p[i];break;}
else
{
strcpy(a.num,"");
a.s=-1;
}
returna;
}
main()
{
SCOREstu[M]={{"G002",69},{"G004",
85},{"G001",96},{"G007",72},{"G008",64},{"G006",87},{"G015",85},{"G013",94},{"G012",64},{"G014",91}};
SCOREt;
charm[10];
inti;FILE*out;
printf("Theoriginaldata:
\n");
for(i=0;i{
if(i%4==0)printf("\n");
printf("%s%3d",stu[i].num,stu[i].s);
}
printf("\n\nEnterthenumber:
");
gets(m);
t=fun(stu,m);
printf("Thedata:
");
printf("\n%s%4d\n",t.num,t.s);
printf("\n");
out=fopen("outfile.dat","w");
t=fun(stu,"G013");
fprintf(out,"%s%4d\n",t.num,t.s);
fclose(out);
getch();
}
程序运行结果示例:
55.3/*已知学生的记录由学号和学习成绩构成,M名学生的数据已存入a结构体数组中。
请编写函数fun,该函数的功能是:
找出成绩最高的学生记录,通过形参返回主函数(规定只