内容正文:
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 = ▭
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 = ▭
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 = ▭
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 = ▭
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);
}
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
$