作业 6 结构体
一、预习检查:自学教材第九章、阅读博客[结构体简介],并回答以下问题:
- 什么是结构?什么情况下使用结构管理数据?
1.结构是c语言中的一种新的结构类型,它能够把有内在联系的不同类型的数据汇聚成一个整体
使他们相互关联,同时,结构也是一个变量的集合,可以按照对基本类型的操作方法单独使用
其成员变量。 2.各项数据类型不同但之间有内在联系的变量
- 什么是结构定义和结构变量?
struct 结构名{
类型名 结构成员名1;
类型名 结构成员名2;
…
类型名 结构成员名n;
};
结构变量:结构类型的变量,通过结构成员操作符.对其成员变量引用,与普通变量作为
函数参数相似,实参变量将其结构值传递给对应的形参变量
- 什么是结构的成员,如何初始化和引用结构成员的值?
1.结构中的成员。2.初始化列表是用花括号括起来的一些常量,这些常量依次赋给结构体变量中的各成员
使用结构成员操作符“.”进行操作,格式为:结构变量名.结构成员名
- 结构变量如何作为函数参数使用?
- 什么是结构数组,如何定义和使用结构数组?
- 什么是结构指针,如何利用结构指针操作结构成员?
二、运行和理解教材例题9-1;
/* 构建学生信息库,实现建立,查询,输出功能 */ #include<stdio.h> #define MaxSize 50 struct student{ int num; char name[10]; int computer,english,math; double average; }; int Count=0; void new_student(struct student students[]); void search_student(struct student students[],int num); void output_student(struct student students[]); int main(void) { int choice,num; struct student students[MaxSize]; do{ printf("choice: 1:new 2:search 3:output 0:exit\n"); scanf_s("%d",&choice); switch(choice){ case 1: new_student(students); break; case 2:printf("输入学生学号:"); scanf_s("%d",&num); search_student(students,num); break; case 3:output_student(students); break; case 0:break; } }while(choice!=0); printf("END!\n"); return 0; } /* 新建学生信息 */ void new_student(struct student students[]){ struct student s; if(Count==MaxSize){ printf("The array is full!\n"); return ; } printf("输入学生学号:"); scanf_s("%d",&s.num); printf("Input the student's name:"); scanf_s("%s",s.name); printf("Input the student's math score:"); scanf_s("%d",&s.math); printf("Input the student's english score:"); scanf_s("%d",&s.english); printf("Input the student's computer score:"); scanf_s("%d",&s.computer); s.average=(s.math+s.english+s.computer)/3.0; students[Count]=s; Count++; } void search_student(struct student students[],int num) { int i,flag=0; if(Count==0){ printf("Count of students is zero!\n"); return ; } for(i=0;i<Count;i++) if(students[i].num==num){ flag=1; break; } if(flag){ printf("num:%d,",students[i].num); printf("name:%s,",students[i].name); printf("math:%d,",students[i].math); printf("english:%d,",students[i].english); printf("computer:%d,",students[i].computer); printf("average:%.2Lf\n",students[i].average); } else printf("Not Found!"); } /* 输出学生信息 */ void output_student(struct student students[]) { int i; if(Count==0){ printf("Count of students is zero!\n"); return ; } printf("num\t name\t math\t english\t computer\t average\n"); for(i=0;i<Count;i++){ printf("%d\t",students[i].num); printf("%d\t",students[i].name); printf("%d\t",students[i].math); printf("%d\t",students[i].english); printf("%d\t",students[i].computer); printf("%.2Lf\n",students[i].average); } }
三、预习检查:选择正确答案,并简要说明为什么?
1) 下面定义结构变量的语句中错误的是 _D__,为什么?
A.struct student{ int num; char name[20]; } s;
B.struct { int num; char name[20]; } stu ;
C.struct student{ int num; char name[20]; }; struct student s;
D.struct student{ int num; char name[20]; }; struct stu s;
2) struct { int x, y; } s[2] = { { 1, 3 }, { 2, 7 } }; 则语句:printf(“%d\n”, s[0].y/s[1].x ); 输出结果是 _B__, 为什么?
A.0 B.1 C.2 D.3
3) 分析下面的程序片段,能打印出字母 M 的语句是 _C__, 为什么?。
struct person{char name[10];int age; } c[10] = { “John”, 17, “Paul”, 19, “Mary”, 18, “Adam”, 16 };
A.printf(“%c”, c[3].name);
B.printf(“%c”, c[3].name[1]);
C.printf(“%c”, c[2].name[0]);
D.printf(“%c”, c[2].name[1]);
4) 设有如下定义,则对 data 中的 a 成员的正确引用是 _B__, 为什么?
struct sk{ int a; float b; } data, *p=&data;
A.(*p).data.a
B.(*p).a
C.p->data.a
D.p.data.a
四、预习检查:填空,并注释"每空"填充的依据
1) 完成下列程序,该程序计算 10 名学生的平均成绩
#include <stdio.h> #include <string.h> struct student { int num; char name[20]; int score; }; struct student stud[10]; int main(void) { int i , sum = 0 ; for(i = 0; i < 10; i++){ scanf("%d%s%d ",&stud[i].num,stud[i].name, &stud[i].score); sum += stud[i].score; } printf("aver = %d \n", sum/10); return 0; }
2) 下列程序读入时间数值,将其加 1 秒后输出,时间格式为:hh: mm: ss,即小时:分钟:秒,当小时等于 24 小时,置为 0。
#include<stdio.h> struct { int hour, minute, second;} time; int main(void) { scanf("%d: %d: %d", &time.hour, &time.minute, &time.second ); time.second++; if( time.second == 60){ time.minute++ ; time.second = 0; if(time.minute == 60){ time.hour++; time.minute = 0; if( time.hour == 24 ) time.hour = 0; } } printf ("%d: %d: %d \n", time.hour, time.minute, time.second ); return 0; }
3) 写出下面程序的运行结果,并简要描述原因。
struct s1{ char c1, c2; int n; }; struct s2{ int n; struct s1 m; } m = {1, {‘A’, ’B’, 2} }; int main(void) { printf(“%d\t%d\t%c\t%c\n”, m.n, m.m.n, m.m.c1, m.m.c2); return 0; }
1 2 A B
4) 写出下面程序的运行结果,并简要描述原因。
struct abc{ int a; float b; char *c; }; int main(void) { struct abc x = {23,98.5,"wang"}; struct abc *px = &x; printf("%d, %s, %.1f, %s \n", x.a, x.c, (*px).b, px->c ); return 0; }