您好,欢迎访问三七文档
当前位置:首页 > 机械/制造/汽车 > 实验八-构造数据类型
实验八构造数据类型一、实验学时4学时。二、实验目的1.掌握结构体类型变量和结构体类型指针的定义和使用。2.掌握结构体类型数组的定义和使用。3.理解单链表的相关概念,熟练掌握单链表的基本操作。4.掌握共用体类型、枚举类型、用户自定义类型的定义和使用。三、实验内容1.阅读程序(1)编辑并调试运行程序,分析程序运行结果。#includestdio.hstructstudent{intnumber;charname[20];};voidmain(){structstudentstu;printf(请输入学生的信息:);scanf(%d%s,&stu.number,&stu.name);printf(学生的信息为:);printf(%d%s\n,stu.number,stu.name);}请输入学生的信息:1Mike↙①分析程序,写出程序运行结果:学生的信息为:1Mike②能否将语句“printf(%d%s\n,stu.number,stu.name);”修改为“printf(%s\n,stu);”。请说明理由。不能,因为对结构体变量的使用是通过对其每个成员的引用来实现的。③如果将语句“structstudentstu;”修改为:structstudentstu,*pstu=&stu;请应用指向运算符“-”完成学生信息的输入及输出。scanf(%d%s,&stu.number,&stu.name);改为scanf(%d%s,&pstu-number,&pstu-name);printf(%d%s\n,stu.number,stu.name);改为printf(%d%s\n,pstu-number,pstu-name);(2)编程并调试运行程序,分析程序运行结果。#includestdio.huniondata{inta;floatb;charc;};voidmain(){uniondatad={65};printf(%d\n,d.a);printf(%d\n,d.b);printf(%d\n,d.c);}650①分析程序,写出程序运行结果:65。②能否将语句“uniondatad={65};”修改为“uniondatad={65,3.14,'F'};”?请说明理由。不可以,因为对共用体变量进行初始化,仅限于对其第一个成员进行初始化,不是对其所有成员都赋初值。2.编程练习(1)定义一个结构体类型变量(包括年、月、日信息)。计算某日在本年度中是第几天?分析:本题需要先构造一个结构体数据类型,其成员信息包括年、月、日等。struct{intyear;intmonth;intday;}date;然后按照月份计算天数,可以采用switch多分支结构描述。同时,需要考虑输入年份值后,判断这一年是否为闰年。输入样例:请输入年、月、日信息:20141008↙输出样例:10月8日是2014年中的第281天参考程序如下:#includestdio.hstruct{intyear;intmonth;intday;}date;voidmain(){intsum=0,leap;printf(请输入年、月、日信息:);scanf(%d%d%d,&date.year,&date.month,&date.day);switch(date.month)/*先计算某月以前月份的总天数*/{case1:sum=0;break;case2:sum=31;break;case3:sum=59;break;case4:sum=90;break;case5:sum=120;break;case6:sum=151;break;case7:sum=181;break;case8:sum=212;break;case9:sum=243;break;case10:sum=273;break;case11:sum=304;break;case12:sum=334;break;default:printf(dataerror);break;}sum=sum+date.day;/*再加上某天的天数*/if(date.year%400==0||(date.year%4==0&&date.year%100!=0))/*判断闰年*/leap=1;elseleap=0;if(leap==1&&date.month2)/*如果是闰年且月份大于2,总天数应该加一天*/sum++;printf(%d月%d日是%d年中的第%d天\n,date.month,date.day,date.year,sum);}(2)有3位学生,每位学生的信息包括学号、姓名、三门课成绩等。要求:通过键盘输入每位学生信息;输出每位学生三门课程总平均分;输出总分最高的学生信息(包括学号、姓名、三门课的成绩,总平均分)。要求:用一个input函数输入3位学生数据;用一个average函数求总平均分;max函数找出总分最高的学生信息;每位学生的总平均分和总分最高的学生信息都在主函数main中输出。#includestdio.h#defineN3structstudent{charnum[7];charname[8];intscore[3];floataverage;};//input函数输入3位学生信息voidinput(structstudent*p,intn){inti;for(i=0;in;i++,p++){printf(请输入第%d位学生信息:,i+1);//请编写代码,完成相应的功能scanf(%s%s,p-num,p-name);for(intj=0;j3;j++)scanf(%d,&p-score[j]);}}//average函数求总平均分floataverage(structstudent*p,intn){floats=0;inti;//请编写代码,完成相应的功能for(i=0;in;i++)s+=p-score[i];returns/3;}//max函数找出总分最高的学生信息intmax(structstudent*p,intn){//请编写代码,完成相应的功能inti,k=0;floatmaxi=p-average;for(i=0;in;i++,p++)if(p-averagemaxi){maxi=p-average;k=i;}returnk;}voidmain(){intmaxi;floatavescore;structstudentstu[N];//请编写代码,完成相应的功能input(stu,N);for(inti=0;iN;i++)stu[i].average=average(&stu[i],3);maxi=max(stu,N);avescore=stu[maxi].score[0]+stu[maxi].score[1]+stu[maxi].score[2];printf(学号姓名分数1分数2分数3平均分\t\n);for(i=0;iN;i++)printf(%s%s%d%d%d%.2f\n,stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].average);printf(总分最高的学生是:%s,总分=%d\n,stu[maxi].name,(int)avescore);}输入样例:请输入第1位学生信息:201401ZhangSan806895↙请输入第2位学生信息:201402LiPing959490↙请输入第3位学生信息:201403SunYang857565↙输出样例:学号姓名分数1分数2分数3平均分201401ZhangSan80689584.00201402LiPing95949093.00201403SunYang85756575.00总分最高的学生是:LiPing,总分=275(3)编写create函数,其功能是建立一个单链表,每个节点包括:学号、性别、年龄,该单链表中共包含3个节点。编写deletestu函数,其功能是:输入一个年龄,如果单链表中的节点所包含的年龄信息等于年龄,则将此节点删除。编写list函数,其功能是将该单链表输出。最后通过主函数main来调用上述函数,实现相应功能。参考程序如下:#includestdio.h#includemalloc.h#defineNULL0#defineLENsizeof(structstudent)structstudent{longnum;charname[8];charsex[10];intage;structstudent*next;};intn=3;//记录学生节点的数目,即学生数//creat函数,其功能是建立一只单键表structstudent*creat(){structstudent*head,*p1,*p2;head=NULL;p1=p2=(structstudent*)malloc(LEN);//请编写代码,完成相应的功能for(inti=0;in;i++){scanf(%ld%s%s%d,&p2-num,p2-name,p2-sex,&p2-age);if(!head)head=p2;else{p1-next=p2;p1=p2;}p2=(structstudent*)malloc(LEN);}p1-next=NULL;returnhead;}//deletestu函数,其功能是输入一个年龄,删除链表中等于此年龄的节点structstudent*deletestu(structstudent*head,intage){structstudent*p1,*p2;//请编写代码,完成相应的功能p2=p1=head;for(;p1!=NULL;)if(p1-age==age)if(head==p1){head=p1-next;free(p1);break;}else{p2-next=p1-next;free(p1);break;}else{p2=p1;p1=p1-next;}returnhead;}//list函数,其功能是将链表输出voidlist(structstudent*head){structstudent*p;//请编写代码,完成相应的功能p=head;printf(%ld%s%s%d-%ld%s%s%d\n,p-num,p-name,p-sex,p-age,p-next-num,p-next-name,p-next-sex,p-next-age);}voidmain(){structstudent*head=NULL;intage;head=creat();printf(请输入年龄:\n);scanf(%d,&age);head=deletestu(head,age);list(head);}输入样例:201401ZhangSanmale20↙201402LiPingmale18↙201403SunYangfemale19↙请输入年龄:18↙输出样例:201401ZhangSanmale20-201403SunYangfemale193.程序改错题在一个结构体类型数组中存储了三位学生的姓名及年龄等信息,请编程输出三位学生中年龄居中的学生姓名及年龄信息。要求:(1)三位学生的姓名及年龄信息通过键盘输入。(2)利用结构体指针实现处理过程。输入样例(改正后程序的运行结果):请输入学生的信息(姓名、年龄):ZhangSan17↙LiPing25↙Sunyang19↙输出样例:年龄居中者:姓名Sunyang,年龄19修改后的程序如下:#includestdio.h#includemalloc.h#defineN3typedefstructstudents{charname[8];intage;}STUDENT[N];voidmain(){STUDENTstu,stu1[N];inti,j,k
本文标题:实验八-构造数据类型
链接地址:https://www.777doc.com/doc-6184533 .html