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

您所在的位置:网站首页 c语言程序设计基础第四版课后题答案 浙大版《C语言程序设计》第四版(何钦铭颜晖) 第9章 结构 课后习题答案

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

2023-12-02 14:54| 来源: 网络整理| 查看: 265

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

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

WX20220412-135428@2x

一、选择题

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 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 int hour; int minute; int second; }; void add(struct time *p, int s); int main() { // 习题(9.3.1) /* 时间换算:用结构类型表示时间内容(时间以时、分、秒表示),输入一个时间数值, 再输入一个秒数 n(n 1:58:295(4分55秒)--> 2:02:55 int ho, mi, se; ho = p->hour; mi = p->minute; se = p->second; se = se + s; if (se mi = p->minute = mi + se / 60; se = p->second = se % 60; if (mi // ho = p->hour = ho + mi / 60; mi = p ->minute = mi % 60; if (ho 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; }

运行结果:

WX20220413-162448@2x

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

答案代码:

#include 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; }

运行结果:

WX20220413-183808@2x

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

答案代码:

#include #define NUMBER 10 struct 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 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 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 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 int i, n = 0; for (i = 0; i p->grade = 'D'; n++; } } return n; }

运行结果:

WX20220413-182029@2x



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3