这个作业属于哪个课程 2024-2025-1-计算机基础与程序设计
这个作业要求在哪里 2024-2025-1计算机基础与程序设计第十三周作业
这个作业的目标 复习知识,巩固所学
作业正文 https://www.cnblogs.com/118qa/p/18622459
教材学习内容总结
- 概念
结构体是一种用户自定义的数据类型,它允许将不同类型的数据(比如整型、字符型、浮点型以及其他自定义的结构体类型等)组合在一起,形成一个有机的整体,便于对相关数据进行统一管理和操作。 - 定义形式
一般形式如下(以 C 语言为例):
c
struct 结构体名 {
数据类型 成员变量1;
数据类型 成员变量2;
//...
};
例如定义一个表示学生信息的结构体:
c
struct Student {
char name[20];
int age;
float score;
}; - 结构体变量的声明与初始化
声明:可以在定义结构体类型后接着声明变量,如 struct Student stu1; ,也可以在定义结构体类型时同时声明变量,像 struct Student { char name[20]; int age; float score; } stu2;。
初始化:例如 struct Student stu3 = {"Tom", 18, 85.5}; 按照结构体成员定义的顺序依次赋初值。 - 结构体成员的访问
使用 . 操作符(对于普通结构体变量),比如 stu1.age = 20; 可以给 stu1 这个结构体变量中的 age 成员赋值;如果是指向结构体的指针,则用 -> 操作符,像 struct Student *p = &stu1; p->age = 21;。 - 应用场景
在处理现实中存在多种属性关联的数据集合时很有用,比如员工信息管理(包含工号、姓名、工资等不同类型数据)、游戏角色属性管理(生命值、攻击力、防御力等)等情况。
文件 - 概念
文件是存储在外部介质(如磁盘等)上的数据集合,可以长久保存数据。计算机中的文件有文本文件(内容主要是可直接阅读的字符,按字符编码存储)和二进制文件(以二进制形式存储数据,对数据的存储更紧凑高效,但通常不可直接阅读内容)之分。 - 文件操作步骤(以 C 语言为例)
打开文件:使用 fopen 函数,例如 FILE *fp = fopen("test.txt", "r"); ,第一个参数是文件名,第二个参数是打开模式(如 r 表示只读,w 表示只写,a 表示追加等),函数返回一个指向文件结构体的指针,若打开失败返回 NULL。
读写文件:
文本文件读写:常用 fgets 函数从文件读取一行字符串,fputs 函数向文件写入一个字符串等。例如 char buf[100]; fgets(buf, 100, fp); 就是从 fp 指向的文件中读取最多 99 个字符(留一个位置给 '\0' 结束符)到 buf 数组中。
二进制文件读写:像 fread 函数用于从文件读取二进制数据块,fwrite 函数用于向文件写入二进制数据块。例如 fwrite(&data, sizeof(data), 1, fp); 可以把 data 这个变量的数据按其大小写入文件,一次写一个数据块。
关闭文件:操作完文件后必须使用 fclose 函数关闭文件,如 fclose(fp); ,这样可以释放相关资源,避免数据丢失等问题。 - 文件指针
文件指针是指向 FILE 类型结构体的指针,该结构体中包含了与文件相关的各种信息,比如文件当前读写位置、缓冲区信息等,通过操作文件指针来实现对文件的各种访问操作。 - 应用场景
实现数据的持久化存储,比如保存程序的配置信息、记录日志(记录程序运行过程中的关键信息方便后续查看和分析)、存储大量的数据(如数据库底层部分也是基于文件存储来实现的)等。
总之,结构体方便了复杂数据的组织,文件则提供了数据长期保存和外部交互的途径,它们在编程中都是极为重要的基础内容。
教材学习中遇到的问题
问题:结构体如何与数组联系?
AI:结构体数组的定义
结构体数组是一个数组,其每个元素都是一个结构体类型的数据。例如,定义一个表示学生信息的结构体,然后定义一个该结构体类型的数组来存储多个学生的信息。
以 C 语言为例,假设已经定义了一个Student结构体:
c
struct Student {
char name[20];
int age;
float score;
};
struct Student students[3];//定义了一个包含3个Student结构体元素的数组
这里students数组有 3 个元素,每个元素都是Student结构体类型,分别可以用来存储 3 个学生的姓名、年龄和成绩。
结构体数组的初始化
可以在定义结构体数组时进行初始化。按照顺序为每个结构体元素的成员变量赋值。
例如:
c
struct Student students[3] = {{"Tom", 18, 85.5}, {"Jerry", 19, 90.0}, {"Alice", 20, 88.0}};
这里初始化了students数组的 3 个元素,第一个元素的name成员为"Tom",age为18,score为85.5;第二个元素和第三个元素也依次进行了初始化。
访问结构体数组元素及其成员
要访问结构体数组中的元素,可以使用数组下标。然后通过."操作符来访问结构体元素中的成员变量。
例如,要访问第二个学生(数组下标为 1)的姓名,可以使用students[1].name。如果要修改第三个学生(数组下标为 2)的成绩,可以使用students[2].score = 92.0;。
在函数中传递结构体数组
可以将结构体数组作为参数传递给函数。当传递结构体数组时,实际上传递的是数组的首地址(在 C 和 C++ 等语言中)。
例如,定义一个函数来打印学生数组中每个学生的信息:
c
void printStudents(struct Student students[], int n) {
for (int i = 0; i < n; i++) {
printf("Name: %s, Age: %d, Score: %.2f\n", students[i].name, students[i].age, students[i].score);
}
}
这里printStudents函数接收一个Student结构体数组和数组元素个数n,通过循环遍历数组,访问每个元素的成员变量并打印出来。
动态分配结构体数组内存
在一些情况下,可能需要动态地分配结构体数组的内存。例如,在 C 语言中,可以使用malloc函数来分配内存。
假设要动态分配一个包含n个Student结构体元素的数组:
c
struct Student *students = (struct Student *)malloc(n * sizeof(struct Student));
分配成功后,students是一个指向Student结构体类型的指针,它指向了一块可以存储n个Student结构体元素的内存空间。可以像访问普通结构体数组一样访问这个动态分配的数组,例如students[0].name等来访问第一个元素的成员变量。不过在使用完后,需要使用free函数释放内存,如free(students);。
基于AI的学习