2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > 浙大版《C语言程序设计》第四版(何钦铭颜晖) 第9章 结构 课后习题答案

浙大版《C语言程序设计》第四版(何钦铭颜晖) 第9章 结构 课后习题答案

时间:2024-02-25 18:05:47

相关推荐

浙大版《C语言程序设计》第四版(何钦铭颜晖) 第9章 结构 课后习题答案

浙大版《C语言程序设计》第四版(何钦铭颜晖) 第9章 结构 课后习题答案

你也可以上程序咖(),打开大学幕题板块,不但有答案,讲解,还可以在线答题。

一、选择题

1.以下定义结构变量的语句中,错误的是( )。

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] ;} ; student s;

D. struct student { int num; char name [ 20] ; } ; struct student s;

答:C

解析:

结构变量名可以在定义结构后单独定义。也可以跟在结构后直接定义,直接写结构变量名即可。

2.如果结构变量 s 中的生日是 “1984 年11月11日”,下列对其生日的正确赋值是( )。

struct student{int no; char name[20]; char sex;struct {int year; int month; int day;}birth;}s;

A. year= 1984; month=11; day=11;

B. birth. year= 1984; birth. month=11; birth. day=11;

C. s. year= 1984; s. month=11; s. day=11;

D. s. birth. year= 1984; s. birth. month= 11; s. birth. day=11;

答:D

解析:

s 对应的结构为 student,birth 是它的一个成员,year,month,day 是birth的成员。所以要通过 s. birth. year= 1984; s. birth. month= 11; s. birth. day=11; 表示。

3.以下程序段的输出结果为( )。

struct{int x, y;} s[2] = {{1, 3}, {2, 7}};printf("%d\n", s[0].y / s[1].x);

A.0

B.1

C.2

D.3

答:B

解析:

这里打印的结果是 s[0].y / s[1].x,就是 3 / 2 的结果,是 1 。

4.没有如下定义,则对data中的a成员的正确引用是( )。

struct sk{int a; double b;}data, *p=&data;

A.(*p).data.a

B.(*p).a

C.p->data. a

D.p.data.a

答:B

解析:

这里*p指向 data,想引用对应的 a,直接(*p).a即可。所以这里选 B。

5.对于以下结构定义,++p->str中的++加在( )。

struct{int len; char *str;}*P;

A.指针 str 上

B.指针 p 上

C. str 指向的内容上

D.语法错误

答:A

解析:->的等级大于++的等级,所以先p->str,然后+1。相当于++(p->str)。

6.若有下列定义,则以下不合法的表达式是( )。

struct student{int num;int age;} stu[3] = {{101, 20}, {102, 19}, {103, 20}}, *p = stu;

A.(p++)->num

B.p++

C.(*p). num

D.p= &stu.age

答:D

解析:

p 是 struct student 类型的指针,stu.age 是 int 型变量,p 指向 stu.age 会产生类型不匹配的问题

二、填空题

1.写出下面程序段的运行结果( )。

struct example{struct{int x;int y;} in;int a;int b;} e;e.a = 1;e.b = 2;e.in.x = e.a * e.b;e.in.y = e.a + e.b;printf("%d,%d\n", e.in.x, e.in.y);

答:2,3

解析:

e.a = 1, e.b = 2,

e.in.x = e.a * e.b = 1 * 2 = 2

e.in.y = e.a + e.b = 1 + 2 = 3

最终打印 2 和 3。

2.时间计算。读入时间数值,将其加 1 秒后输出,时间格式为 “hh: mm: ss”,即 “小时: 分钟: 秒”,当小时等于 24 小时,置为 0 。请填空。

#include <stdio.h>struct{int hour, minute, second;} time;int main(){scanf("%d:%d:%d", _______________);time.second++;if ( _______________ == 60){_______________;time.second = 0;if (time.minute == 60){time.hour++;time.minute = 0;if ( _______________ == 24){time.hour = 0;}}}printf("%d:%d:%d\n", time.hour, time.minute, time.second);return 0;}

答:

&time.hour, &time.minute, &time.second

time.second

time.minute++

time.hour

解析:

