第8章 第6.1节:指向结构体的指针变量(练习)-《编程语言基础—C语言》(高教版第5版)同步精品课堂

2025-12-29
| 2份
| 33页
| 53人阅读
| 1人下载

内容正文:

8.6.1节:指向结构体的指针变量 一、单项选择题 1.以下程序的输出结果是( ) #include <stdio.h> struct student { int num; char name[10]; }; void print(struct student *p) { printf("%s", p->name); } main() { struct student s[2] = {{1001, "Tom"}, {1002, "Jerry"}}; print(s + 1); } A. Tom B. Jerry C. 1002 D. 编译错误 2.以下程序的输出结果是() #include <stdio.h> struct node { int data; struct node *next; }; main() { struct node n1 = {10, NULL}; struct node n2 = {20, &n1}; struct node *p = &n2; printf("%d", p->next->data); } A. 10 B. 20 C. 0 D. 编译错误 3.以下程序的输出结果是() #include <stdio.h> struct test { int a; int b; }; void swap(struct test *p) { int temp = p->a; p->a = p->b; p->b = temp; } main() { struct test t = {5, 10}; swap(&t); printf("%d,%d", t.a, t.b); } A. 5,10 B. 10,5 C. 5,5 D. 10,10 4.以下程序的输出结果是() #include <stdio.h> struct complex { float real; float imag; }; main() { struct complex c = {3.0, 4.0}; struct complex *p = &c; p->real = p->real * 2; p->imag = p->imag + 1; printf("%.1f,%.1f", c.real, c.imag); } A. 3.0,4.0 B. 6.0,5.0 C. 3.0,5.0 D. 6.0,4.0 5.以下程序的输出结果是() #include <stdio.h> struct person { char name[10]; int age; }; void update(struct person *p) { p->age++; } main() { struct person p = {"Alice", 20}; update(&p); printf("%d", p.age); } A. 20 B. 21 C. 0 D. 编译错误 二、程序运行结果题 6.执行以下程序的输出结果是() #include <stdio.h> struct rectangle { int width; int height; }; int area(struct rectangle *r) { return r->width * r->height; } main() { struct rectangle rect = {5, 8}; struct rectangle *p = &rect; printf("%d", area(p)); } 7.执行以下程序的输出结果是() #include <stdio.h> struct point { int x; int y; }; void move(struct point *p, int dx, int dy) { p->x += dx; p->y += dy; } main() { struct point pt = {10, 20}; move(&pt, 5, -10); printf("%d,%d", pt.x, pt.y); } 8.执行以下程序的输出结果是() #include <stdio.h> struct node { int data; struct node *next; }; main() { struct node n1 = {10, NULL}; struct node n2 = {20, &n1}; struct node *p = &n2; p->next->data = 30; printf("%d", n1.data); } 9.执行以下程序的输出结果是() #include <stdio.h> struct time { int hour; int minute; }; void add_minutes(struct time *t, int m) { t->minute += m; t->hour += t->minute / 60; t->minute %= 60; } main() { struct time t = {10, 30}; add_minutes(&t, 45); printf("%d:%02d", t.hour, t.minute); } 10.执行以下程序的输出结果是() #include <stdio.h> struct circle { float radius; float area; }; void calc_area(struct circle *c) { c->area = 3.14 * c->radius * c->radius; } main() { struct circle c = {5.0, 0.0}; struct circle *p = &c; calc_area(p); printf("%.2f", c.area); } 11.执行以下程序的输出结果是() #include <stdio.h> struct student { int num; char name[10]; float score; }; main() { struct student stu = {1001, "Zhang", 85.5}; struct student *p = &stu; p->score = 90.0; printf("%s: %.1f", stu.name, stu.score); } 12.执行以下程序的输出结果是() #include <stdio.h> struct point { int x; int y; }; main() { struct point pts[3] = {{1,2}, {3,4}, {5,6}}; struct point *p = pts; printf("%d,%d", (p+1)->x, (p+2)->y); } 13.执行以下程序的输出结果是() #include <stdio.h> struct employee { int id; float salary; char dept[10]; }; void change(struct employee *emp) { emp->salary *= 1.2; emp->dept[0] = 'T'; } main() { struct employee e = {101, 5000.0, "Sales"}; change(&e); printf("%d %.0f %s", e.id, e.salary, e.dept); } 14.执行以下程序的输出结果是() #include <stdio.h> struct node { int value; struct node *next; }; main() { struct node n1 = {10, NULL}; struct node n2 = {20, &n1}; struct node n3 = {30, &n2}; struct node *p = &n3; printf("%d %d", p->value, p->next->value); } 15.执行以下程序的输出结果是() #include <stdio.h> struct rectangle { int length; int width; int area; }; void calc(struct rectangle *r) { r->area = r->length * r->width; } main() { struct rectangle rect = {8, 5, 0}; struct rectangle *p = &rect; calc(p); printf("Area: %d", p->area); } 16.执行以下程序的输出结果是() #include <stdio.h> struct book { char title[20]; char author[20]; float price; }; main() { struct book library[3] = { {"C Programming", "K&R", 45.5}, {"Data Structure", "Knuth", 68.0}, {"Algorithm", "Cormen", 72.5} }; struct book *p = library; p += 2; printf("%s - %.1f", p->title, p->price); } 17.执行以下程序的输出结果是() #include <stdio.h> struct student { char name[10]; int scores[3]; }; void update(struct student *s) { s->scores[0] += 5; s->scores[1] += 3; s->scores[2] += 2; } main() { struct student stu = {"Tom", {70, 80, 90}}; update(&stu); printf("%s: %d %d %d", stu.name, stu.scores[0], stu.scores[1], stu.scores[2]); } 18.执行以下程序的输出结果是() #include <stdio.h> struct complex { float real; float imag; }; struct complex add(struct complex *a, struct complex *b) { struct complex c; c.real = a->real + b->real; c.imag = a->imag + b->imag; return c; } main() { struct complex x = {3.0, 4.0}; struct complex y = {2.0, 5.0}; struct complex z = add(&x, &y); printf("%.1f+%.1fi", z.real, z.imag); } 19.执行以下程序的输出结果是() #include <stdio.h> struct car { char brand[20]; int year; float price; }; void discount(struct car *c) { if(c->year < 2010) { c->price *= 0.8; } else if(c->year < 2015) { c->price *= 0.9; } } main() { struct car mycar = {"Toyota", 2012, 150000.0}; discount(&mycar); printf("%s: %.0f", mycar.brand, mycar.price); } 20.执行以下程序的输出结果是() #include <stdio.h> struct coordinate { int x; int y; }; void mirror(struct coordinate *p) { int temp = p->x; p->x = p->y; p->y = temp; } main() { struct coordinate pt = {3, 7}; mirror(&pt); printf("(%d,%d)", pt.x, pt.y); } 三、编程题 1.编写一个程序,定义表示学生信息的结构体,包含学号、姓名和三门课程成绩。使用结构体指针实现以下功能:输入学生信息,计算每个学生的平均分,输出平均分最高的学生信息。 2.建立一个简单的静态链表,包含3个学生信息的结点。每个结点包含学号、姓名和下一个结点的指针。遍历链表并输出所有学生信息。 3.定义一个表示时间的结构体,包含时、分、秒。编写函数实现时间相加功能,要求考虑进位(60秒进1分,60分进1小时)。 4.定义一个表示图书信息的结构体数组,包含书号、书名、作者、价格。编写程序实现以下功能:按书名查找图书、按价格范围查找图书、计算图书平均价格。 原创精品资源学科网独家享有版权,侵权必究! 学科网(北京)股份有限公司 $ 8.6.1节:指向结构体的指针变量 一、单项选择题 1.以下程序的输出结果是( ) #include <stdio.h> struct student { int num; char name[10]; }; void print(struct student *p) { printf("%s", p->name); } main() { struct student s[2] = {{1001, "Tom"}, {1002, "Jerry"}}; print(s + 1); } A. Tom B. Jerry C. 1002 D. 编译错误 【答案】B 2.以下程序的输出结果是( ) #include <stdio.h> struct node { int data; struct node *next; }; main() { struct node n1 = {10, NULL}; struct node n2 = {20, &n1}; struct node *p = &n2; printf("%d", p->next->data); } A. 10 B. 20 C. 0 D. 编译错误 【答案】A 3.以下程序的输出结果是( ) #include <stdio.h> struct test { int a; int b; }; void swap(struct test *p) { int temp = p->a; p->a = p->b; p->b = temp; } main() { struct test t = {5, 10}; swap(&t); printf("%d,%d", t.a, t.b); } A. 5,10 B. 10,5 C. 5,5 D. 10,10 【答案】B 4.以下程序的输出结果是( ) #include <stdio.h> struct complex { float real; float imag; }; main() { struct complex c = {3.0, 4.0}; struct complex *p = &c; p->real = p->real * 2; p->imag = p->imag + 1; printf("%.1f,%.1f", c.real, c.imag); } A. 3.0,4.0 B. 6.0,5.0 C. 3.0,5.0 D. 6.0,4.0 【答案】B 5.以下程序的输出结果是( ) #include <stdio.h> struct person { char name[10]; int age; }; void update(struct person *p) { p->age++; } main() { struct person p = {"Alice", 20}; update(&p); printf("%d", p.age); } A. 20 B. 21 C. 0 D. 编译错误 【答案】B 二、程序运行结果题 6.执行以下程序的输出结果是( ) #include <stdio.h> struct rectangle { int width; int height; }; int area(struct rectangle *r) { return r->width * r->height; } main() { struct rectangle rect = {5, 8}; struct rectangle *p = &rect; printf("%d", area(p)); } 【答案】40 7.执行以下程序的输出结果是( ) #include <stdio.h> struct point { int x; int y; }; void move(struct point *p, int dx, int dy) { p->x += dx; p->y += dy; } main() { struct point pt = {10, 20}; move(&pt, 5, -10); printf("%d,%d", pt.x, pt.y); } 【答案】15,10 8.执行以下程序的输出结果是( ) #include <stdio.h> struct node { int data; struct node *next; }; main() { struct node n1 = {10, NULL}; struct node n2 = {20, &n1}; struct node *p = &n2; p->next->data = 30; printf("%d", n1.data); } 【答案】30 9.执行以下程序的输出结果是( ) #include <stdio.h> struct time { int hour; int minute; }; void add_minutes(struct time *t, int m) { t->minute += m; t->hour += t->minute / 60; t->minute %= 60; } main() { struct time t = {10, 30}; add_minutes(&t, 45); printf("%d:%02d", t.hour, t.minute); } 【答案】11:15 10.执行以下程序的输出结果是( ) #include <stdio.h> struct circle { float radius; float area; }; void calc_area(struct circle *c) { c->area = 3.14 * c->radius * c->radius; } main() { struct circle c = {5.0, 0.0}; struct circle *p = &c; calc_area(p); printf("%.2f", c.area); } 【答案】78.50 11.执行以下程序的输出结果是( ) #include <stdio.h> struct student { int num; char name[10]; float score; }; main() { struct student stu = {1001, "Zhang", 85.5}; struct student *p = &stu; p->score = 90.0; printf("%s: %.1f", stu.name, stu.score); } 【答案】Zhang: 90.0 12.执行以下程序的输出结果是( ) #include <stdio.h> struct point { int x; int y; }; main() { struct point pts[3] = {{1,2}, {3,4}, {5,6}}; struct point *p = pts; printf("%d,%d", (p+1)->x, (p+2)->y); } 【答案】3,6 13.执行以下程序的输出结果是( ) #include <stdio.h> struct employee { int id; float salary; char dept[10]; }; void change(struct employee *emp) { emp->salary *= 1.2; emp->dept[0] = 'T'; } main() { struct employee e = {101, 5000.0, "Sales"}; change(&e); printf("%d %.0f %s", e.id, e.salary, e.dept); } 【答案】101 6000 Tales 14.执行以下程序的输出结果是( ) #include <stdio.h> struct node { int value; struct node *next; }; main() { struct node n1 = {10, NULL}; struct node n2 = {20, &n1}; struct node n3 = {30, &n2}; struct node *p = &n3; printf("%d %d", p->value, p->next->value); } 【答案】30 20 15.执行以下程序的输出结果是( ) #include <stdio.h> struct rectangle { int length; int width; int area; }; void calc(struct rectangle *r) { r->area = r->length * r->width; } main() { struct rectangle rect = {8, 5, 0}; struct rectangle *p = &rect; calc(p); printf("Area: %d", p->area); } 【答案】Area: 40 16.执行以下程序的输出结果是( ) #include <stdio.h> struct book { char title[20]; char author[20]; float price; }; main() { struct book library[3] = { {"C Programming", "K&R", 45.5}, {"Data Structure", "Knuth", 68.0}, {"Algorithm", "Cormen", 72.5} }; struct book *p = library; p += 2; printf("%s - %.1f", p->title, p->price); } 【答案】Algorithm - 72.5 17.执行以下程序的输出结果是( ) #include <stdio.h> struct student { char name[10]; int scores[3]; }; void update(struct student *s) { s->scores[0] += 5; s->scores[1] += 3; s->scores[2] += 2; } main() { struct student stu = {"Tom", {70, 80, 90}}; update(&stu); printf("%s: %d %d %d", stu.name, stu.scores[0], stu.scores[1], stu.scores[2]); } 【答案】Tom: 75 83 92 18.执行以下程序的输出结果是( ) #include <stdio.h> struct complex { float real; float imag; }; struct complex add(struct complex *a, struct complex *b) { struct complex c; c.real = a->real + b->real; c.imag = a->imag + b->imag; return c; } main() { struct complex x = {3.0, 4.0}; struct complex y = {2.0, 5.0}; struct complex z = add(&x, &y); printf("%.1f+%.1fi", z.real, z.imag); } 【答案】5.0+9.0i 19.执行以下程序的输出结果是( ) #include <stdio.h> struct car { char brand[20]; int year; float price; }; void discount(struct car *c) { if(c->year < 2010) { c->price *= 0.8; } else if(c->year < 2015) { c->price *= 0.9; } } main() { struct car mycar = {"Toyota", 2012, 150000.0}; discount(&mycar); printf("%s: %.0f", mycar.brand, mycar.price); } 【答案】Toyota: 135000 20.执行以下程序的输出结果是( ) #include <stdio.h> struct coordinate { int x; int y; }; void mirror(struct coordinate *p) { int temp = p->x; p->x = p->y; p->y = temp; } main() { struct coordinate pt = {3, 7}; mirror(&pt); printf("(%d,%d)", pt.x, pt.y); } 【答案】(7,3) 三、编程题 1.编写一个程序,定义表示学生信息的结构体,包含学号、姓名和三门课程成绩。使用结构体指针实现以下功能:输入学生信息,计算每个学生的平均分,输出平均分最高的学生信息。 【答案】 #include <stdio.h> struct student { int num; char name[20]; float score[3]; float average; }; void input_student(struct student *s) { printf("请输入学号: "); scanf("%d", &s->num); printf("请输入姓名: "); scanf("%s", s->name); printf("请输入三门课程成绩: "); scanf("%f %f %f", &s->score[0], &s->score[1], &s->score[2]); } void calculate_average(struct student *s) { s->average = (s->score[0] + s->score[1] + s->score[2]) / 3.0; } int main() { int i; struct student stu[5]; struct student *highest = &stu[0]; // 输入学生信息 for(i = 0; i < 5; i++) { printf("输入第%d个学生信息: ", i + 1); input_student(&stu[i]); calculate_average(&stu[i]); printf(" "); } // 查找平均分最高的学生 for(i = 1; i < 5; i++) { if(stu[i].average > highest->average) { highest = &stu[i]; } } // 输出结果 printf("平均分最高的学生: "); printf("学号: %d ", highest->num); printf("姓名: %s ", highest->name); printf("成绩: %.1f %.1f %.1f ", highest->score[0], highest->score[1], highest->score[2]); printf("平均分: %.2f ", highest->average); } 2.建立一个简单的静态链表,包含3个学生信息的结点。每个结点包含学号、姓名和下一个结点的指针。遍历链表并输出所有学生信息。 【答案】 #include <stdio.h> #include <string.h> struct student_node { int num; char name[20]; struct student_node *next; }; main() { // 定义链表结点 struct student_node stu1, stu2, stu3; struct student_node *head, *p; // 初始化结点数据 stu1.num = 1001; strcpy(stu1.name, "张三"); stu1.next = &stu2; stu2.num = 1002; strcpy(stu2.name, "李四"); stu2.next = &stu3; stu3.num = 1003; strcpy(stu3.name, "王五"); stu3.next = NULL; // 最后一个结点 // 遍历链表 head = &stu1; p = head; printf("学生信息链表: "); printf("------------------- "); while(p != NULL) { printf("学号: %d ", p->num); printf("姓名: %s ", p->name); printf("------------------- "); p = p->next; } } 3.定义一个表示时间的结构体,包含时、分、秒。编写函数实现时间相加功能,要求考虑进位(60秒进1分,60分进1小时)。 【答案】 #include <stdio.h> struct time { int hour; int minute; int second; }; void add_time(struct time *t1, struct time *t2, struct time *result) { result->second = t1->second + t2->second; result->minute = t1->minute + t2->minute; result->hour = t1->hour + t2->hour; // 处理进位 if(result->second >= 60) { result->second -= 60; result->minute++; } if(result->minute >= 60) { result->minute -= 60; result->hour++; } } void print_time(struct time *t) { printf("%02d:%02d:%02d", t->hour, t->minute, t->second); } main() { struct time t1, t2, sum; printf("输入第一个时间(时 分 秒): "); scanf("%d %d %d", &t1.hour, &t1.minute, &t1.second); printf("输入第二个时间(时 分 秒): "); scanf("%d %d %d", &t2.hour, &t2.minute, &t2.second); add_time(&t1, &t2, &sum); printf(" 时间1: "); print_time(&t1); printf(" "); printf("时间2: "); print_time(&t2); printf(" "); printf("相加后: "); print_time(&sum); printf(" "); } 4.定义一个表示图书信息的结构体数组,包含书号、书名、作者、价格。编写程序实现以下功能:按书名查找图书、按价格范围查找图书、计算图书平均价格。 【答案】 #include <stdio.h> #include <string.h> #define MAX_BOOKS 5 struct book { int id; char title[50]; char author[30]; float price; }; void search_by_title(struct book books[], int n, char *title) { int found = 0,i; printf(" 按书名查找 '%s': ", title); printf("---------------------------------------- "); for(i = 0; i < n; i++) { if(strstr(books[i].title, title) != NULL) { printf("书号: %d ", books[i].id); printf("书名: %s ", books[i].title); printf("作者: %s ", books[i].author); printf("价格: %.2f ", books[i].price); printf("---------------------------------------- "); found = 1; } } if(!found) { printf("未找到相关图书 "); } } void search_by_price_range(struct book books[], int n, float min_price, float max_price) { int found = 0,i; printf(" 价格范围 %.2f - %.2f 的图书: ", min_price, max_price); printf("---------------------------------------- "); for(i = 0; i < n; i++) { if(books[i].price >= min_price && books[i].price <= max_price) { printf("书号: %d ", books[i].id); printf("书名: %s ", books[i].title); printf("作者: %s ", books[i].author); printf("价格: %.2f ", books[i].price); printf("---------------------------------------- "); found = 1; } } if(!found) { printf("未找到相关图书 "); } } float average_price(struct book books[], int n) { int i; float total = 0; for(i = 0; i < n; i++) { total += books[i].price; } return total / n; } main() { struct book library[MAX_BOOKS] = { {1001, "C Programming", "K&R", 45.5}, {1002, "Data Structure", "Knuth", 68.0}, {1003, "Algorithm Design", "Cormen", 72.5}, {1004, "C++ Primer", "Lippman", 88.0}, {1005, "Python Basics", "Van Rossum", 55.0} }; // 计算平均价格 float avg = average_price(library, MAX_BOOKS); printf("图书平均价格: %.2f ", avg); // 按书名查找 search_by_title(library, MAX_BOOKS, "C"); // 按价格范围查找 search_by_price_range(library, MAX_BOOKS, 50.0, 70.0); } 原创精品资源学科网独家享有版权,侵权必究! 学科网(北京)股份有限公司 $

资源预览图

第8章 第6.1节:指向结构体的指针变量(练习)-《编程语言基础—C语言》(高教版第5版)同步精品课堂
1
第8章 第6.1节:指向结构体的指针变量(练习)-《编程语言基础—C语言》(高教版第5版)同步精品课堂
2
第8章 第6.1节:指向结构体的指针变量(练习)-《编程语言基础—C语言》(高教版第5版)同步精品课堂
3
所属专辑
由于学科网是一个信息分享及获取的平台,不确保部分用户上传资料的 来源及知识产权归属。如您发现相关资料侵犯您的合法权益,请联系学科网,我们核实后将及时进行处理。