第4次形成性考核 (结构体、文件与综合应用)
- 主题: 结构体的定义与使用、结构体数组、文件基本操作(打开、关闭、读、写)、动态内存分配初步(malloc, free)、综合应用。
- 题量: 7题
题目:
- (选择题 – 3分)
下面关于C语言结构体的描述,哪个是错误的? ( D )
- 结构体是一种构造数据类型。
- 结构体可以包含不同类型的成员。
- 结构体变量在定义后,其成员可以直接通过运算符访问。
- 结构体变量之间不能直接赋值。
- (填空题 – 4分)
定义一个名为 Student 的结构体,包含 id (整型) 和 name (字符数组,长度为20) 两个成员的语句是:
struct Student {
____int___ id;
_char___ name[20];
};
若有结构体变量 struct Student s1;,给其 id 成员赋值为101的语句是:s1.____ = 101;
若要以文本只读方式打开文件 “data.txt”,fopen 函数的第二个参数应为 ____。
- (简答题 – 5分)
简述C语言中 malloc() 和 free() 函数的作用以及为什么它们通常需要配对使用。
malloc() 用于动态分配内存空间,返回指向该空间的指针;free() 用于释放动态分配的内存,避免内存泄漏。
配对使用原因:动态分配的内存若不释放,会导致内存资源浪费(内存泄漏),程序长期运行可能耗尽内存。因此,malloc 分配的内存必须用 free 释放,确保资源有效管理。
- (编程题 – 10分)
定义一个 Point 结构体,包含两个 double 类型的成员 x 和 y,表示平面上的一个点。编写一个函数 double distance(struct Point p1, struct Point p2),计算并返回两个点 p1 和 p2 之间的距离。 距离公式:sqrt((x2-x1)^2 + (y2-y1)^2) (可以使用 math.h 中的 sqrt() 和 pow())。 在 main 函数中创建两个 Point 结构体变量,赋初值,调用 distance 函数并输出结果。
“`c #include #include
struct Point {
double x, y;
};
double distance(struct Point p1, struct Point p2) {
double dx = p2.x – p1.x;
double dy = p2.y – p1.y;
return sqrt(pow(dx, 2) + pow(dy, 2));
}
int main () {
struct Point p1 = {1.0, 2.0}, p2 = {4.0, 6.0};
double dist = distance (p1, p2);
printf (“Distance: %.2f\n”, dist); // 输出应为 5.00
return 0;
}
- (编程题 – 10分)
编写一个C程序,要求用户输入5个学生的姓名(不超过19个字符)和成绩(整数)。将这些信息存入一个结构体数组中。然后,找出并输出成绩最高的学生的姓名和成绩。
结构体定义建议:
struct Student {
char name[20];
int score;
};
<doubaocanvas identifier=”c-highest-score-student” type=”general_code” title=”查找成绩最高的学生”>
<doubaocanvas-part language=”c” path=”highest_score.c” description=”查找成绩最高的学生”>
“`c
#include <stdio.h>
#include <string.h>
struct Student {
char name[20];
int score;
};
int main() {
struct Student students[5], max_student;
int i;
// 输入5名学生信息
for (i = 0; i < 5; i++) {
scanf(“%s %d”, students[i].name, &students[i].score);
}
// 初始化最大值
max_student = students[0];
for (i = 1; i < 5; i++) {
if (students[i].score > max_student.score) {
max_student = students[i];
}
}
printf(“Highest score student: %s, %d\n”, max_student.name, max_student.score);
return 0;
}
- (编程题 – 12分)
编写一个C程序,实现以下功能:
- 向文件 txt 中写入10行文本,每行内容为 “Line number: X”,其中 X 是行号(从1到10)。
- 关闭文件。
- 重新打开 txt 文件进行读取。
- 逐行读取文件内容,并在每行内容前加上 “Read from file: ” 后输出到屏幕。
- 关闭文件。 (注意错误处理,如文件打开失败等。)
- “`c #include #include
- int main() {
FILE *fp;
char line[50]; - // 写入文件
fp = fopen (“output.txt”, “w”);
if (fp == NULL) {
perror (“Error opening file for writing”);
return 1;
} - for (int i = 1; i <= 10; i++) {
fprintf(fp, “Line number: %d\n”, i);
}
fclose(fp); - // 读取文件
fp = fopen (“output.txt”, “r”);
if (fp == NULL) {
perror (“Error opening file for reading”);
return 1;
} - while (fgets(line, sizeof(line), fp)) {
printf(“Read from file: %s”, line);
}
fclose(fp); - return 0;
}