第一空,&time.hour, &time.minute, &time.second,读入时间的时,分,秒。然后根据题意,给秒加 1。

第二空,time.second == 60,判断秒是否是 60。

第三空,time.minute++,如果是,那么分钟累加 1,秒置为 0。然后判断分钟是否是 60,如果是,时就累加 1,然后分钟置为 0 。

第四空,time.hour == 24,如果时为 24,要将时置为 0 ,表示第二天了。

3.“.” 称为( )运算符,“->” 称为( )运算符。

答:成员 指向

解析:

. 叫做结构成员操作符。用于访问结构成员。

-> 叫做指向运算符。用于访问指针指向的结构成员。

4.写出下面程序段的运行结果( )。

struct example{int a;double b;char *c;} x = {23, 98.5, "wang"}, *px = &x;printf("%d,%s,%.1f,%s\n", x.a, x.c, (*px).b, px->c);

答:23,wang,98.5,wang

解析:

打印语句中,先打印 x.a ,就是 23,然后打印 x.c ,就是 wang,然后(*px).b,这里 px 指向 x,打印的就是 98.5,px->c,打印 wang。

5.写出下面程序段的运行结果( )。

struct table{int x, y;} a[4] = {{10, 20}, {30, 40}, {50, 60}, {70, 80}};struct table *p = a;printf("%d,", p++->x);printf("%d,", ++p->y);printf("%d\n", (a + 3)->x);

答:10,41,70

解析:

第一行打印:p+±>x,最初 p 指向数组 a 的第一个元素,打印它的 x,值为 10。然后 p指向下一个元素。

第二行打印:此时 p 指向第二个元素{30,40},++p->y,这里表示取 p->y,40,然后 ++ ,打印 41。

第三行打印:(a + 3)->x,a+3 表示里面下标为 3 的元素,就是 {70,80},取 x 打印出 70。

6.写出下面程序段的运行结果( )。

struct{int a;int *b;} s[4], *p;int i, n = 1;for (i = 0; i < 4; i++){s[i].a = n;s[i].b = &s[i].a;n = n + 2;}p = &s[0];printf("%d\n", ++*p->b);p++;printf("%d,%d\n", (++p)->a, (p++)->a);

答:

2

5,5

解析:

for 循环中主要是为了给数组 s 中的 4 个元素赋值。

s[0] 中 a 和 b 分别是 1。

s[1] 中 a 和 b 分别是 3。

s[2] 中 a 和 b 分别是 5。

s[3] 中 a 和 b 分别是 7。

第一行打印语句,++*p->b,这里取*p指向数组中的第一个元素,取 b 的值,就是 1。然后有个前置的 ++ ,所以打印的是 2。

第二行打印语句,(++p)->a,在这之前,上面有一行单独的 p++,那么 p 会指向数组中第二个元素,这里 (++p) 后,那么 p 就指向了数组第三个元素,打印 它的 a,就是 5。再打印 (p++)->a,这里 (p++),还是先运算再累加 1,所以还是打印第三个元素的 a,然后 p 指向第四个元素。

三、程序设计题

题目1:时间换算:用结构类型表示时间内容(时间以时、分、秒表示),输入一个时间数值,再输入一个秒数 n(n<60),以 h: m: s 的格式输出该时间再过 n 秒后的时间值(超过 24 点就从 0 点开始计时)。试编写相应程序。

答案代码:

#include <stdio.h>struct time{int hour;int minute;int second;};void add(struct time *p, int s);int main(){// 习题(9.3.1)/*时间换算:用结构类型表示时间内容(时间以时、分、秒表示),输入一个时间数值,再输入一个秒数 n(n<60),以 h: m: s 的格式输出该时间再过 n 秒后的时间值(超过 24 点就从 0 点开始计时)。*/struct time c;int n;printf("input time:");scanf("%d%d%d", &c.hour, &c.minute, &c.second);printf("input n:");scanf("%d", &n);add(&c, n);printf("%d: %d: %d\n", c.hour, c.minute, c.second);return 0;}void add(struct time *p, int s){// 1:58:50 + 245 -->1:58:295(4分55秒)--> 2:02:55int ho, mi, se;ho = p->hour; mi = p->minute; se = p->second; se = se + s; if (se < 60){p->second = se; return;}else{mi = p->minute = mi + se / 60; se = p->second = se % 60; if (mi < 60){return;}else{// ho = p->hour = ho + mi / 60;mi = p ->minute = mi % 60; if (ho < 24){return;}elseho = p->hour = ho % 24;}return;}}

