更新实验报告

This commit is contained in:
Luthics 2023-12-19 19:43:41 +08:00
parent 7123a79aa6
commit 8cffbe7e1d
2 changed files with 36 additions and 20 deletions

Binary file not shown.

View File

@ -174,15 +174,13 @@ int main() {
狼不吃白菜。请求出农夫将所有的东西运过河的方案。 狼不吃白菜。请求出农夫将所有的东西运过河的方案。
## 实现提示 ## 实现提示
求解这个问题的简单方法是一步一步进行试探,每一步搜索所有可能的选择 求解这个问题的简单方法是一步一步进行试探,每一步搜索所有可能的选择,对前一步合适的选择后再考虑下一步的各种方案。要模拟农夫过河问题,首先需要对问题中的每个角色的位置进行描述。可用`4`位二进制数顺序分别表示农夫、狼、白菜和羊的位置。用0表在南岸1表示在北岸。例如整数`5` (`0101`)表示农
,对前一步合适的选择后再考虑下一步的各种方案。要模拟农夫过河问题,首先
需要对问题中的每个角色的位置进行描述。可用4位二进制数顺序分别表示农夫、
狼、白菜和羊的位置。用0表在南岸1表示在北岸。例如整数5 (0101)表示农
夫和白菜在南岸,而狼和羊在北岸。 夫和白菜在南岸,而狼和羊在北岸。
现在问题变成从初始的状态二进制0000(全部在河的南岸)出发,寻找一种
全部由安全状态构成的状态序列它以二进制1111(全部到达河的北岸)为最终目 现在问题变成:从初始的状态二进制`0000`(全部在河的南岸)出发,寻找一种全部由安全状态构成的状态序列,它以二进制`1111`(全部到达河的北岸)为最终目标。总状态共16种(`0000`到`1111`)(或者看成`16`个顶点的有向图)可采用广度优先或深度优先的搜索策略`---`得到从`0000`到`1111`的安全路径。
标。总状态共16种(0000到1111)(或者看成16个顶点的有向图)可采用广度优先或深度优先的搜索策略---得到从0000到1111的安全路径。
以广度优先为例:整数队列---逐层存放下一步可能的安全状态Visited[16]数组标记该状态是否已访问过,若访问过,则记录前驱状态值---安全路径。 以广度优先为例:整数队列---逐层存放下一步可能的安全状态Visited[16]数组标记该状态是否已访问过,若访问过,则记录前驱状态值---安全路径。
最终的过河方案应用汉字显示出每一步的两岸状态。 最终的过河方案应用汉字显示出每一步的两岸状态。
## 思路 ## 思路
@ -380,6 +378,10 @@ B >
## 思路 ## 思路
参考代码中的 `main.c`,使用 `TableInfo` 结构体存储表格信息,使用 `key.h` 存储键盘按键的宏定义,使用 `conio.h` 实现光标移动,使用 `stdlib.h` 实现 `malloc` 函数,使用 `string.h` 实现 `strcpy` 函数,使用 `stdio.h` 实现 `printf` 函数,使用 `math.h` 实现 `atoi` 函数。 参考代码中的 `main.c`,使用 `TableInfo` 结构体存储表格信息,使用 `key.h` 存储键盘按键的宏定义,使用 `conio.h` 实现光标移动,使用 `stdlib.h` 实现 `malloc` 函数,使用 `string.h` 实现 `strcpy` 函数,使用 `stdio.h` 实现 `printf` 函数,使用 `math.h` 实现 `atoi` 函数。
## 运行结果
大致如下,具体交互功能请运行代码
![1702985432960.png](https://picture-1300689095.file.myqcloud.com/2023/12/19/65817edc94e80.png)
## 代码及解释 ## 代码及解释
`key.h` `key.h`
@ -1487,16 +1489,20 @@ int main() {
# 实验四 八皇后问题 # 实验四 八皇后问题
## 问题描述 ## 问题描述
设在初始状态下在国际象棋的棋盘上没有任何棋子这里的棋子指皇后棋子。然后顺序在第1行第2行……第8行上布放棋子。在每一行中共有8个可选择的位置但在任一时刻棋盘的合法布局都必须满足3个限制条件1任意两个棋子不得放在同一行2任意两个棋子不得放在同一列上3任意棋子不得放在同一正斜线和反斜线上。 设在初始状态下在国际象棋的棋盘上没有任何棋子(这里的棋子指皇后棋子)。然后顺序在第`1`行,第`2`行……第`8`行上布放棋子。在每一行中共有`8`个可选择的位置,但在任一时刻棋盘的合法布局都必须满足`3`个限制条件
1. 任意两个棋子不得放在同一行
2. 任意两个棋子不得放在同一列上
3. 任意棋子不得放在同一正斜线和反斜线上。
## 基本要求 ## 基本要求
编写求解并输出此问题的一个合法布局的程序。 编写求解并输出此问题的一个合法布局的程序。
## 实现提示: ## 实现提示:
在第i行布放棋子时从第1列到第8列逐列考察。当在第i行第j列布放棋子时需要考察布放棋子后在行方向、列方向、正斜线和反斜线方向上的布局状态是否合法若该棋子布放合法再递归求解在第i+1行布放棋子若该棋子布放不合法移去这个棋子恢复布放该棋子前的状态然后再试探在第i行第j+1列布放棋子。 在第`i`行布放棋子时,从第`1`列到第`8`列逐列考察。当在第`i`行第`j`列布放棋子时,需要考察布放棋子后在行方向、列方向、正斜线和反斜线方向上的布局状态是否合法,若该棋子布放合法,再递归求解在第`i+1`行布放棋子;若该棋子布放不合法,移去这个棋子,恢复布放该棋子前的状态,然后再试探在第`i`行第`j+1`列布放棋子。
## 思路 ## 思路
使用回溯法,从第一行开始,每一行都有 n 个选择,如果选择合法,就继续下一行,否则就回溯到上一行,重新选择。 使用回溯法,从第一行开始,每一行都有 `n` 个选择,如果选择合法,就继续下一行,否则就回溯到上一行,重新选择。
## 代码 ## 代码
参考 洛谷 P1219 实现的 `n` 皇后问题 参考 洛谷 P1219 实现的 `n` 皇后问题
@ -1573,6 +1579,7 @@ int main() {
``` ```
## 输出 ## 输出
仅输出前三个解
``` ```
Q....... Q.......
....Q... ....Q...
@ -1613,6 +1620,7 @@ Q.......
``` ```
## 输出2 ## 输出2
仅输出前三个解
``` ```
Q........... Q...........
..Q......... ..Q.........
@ -1757,13 +1765,13 @@ int main() {
3. 若根据给定的条件问题无解,则报告适当的信息;否则,将教学 3. 若根据给定的条件问题无解,则报告适当的信息;否则,将教学
计划输出到用户指定的文件中。计划的表格格式自行设计。 计划输出到用户指定的文件中。计划的表格格式自行设计。
## 实现提示 ## 实现提示
可设学期总数不超过12课程总数小于100。如果输入的先修课程号不在该专业开设的课程序列中则作为错误处理。 可设学期总数不超过12课程总数小于100。如果输入的先修课程号不在该专业开设的课程序列中则作为错误处理。
## 思路: ## 思路
使用拓扑排序,先将课程按照先修课程的数量进行排序,先修课程数量越多的课程越靠前,然后从前往后,如果学期学习数量小于平均值,则将前面的课程往后移动。 使用拓扑排序,先将课程按照先修课程的数量进行排序,先修课程数量越多的课程越靠前,然后从前往后,如果学期学习数量小于平均值,则将前面的课程往后移动。
## 代码: ## 代码
```c++ ```c++
#include <bits/stdc++.h> #include <bits/stdc++.h>
@ -2268,12 +2276,14 @@ int main() {
``` ```
#### 输入 #### 输入
```
10 10
2 5 10 8 7 9 4 6 1 3 2 5 10 8 7 9 4 6 1 3
3 3
2 2
5 5
9 9
```
#### 输出 #### 输出
``` ```
@ -2732,12 +2742,14 @@ int main() {
``` ```
#### 输入 #### 输入
```
10 10
2 5 10 8 7 9 4 6 1 3 2 5 10 8 7 9 4 6 1 3
3 3
2 2
5 5
9 9
```
#### 输出 #### 输出
二叉树图形输出为竖着 二叉树图形输出为竖着
@ -2824,11 +2836,11 @@ ASL: 1.700000
## 问题描述 ## 问题描述
录入、保存一个班级学生多门课程的成绩,并对成绩进行分析。 录入、保存一个班级学生多门课程的成绩,并对成绩进行分析。
## 基本要求 ## 基本要求
1. 通过键盘输入各学生的多门课程的成绩建立相应的文件input.dat。 1. 通过键盘输入各学生的多门课程的成绩,建立相应的文件`input.dat`
2. 对文件 input.dat 中的数据进行处理,要求具有如下功能: 2. 对文件 `input.dat` 中的数据进行处理,要求具有如下功能:
1. 按各门课程成绩排序,并生成相应的文件输出。 1. 按各门课程成绩排序,并生成相应的文件输出。
2. 计算每人的平均成绩,按平均成绩排序,并生成文件。 2. 计算每人的平均成绩,按平均成绩排序,并生成文件。
3. 求出各门课程的平均成绩、最高分、最低分、不及格人数、60-69分人数、70-79分人数、 80-89分人数、90分以上人数。 3. 求出各门课程的平均成绩、最高分、最低分、不及格人数、`60-69`分人数、`70-79`分人数、 `80-89`分人数、`90`分以上人数。
4. 根据姓名或学号查询某人的各门成绩,重名情况也能处理。 4. 根据姓名或学号查询某人的各门成绩,重名情况也能处理。
## 代码 ## 代码
@ -2855,7 +2867,6 @@ void save_to_file(Score **scores, int n, char *file_name) {
} }
int main() { int main() {
Score *scores[105]; Score *scores[105];
int n; int n;
// 如果 score.dat 不存在,就从键盘输入 // 如果 score.dat 不存在,就从键盘输入
@ -3195,7 +3206,10 @@ L6
2. 输出多项式:遍历链表,按格式输出多项式的每一项。 2. 输出多项式:遍历链表,按格式输出多项式的每一项。
3. 多项式相加:遍历两个链表,同时比较节点的指数大小,按照大小关系进行处理。如果两个指数相等,则将系数相加并创建新的节点插入到结果链表中;如果一个指数较大,则将该项直接插入结果链表中;如果一个指数较小,则将该项的系数取负数后插入结果链表中。 3. 多项式相加:遍历两个链表,同时比较节点的指数大小,按照大小关系进行处理。如果两个指数相等,则将系数相加并创建新的节点插入到结果链表中;如果一个指数较大,则将该项直接插入结果链表中;如果一个指数较小,则将该项的系数取负数后插入结果链表中。
4. 多项式相减:与多项式相加类似,不同的是需要将第二个多项式的所有系数取负数。 4. 多项式相减:与多项式相加类似,不同的是需要将第二个多项式的所有系数取负数。
5. 计算多项式在某个点的值遍历链表依次将每一项的系数乘以x的指数次方并累加到结果中。 5. 计算多项式在某个点的值:遍历链表,依次将每一项的系数乘以`x`的指数次方,并累加到结果中。
## 思路
直接模拟
## 代码 ## 代码
```c ```c
@ -3478,7 +3492,9 @@ int main() {
``` ```
# 实验感悟 # 实验感悟
通过本学期的数据结构实验, 我对数据结构有了更深的理解, 也对C语言有了更深的理解. 通过实验, 我学会了如何使用C和C++语言来实现各种数据结构, 也学会了如何使用各种数据结构来解决实际问题. 通过本学期的数据结构实验, 我对数据结构有了更深的理解, 也对`C`语言有了更深的理解. 通过实验, 我学会了如何使用`C``C++`语言来实现各种数据结构, 也学会了如何使用各种数据结构来解决实际问题.
# 更多 # 更多
Qt 版本的电子表格等待制作中, 预计在假期尝试. `Qt` 版本的电子表格等待制作中, 预计在假期尝试.
`Luthics` 的个人博客:[https://www.luthics.com/](https://www.luthics.com/)