实验14结构体-答案
![实验14结构体-答案](https://img.360docs.net/imgd5/06e4i2iy9f4agqwj3xyb-51.webp)
![实验14结构体-答案](https://img.360docs.net/imgd5/06e4i2iy9f4agqwj3xyb-02.webp)
实验14结构体
[实验目的]
1.掌握结构体和结构体数组的概念、定义及存储
2.掌握结构体和结构体数组的基本操作及应用
[DIY]
1、调试下列程序(下列各程序中存在一些问题,通过调试发现问题,并加以修正,使其实现预期目标)
[1.1]下列程序的功能为:应用结构体求多项式的值。多项式:
a n x n+a n-1x n-1+a n-2x n-2+…+a1x+a0,请纠正程序中存在的错误,使程序实现其功能。
答案
#include
#include
struct Poly
{ float a; /*系数*/
int n; /*指数*/
};
double fpvalue()
{ struct Poly p;
double pvalue=0;
float x;
printf("输入多项式X:\n");
scanf("%f",&x);
printf("输入多项式系数(a)和指数(n,n=-10000,结束):\n");
scanf("%f %d", &p.a, &p.n);
while(p.n!=-10000)
{pvalue+=p.a*pow(x, p.n);
scanf("%f %d", &p.a, &p.n);
}
return pvalue;
}
[1.2] 13个人围成一圈,从第1个开始顺序报号1、2、3。凡报到“3”者退出圈子。找出最后留在圈子中的人原来的序号。
[分析]本题算法通过一个循环队列来实现,用结构体数组构造一个循环队列,每个元素中定义一个成员存放下一个元素的下标。
答案
#include
#define N 13
struct person
{ int number ; /*当前元素的序号*/
int nextp ; /*下一个元素的位置*/
} link[N+1] ; /*定义N+1个元素的结构体数组存放N个人的信息*/
main()
{ int i, count, h ;
for( i = 1 ; i<=N ; i++) /*给循环队列初始化,下标从1开始*/
{ if(i==N)
link[i].nextp=1 ;
/*最后一人的下一个元素的位置为1即第一个元素,形成循环队列*/
else
link[i].nextp=i+1; /*下一个人的序号*/
link[i].number=i; /*每个人的序号与下标值相等*/
}
printf("\n") ;
count=0;
h=N ; /*count统计出列的人数,h初始化为队列的最后一个元素*/ printf("sequence that persons leave the ircle: \n") ;
while(count { i=0; while(i!=3) /*报数,i统计当前数到的顺序,没数到3时继续报数*/ { h=link[h].nextp; /*h指向当前元素即前一个元素的后面一个元素*/ if( link[h].number) i++ ; /*如果h的序号为0,表示该元素已出列,i不加*/ } printf("% 4d", link[h].number) ; /*数到3循环退出,输出数到3的人的序号*/ link[h] .number = 0 ; /*将其序号置0,表示该元素已出列*/ count++ ; /*统计出列的人数*/ } printf("\n The last one is ") ; for( i=1 ;i<=N; i++) if(link[i].number) /*若元素值不为0,表示该元素没出列,即是留下来的元素*/ printf("% 3d\n" , link[i].number) ; } 2.程序填空(请填写适当的符号,使程序实现其功能) [2.1] 下列函数findbook的功能为:在有n个元素的数组s中查找书名为a的书,若找到,函数返回数组下标,否则,函数返回0,请填写适当的符号或语句,使程序实现其功能。 答案 #include #include "string.h" struct bdata { int id; char bname[20]; float price; }; int findbook(struct bdata st[],int n,char s[]) { int i; for(i=0;i {if(strcmp(st[i].bname,s)==0) return i+1;} return 0; } void main() {struct bdata book[100]={12,"program-c",23.5,2,"大学计算机",43.5,3,"大学物理",33.5,6,"大学化学",53.5,8,"大学语文",23.5,9,"哲学",13.5}; char st[20]; int index; printf("请输入要查找书名:"); gets(st); index=findbook(book,6,st); if(index) printf("书号:%d,书名:%s,价格:%f\n",book[index-1].id,book[index-1].bname,book[index-1].price); else printf("%s 不在书库中\n",st); } [2.2] 下列函数average功能为:计算5名学生3门课成绩的平均分,请填写适当的符号或语句,使程序实现其功能。 答案 #include #define m 3 #define n 5 struct stud { int no; char name[16]; float mark[m]; float ave; }; void average(struct stud st[]) {int i,j; float sum; for(i=0;i {sum=0; for(j=0;j sum=sum+st[i].mark[j]; st[i].ave=sum/m; } } void main() {struct stud preson[n]={1,"张平",90,88,78,0,2,"王新",70,88,78,0,3,"李和平 ",60,68,78,0,4,"王开新",80,78,78,0,5,"赵明",89,98,98,0}; int i; average(preson); printf("\t\t\t成绩表\n"); for(i=0;i printf("%3d%10s,%6f,%6f,%6f,%.2f\n",preson[i].no,preson[i].name,preson[i].mark[0], preson[i].mark[1],preson[i].mark[2],preson[i].ave); } 3.编程 [3.1] 编写一个程序实现如下功能:定义一个点的结构数据类型,实现下列功能: ①为点输入坐标值。 ②求两个点中点坐标。 ③求两点间距离。 #include "stdio.h" #include "math.h" struct point { float x; float y; }; void input(struct point a[]) { int i; for(i=0;i<2;i++) { printf("输入第%d点的坐标\n",i+1); scanf("%f%f",&a[i].x,&a[i].y); } } void midpoint(struct point a[]) { int i;struct point m;m.x=0;m.y=0; for(i=0;i<2;i++) {m.x=m.x+a[i].x; m.y=m.y+a[i].y;} m.x=m.x/2;m.y=m.y/2; a[2].x=m.x;a[2].y=m.y; } float dis(struct point a[]) { int i;float s;struct point m;m.x=a[0].x;m.y=a[0].y; { m.x=m.x-a[1].x;m.y=m.y-a[1].y;} s=sqrt(m.x*m.x+m.y*m.y); return s; } main() { struct point a[3]; input(a); printf(" 第1点%f %f 第2点%f %f\n",a[0].x,a[0].y,a[1].x,a[1].y); midpoint(a); printf(" 中点%f %f \n",a[2].x,a[2].y); printf("距离%f\n",dis(a)); } [3.2] 建立一份同学通讯录,包含姓名、电话、通信地址、邮编、生日等信息,要求按姓名的字母顺序排列输出通讯录。 #include "stdio.h" #include "string.h" struct data { int month; int day; int year; }; struct stud { char name[20]; char tele[12]; char zip[7]; struct data birthday; char addre[30]; }; struct stud stud1[30]={"liming","1331187907","210020",3,14,1988,"beijing","chaening","137********","26 0020",8,14,1980,"tianjing","being","136********","710020",9,14,1990,"nanjing"}; main() { i nt k,i,j,n=3; struct stud temp; for ( i = 0; i < n-1; i++) { k = i; for (j= i+1;j if (strcmp(stud1[j].name,stud1[k].name)<0) k =j; temp= stud1[i]; stud1[i]= stud1[k]; stud1[k]= temp; } printf("姓名 电话 邮编 生日 地址\n"); for(i=0;i<3;i++) printf("%10s%12s%8s %2d-%2d-%4d %15s\n",stud1[i].name,stud1[i].tele,stud1[i].zip,stu d1[i].birthday.month,stud1[i].birthday.day,stud1[i].birthday.year,stud1[i].addre); } [本章测试] 一、 单选题(10分) 1.下列关于结构体的说法错误的是 D 。 A.结构体是由用户自定义的一种结构类型 B.结构体中可设定若干个不同数据类型的成员 C.结构体中成员的数据类型可以是另一个已定义的结构 D.在定义结构时,可以为成员设置默认值 2.下列程序中,结构体变量a 所占内存字节数是 C 。 union u {char st[4] ; int i; long l; }; struct A {int c; union u; }a; A.4 B.5 C.6 D.8 3.以下对结构体类型变量的定义中,不正确的是__ A _____。 A. typedef struct aa { int n; float m; }AA; AA tdl; C. struct { int n; float m; } aa; struct aa tdl; 4.若有下面的说明和定义,则sizeof(struct test)的值是___ A ____。 struct test { int m1; char m2; B.#define AA struct aa AA{ int n; float m; }tdl; D. struct { int n; float m; } tdl; float m3; union uu {char ul[5] ; int u2[2] ;} ua; } myaa; A.12 B.16 C.14 D.9 5.若程序中有下面的说明和定义,则会发生的情况是__A___。 struct abc { int x; char y;} struct abc s1,s2; A.编译是错 B.程序将顺利编译、连接、执行 C.能顺利通过编译、连接但不能执行 D.能顺利通过编译、但连接出错 6.以下对C语言共用体中共用体类型数据叙述正确的是_ C __。 A.一旦定义了一个共用变量后,即可引用该变量或该变量中的任意成员 B.一个共用体变量中可以同时存放其所有成员 C.一个共用体变量中不能同时存放其所有成员 D.共用体类型数据可以出现在结构体类型定义中,但结构类型数据不能出现在共用体类 型定义中 7.下面的程序使用了共用体,其输出结果是_ D __。 #define N 5 union data { char a; int b; }; main() { union data d; d.b=0xeeff; d.a=0xaa; printf("%x ",d.b); } A.eeff B.0xaa C.aaee D.eeaa 8.以下程序的输出结果是 C 。 # define f(x) x*x main() { int a=6, b = 2, c; c = f(a)/f(b) ; printf("% d \n", c); } A.9 B.6 C.36 D.18 9.下列程序的输出结果是 B 。 struct abc { int a, b, c ; } ; main() { struct abc s[2] = { {1,2,3},{4,5,6}} ; int i,t ; t = s[0] .a + s[1] .b ; printf("%d \n", t) ; } A.5 B.6 C.7 D.8 10.结构体成员在内存中从高位到低位的排列顺序是__A.____。 A.按结构体说明中成员出现的先后顺序,先出现的在低位 B.按结构体说明中成员出现的先后顺序,先出现的在高位 C.占内存量少的成员在低位 D.占内存量大的成员在低位 二、填空题(7分) 1.设struct student {int num;char name[20];}st; 写出printf语句:输出学生st的各个成员分量。要求按num、name的顺序输出,各成员之间使用空格分隔开。____printf("%d %s\n",st.num,https://www.360docs.net/doc/de6029491.html,);______________ 2.已知struct fs { int fz; int fm; } x[]={{2,7}, {4,9}};计算表达式 x[0].fz*x[1].fm+x[1].fz*x[0].fm和x[0].fm*x[1].fm的值为___46 63____________。3.已知有职工结构体数组struct {int num; char name[20];}per[100]; 用scanf函数写出输入下标为i 的职工的num和name的语句为scanf(“%d%s”,&a[i].num,a[i].name)_______________________________。 4.运行下列程序段,若输入:3 101 wang 102 zou 103 chen 其输出结果为:______103 chen 101 wang 102 zou _______________________________________。 struct worker { int num; char name[20]; }; main() { struct worker per[10], t; int n,i,j; scanf( "%d", &n ); for ( i = 0; i < n; i++ ) scanf( "%d%s", &per[i].num, per[i].name ); for ( i = 0; i < n-1; i++ ) for ( j = 0; j < n-1-i; j++ ) if ( strcmp(per[j].name,per[j+1].name) > 0 ) { t = per[j]; per[j] = per[j+1]; per[j+1] = t; } for ( i = 0; i < n; i++ ) printf( "%d, %s\n", per[i].num, per[i].name ); } 5.有以下说明和定义语句,请给结构体变量w赋初值,使w.a的值为99,w.b指向a数组的首地址。 double a[5] ; struct ABC { int a ; double b ; }w ={ 99_, _&a[0]_} ; 6.有以下程序: #include union pw { int i; char ch[2] ; } a; main() { a.ch[0] = 13 ; a.ch[1] = 0 ; printf("% d\n", a.i) ; } 程序的输出结果是13 (注意:ch[0] 在低字节,ch[1] 在高字节)。 三、程序调试题(10分) 1.请指出下列程序的错误所在。 【3.1】 #include struct person { char name[20]; int count; } x1={"ZhongHua", 10}; main( ) { int p; p=x1; printf ("%s\n%d\n", https://www.360docs.net/doc/de6029491.html,, p.count) } #include #include "string.h" struct person { char name[20]; int count; }x1={"ZhongHua", 10}; main( ) { struct person p; p.count=x1.count;strcpy(https://www.360docs.net/doc/de6029491.html,,https://www.360docs.net/doc/de6029491.html,); printf ("%s\n%d\n", https://www.360docs.net/doc/de6029491.html,, p.count); } 2.计算至少有一门功课不及格的学生人数,改正下列程序的错误。 【3.2】 #include struct student { int num; char name; char sex; float score[2]; } stu[5]={{101,"Li ping",'M',45,67}, {102,"Zhang ping",'M',62.5,76}, {103,"He fang",'F',92.5,80}, {104,"Cheng ling",'F',87,78}, {105,"Wang ming",'M',58,65}}; void main() { int i,c; float s ; for(i=0;i<5;i++) if(stu[i].score<60) c+=1; printf("\ncount=%d\n",c); } #include struct student { int num; char name; char sex; float score[2]; } stu[5]={{101,"Li ping",'M',45,67},{102,"Zhang ping",'M',62.5,76}, {103,"He fang",'F',92.5,80}, {104,"Cheng ling",'F',87,78}, {105,"Wang ming",'M',58,65}}; void main() { int i,j,c,count=0; float s ; for(i=0;i<5;i++) {c=0; for(j=0;j<2;j++) if(stu[i].score[j]<60) c++; if(c) count++; } printf("\ncount=%d\n",count); } 四、程序填空题(30分) 1.对结构体类型变量punkt 赋值并进行屏幕输出: #include #include void main ( void ) { struct { double xk ; int yk ; char zk ; } punkt; scanf ( "%lf " , &punkt.xk) ; scanf ( "%d " , &punkt.yk); scanf ( "%c " ,&punkt.zk) ; printf ( " \n x-coordinate : %lf ", punkt.xk) ; printf ( " \n y-coordinate : %d ", punkt.yk) ; printf ( " \n z-coordinate : %c ", punkt.zk) ; } 3.已知结构体数组person中存有N个人员的姓名和年龄,以下程序的功能:输出数组中 年龄最大者的姓名和年龄,请填空。 #include #define N 3 struct man { char name[20] ; int age ; }; struct man person [N] ={ " zhang" , 27 , " li " , 18 , " wang " , 73} ; int find (struct man s[],int n) { int q; int i; q = 0; for ( i=1 ; i if (s[i].age>s[q].age) q=i ; return q; } main ( ) { int q ; q = find (person, 3) ; printf ( "年龄最大者为: %s , 其年龄为:%d\n", person[q].name , person[q].age ) ; } 五、编程题(36分) 1.对职工工资进行统计。职工信息包含工号和姓名、基本工资、奖金、提成、实发工资,分别统计平均工资、最高工资和最低工资。将职工工资信息存入文件(diy 2.dat)中。 #include "stdio.h" #include "string.h" struct staff { int num; char name[20]; float basic_wage; float percentage; float bonus; float real_wages; float wages_should; }sp[200]={901,"张川",432,120,66,0,0,902,"李洪",488,123,75,0,0,903,"罗庆 ",423,240,24,0,0,904,"秦汉",356,789,72,0,0,905,"刘少文",530,765,114,0,0,906,"苏南昌",488,456,87,0,0,907,"孙红",530,345,102,0,0}; FILE *fp3; void file(struct staff a[],int n) { int i;FILE *fp3; if((fp3=fopen("diy2.dat", "w"))==NULL) { printf("Open error \n");exit(0); } for(i=0;i { fprintf(fp3,"%d,%s,%f,%f,%f,%f,%f",a[i].num,a[i].name,a[i].basic_wage,a[i].percent age,a[i].bonus,a[i].real_wages,a[i].wages_should); } fclose(fp3); } int max(struct staff a[],int n) { int imax=0,i; for(i=0;i if(a[i].basic_wage>a[imax].basic_wage) imax=i; return imax; } int min(struct staff a[],int n) { int imin=0,i; for(i=0;i if(a[i].basic_wage return imin; } void comput(struct staff a[],int n) { int i; for(i=0;i {a[i].wages_should=a[i].basic_wage+a[i].percentage+a[i].bonus; a[i].real_wages=a[i].wages_should-a[i].wages_should*0.1; } } float ave(struct staff a[],int n) { int i;float ave=0; for(i=0;i ave=ave+a[i].basic_wage; ave=ave/n; return ave; } main() { int m=7; comput(sp,m); printf("最高工资%f 最低工资%f 平均工资%f\n",sp[max(sp,m)].basic_wage,sp[min(sp,m)].basic_wage,ave(sp,m)); file(sp,m); } 2.定义一个结构体用于存储年、月、日数据,并定义一个函数用于求两个日期之间的天数。#include "stdio.h" struct date { int month; int day; int year; }; int Mon[13]={ 0,31,28,31,30,31,30,31,31,30,31,30,31}; int funy(int y) /*判断年份y是否闰年*/ { return(y%4==0&&y%100!=0||y%400==0); } int funa(int y,int m,int d) /*计算一个日期到该年年底的天数*/ { int i,days=0; for(i=m+1;i<13;i++) days+=Mon[i]; days+=(Mon[m]-d); if(m<3) days+=funy(y); return days; } int funb(int y,int m,int d) /*计算一个日期是该年的第多少天*/ { int i,days=0; for(i=1;i days+=d; if(m>2) days+=funy(y); return days; } int func(int y1,int y2)/*计算整年的天数*/ { int i,days=0; for(i=y1+1;i days+=(365+funy(i)); return days; } main() { struct date y1,y2;int days=0; printf("请输入开始日期(yy-mm-dd)\n"); scanf("%d-%d-%d",&y1.year,&y1.month,&y1.day); printf("请输入终止日期(yy-mm-dd)\n"); scanf("%d-%d-%d",&y2.year,&y2.month,&y2.day); if(y1.year==y2.year) days=funa(y1.year,y1.month,y1.day)-funa(y2.year,y2.month,y2.day); else days=funa(y1.year,y1.month,y1.day)+funb(y2.year,y2.month,y2.day)+func(y1.year,y2.year); printf("%d年%d月%d日到%d年%d月%d日是一共有%d 天!\n",y1.year,y1.month,y1.day,y2.year,y2.month,y2.day,days); } 高中生物专题训练·生物实验 生物 1.(2012石家庄第一次质检)下列有关实验设计的叙述中正确的是() A.实验材料的数量、温度和时间等变量都应保持相同 B.各种实验中都必须设置空白对照组,确保单一变量 C.数据测量时应力求精确,因而需要多次测量求平均值 D.探究实验设计中,实验结果总是与提出的假设一致 [答案] 1 2.(2013年山东潍坊高三模拟考试)下列哪项是以下实验共有的() ①低温诱导植物染色体数目的变化 ②观察植物细胞的质壁分离和复原 ③观察植物细胞的有丝分裂 ④观察和在细胞中的分布 A.使用显微镜观察 B.实验材料不需要保持活性 C.使用盐酸 D.需染色处理 [答案] 2 3.(2013江苏,9,2分)一个班级分组进行减数分裂实验, 下列操作及表述正确的是() A. 换用高倍镜时, 从侧面观察, 防止物镜与装片碰擦 B. 因观察材料较少, 性母细胞较小, 显微镜视野应适当调亮 C. 为观察染色体不同层面的精细结构, 用粗准焦螺旋调节焦距 D. 一个视野中, 用10×物镜看到8个细胞, 用40×物镜则可看到32个细胞 [答案] 3 4.(2013福建,4,6分)下列为减少实验误差而采取的措施, 错误的是() 5.(2013江苏无锡高三期末)(5分)有人在1980年对栖息于岩石地带原来生活在一起的大、小两个种的鬣蜥作了相互移走的实验。四年实验中,其中两年气候干旱,鬣蜥的食物短缺;另两年气候湿润,食物极为丰富。实验者将实验分成六组,每组都有一定数量的大、小鬣蜥。实验过程及结果如下: (1)如果只在A组与B组间比较,在干旱年份,将大鬣蜥移走后,小鬣蜥的体重、种群密度比B组明显增加。据此分析,大、小两种鬣蜥的种间关系可能是,再将C组与B组比较后,可以排除两种鬣蜥间有关系。 (2)从实验来看,大鬣蜥的竞争能力强于小鬣蜥,判断理由是。 (3)在湿润年份,将大鬣蜥移走后,小鬣蜥的体重、种群密度与E组差别不大,出现这种情况的原因是。 (4)B、E两组在实验中都起对照作用。根据实验过程的气候条件分析,两组中小鬣蜥种群密度较大的是组。 [答案] 5.(1)竞争和捕食捕食 (2)将大鬣蜥移走对小鬣蜥的影响较大,将小鬣蜥移走对大鬣蜥的影响较小 验证性实验:数组指针结构体实验报告 1.实验目的 (1)复习c++语言数组的用法。 (2)复习c++语言指针的用法。 (3)复习c++语言结构体的用法。 (4)理解算法时间复杂度分析的基本方法。 (5)通过实验程序,分析它们的时间复杂度。 2.实验内容 (1)将1~10存入数组a[10],并将其逆序输出。 (2)用指针方式编写程序:从键盘输入10个整数数据,并存入数组,要求将10个数中最大的数与第1个输入的输交换:将10个数中最小的数和最后一个输入的数交换。(3)有5个学生,每个学生的数据包括学号、姓名3门课的成绩、平均分。 要求:从键盘依次输入5个学生的学号、姓名3门课的成绩,自动计算3门课的平均分,将5个学生的数据在屏幕上输出。 3.实验结果 (1)#include高中生物实验专题练习
数组指针结构体实验报告