运行结果:

题目2:计算两个复数之积:编写程序,利用结构变量求解两个复数之积。

提示:求解 (a1+a2i)x(b1+b2i), 乘积的实部为: a1xb1-a2xb2 ,虚部为: a1xb2+a2xb1。

答案代码:

#include <stdio.h>struct complex{int real, im;};struct complex cmult(struct complex, struct complex);int main(){// 习题(9.3.2)/*计算两个复数之积:编写程序,利用结构变量求解两个复数之积。提示:求解 (a1+a2i)x(b1+b2i), 乘积的实部为: a1xb1-a2xb2 ,虚部为: a1xb2+a2xb1。*/struct complex a = {3, 4}, b = {5, 6}, c;c = cmult(a, b);printf("(%d+%di)x(%d+%di) =%d+%di\n", a.real, a.im, b.real, b.im, c.real, c.im);return 0;}struct complex cmult(struct complex a, struct complex b){struct complex w;w.real = a.real * b.real - a.im * b.im;w.im = a.real * b.im + a.im * b.real;return w;}

运行结果:

题目3:平面向量加法:输入两个二维平面向量 V1=(x1, y1) 和 V2=(x2, y2) 的分量,计算并输出两个向量的和向量。试编写相应程序。

答案代码:

#include <stdio.h>struct vector{double x;double y;};struct vector vector_add(struct vector v1, struct vector v2);int main(){// 习题(9.3.3)/*平面向量加法:输入两个二维平面向量 V1=(x1, y1) 和 V2=(x2, y2) 的分量,计算并输出两个向量的和向量。*/struct vector v1, v2, sum;double s1, s2;printf("input first vector:\n");scanf("%lf%lf", &v1.x, &v1.y);printf("input second vector:\n");scanf("%lf%lf", &v2.x, &v2.y);sum = vector_add(v1, v2);printf("(%.1lf, %.1lf)\n", sum.x, sum.y);return 0;}struct vector vector_add(struct vector v1, struct vector v2){struct vector sum;double s1, s2;s1 = v1.x + v2.x;s2 = v1.y + v2.y;sum.x = s1;sum.y = s2;return sum;}

运行结果:

题目4:查找书籍:从键盘输入 10 本书的名称和定价并存入结构数组中,从中查找定价最高和最低的书的名称和定价,并输出。试编写相应程序。

答案代码:

#include <stdio.h>#define NUMBER 10struct book{char name[30];float price;};int main(){// 习题(9.3.4)/*查找书籍:从键盘输入 10 本书的名称和定价并存入结构数组中,从中查找定价最高和最低的书的名称和定价,并输出。*/int i, max1, min1;struct book test[NUMBER];printf("input 10 book's name and price\n");for (i = 0; i < NUMBER; i++)scanf("%s%f", test[i].name, &test[i].price);max1 = min1 = 0;for (i = 1; i < NUMBER; i++){if (test[max1].price < test[i].price)max1 = i;if (test[min1].price > test[i].price)min1 = i;}printf("Max Price: %.2f, %s\n", test[max1].price, test[max1].name);printf("Min Price: %.2f, %s\n", test[min1].price, test[min1].name);return 0;}

运行结果:

题目5:通信录排序:建立一个通信录,通信录的结构记录包括:姓名、生日、电话号码;其中生日又包括三项:年、月、日。编写程序,定义一个嵌套的结构类型,输入 n(n<10)个联系人的信息,再按他们的年龄从大到小的顺序依次输出其信息。试编写相应程序。

答案代码:

