2024-2025-1 20241313《计算机基础与程序设计》第14周学习总结
作业信息
这个作业属于哪个课程 | <班级的链接>(如2024-2025-1-计算机基础与程序设计) |
---|---|
这个作业要求在哪里 | <作业要求的链接>(如2024-2025-1计算机基础与程序设计第一周作业) |
这个作业的目标 | <写上具体方面> |
作业正文 | ... 本博客链接 |
教材学习内容总结
《C语言程序设计》第13章-文件操作
- 文件的基本概念
文件的定义:文件是存储在外部介质(如硬盘、光盘等)上的数据集合。在 C 语言中,文件可视为一个字节流或字符序列。
文件的分类
文本文件:以字符的 ASCII 码形式存储数据,每个字符对应一个字节。例如,整数 123 在文本文件中存储为 '1'、'2'、'3' 三个字符的 ASCII 码值,占用三个字节。
二进制文件:数据按其在内存中的存储形式原样存放在文件中。同样是整数 123,在二进制文件中以其二进制形式(假设为 4 字节存储系统,00000000 00000000 00000000 01111011)存储,仅占用 4 字节。 - 文件指针
定义:FILE 是 C 语言标准库定义的结构体类型,用于存放文件的相关信息,如文件当前读写位置、缓冲区状态等。文件指针是指向 FILE 类型结构体的指针变量,用于对文件进行各种操作。
声明方式:FILE *fp; ,这里 fp 就是一个文件指针。 - 文件的打开与关闭
文件打开函数 fopen()
函数原型:FILE *fopen(const char *filename, const char *mode);
参数说明:filename 是要打开文件的文件名(包含路径,若不写路径则默认在当前工作目录);mode 是文件打开方式,如 "r"(只读)、"w"(只写,若文件存在则清空,不存在则创建)、"a"(追加,在文件末尾添加内容,不存在则创建)、"rb"(以二进制方式只读)、"wb"(以二进制方式只写)等。
返回值:成功打开文件返回文件指针,否则返回 NULL。例如:
c
FILE *fp = fopen("test.txt", "r");
if (fp == NULL) {
perror("Failed to open file");
return 1;
}
文件关闭函数 fclose()
函数原型:int fclose(FILE *stream);
参数说明:stream 是要关闭的文件指针。
返回值:成功关闭返回 0,否则返回 EOF(通常为 -1)。关闭文件可释放系统资源,确保数据完整写入。例如:fclose(fp); - 文件的读写操作
字符读写函数
fgetc():从指定文件读取一个字符。int fgetc(FILE *stream);,返回读取的字符(以 int 类型表示,便于处理文件结束标志 EOF),若到达文件末尾或出错返回 EOF。例如:
c
int ch;
while ((ch = fgetc(fp))!= EOF) {
putchar(ch);
}
fputc():向指定文件写入一个字符。int fputc(int c, FILE *stream);,成功写入返回写入的字符,失败返回 EOF。例如:fputc('A', fp);
字符串读写函数
fgets():从指定文件读取一行字符串。char *fgets(char *str, int num, FILE *stream);,str 为存放读取字符串的数组,num 是要读取的最大字符数(包括字符串结束符 '\0')。成功读取返回 str,到达文件末尾或出错返回 NULL。例如:
c
char buffer[100];
while (fgets(buffer, sizeof(buffer), fp)!= NULL) {
printf("%s", buffer);
}
fputs():向指定文件写入一个字符串(不包括字符串结束符 '\0')。int fputs(const char *str, FILE *stream);,成功写入返回非负整数,失败返回 EOF。例如:fputs("Hello, World!", fp);
格式化读写函数
fscanf():从指定文件按指定格式读取数据。int fscanf(FILE *stream, const char *format,...);,与 scanf() 类似,只是数据来源是文件。例如:
c
int num;
fscanf(fp, "%d", &num);
fprintf():向指定文件按指定格式写入数据。int fprintf(FILE *stream, const char *format,...);,与 printf() 类似,只是输出目标是文件。例如:fprintf(fp, "The number is %d", num);
数据块读写函数
fread():从指定文件读取数据块。size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);,ptr 为存放读取数据的内存地址,size 是每个数据项的大小(字节数),nmemb 是数据项的个数。返回成功读取的数据项个数。常用于读取二进制文件,例如读取一个结构体数组:
c
struct Student {
char name[50];
int age;
};
struct Student students[10];
size_t count = fread(students, sizeof(struct Student), 10, fp);
fwrite():向指定文件写入数据块。size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);,参数含义与 fread() 类似,返回成功写入的数据项个数。例如写入一个结构体数组:
c
struct Student student = {"John", 20};
fwrite(&student, sizeof(struct Student), 1, fp); - 文件的定位操作
fseek():用于移动文件指针到指定位置。int fseek(FILE *stream, long offset, int whence);
参数说明:offset 是偏移量,可正可负;whence 是起始位置,取值 SEEK_SET(文件开头)、SEEK_CUR(当前位置)、SEEK_END(文件末尾)。例如,将文件指针从文件开头向后移动 10 个字节:fseek(fp, 10, SEEK_SET);
ftell():获取文件指针当前位置。long ftell(FILE *stream);,返回文件指针相对于文件开头的字节偏移量,出错返回 -1L。例如:long pos = ftell(fp);
rewind():将文件指针重新定位到文件开头。void rewind(FILE *stream);,相当于 fseek(fp, 0, SEEK_SET); - 文件操作的错误处理
ferror():用于检测文件操作过程中是否发生错误。int ferror(FILE *stream);,若发生错误返回非零值,否则返回 0。例如,在每次文件操作后可通过检查 ferror(fp) 判断是否出错。
clearerr():清除文件错误标志。void clearerr(FILE stream);,当文件操作出错后,可调用此函数清除错误标志,以便后续操作能正常进行。
第14章-简单的游戏设计
一、游戏设计基础思路
确定游戏目标与规则
明确玩家在游戏中要达成的任务,如在猜数字游戏中,目标是猜出程序预设的数字。规则可能包括猜测次数限制、提示方式(如猜大了或猜小了)等。在井字棋游戏里,目标是率先让自己的棋子在横、竖或斜向连成一线,规则涉及轮流落子、棋盘边界限制等。
这些目标和规则是游戏设计的核心,决定了游戏的玩法和趣味性。
规划游戏流程
通常游戏开始时要进行初始化,如初始化游戏数据、设置初始场景等。以贪吃蛇游戏为例,要初始化蛇的位置、长度、食物位置等。
接着进入游戏主循环,在循环中不断获取玩家输入、更新游戏状态、检测游戏结束条件。例如在俄罗斯方块游戏中,主循环里要处理方块的下落、玩家的旋转与移动操作,同时检测方块是否触底或填满一行等结束条件。
游戏结束后,可能需要显示游戏结果,如得分、是否胜利等信息。
二、游戏设计常用技术
随机数生成
C 语言通过<stdlib.h>库中的rand()函数生成随机数。rand()函数返回一个介于 0(包括)和RAND_MAX(通常是一个较大的整数,如 32767)之间的伪随机整数。
例如在猜数字游戏中,可用rand() % 100生成 0 到 99 之间的随机数作为要猜测的数字。为使每次运行程序生成不同的随机序列,常使用srand()函数设置随机数种子,如srand(time(NULL)),利用系统时间作为种子,保证每次运行时种子不同。
输入处理
使用getchar()函数获取单个字符输入,常用于简单的选择操作,如在游戏菜单中选择选项。例如在一个简单的冒险游戏菜单中,玩家输入 'y' 或 'n' 来决定是否继续前进。
scanf()函数可用于获取格式化输入,如在猜数字游戏中获取玩家猜测的整数。但使用scanf()时要注意输入格式匹配问题,避免输入错误导致程序异常。
对于更复杂的游戏,可能需要处理键盘的特殊按键,如方向键。在 Windows 系统下可通过conio.h库中的_getch()函数结合特殊按键编码来实现,如按下方向右键对应的编码值获取玩家的移动方向操作。
输出显示
printf()函数是最基本的输出函数,用于在控制台输出文本信息,如游戏提示、结果等。例如在猜数字游戏中输出 “猜大了,请重新猜测!” 等提示。
对于一些简单图形显示需求,可通过重复输出字符来模拟,如用字符组成一个简单的边界框来表示游戏区域。例如在井字棋游戏中,通过输出空格和棋子符号(如X和O)来绘制棋盘。
教材学习中的问题和解决过程(先问 AI)
期末知识点的复习