第9章 结构
【练习9-1】定义一个能够表示复数的结构类型,一个复数包括实数与虚数两个部分。 解答:
struct complex{ float real;
float imaginary; };
【练习9-2】人的出生日期由年、月、日组成,请在例 9-1 中的通讯录结构中增加一个成员:出生日期,用嵌套定义的方式重新定义该结构类型。 解答:
struct date{ int year; int month; int day; };
struct student{ int num;
char name[10];
struct date birthday; int computer,english,math; double average; };
【练习9-3】例 9-1 中,如果要计算的是三门课程的课程平均成绩,应该如何改写程序? 解答:
#include
char name[10];
int computer,english,math; double average; };
int main(void) {
int i, n;
double math_sum,english_sum,computer_sum; struct student s1;
printf(\ scanf(\
printf(\ math_sum=english_sum=computer_sum=0; for(i=1;i<=n;i++){
printf(\
scanf(\ter);
math_sum+=s1.math;
english_sum+=s1.english; computer_sum+=s1.computer; }
printf(\math_sum/n,english_sum/n,computer_sum/n);
return 0; }
【练习9-4】定义一个包含 5 名学生信息的结构数组,并对该结构数组的所有元素进行初始化。 解答:
struct student{ int num;
char name[10];
int computer, english, math; };
struct student s[5]={{30101, \张一\李二\5,90},{40231, \王三\赵四\刘五\
【练习9-5】参考例 9-2,输入并保存 10 个学生的成绩信息,分别输出平均成绩最高和最低的学生信息。 解答:
#include
char name[10];
int computer,english,math; double average; };
int main(void) {
int i,n,max,min;
struct student students[50];
printf(\ scanf(\ for(i=0;i printf(\ printf(\ scanf(\ printf(\ scanf(\ printf(\ scanf(\ printf(\ scanf(\ printf(\ scanf(\ students[i].average=(students[i].math+students[i].english+stu dents[i].computer)/3.0; } max=min=0; for(i=1;i if(students[max].average printf(\ printf(\%.2lf\\n\ents[max].english,students[max].computer,students[max].average); printf(\ printf(\%.2lf\\n\ents[min].english, students[min].computer, students[min].average); return 0; } 【练习9-6】定义一个 struct student 类型的结构指针,用其实现一个学生信息的输入和输出。 解答: struct student{ /* 学生信息结构定义 */ int num; /* 学号 */ char name[10]; /* 姓名 */ int computer, english, math ; /* 三门课程成绩 */ double average; /* 个人平均成绩 */ }s, *p; p = &s; scanf(\&p->num, p->name, &p->math, &p->english, &p->computer); 【练习9-7】改写例 9-3 中的函数 update_score( ),将第一个形参改为结构数组形式。 解答: int update_score(struct student s[],int n,int num,int course,int score) { int i,pos; for(i=0;i switch(course){ case 1:s[i].math=score; break; case 2:s[i].english=score; break; case 3:s[i].computer=score; break; } pos = i; } else pos = -1; return pos; } 习题9 一、选择题 1.下面定义结构变量的语句中错误的是 D 。 A.struct student{ int num; char name[20]; } s; B.struct { int num; char name[20]; } s; C.struct student{ int num; char name[20]; }; struct student s; D.struct student{ int num; char name[20]; }; student 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 5.对于以下结构定义,(*p)->str++中的++加在 D 。 struct { int len; char *str; } *p; A.指针 str 上 B.指针 p 上 C.str 指向的内容上 D.语法错误 二、填空题 1.“.”称为 成员_(分量)_运算符,“->”称为_指向_运算符。 2.完成下列程序,该程序计算 10 名学生的平均成绩。 #include char name[20]; int score; }; struct student stud[10]; int main(void) { int i , sum = 0 ; for(i = 0; i < 10; i++){ scanf(\\&stud[i].num,_stud[i].name_,stud[i].score); sum += stud[i].score; } printf(\ return 0; } &