#include <stdio.h>struct birth{int year;int month;int date;};struct friends_list{char name[10]; /*姓名*/struct birth birthday; /*生日*/char phone[15]; /*电话号码*/char address[50]; /*住址*/};void sort(struct friends_list s[], int n) /*按生日日期从小到大排序*/{int i, j;struct friends_list temp;for (i = 1; i < n; i++)for (j = 0; j < n - i; j++)// 先判断年份if (s[j].birthday.year > s[j + 1].birthday.year){temp = s[j];s[j] = s[j + 1];s[j + 1] = temp;}else if (s[j].birthday.year == s[j + 1].birthday.year){if (s[j].birthday.month > s[j + 1].birthday.month){temp = s[j];s[j] = s[j + 1];s[j + 1] = temp;}else if (s[j].birthday.month == s[j + 1].birthday.month){if (s[j].birthday.date > s[j + 1].birthday.date){temp = s[j];s[j] = s[j + 1];s[j + 1] = temp;}}}}int main(){// 习题(9.3.5)/*通信录排序:建立一个通信录,通信录的结构记录包括:姓名、生日、电话号码;其中生日又包括三项:年、月、日。编写程序,定义一个嵌套的结构类型,输入 n(n<10)个联系人的信息,再按他们的年龄从大到小的顺序依次输出其信息。*/int i, n;struct friends_list friends[10];printf("input n:");scanf("%d", &n);for (i = 0; i < n; i++) /*输入 n个人的通讯信息*/{printf("请输入第 %d 个人的信息: 姓名 年 月 日 手机号 地址\n", i + 1);scanf("%s%d%d%d%s%s", friends[i].name, &friends[i].birthday.year, &friends[i].birthday.month, &friends[i].birthday.date, friends[i].phone, friends[i].address);}printf("------------------------------------------------------------------------\n");printf("通讯录信息:\n");for (i = 0; i < n; i++)/*输出*/printf("%s\t%d\t%d\t%d\t%s\t%s\n", friends[i].name, friends[i].birthday.year, friends[i].birthday.month, friends[i].birthday.date, friends[i].phone, friends[i].address);printf("------------------------------------------------------------------------\n");printf("排序后信息:\n");/*按年龄从大到小排序*/sort(friends, n);for (i = 0; i < n; i++)/*输出*/printf("%s\t%d\t%d\t%d\t%s\t%s\n", friends[i].name, friends[i].birthday.year, friends[i].birthday.month, friends[i].birthday.date, friends[i].phone, friends[i].address);return 0;}

运行结果:

题目6:按等级统计学生成绩:输入 10 个学生的学号、姓名和成绩,输出学生的成绩等级和不及格人数。每个学生的记录包括学号、姓名、成绩和等级,要求定义和调用函数set_grade(),根据学生成绩设置其等级,并统计不及格人数,等级设置: 85~100 为 A ,70~84 为 B , 60~69 为 C , 0~59 为 D。试编写相应程序。

答案代码:

#include <stdio.h>#define N 10struct student{int num;char name[20];int score;char grade;};int set_grade(struct student *p);int main(){// 习题(9.3.6)/*按等级统计学生成绩:输入 10 个学生的学号、姓名和成绩,输出学生的成绩等级和不及格人数。每个学生的记录包括学号、姓名、成绩和等级,要求定义和调用函数set_grade(),根据学生成绩设置其等级,并统计不及格人数,等级设置: 85~100 为 A ,70~84 为 B , 60~69 为 C , 0~59 为 D。*/struct student stu[N], *ptr;int i, count;ptr = stu;printf("input the student's number, name and score: \n");for (i = 0; i < N; i++){printf("No %d:", i + 1);scanf("%d%s%d", &stu[i].num, stu[i].name, &stu[i].score);}count = set_grade(ptr);printf("The count (<60): %d\n", count);printf("The student grade:\n");for (i = 0; i < N; i++)printf("%d\t%s\t%c\n", stu[i].num, stu[i].name, stu[i].grade);return 0;}//等级设置int set_grade(struct student *p){int i, n = 0;for (i = 0; i < N; i++, p++){if (p->score >= 85)p->grade = 'A';else if (p->score >= 70)p->grade = 'B';else if (p->score >= 60)p->grade = 'C';else{p->grade = 'D';n++;}}return n;}

运行结果:

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。