提交所有LaTeX文件。
This commit is contained in:
57
数据结构/作业/10213903403第一章作业.tex
Normal file
57
数据结构/作业/10213903403第一章作业.tex
Normal file
@@ -0,0 +1,57 @@
|
||||
\documentclass[实验报告模板]{subfiles}
|
||||
|
||||
% \clearpage
|
||||
% \fancyfoot[C]{第 \thepage 页\quad 共 \thetotalpages 页}
|
||||
\renewcommand{\mydate}{
|
||||
2023/09/22
|
||||
}
|
||||
|
||||
\begin{document}
|
||||
\mytitle
|
||||
\begin{enumerate}
|
||||
\myitem{实验目的}{
|
||||
\item 回顾之前学习过的语言语法(任何语言都可以),旨在解决数据结构实际问题。
|
||||
}
|
||||
\myitem{实验内容}{
|
||||
\item 输入 10 名学生的成绩,计算总分和平均分,输出平均分。
|
||||
\item 输入 10 个学生的成绩,输出高于平均分的学生成绩。
|
||||
}
|
||||
\myitem{实验原理}{
|
||||
\item 程序设计原理。
|
||||
}
|
||||
\myitem{实验步骤}{
|
||||
\item 问题抽象
|
||||
\item 编写程序
|
||||
\item 调试程序
|
||||
\item 完善总结
|
||||
}
|
||||
\myitem{调试过程、结果和分析}{
|
||||
\item JavaScript总体以异步执行为特点,因此不能简单地使用for循环来重复读取输入数据,需要在事件中调用函数来达到重复执行的目的;
|
||||
\item JavaScript不像Python有内置的sum函数,因此需要使用Array.reduce方法实现求和。
|
||||
}
|
||||
\myitem{总结}{
|
||||
\item 使用JavaScript实现,效果不错;
|
||||
\item 简单考虑,暂时不考虑输入错误的情况;
|
||||
\item 总体时间复杂度为O(n),空间复杂度为O(n);
|
||||
\item 对于第1题,只需要计算总分和平均分时,可以不使用数组,只使用一个变量记录总分,最后计算平均分,可以将空间复杂度降为O(1),而第2题可能无法降低空间复杂度了;
|
||||
\item 学生数10与主要功能解耦,便于更改学生数。
|
||||
}
|
||||
\myitem{附件}{
|
||||
\item 输入 10 名学生的成绩,计算总分和平均分,输出平均分。\\
|
||||
(JavaScript, Node.js环境)
|
||||
\inputminted[linenos=true,breaklines=true]{javascript}{../JavaScript/第一章作业1.1.js}
|
||||
% PDFLaTeX暂时无法导入文件名含有中文的代码文件
|
||||
% 使用XeLaTeX时:
|
||||
% (./latex-output/_minted-第一章作业/default.pygstyle)
|
||||
% runsystem(pygmentize -l "javascript" -f latex -P commandprefix=PYG -F tokenmerge -P stripnl="False" -o ./latex-output/_minted-第一章作业/EB9C1F6C899584BBD96A7EA2CCA6A26247E0DCB0F1FF070BB839FDEA77D6714A.pygtex ../JavaScript/第一章作业1.1.js)...executed.
|
||||
% 使用PDFLaTeX时:
|
||||
% (./latex-output/_minted-第一章作业/default.pygstyle)
|
||||
% runsystem(pygmentize -l "javascript" -f latex -P commandprefix=PYG -F tokenmerge -P stripnl="False" -o ./latex-output/_minted-第一章作业/CDD4D8FBCEF7B3B45864487BE6CE9E9E.pygtex ../JavaScript/\CTEX@char@nnn {231}{172}{172}\CTEX@char@nnn {228}{184}{128}\CTEX@char@nnn {231}{171}{160}\CTEX@char@nnn {228}{189}{156}\CTEX@char@nnn {228}{184}{154}1.1.js)...executed.
|
||||
\itemsep 3em
|
||||
\item 输入 10 个学生的成绩,输出高于平均分的学生成绩。\\
|
||||
(JavaScript, Node.js环境)
|
||||
\thetotalpages
|
||||
\inputminted[linenos=true,breaklines=true]{javascript}{../JavaScript/第一章作业1.2.js}
|
||||
}
|
||||
\end{enumerate}
|
||||
\end{document}
|
||||
58
数据结构/作业/10213903403第七章作业.tex
Normal file
58
数据结构/作业/10213903403第七章作业.tex
Normal file
@@ -0,0 +1,58 @@
|
||||
\documentclass[实验报告模板]{subfiles}
|
||||
|
||||
\renewcommand{\mydate}{
|
||||
2023/12/15
|
||||
}
|
||||
\renewcommand{\mychapternum}{7}
|
||||
|
||||
\begin{document}
|
||||
\mytitle
|
||||
\begin{enumerate}
|
||||
\myitem{实验目的}{
|
||||
\item 使用第七章的知识解决查找树的综
|
||||
合问题。
|
||||
}
|
||||
\myitem{实验内容}{
|
||||
\item 给出 N 个正整数作为二叉排序树的节点插入顺序.判断这串序列是否是
|
||||
该二叉树的先序序列或者是该二叉排序树的镜像树的先序序列.镜像树
|
||||
指的是交换根结点的左右子树形成的二叉树,如果对于输入的序列与二
|
||||
叉排序树的先序序列一致,则输出 Yes,并输出该二叉排序树的后序序
|
||||
列.若对于输入的序列与二叉排序树的镜像树的先序序列一致,则输出
|
||||
Yes,并输出该二叉排序树的后序序列.其余情况输出 No.
|
||||
|
||||
\item 根据二叉排序树的镜像树的后序遍历序列作为顺序,构造平衡二叉树。
|
||||
}
|
||||
\myitem{实验原理}{
|
||||
\item 程序设计原理。
|
||||
}
|
||||
\myitem{实验步骤}{
|
||||
\item 问题抽象
|
||||
\item 编写程序
|
||||
\item 调试程序
|
||||
\item 完善总结
|
||||
}
|
||||
\myitem{调试过程、结果和分析}{
|
||||
\item 树的结构确实不好调试,尤其是平衡二叉树,但好在可以进行中序遍历,正确的情况下中序遍历的结果应该是排好序的;
|
||||
\item 对于镜像树,可以修改比较操作的函数定义,就像C++内置的make\_heap一样,当然由于镜像树是对称的,可以直接在遍历时先遍历右子树,再遍历左子树,也能实现;
|
||||
\item 两道题的输入输出有关联性,第二题的输入是第一题的输出但又不完全是,第一题输出的是原二叉树的后序遍历结果,但第二题要使用第一题的镜像数的后序遍历结果,因此可以使用文件记录输出结果,第二题就可以进行输入重定向。
|
||||
}
|
||||
\myitem{总结}{
|
||||
\item 遵循指针应在初始化时分配资源,以及将资源交给变量作用域和变量生命周期自动管理,此次代码中将每个节点的左右指针都使用unique\_ptr定义,这样就不需要自己进行delete删除分配的资源了;
|
||||
\item 但是使用unique\_ptr要注意,此指针指向的对象不能再被其他对象指向,因此需要使用move进行转移资源的所有权,这在旋转子树时尤其明显;
|
||||
\item 借助std::function和匿名函数,我们可以很方便地实现简单的函数回调,尤其是涉及到类和对象的成员函数的时候;
|
||||
\item 类中的this是常量指针,是不能改变它所指向的地址的,即不能对*this赋值;
|
||||
\item C++中有类似Python的迭代器,也能用匿名函数实现类似JavaScript的回调;
|
||||
\item 但是C++中没法直接使用 this->left\_child \&\& this->left\_child->postorder\_traversal(output),因为逻辑与操作中的函数调用会返回void,而void无法转换为bool类型;
|
||||
\item C++中的模板自动类型推断,还有解包参数,和Python、JavaScript中有相似之处,但又不完全一样,仍需深入了解。
|
||||
}
|
||||
\myitem{附件}{
|
||||
\itemsep 5em
|
||||
\item 第七章作业1.cpp
|
||||
\inputminted[]{cpp}{../C++/第七章作业/第七章作业1.cpp}
|
||||
\item 第七章作业2.cpp
|
||||
\inputminted[]{cpp}{../C++/第七章作业/第七章作业2.cpp}
|
||||
\item CMakeLists.txt
|
||||
\inputminted[]{cmake}{../C++/第七章作业/CMakeLists.txt}
|
||||
}
|
||||
\end{enumerate}
|
||||
\end{document}
|
||||
107
数据结构/作业/10213903403第三章作业.tex
Normal file
107
数据结构/作业/10213903403第三章作业.tex
Normal file
@@ -0,0 +1,107 @@
|
||||
\documentclass[实验报告模板]{subfiles}
|
||||
|
||||
\renewcommand{\mydate}{
|
||||
2023/10/20
|
||||
}
|
||||
\renewcommand{\mychapternum}{3}
|
||||
|
||||
\begin{document}
|
||||
\mytitle
|
||||
\begin{enumerate}
|
||||
\myitem{实验目的}{
|
||||
\item 使用第三章知识解决链表队列问题。
|
||||
}
|
||||
\myitem{实验内容}{
|
||||
\item 使用链队列模拟银行窗口业务。假设每位客户有 2 项信息:序号、金
|
||||
额。早上开张后,按随机时间有客户上门办理业务,假设携带的现金是
|
||||
1-20 万之间的随机数。来一位客户,就将其加入队列,等待办理业务。
|
||||
假设办理业务所需要消耗的时间和金额成正比(可设置一个系数),位
|
||||
于队头的客户办理完业务后,就从队列中移走。请编写程序动态模拟这
|
||||
个过程。
|
||||
\item (选做)在第一题的基础上,如果银行有多个窗口。
|
||||
\begin{enumerate}
|
||||
\item 客户过来时挑队列最短的排队,后面不会换队列。
|
||||
\item 如果排队过程中,出现相邻队列比自己所排队列短,则可以重新
|
||||
选择队列。
|
||||
\end{enumerate}
|
||||
}
|
||||
\myitem{实验原理}{
|
||||
\item 程序设计原理。
|
||||
}
|
||||
\myitem{实验步骤}{
|
||||
\item 问题抽象
|
||||
\item 编写程序
|
||||
\item 调试程序
|
||||
\item 完善总结
|
||||
}
|
||||
\myitem{调试过程、结果和分析}{
|
||||
\item C++采用面向对象的方式设计复杂程序时,要处理非常多的类型,因此可能会比较复杂;
|
||||
\item 传参数有引用传递、指针传递、值传递;
|
||||
\item 类的模板是静态多态,类的继承是动态多态;
|
||||
\item 子类对父类函数的重写、重载、覆盖;
|
||||
\item 私有、保护、公共、友元的成员访问权限;
|
||||
\item 比起Python和JavaScript,C++的各种类型、各种限制、各种访问权限非常复杂,由于初次调试这种复杂的程序,出现各种错误时也需要查资料解决,导致花费大约三天时间才完成这次作业;
|
||||
\item 但也许这就是C++这种强类型语言的特点,编写代码时需要对类型进行非常确定的定义(模板可能是例外),但这也保证了运行效率和安全性;
|
||||
\item 此次作业没有尝试使用异步、多线程、多进程等并发执行方式来提升执行效率并改善图形(命令行)界面体验,之后可以尝试加入;
|
||||
\item 也是初次使用cmake进行程序的构建、测试、打包,cmake用来管理这种多文件的复杂程序时确实比较方便。
|
||||
}
|
||||
\myitem{总结}{
|
||||
\item 对于这种较为复杂的程序,首先考虑它的架构,由于此程序需要使用到链队列的模型,而且还需要进行图形化或命令行的展示,因此考虑采用MVC架构,但又由于程序功能较少,因此不想使用多线程或异步的事件循环,因此尝试是否能在单线程同步的架构下实现MVC架构;
|
||||
\item 事实证明是可以在单线程同步的架构下实现MVC架构的,但是可能一些细节会有所更改,例如:
|
||||
\begin{enumerate}
|
||||
\item MVC中的Controller接受用户事件并通知Model,这种行为在没有事件循环的情况下采用了View直接调用Model来实现;
|
||||
\item Model通知View进行修改的行为,改为View直接依赖Model,之后更改View的时候只需调用View::refresh的方法,View就会从自己已经绑定的Model中获取数据并进行刷新。
|
||||
\end{enumerate}
|
||||
但是这样造成了View依赖Model,Controller依赖View和Model,也许可能不太符合MVC。
|
||||
\item 之后就需要考虑如何拆分各个模块,这里采用了面向对象的思想:
|
||||
\begin{enumerate}
|
||||
\item Model: 链队列的实现、客户对象;
|
||||
\item View: 背景界面、排队的显示、客户的显示、走路过程中的客户的显示;
|
||||
\item Controller:实现主循环,单个Controller绑定Model和View,调度Model和View的更新;
|
||||
\item MVC: 调用主循环,综合多个Controller,统一调度所有Controller的更新,之后所有View一起更新;
|
||||
\item main: 实现根据用户输入进行调整调用参数,是入口文件。
|
||||
\end{enumerate}
|
||||
每个文件中也有类之间的继承关系:
|
||||
\begin{enumerate}
|
||||
\item SingleQueueModel继承了Model;
|
||||
\item SimpleQueueView继承了QueueView,QueueView继承了View;
|
||||
\item SingleQueueController继承了Controller,DriftingController也继承了Controller。
|
||||
\end{enumerate}
|
||||
\item 虽然采用面向对象,总体是成功实现了,但各个模块之间的职责划分仍不是特别清晰,并且产生了很多依赖关系,因此仍需改进。
|
||||
\item 由于时间有限,暂未实现相邻队列换位的模拟。
|
||||
}
|
||||
\item \textbf{附件}\\
|
||||
运行时截图:\\
|
||||
\includegraphics[width=1\linewidth]{imgs/2023-10-29-10-52-02.png}
|
||||
\begin{enumerate}
|
||||
\item 单个队列\\
|
||||
\includegraphics[width=1\linewidth]{imgs/2023-10-29-10-38-47.png}
|
||||
\item 多个队列\\
|
||||
\includegraphics[width=1\linewidth]{imgs/2023-10-29-10-40-00.png}
|
||||
\item 自定义\\
|
||||
\includegraphics[width=1\linewidth]{imgs/2023-10-29-10-53-57.png}\\
|
||||
\vspace{1em}\\
|
||||
\includegraphics[width=1\linewidth]{imgs/2023-10-29-10-45-41.png}
|
||||
代码:\\
|
||||
\begin{enumerate}
|
||||
\itemsep 5em
|
||||
\item constants.h
|
||||
\inputminted[linenos=true,breaklines=true]{cpp}{../C++/第三章作业/include/constants.h}
|
||||
\item model.hpp
|
||||
\inputminted[linenos=true,breaklines=true]{cpp}{../C++/第三章作业/include/model.hpp}
|
||||
\item view.hpp
|
||||
\inputminted[linenos=true,breaklines=true]{cpp}{../C++/第三章作业/include/view.hpp}
|
||||
\item controller.hpp
|
||||
\inputminted[linenos=true,breaklines=true]{cpp}{../C++/第三章作业/include/controller.hpp}
|
||||
\item MVC.h
|
||||
\inputminted[linenos=true,breaklines=true]{cpp}{../C++/第三章作业/include/MVC.h}
|
||||
\item MVC.cpp
|
||||
\inputminted[linenos=true,breaklines=true]{cpp}{../C++/第三章作业/src/MVC.cpp}
|
||||
\item main.cpp
|
||||
\inputminted[linenos=true,breaklines=true]{cpp}{../C++/第三章作业/src/main.cpp}
|
||||
\item CMakeLists.txt
|
||||
\inputminted[linenos=true,breaklines=true]{cmake}{../C++/第三章作业/CMakeLists.txt}
|
||||
\end{enumerate}
|
||||
\end{enumerate}
|
||||
\end{enumerate}
|
||||
\end{document}
|
||||
56
数据结构/作业/10213903403第二章作业.tex
Normal file
56
数据结构/作业/10213903403第二章作业.tex
Normal file
@@ -0,0 +1,56 @@
|
||||
\documentclass[实验报告模板]{subfiles}
|
||||
|
||||
\renewcommand{\mydate}{
|
||||
2023/10/10
|
||||
}
|
||||
\renewcommand{\mychapternum}{2}
|
||||
|
||||
\begin{document}
|
||||
\mytitle
|
||||
\begin{enumerate}
|
||||
\myitem{实验目的}{
|
||||
\item 使用第二章知识解决约瑟夫环问题(复杂版)。
|
||||
}
|
||||
\myitem{实验内容}{
|
||||
\item 在原有约瑟夫环的基础上,输入参与这场游戏的人数 n 与自杀报数 m,
|
||||
输出为最后两个幸存者的位置序号。
|
||||
\item 在第一题的基础上,输入参与这场游戏的人数 n 与两个自杀报数 a 和
|
||||
b,按照一次 a 一次 b 的顺序自杀(a,b 可以为负数,正数代表正向,
|
||||
负数代表反向),输出为最后两个幸存者的位置序号。
|
||||
}
|
||||
\myitem{实验原理}{
|
||||
\item 程序设计原理。
|
||||
}
|
||||
\myitem{实验步骤}{
|
||||
\item 问题抽象
|
||||
\item 编写程序
|
||||
\item 调试程序
|
||||
\item 完善总结
|
||||
}
|
||||
\myitem{调试过程、结果和分析}{
|
||||
\item 简单考虑,暂时不考虑输入错误或者输入为0的情况;
|
||||
\item JavaScript没有指针的概念,所以使用对象的引用代替;
|
||||
\item JavaScript在严格模式下暂时无法直接删除对象,因此移除结点时无法完全销毁一个节点;
|
||||
\item 最后只留下两个,而不是$\min(\mathrm{abs}(a), \mathrm{abs}(b))-1$个;
|
||||
\item 删除的结点应该作为第0个,此时往前a个或往后b个,一开始如果a是正数那么应该按照$1, 2, 3, \ldots $的顺序遍历,如果a是负数那么应该按照$n, n-1, n-2, \ldots $的顺序遍历;
|
||||
\item 由于此问题中只涉及到初始化链表、删除单个结点两个操作,因此链表的添加结点、清空、销毁等操作暂不需要实现。
|
||||
}
|
||||
\myitem{总结}{
|
||||
\item 由于JavaScript的异步性质,需要进行连续多个输入时,可以将回调过程封装成Promise对象后,使用async创建异步函数,在其中使用await可以方便使用Promise对象,避免大量回调,同时也可以结合循环、分支等结构,实现更复杂的控制;
|
||||
\item 抽象出了结点对象和链表对象,并且实现了从当前节点开始寻找第n个结点(可以为负数)的方法;
|
||||
\item 整个文件中只有input和main\_函数与Node.js环境耦合,即使用了readline模块,而主要功能放在main函数中,因此在浏览器环境中可以直接调用main函数,方便代码复用。
|
||||
}
|
||||
\myitem{附件}{
|
||||
\itemsep 3em
|
||||
\item 在原有约瑟夫环的基础上,输入参与这场游戏的人数 n 与自杀报数 m,
|
||||
输出为最后两个幸存者的位置序号。\\
|
||||
(JavaScript,Node.js环境)
|
||||
\inputminted[linenos=true,breaklines=true]{javascript}{../JavaScript/第二章作业1.js}
|
||||
\item 在第一题的基础上,输入参与这场游戏的人数 n 与两个自杀报数 a 和
|
||||
b,按照一次 a 一次 b 的顺序自杀(a,b 可以为负数,正数代表正向,
|
||||
负数代表反向),输出为最后两个幸存者的位置序号。\\
|
||||
(JavaScript,Node.js环境)
|
||||
\inputminted[linenos=true,breaklines=true]{javascript}{../JavaScript/第二章作业2.js}
|
||||
}
|
||||
\end{enumerate}
|
||||
\end{document}
|
||||
89
数据结构/作业/10213903403第五章作业.tex
Normal file
89
数据结构/作业/10213903403第五章作业.tex
Normal file
@@ -0,0 +1,89 @@
|
||||
\documentclass[实验报告模板]{subfiles}
|
||||
|
||||
\renewcommand{\mydate}{
|
||||
2023/11/10
|
||||
}
|
||||
\renewcommand{\mychapternum}{5}
|
||||
|
||||
\begin{document}
|
||||
\mytitle
|
||||
\begin{enumerate}
|
||||
\myitem{实验目的}{
|
||||
\item 使用第五章的知识解决树的综合问
|
||||
题。
|
||||
}
|
||||
\myitem{实验内容}{
|
||||
\item 用顺序表或链表形式实现一棵树,树中节点存放 2 个内容:整数编号,
|
||||
和字符串的文本。每个节点的编号,是整棵树自上而下,自左而右依次
|
||||
编号的。构造这棵树的方式:一行代表 1 个节点对应的儿子节点,第 1
|
||||
个数据是编号,后续字符串以空白字符分隔,依次作为该节点的儿子,
|
||||
并自动编号。如果新录入的编号,在已有树中不存在,则发出错误提
|
||||
示;如果新录入节点后,对原有的编号有影响,则更新原有编号,使满
|
||||
足编号自上而下、自左而右依次编号的规则。假设树根为 0 号节点,一
|
||||
开始就存在。(注:允许在节点上,增加层次字段,比如,0 号节点的
|
||||
层次为 1;1 号节点“张三”的层次为 2)\\
|
||||
输入案例:\\
|
||||
0\ 张三\ 李四\ 王五\qquad
|
||||
:表示,3 个人都是 0 号节点的儿子\\
|
||||
2\ 师大\ 统计\ 计算机\qquad
|
||||
:表示,3 个院系是李四儿子\\
|
||||
0\ 赵六\qquad
|
||||
:表示,0 号节点下增加 1 个儿子,此时,
|
||||
2 号节点的儿子编号将需要更新
|
||||
\item 在第 1 题的基础上,将树转换成二叉树,遵循左孩子右兄弟的原则。
|
||||
}
|
||||
\myitem{实验原理}{
|
||||
\item 程序设计原理。
|
||||
}
|
||||
\myitem{实验步骤}{
|
||||
\item 问题抽象
|
||||
\item 编写程序
|
||||
\item 调试程序
|
||||
\item 完善总结
|
||||
}
|
||||
\myitem{调试过程、结果和分析}{
|
||||
\item VSCode调试很方便,但用了CLion后发现CLion调试的手感更好,仔细思考后发现可能原因之一是有时候CLion启动调试和重启调试更快,虽然可能只有一秒甚至不到一秒的时间,但在注意力高度集中找bug时不到一秒的间断也可能造成分心;
|
||||
\item 还有可能的原因是CLion的变量监视窗口可以步入步过时保持展开的层级;
|
||||
\item 而且CLion的自动补全更加完善,比如输入一个带参数的函数名会自动加好括号并将光标移动到括号内,输入一个无参数的函数名会自动加括号并将光标移动到括号右侧,删除左括号会自动删除相邻的右括号等等;
|
||||
}
|
||||
\myitem{总结}{
|
||||
\item 虽然C++的智能指针可以自动管理对象的生命周期,但也许在这种不需要长期维护,也不需要安全性的项目上使用原始指针更方便,只是要自己实现析构函数罢了;
|
||||
\item 为了简化代码便于从一个入口文件直接编译,直接使用了include cpp源文件的方法,可以从main.cpp入口直接编译;
|
||||
\item 将此题中的树转化成二叉树后,此题中的遍历方式不是先序中序后序层序中的任何一种,非常有创新点!
|
||||
\includegraphics[width=1em]{imgs/028E9BA6.pdf}
|
||||
受到广度优先搜索的启发,代码中采用了标准库中的队列实现,遍历每个节点时将它的左节点入队,每个节点出队时将它扩展到所有的右节点依次遍历;
|
||||
\item 虽然代码中也维护了线索化的标志域,不过好像没有用到线索化二叉树;
|
||||
\item 在命令行输出时要计算每个节点的宽度,防止子节点相互遮挡;
|
||||
\item 还能做的更好,但由于时间原因,就暂时这样了,以后可以完善一下,比如可以在命令行输出得更美观一些,使用多线程等。
|
||||
}
|
||||
\item \textbf{附件}
|
||||
|
||||
\textbf{说明:}
|
||||
\begin{enumerate}
|
||||
\item 由于多叉树实现的复杂度太高,此题直接使用二叉树完成。
|
||||
\item 为了便于阅读,使用CodeGeeX生成了部分代码的注释,注释不一定正确或有用,仅供参考。
|
||||
\end{enumerate}
|
||||
\textbf{运行时截图:}\\
|
||||
\includegraphics[width=1\linewidth]{imgs/2023-11-12-21-09-15.png}
|
||||
\includegraphics[width=1\linewidth]{imgs/2023-11-12-21-09-45.png}
|
||||
\includegraphics[width=1\linewidth]{imgs/2023-11-12-21-10-00.png}
|
||||
\includegraphics[width=1\linewidth]{imgs/2023-11-12-21-10-48.png}
|
||||
\includegraphics[width=1\linewidth]{imgs/2023-11-12-21-11-06.png}
|
||||
\includegraphics[width=1\linewidth]{imgs/2023-11-12-21-11-36.png}
|
||||
\includegraphics[width=1\linewidth]{imgs/2023-11-12-21-11-50.png}
|
||||
\includegraphics[width=1\linewidth]{imgs/2023-11-12-21-12-13.png}
|
||||
\includegraphics[width=1\linewidth]{imgs/2023-11-12-21-12-26.png}
|
||||
\textbf{代码:}
|
||||
\begin{enumerate}
|
||||
\itemsep 5em
|
||||
\item bitree.cpp
|
||||
\inputminted[linenos=true, breaklines=true]{cpp}{../C++/第五章作业/bitree.cpp}
|
||||
\item view.cpp
|
||||
\inputminted[linenos=true, breaklines=true]{cpp}{../C++/第五章作业/view.cpp}
|
||||
\item main.cpp
|
||||
\inputminted[linenos=true, breaklines=true]{cpp}{../C++/第五章作业/main.cpp}
|
||||
\item CMakeLists.txt
|
||||
\inputminted[linenos=true, breaklines=true]{cmake}{../C++/第五章作业/CMakeLists.txt}
|
||||
\end{enumerate}
|
||||
\end{enumerate}
|
||||
\end{document}
|
||||
63
数据结构/作业/10213903403第八章作业.tex
Normal file
63
数据结构/作业/10213903403第八章作业.tex
Normal file
@@ -0,0 +1,63 @@
|
||||
\documentclass[实验报告模板]{subfiles}
|
||||
|
||||
\renewcommand{\mydate}{
|
||||
2023/12/29
|
||||
}
|
||||
\renewcommand{\mychapternum}{8}
|
||||
|
||||
\begin{document}
|
||||
\mytitle
|
||||
\begin{enumerate}
|
||||
\myitem{实验目的}{
|
||||
\item 使用第八章的知识解决排序的综合
|
||||
问题。
|
||||
}
|
||||
\myitem{实验内容}{
|
||||
\item 给定一个序列,使用快速排序将其从小到大进行排列。
|
||||
\item 给定一个序列,构造一个大根堆。
|
||||
}
|
||||
\myitem{实验原理}{
|
||||
\item 程序设计原理。
|
||||
}
|
||||
\myitem{实验步骤}{
|
||||
\item 问题抽象
|
||||
\item 编写程序
|
||||
\item 调试程序
|
||||
\item 完善总结
|
||||
}
|
||||
\myitem{调试过程、结果和分析}{
|
||||
\item 两道题分别对应了快速排序和堆排序。
|
||||
\item 快速排序要注意好起点和终点的位置选取,作为比较标准的元素放在最前面,开始位置为数组的开始,开始元素为这个元素后面的一个元素,结束元素为数组末尾的元素。需要维护两个指针,分别从开始往后移动和从末尾往前移动,用来标记下一个要交换的位置。最后这两个指针交汇时的位置就是比较标准的元素需要放置的位置了。
|
||||
\item 堆排序要注意不同的操作,构造堆时从最后一个非叶子节点开始往前逐个下沉,当然也可以看做向一个空的堆中不断插入来完成构造;插入操作是先插入到末尾然后上浮;弹出操作是将堆顶的元素弹出,之后把末尾的元素放到对顶再下沉。
|
||||
\item 下沉操作比上浮操作更复杂一点,因为要比较父节点和左右两个子节点,把最大的子节点换上了,而上浮操作只需要和父节点比较就行。
|
||||
\item 快速排序的
|
||||
输入:\\
|
||||
20\\
|
||||
41 40 19 8 5 5 17 32 39 32 98 95 68 56 60 59 67 94 77 98
|
||||
|
||||
输出:\\
|
||||
5 5 8 17 19 32 32 39 40 41 56 59 60 67 68 77 94 95 98 98
|
||||
|
||||
\item 大根堆的
|
||||
输入:\\
|
||||
20\\
|
||||
41 40 19 8 5 5 17 32 39 32 98 95 68 56 60 59 67 94 77 98
|
||||
|
||||
输出:\\
|
||||
逐个插入后,逐个弹出输出的结果为:\\
|
||||
98 98 95 94 77 68 67 60 59 56 41 40 39 32 32 19 17 8 5 5\\
|
||||
一次性初始化后,逐个弹出输出的结果为:\\
|
||||
98 98 95 94 77 68 67 60 59 56 41 40 39 32 32 19 17 8 5 5
|
||||
}
|
||||
\myitem{总结}{
|
||||
\item 在大根堆排序时,如果不使用弹出,而是每次把堆顶的元素和堆末尾的元素交换,之后将堆的长度减一,这样操作完成后就会形成升序排列。如果每次把堆顶的元素弹出,并且输出,这样操作完成后就会形成降序排列。这里使用的是弹出方式。
|
||||
}
|
||||
\myitem{附件}{
|
||||
\itemsep 5em
|
||||
\item 第八章作业1.cpp
|
||||
\inputminted[]{cpp}{../C++/第八章作业/第八章作业1.cpp}
|
||||
\item 第八章作业2.cpp
|
||||
\inputminted[]{cpp}{../C++/第八章作业/第八章作业2.cpp}
|
||||
}
|
||||
\end{enumerate}
|
||||
\end{document}
|
||||
78
数据结构/作业/10213903403第六章作业.tex
Normal file
78
数据结构/作业/10213903403第六章作业.tex
Normal file
@@ -0,0 +1,78 @@
|
||||
\documentclass[实验报告模板]{subfiles}
|
||||
|
||||
\renewcommand{\mydate}{
|
||||
2023/11/24
|
||||
}
|
||||
\renewcommand{\mychapternum}{6}
|
||||
|
||||
\begin{document}
|
||||
\mytitle
|
||||
\begin{enumerate}
|
||||
\myitem{实验目的}{
|
||||
\item 使用第六章的知识解决图的综合问
|
||||
题。
|
||||
}
|
||||
\myitem{实验内容}{
|
||||
\item 某国有 n 个城市,他们之间没有路连通,因此交通十分不便,现决定修
|
||||
建公路,任务由各个城市共同完成。修建分为 n 轮,在每一轮,每个城
|
||||
市选择一个与它最近的城市,申请修往该城市的公路,政府负责审批这
|
||||
些申请决定是否同意修建。
|
||||
|
||||
政府审批规则如下:
|
||||
|
||||
I.如果两个城市申请修建同一条公路,则让后申请修建的城市重新选择
|
||||
未申请修建的公路。
|
||||
|
||||
II.如果三个或以上城市申请修建的公路成环,即 A 申请修建 AB,B 申
|
||||
请修建 BC,C 申请修建 CA,则政府将否决其中最短的一条公路的修建申
|
||||
请。
|
||||
|
||||
III.其他情况一律同意。
|
||||
|
||||
一轮修建后,若干城市将会直接或间接相连,连通的城市被看作一个
|
||||
league,下一轮修建中,league 被看作为一个城市。当所有的城市都连
|
||||
通时,则修建完毕。根据上述规则计算需要修建的公路的总长度。
|
||||
|
||||
\item 每个城市的规模大小是不同的(在初始需要赋值),在每个城市申请修
|
||||
建通往其他城市的道路时,需要查看城市规模系数$\alpha $,若规模小于目标
|
||||
城市,则政府拒绝修建,若两个城市规模相等,则修建过后两座城市形
|
||||
成的 league 城市规模系数$\alpha $增一,若大于目标城市,则同意修建,规
|
||||
模系数不变。当城市规模系数$\alpha $到达限定系数$\beta $后,我们认为该 league
|
||||
已经到达“稳定”,不再与任何其他城市修建公路。根据上述规则计算
|
||||
需要修建的公路的总长度。
|
||||
}
|
||||
\myitem{实验原理}{
|
||||
\item 程序设计原理。
|
||||
}
|
||||
\myitem{实验步骤}{
|
||||
\item 问题抽象
|
||||
\item 编写程序
|
||||
\item 调试程序
|
||||
\item 完善总结
|
||||
}
|
||||
\myitem{调试过程、结果和分析}{
|
||||
\item 子类继承父类的时候应该不需要手动调用父类的析构函数,因为编译器会自动调用;
|
||||
\item 调试带有随机性质的程序要先把随机数种子固定下来,调试完再用时间戳作为随机种子;
|
||||
\item 类的保护属性在类外能直接访问?
|
||||
}
|
||||
\myitem{总结}{
|
||||
\item 采用何种设计架构要综合考虑项目周期、系统复杂度、掌握熟练度等一系列因素,比如虽然这次的题可能有在时间复杂度或空间复杂度上更优的算法来解决,但是考虑到时间有限,还是使用了比较容易实现的思路;
|
||||
\item CLion的自动补全确实更加顺手,而且还能自动生成构造函数、析构函数等;
|
||||
\item 此次也没有进行非常复杂的对象设计,只实现了并查集的类、图的类、复杂图的类;
|
||||
\item 由于需要多次合并城市为一个联盟,所以使用了并查集;
|
||||
\item 做题之前可以先考虑是否可以简化问题,比如这次的题的第二条规则就是无效的;
|
||||
\item 输出的方式不一定要像图形界面,可以用文字表示,比如图可以用邻接矩阵、关系矩阵表示。
|
||||
}
|
||||
\myitem{附件}{
|
||||
\itemsep 5em
|
||||
\item graph.cpp
|
||||
\inputminted[linenos=true, breaklines=true]{cpp}{../C++/第六章作业/graph.hpp}
|
||||
\item 第六章作业1.cpp
|
||||
\inputminted[linenos=true, breaklines=true]{cpp}{../C++/第六章作业/第六章作业1.cpp}
|
||||
\item 第六章作业2.cpp
|
||||
\inputminted[linenos=true, breaklines=true]{cpp}{../C++/第六章作业/第六章作业2.cpp}
|
||||
\item CMakeLists.txt
|
||||
\inputminted[linenos=true, breaklines=true]{cmake}{../C++/第六章作业/CMakeLists.txt}
|
||||
}
|
||||
\end{enumerate}
|
||||
\end{document}
|
||||
65
数据结构/作业/10213903403第四章作业.tex
Normal file
65
数据结构/作业/10213903403第四章作业.tex
Normal file
@@ -0,0 +1,65 @@
|
||||
\documentclass[实验报告模板]{subfiles}
|
||||
|
||||
\renewcommand{\mydate}{
|
||||
2023/10/27
|
||||
}
|
||||
\renewcommand{\mychapternum}{4}
|
||||
|
||||
\begin{document}
|
||||
\mytitle
|
||||
\begin{enumerate}
|
||||
\myitem{实验目的}{
|
||||
\item 使用第四章知识解决数组和字符串
|
||||
的问题。
|
||||
}
|
||||
\myitem{实验内容}{
|
||||
\item 给你一个 m 行 n 列的矩阵 matrix,请按照顺时针螺旋顺序,返回矩
|
||||
阵中的所有元素。
|
||||
\item 给定一个字符串,输出所有长度至少为 2 的回文子串。回文子串即从左
|
||||
往右输出和从右往左输出结果是一样的字符串,比如:abba,
|
||||
cccdeedccc 都是回文字符串。
|
||||
}
|
||||
\myitem{实验原理}{
|
||||
\item 程序设计原理。
|
||||
}
|
||||
\myitem{实验步骤}{
|
||||
\item 问题抽象
|
||||
\item 编写程序
|
||||
\item 调试程序
|
||||
\item 完善总结
|
||||
}
|
||||
\myitem{调试过程、结果和分析}{
|
||||
\item Python的切片取反时要注意stop的参数可能会小于0,就变成负向索引了。例如正向切片时使用a[i:j + 1]可以取出[i,j + 1)区间,即[i,j]闭区间内的元素,但要是反向切片的话,因为切片的区间包含start但不包含stop,所以应该为(i - 1, j],也就是start为j,stop为i - 1,即a[j:i - 1:-1],但是如果i = 0的时候,正向切片是取出[0, j + 1)区间内的元素,但反向取就变成了(-1, j],而-1在切片中是负向索引,而每个元素的位置肯定小于等于最后一个元素所在的位置,因此不管j怎么取,最终的结果都是空的序列。因此最终的代码采用了先赋值再切片防止出现这样的情况。
|
||||
}
|
||||
\item \textbf{总结}
|
||||
\begin{enumerate}
|
||||
\itemsep 1.6em
|
||||
\item 在不考虑复杂度的情况下,Python实现功能真的特别方便;
|
||||
\item Python的and和or有短路规则,即:and连接的前后两个操作数,如果前一个操作数的逻辑取值为假,则会直接返回前一个操作数(注意是返回原操作数而不是False也不是0,这和C/C++中不一样);如果前一个操作数的逻辑取值为真,则会返回后一个操作数(注意也是返回原操作数)。同理,or连接的前后两个操作,如果前一个操作数的逻辑取值为真,则会返回前一个操作数;如果前一个操作数的逻辑取值为假,则会返回后一个操作数;
|
||||
\item 空列表、空字典、空元组、空集合、空字符串、0的逻辑取值为假;
|
||||
\item 列表可以直接使用加号拼接;
|
||||
\item 单个星号“*”表示按位置参数解包操作符,即把星号后面的操作数按顺序依次取出作为位置参数;
|
||||
\item zip函数的功能是依次把传递给它的每个位置参数同时取出一个元素并进行组合,(不好描述,建议看官方文档)可以理解为矩阵转置,以下是官方文档中的解释:\\
|
||||
\url{https://docs.python.org/zh-cn/3/library/functions.html#zip}
|
||||
\item 如果将二维列表看成是矩阵的话,zip函数和*操作符一起使用是真正的矩阵转置,之后[::-1]这样的切片操作表示将外层列表反向,一个二维矩阵转置再反向后就相当于这个二维矩阵逆时针旋转了90度;
|
||||
\item matrix[0]表示这个矩阵的第一行,matrix[1:]表示这个矩阵去掉第一行后的部分,所以将矩阵去掉第一行的部分逆时针旋转90度,再去掉第一行,再逆时针旋转90度,不断重复这样的操作就可以顺时针遍历矩阵中的元素;
|
||||
\item \_\_import\_\_可以导入模块并返回模块,sys.stdin是标准输入,sys.stdin.readlines()是读取标准输入并按行存储,之后使用列表解析式,对每一行line.split()表示按空白字符分割,之后返回的就是一个二维列表;
|
||||
\item “:=”是赋值表达式,会将表达式右端赋值给左端并返回表达式右端的值,相当于C/C++中的“=”;
|
||||
\item f"..."是格式化字符串字面值,参考官方文档:\\
|
||||
\url{https://docs.python.org/zh-cn/3/reference/lexical_analysis.html#formatted-string-literals}
|
||||
\item “\_”存储最后一次求值的结果,也可以用来命名无需使用的变量,参考官方文档:\\
|
||||
\url{https://docs.python.org/zh-cn/3/reference/lexical_analysis.html#reserved-classes-of-identifiers}\\
|
||||
这里使用是为了防止在Jupyter等交互式解释器中运行此段代码时Jupyter自动返回最后一次求值的结果。
|
||||
\end{enumerate}
|
||||
\myitem{附件}{
|
||||
\itemsep 5em
|
||||
\item 给你一个 m 行 n 列的矩阵 matrix,请按照顺时针螺旋顺序,返回矩
|
||||
阵中的所有元素。
|
||||
\inputminted[linenos=true, breaklines=true]{python3}{../Python/第四章作业4.1.py}
|
||||
\item 给定一个字符串,输出所有长度至少为 2 的回文子串。回文子串即从左
|
||||
往右输出和从右往左输出结果是一样的字符串,比如:abba,
|
||||
cccdeedccc 都是回文字符串。
|
||||
\inputminted[linenos=true, breaklines=true]{python3}{../Python/第四章作业4.2.py}
|
||||
}
|
||||
\end{enumerate}
|
||||
\end{document}
|
||||
75
数据结构/作业/mypreamble.tex
Normal file
75
数据结构/作业/mypreamble.tex
Normal file
@@ -0,0 +1,75 @@
|
||||
\usepackage[margin=1in]{geometry}
|
||||
\usepackage{longtable}
|
||||
\usepackage{booktabs}
|
||||
\usepackage{array}
|
||||
\usepackage{zhnumber} % change section number to chinese
|
||||
% \usepackage{enumerate}
|
||||
\usepackage{enumitem}
|
||||
\usepackage{titlesec}
|
||||
\usepackage{fancyhdr}
|
||||
\usepackage{graphicx}
|
||||
\usepackage{environ} % 加了这个再\def\myitem就不报错了
|
||||
\usepackage{hyperref}
|
||||
\usepackage{mylatex}
|
||||
% \usepackage{url}
|
||||
% \PassOptionsToPackage{hyphens}{url}
|
||||
% \usepackage{breakurl} // 这个包总是会报错,可能是和别的什么包冲突了,所以只能用传统的一大段文字的办法实现网址换行
|
||||
\usepackage[outputdir=./latex-output]{minted}
|
||||
\usepackage{subfiles}
|
||||
\usepackage{totpages} % 不加这个会导致总页数出错
|
||||
% \usepackage{pgfplots}
|
||||
% \pgfmathsetmacro{\totalpages}{\totalpages+1}
|
||||
% \setcounter{totalpages}{1}
|
||||
\pagestyle{fancyplain}
|
||||
\fancyhead{}
|
||||
\fancyhead[C]{华东师范大学计算机科学与技术学院上机实践报告}
|
||||
\fancyfoot[C]{第 \thepage 页\quad 共 \ref{TotPages} 页}
|
||||
\renewcommand\thesection{\zhnum{section}}
|
||||
\renewcommand \thesubsection {\arabic{subsection}}
|
||||
\setlist[1]{label=\zhnum{enumi}、}
|
||||
\setlist[2]{labelindent=-1em, leftmargin=*, label=\arabic{enumii}.\quad}
|
||||
\setlist[3]{labelindent=1em, leftmargin=*, label=(\arabic{enumiii})}
|
||||
\setminted{linenos=true, breaklines=true}
|
||||
|
||||
\newcommand{\mydate}{
|
||||
2023/09/23
|
||||
}
|
||||
|
||||
\newcommand{\mychapternum}{
|
||||
1
|
||||
}
|
||||
|
||||
\newcommand{\mytitle}{
|
||||
\title{\fontsize{15}{0}华东师范大学计算机科学与技术学院上机实践报告\vspace{-2em}}
|
||||
\date{}
|
||||
\maketitle
|
||||
|
||||
\begin{longtable}[]{lll}
|
||||
\toprule\noalign{}
|
||||
\endhead
|
||||
\bottomrule\noalign{}
|
||||
\endlastfoot
|
||||
\textbf{课程名称}:数据结构 & \textbf{年级}:2022级 &
|
||||
\textbf{上机实践成绩}: \\
|
||||
\textbf{指导教师}:金健 & \textbf{姓名}:岳锦鹏 &
|
||||
\textbf{上机实践时间}:2学时 \\
|
||||
\textbf{上机实践名称}:第\zhnumber{\mychapternum}章作业 & \textbf{学号}:10213903403 &
|
||||
\textbf{上机实践日期}:\mydate \\
|
||||
\end{longtable}
|
||||
}
|
||||
|
||||
% \def\myitem#1#2{
|
||||
% \item \textbf{#1}
|
||||
% \begin{enumerate}
|
||||
% #2
|
||||
% \end{enumerate}
|
||||
% }
|
||||
|
||||
% https://blog.csdn.net/u010801696/article/details/79477226
|
||||
\def\UrlBreaks{\do\A\do\B\do\C\do\D\do\E\do\F\do\G\do\H\do\I\do\J
|
||||
\do\K\do\L\do\M\do\N\do\O\do\P\do\Q\do\R\do\S\do\T\do\U\do\V
|
||||
\do\W\do\X\do\Y\do\Z\do\[\do\\\do\]\do\^\do\_\do\`\do\a\do\b
|
||||
\do\c\do\d\do\e\do\f\do\g\do\h\do\i\do\j\do\k\do\l\do\m\do\n
|
||||
\do\o\do\p\do\q\do\r\do\s\do\t\do\u\do\v\do\w\do\x\do\y\do\z
|
||||
\do\.\do\@\do\\\do\/\do\!\do\_\do\|\do\;\do\>\do\]\do\)\do\,
|
||||
\do\?\do\'\do+\do\=\do\#}
|
||||
14
数据结构/作业/使用示例.tex
Normal file
14
数据结构/作业/使用示例.tex
Normal file
@@ -0,0 +1,14 @@
|
||||
\documentclass[实验报告模板]{subfiles}
|
||||
|
||||
\renewcommand{\mydate}{
|
||||
2023/09/25
|
||||
}
|
||||
|
||||
\begin{document}
|
||||
\mytitle
|
||||
\begin{enumerate}
|
||||
\myitem{列表标题}{
|
||||
\item 列表内容
|
||||
}
|
||||
\end{enumerate}
|
||||
\end{document}
|
||||
87
数据结构/作业/实验报告模板.tex
Normal file
87
数据结构/作业/实验报告模板.tex
Normal file
@@ -0,0 +1,87 @@
|
||||
\documentclass[a4paper]{ctexart}
|
||||
\input{mypreamble}
|
||||
|
||||
\begin{document}
|
||||
|
||||
\title{\fontsize{15}{0}华东师范大学计算机科学与技术学院上机实践报告\vspace{-2em}}
|
||||
\date{}
|
||||
\maketitle
|
||||
|
||||
\begin{longtable}[]{lll}
|
||||
\toprule\noalign{}
|
||||
\endhead
|
||||
\bottomrule\noalign{}
|
||||
\endlastfoot
|
||||
\textbf{课程名称}:数据结构 & \textbf{年级}:2022级 &
|
||||
\textbf{上机实践成绩}: \\
|
||||
\textbf{指导教师}:金健 & \textbf{姓名}:金小健 &
|
||||
\textbf{上机实践时间}:2学时 \\
|
||||
\textbf{上机实践名称}:第一章作业 & \textbf{学号}:xxxxxxxxxx &
|
||||
\textbf{上机实践日期}:2023/09/23 \\
|
||||
\end{longtable}
|
||||
|
||||
\begin{enumerate}
|
||||
\item \textbf{实验目的}
|
||||
|
||||
\begin{enumerate}
|
||||
\item
|
||||
从第1条起填写基本目的。
|
||||
\end{enumerate}
|
||||
\item \textbf{实验内容}
|
||||
|
||||
\begin{enumerate}
|
||||
\item
|
||||
结合实验目的填写。
|
||||
\item
|
||||
在预习时,对程序或过程中出现的问题,都写在这里,以便真正上机实践时有针对性的查找答案,并填充相应的实验步骤、过程、结果和分析,以及总结。
|
||||
\end{enumerate}
|
||||
\item \textbf{实验原理}
|
||||
|
||||
\begin{enumerate}
|
||||
\item
|
||||
参考实验教材
|
||||
\end{enumerate}
|
||||
\item \textbf{实验步骤}
|
||||
|
||||
\begin{enumerate}
|
||||
\item
|
||||
参考实验教材
|
||||
\end{enumerate}
|
||||
\item \textbf{调试}\textbf{过程、结果和分析}
|
||||
|
||||
\begin{enumerate}
|
||||
\item
|
||||
参考教材,结合自己实际,对调试过程进行记录和分析。
|
||||
\end{enumerate}
|
||||
\item \textbf{总结}
|
||||
|
||||
\begin{enumerate}
|
||||
\item
|
||||
预习时提出的问题有没有解决,实验目的有没有达到
|
||||
\item
|
||||
如果实现了,作一下评价
|
||||
\item
|
||||
如果未实现,总结一下原因(并不一定每次都必定要完全实现预定目标的,只要原因分析得恰当,同样是好的)
|
||||
\item
|
||||
有没有新的疑问或想法
|
||||
\end{enumerate}
|
||||
\item \textbf{附件}
|
||||
|
||||
\begin{enumerate}
|
||||
\item
|
||||
程序代码。
|
||||
\end{enumerate}
|
||||
\end{enumerate}
|
||||
|
||||
|
||||
\noindent \textbf{说明:}
|
||||
|
||||
文件命名格式:学号+第一章作业.doc
|
||||
|
||||
\noindent 例如:
|
||||
|
||||
52051201004第一章作业.doc
|
||||
|
||||
52051201004第二章作业.doc
|
||||
|
||||
\end{document}
|
||||
Reference in New Issue
Block a user