diff --git "a/2020302111398-\346\261\252\345\256\266\344\274\237-\347\254\254\344\270\203\345\221\250\350\257\276\345\220\216\344\275\234\344\270\232/2020302111398-\346\261\252\345\256\266\344\274\237-\347\254\254\344\270\203\345\221\250\350\257\276\345\220\216\344\275\234\344\270\232.md" "b/2020302111398-\346\261\252\345\256\266\344\274\237-\347\254\254\344\270\203\345\221\250\350\257\276\345\220\216\344\275\234\344\270\232/2020302111398-\346\261\252\345\256\266\344\274\237-\347\254\254\344\270\203\345\221\250\350\257\276\345\220\216\344\275\234\344\270\232.md"
new file mode 100644
index 0000000000000000000000000000000000000000..3f30734525077a61ed4fa77b906c66a0d3ffbd89
--- /dev/null
+++ "b/2020302111398-\346\261\252\345\256\266\344\274\237-\347\254\254\344\270\203\345\221\250\350\257\276\345\220\216\344\275\234\344\270\232/2020302111398-\346\261\252\345\256\266\344\274\237-\347\254\254\344\270\203\345\221\250\350\257\276\345\220\216\344\275\234\344\270\232.md"
@@ -0,0 +1,55 @@
+# MVVM的基本思想
+## MVVM的概念
+MVVM模式全称是模型-视图-视图模型(Mod el-View-ViewModel),MVVM是为绑定而设计的一种模式。在MVVM中,有Model,View,和ViewModel三个组成部分:View就是用户看到的界面;Model是我们的数据,而ViewModel就负责将Model中的数据展示在页面上,同时将View上的改变同步回Model中,ViewModel是MVVM的核心,它通过DataBinding实现View与Model之间的双向绑定,其内容包括数据状态处理、数据绑定及数据转换。例如,View中某处的状态和Model中某部分数据绑定在一起,这部分数据一旦变更将会反映到View层。而这个机制通过ViewModel来实现。ViewModel,即视图模型,是一个专门用于数据转换的控制器,它可以把对象信息转换为视图信息,将命令从视图携带到对象。它通过View发布对象的公共数据,同时向视图提供数据和方法。View和ViewModel之间使用DataBinding及其事件进行通信。View的用户接口事件仍然由View自身处理,并把相关事件映射到ViewModel,以实现View中的对象与视图模型内容的同步,且可通过双向数据绑定进行更新。因此,程序员只需编写包含声明绑定的视图模板,以及ViewModel中的数据变更逻辑,就能使View获得响应式的更新。
+
+## MVVM的流程
+在 MVVM 流程(如图 3 所示)中,View 仍然代表前端的界面,Model 仍然代表后端传递的数据,而 ViewModel 作为核心有着两个传递方向:
+1. 将 Model 转换成 View,即将后端传递的数据转换成用户界面,实现方式为数据绑定;
+2. 将 View 转换成 Model,即将用户界面转换成后端数据,实现方式为 DOM 事件监听。
+
+## MVVM的应用场景
+在 MVVM 模式下 View 和 Model 不能直接通信,两者的通信只能通过 ViewModel 来实现。ViewModel 通常要实现一个观察者,当数据发生变化,ViewModel 能够监听到数据的变化,然后通知对应的视图做自动更新;而当用户操作视图,ViewModel 也能监听到视图的变化,再通知数据做改动,从而形成数据的双向绑定。这使得 MVVM 更适用于数据驱动的场景,尤其是数据操作特别频繁的场景。但也正是由于数据和视图的双向绑定,导致出现问题时不太好定位来源,有可能由数据问题导致、也有可能由业务逻辑中对视图属性的修改导致。
+
+## MVVM的优点
+1. 低耦合。视图(View)可以独立于Model变化和修改,一个ViewModel可以绑定到不同的"View"上,当View变化的时候Model可以不变,当Model变化的时候View也可以不变。
+2. 可重用性。你可以把一些视图逻辑放在一个ViewModel里面,让很多view重用这段视图逻辑。
+3. 独立开发。开发人员可以专注于业务逻辑和数据的开发(ViewModel),设计人员可以专注于页面设计,使用Expression Blend可以很容易设计界面并生成xaml代码。
+4. 可测试。界面素来是比较难于测试的,测试可以针对ViewModel来写。
+
+## MVVM的缺点
+1. 代码量增加:与MVC等相比,由于MVVM要实现一系列的数据绑定,所以代码量会增加不少。
+2. 内存占用量大:一个大的Model里面也一定会存储着比较多的数据,所以会使用更多的内存。
+
+# 熟悉WPF窗体应用程序创建流程
+## WPF基本概念
+WPF的核心是一个与分辨率无关且基于矢量的呈现引擎,旨在充分利用现代图形硬件。WPF通过一套完善的应用程序开发功能对该核心进行了扩展,这些功能包括可扩展应用程序标记语言 (XAML)、控件、数据绑定、布局、二维和三维图形、动画、样式、模板、文档、媒体、文本和版式。 WPF 属于 .NET,因此可以生成整合 .NET API 其他元素的应用程序。
+
+## WPF程序创建流程
+选择所需要的WPF程序,就可以创建一个WPF窗体程序,在工具箱中选择我们需要的控件。可以直接从工具箱选择需要的控件,拖到MainWindow中使用。
+![选择WPF](WPF%E7%A8%8B%E5%BA%8F%E5%88%9B%E5%BB%BA%E6%B5%81%E7%A8%8B%E5%9B%BE/%E5%88%9B%E5%BB%BAWPF%E7%AA%97%E4%BD%93%E7%A8%8B%E5%BA%8F.png)
+1. Button:按钮控件,可以添加文字,后台会生成点击按钮的Click事件。
+2. Label:在Label控件使用时,一般给予用户提示。Label控件的值不是text而是content。
+3. Textbox:TextBox是支持编辑的基本控件。
+4. Listbox:ListBox是列表级控件,是项目中比较常用的,该控件通过重写控件等方式,对项目中使用了特效方面特别有帮助。
+5. DataGrid:DataGrid 控件看起来很像 ListView,但它提供了许多附加功能。例如,DataGrid可以根据您提供给它的数据自动生成列。默认情况下,DataGrid也是可编辑的,允许最终用户更改基础数据源的值。
+6. ComboBox:ComboBox与ListBox基本上差别不大,比较相似。
+效果图如下
+![效果图](WPF%E7%A8%8B%E5%BA%8F%E5%88%9B%E5%BB%BA%E6%B5%81%E7%A8%8B%E5%9B%BE/%E6%95%88%E6%9E%9C%E5%9B%BE.png)
+![效果图1](WPF%E7%A8%8B%E5%BA%8F%E5%88%9B%E5%BB%BA%E6%B5%81%E7%A8%8B%E5%9B%BE/%E6%95%88%E6%9E%9C%E5%9B%BE1.png)
+# lab1实验准备
+安装VS2022专业版,Windows11专业版,Office专业版以及git等等软件,提前创建好gitee仓库。预计好完成实验的时间,并在实验完成后及时撰写实验报告。
+# 选做
+## 安装Anaconda
+![anaconda](%E9%80%89%E5%81%9A/anaconda.jpg)
+安装完anaconda之后,进行pytorch的安装
+## 安装pytorch
+进入Python环境之后,进入PyTorch官网,选择相关参数,获取PyTorch安装指令。
+## 安装gym
+管理员运行进入anaconda
+git clone https://github.com/openai/gym.git
+进入下载好的 gym 文件夹
+激活环境
+conda activate env_pytorch
+pip install gym
+conda install swig
+pip install gym[Box2d]
\ No newline at end of file
diff --git "a/2020302111398-\346\261\252\345\256\266\344\274\237-\347\254\254\344\270\203\345\221\250\350\257\276\345\220\216\344\275\234\344\270\232/WPF\347\250\213\345\272\217\345\210\233\345\273\272\346\265\201\347\250\213\345\233\276/\345\210\233\345\273\272WPF\347\252\227\344\275\223\347\250\213\345\272\217.png" "b/2020302111398-\346\261\252\345\256\266\344\274\237-\347\254\254\344\270\203\345\221\250\350\257\276\345\220\216\344\275\234\344\270\232/WPF\347\250\213\345\272\217\345\210\233\345\273\272\346\265\201\347\250\213\345\233\276/\345\210\233\345\273\272WPF\347\252\227\344\275\223\347\250\213\345\272\217.png"
new file mode 100644
index 0000000000000000000000000000000000000000..93cf732bd0b0a2bd1bc680cfe3215327d7722f42
Binary files /dev/null and "b/2020302111398-\346\261\252\345\256\266\344\274\237-\347\254\254\344\270\203\345\221\250\350\257\276\345\220\216\344\275\234\344\270\232/WPF\347\250\213\345\272\217\345\210\233\345\273\272\346\265\201\347\250\213\345\233\276/\345\210\233\345\273\272WPF\347\252\227\344\275\223\347\250\213\345\272\217.png" differ
diff --git "a/2020302111398-\346\261\252\345\256\266\344\274\237-\347\254\254\344\270\203\345\221\250\350\257\276\345\220\216\344\275\234\344\270\232/WPF\347\250\213\345\272\217\345\210\233\345\273\272\346\265\201\347\250\213\345\233\276/\346\225\210\346\236\234\345\233\276.png" "b/2020302111398-\346\261\252\345\256\266\344\274\237-\347\254\254\344\270\203\345\221\250\350\257\276\345\220\216\344\275\234\344\270\232/WPF\347\250\213\345\272\217\345\210\233\345\273\272\346\265\201\347\250\213\345\233\276/\346\225\210\346\236\234\345\233\276.png"
new file mode 100644
index 0000000000000000000000000000000000000000..e4d2187b5232a5893b25102ca3c0e1e04e84dc2d
Binary files /dev/null and "b/2020302111398-\346\261\252\345\256\266\344\274\237-\347\254\254\344\270\203\345\221\250\350\257\276\345\220\216\344\275\234\344\270\232/WPF\347\250\213\345\272\217\345\210\233\345\273\272\346\265\201\347\250\213\345\233\276/\346\225\210\346\236\234\345\233\276.png" differ
diff --git "a/2020302111398-\346\261\252\345\256\266\344\274\237-\347\254\254\344\270\203\345\221\250\350\257\276\345\220\216\344\275\234\344\270\232/WPF\347\250\213\345\272\217\345\210\233\345\273\272\346\265\201\347\250\213\345\233\276/\346\225\210\346\236\234\345\233\2761.png" "b/2020302111398-\346\261\252\345\256\266\344\274\237-\347\254\254\344\270\203\345\221\250\350\257\276\345\220\216\344\275\234\344\270\232/WPF\347\250\213\345\272\217\345\210\233\345\273\272\346\265\201\347\250\213\345\233\276/\346\225\210\346\236\234\345\233\2761.png"
new file mode 100644
index 0000000000000000000000000000000000000000..a7b074d770c4b2ad234f3ba83e4ec46fc0792670
Binary files /dev/null and "b/2020302111398-\346\261\252\345\256\266\344\274\237-\347\254\254\344\270\203\345\221\250\350\257\276\345\220\216\344\275\234\344\270\232/WPF\347\250\213\345\272\217\345\210\233\345\273\272\346\265\201\347\250\213\345\233\276/\346\225\210\346\236\234\345\233\2761.png" differ
diff --git "a/2020302111398-\346\261\252\345\256\266\344\274\237-\347\254\254\344\270\203\345\221\250\350\257\276\345\220\216\344\275\234\344\270\232/\351\200\211\345\201\232/anaconda.jpg" "b/2020302111398-\346\261\252\345\256\266\344\274\237-\347\254\254\344\270\203\345\221\250\350\257\276\345\220\216\344\275\234\344\270\232/\351\200\211\345\201\232/anaconda.jpg"
new file mode 100644
index 0000000000000000000000000000000000000000..b9c81dc3cb51ff0ad99e8185dcc890dd8fe1a4d8
Binary files /dev/null and "b/2020302111398-\346\261\252\345\256\266\344\274\237-\347\254\254\344\270\203\345\221\250\350\257\276\345\220\216\344\275\234\344\270\232/\351\200\211\345\201\232/anaconda.jpg" differ
diff --git "a/2020302111398-\346\261\252\345\256\266\344\274\237-\347\254\254\345\205\253\345\221\250\344\275\234\344\270\232&\350\257\276\345\240\202\344\272\222\345\212\250\357\274\210\347\277\273\350\257\221\357\274\211/lab_2_7.md" "b/2020302111398-\346\261\252\345\256\266\344\274\237-\347\254\254\345\205\253\345\221\250\344\275\234\344\270\232&\350\257\276\345\240\202\344\272\222\345\212\250\357\274\210\347\277\273\350\257\221\357\274\211/lab_2_7.md"
new file mode 100644
index 0000000000000000000000000000000000000000..b36b8dc9d4b4b062e533d021bdc90af3bf76b2b4
--- /dev/null
+++ "b/2020302111398-\346\261\252\345\256\266\344\274\237-\347\254\254\345\205\253\345\221\250\344\275\234\344\270\232&\350\257\276\345\240\202\344\272\222\345\212\250\357\274\210\347\277\273\350\257\221\357\274\211/lab_2_7.md"
@@ -0,0 +1,63 @@
+# 2-7翻译
+## 注册表结构和注册表值类型
+* https://docs.microsoft.com/en-us/windows/win32/api/winreg/ns-winreg-valenta
+* https://docs.microsoft.com/en-us/windows/win32/sysinfo/registry-value-types
+* https://docs.microsoft.com/en-us/windows/win32/sysinfo/registry-value-types
+### 一、注册表结构
+包含关于一个注册表值的信息。列表中的 RegQueryMultipleValues 函数使用此结构。
+```
+typedef struct value_entW {
+ LPWSTR ve_valuename;
+ DWORD ve_valuelen;
+ DWORD_PTR ve_valueptr;
+ DWORD ve_type;
+} VALENTW, *PVALENTW;
+```
+**ve_valuename**
+
+要检索的值的名称。请确保在调用RegQueryMultipleValues之前设置此成员 然后再调用RegQueryMultipleValues。
+
+**ve_valuelen**
+
+数据的大小被ve_valueptr指向(ve_valueptr指向的数据的大小),以字节为单位
+
+**ve_valueptr**
+
+一个指向值输入数据的指针。这是一个指针,指向 在lpValueBuf缓冲区中返回的值的数据的指针,由 RegQueryMultipleValues填写的缓冲区中的值的指针。
+
+**ve_type**
+
+ve_valueptr所指向的数据类型。关于可能的类型列表 可能的类型,请看注册表值类型。
+
+### 二、注册表值的类型
+下面的例子是遍历一个REG_MULTI_SZ字符串。
+```
+#include
+#include
+#include
+
+void SampleSzz(PTSTR pszz)
+{
+ _tprintf(_TEXT("\tBegin multi-sz string\n"));
+ while (*pszz)
+ {
+ _tprintf(_TEXT("\t\t%s\n"), pszz);
+ pszz = pszz + _tcslen(pszz) + 1;
+ }
+ _tprintf(_TEXT("\tEnd multi-sz\n"));
+}
+
+int __cdecl main(int argc, char **argv)
+{
+ // Because the compiler adds a \0 at the end of quoted strings,
+ // there are two \0 terminators at the end.
+
+ _tprintf(_TEXT("Conventional multi-sz string:\n"));
+ SampleSzz(_TEXT("String1\0String2\0String3\0LastString\0"));
+
+ _tprintf(_TEXT("\nTest case with no strings:\n"));
+ SampleSzz(_TEXT(""));
+
+ return 0;
+}
+```
\ No newline at end of file
diff --git "a/2020302111398-\346\261\252\345\256\266\344\274\237-\347\254\254\345\205\253\345\221\250\344\275\234\344\270\232&\350\257\276\345\240\202\344\272\222\345\212\250\357\274\210\347\277\273\350\257\221\357\274\211/lab_2_8.md" "b/2020302111398-\346\261\252\345\256\266\344\274\237-\347\254\254\345\205\253\345\221\250\344\275\234\344\270\232&\350\257\276\345\240\202\344\272\222\345\212\250\357\274\210\347\277\273\350\257\221\357\274\211/lab_2_8.md"
new file mode 100644
index 0000000000000000000000000000000000000000..b4145823a24ae4b56cf78b3d71d831cad919498a
--- /dev/null
+++ "b/2020302111398-\346\261\252\345\256\266\344\274\237-\347\254\254\345\205\253\345\221\250\344\275\234\344\270\232&\350\257\276\345\240\202\344\272\222\345\212\250\357\274\210\347\277\273\350\257\221\357\274\211/lab_2_8.md"
@@ -0,0 +1,117 @@
+# 2-8翻译
+## 枚举注册表子键
+* https://docs.microsoft.com/en-us/windows/win32/sysinfo/enumerating-registry-subkeys
+
+此实验示例使用RegQueryInfoKey、RegEnumKeyEx和RegEnumValue函数枚举指定键的子键。传递给每个函数的hKey参数是打开键的句柄。此键必须在函数调用之前打开,然后关闭。
+```
+// QueryKey - 枚举键的子键及其相关值。
+// hKey - 要列举其子键和值的键。
+
+#include
+#include
+#include
+
+#define MAX_KEY_LENGTH 255
+#define MAX_VALUE_NAME 16383
+
+void QueryKey(HKEY hKey)
+{
+ TCHAR achKey[MAX_KEY_LENGTH]; // 子键名称的缓冲区
+ DWORD cbName; // 名称字符串的大小
+ TCHAR achClass[MAX_PATH] = TEXT(""); // 类名的缓冲区
+ DWORD cchClassName = MAX_PATH; // 类字符串的大小
+ DWORD cSubKeys=0; // 子密钥的数量
+ DWORD cbMaxSubKey; // 最大的子键尺寸
+ DWORD cchMaxClass; // 最长级别的字符串
+ DWORD cValues; // 键值的数量
+ DWORD cchMaxValue; // 最长的值名称
+ DWORD cbMaxValueData; // 最长值数据
+ DWORD cbSecurityDescriptor; // 安全描述符的大小
+ FILETIME ftLastWriteTime; // 最后写入时间
+
+ DWORD i, retCode;
+
+ TCHAR achValue[MAX_VALUE_NAME];
+ DWORD cchValue = MAX_VALUE_NAME;
+
+ // 获取类的名称和值的数量。
+ retCode = RegQueryInfoKey(
+ hKey, // 钥匙柄
+ achClass, // 类名的缓冲区
+ &cchClassName, // 类字符串的大小
+ NULL, // 保留
+ &cSubKeys, // 子密钥的数量
+ &cbMaxSubKey, // 最长的子键尺寸
+ &cchMaxClass, // 最长级别的字符串
+ &cValues, // 这个键的值的数量
+ &cchMaxValue, // 最长的值名称
+ &cbMaxValueData, // 最长值数据
+ &cbSecurityDescriptor, //安全描述符
+ &ftLastWriteTime); // 最后写作时间
+
+ //枚举子键,直到RegEnumKeyEx失败。
+
+ if (cSubKeys)
+ {
+ printf( "\nNumber of subkeys: %d\n", cSubKeys);
+
+ for (i=0; i