diff --git a/Homework_wangrunqi/.keep b/Homework_wangrunqi/.keep new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git "a/Homework_wangrunqi/Week7homeWork/2020302111087-\347\216\213\346\266\246\347\220\246-homeworkWeek7.md" "b/Homework_wangrunqi/Week7homeWork/2020302111087-\347\216\213\346\266\246\347\220\246-homeworkWeek7.md" new file mode 100644 index 0000000000000000000000000000000000000000..4b8e13b4fed8fa1ba2fdaf50a38338beb534e93e --- /dev/null +++ "b/Homework_wangrunqi/Week7homeWork/2020302111087-\347\216\213\346\266\246\347\220\246-homeworkWeek7.md" @@ -0,0 +1,459 @@ + +### 第七周作业 +### 熟悉MVVM的基本思想 + + +#### **一、MVVM的基本思想** + + + +MVVM(Model-View-ViewModel)框架的由来是MVP(Model-View-Presenter)模式与WPF结合的应用方式时发展演变过来的一种新型架构框架。 + +MVVM,是Model-View-ViewModel的简写,由M-V-VM三部分组成。从字面上理解MVVM,M指的是model数据模型,就是vue实例中data里的数据;V就是view视图,就是所写的模版,本质上来说就是DOM元素;最后的两个字母VM就是上面两者的结合View-Model,它所扮演的角色就是一些控制逻辑。model模型是提供数据的,view视图是提供页面展示效果的,VM是实现控制逻辑把两者结合在一起。它本质上就是MVC 的改进版。MVVM 就是将其中的View 的状态和行为抽象化,其中ViewModel将视图 UI 和业务逻辑分开,它可以取出 Model 的数据同时帮忙处理 View 中由于需要展示内容而涉及的业务逻辑。 + +MVVM主要目的是分离视图(View)和模型(Model)。采用双向数据绑定,view中数据变化将自动反映到viewmodel上,反之,model中数据变化也将会自动展示在页面上。把Model和View关联起来的就是ViewModel。ViewModel负责把Model的数据同步到View显示出来,还负责把View的修改同步回Model。 + +MVVM是Vue框架非常核心的设计思想,最重要的理念其实就是分而治之,就是把不同的功能代码放到不同的模块里边,然后通过特定的方式让它们之间建立起关联,从而达到不同部分不会彼此影响的效果。比如关注model的变化,让MVVM框架利用自己的机制自动更新DOM,也就是所谓的数据-视图分离,数据不会影响视图。 + +![输入图片说明](MVVP.png) + + +#### **二、MVVM的优点** + + + + + +1. 基于MVP的改良,含有MVP的优点。增加了双向绑定(data-binding)等操作,使数据推送/更新等操作更自动化 + +1. 分离视图(View)和模型( Model ),降低代码耦合: 比如视图(View)可以独立于 Model变化和修改,⼀个 ViewModel 可以绑定不同的 "View" 上,当 View 变化的时候 Model 不可以不变,当 Model 变化 的时候View 也可以不变。 + +1. 可重用性:你可以把一些视图逻辑放在一个ViewModel里面,让很多view重用这段视图逻辑。 + +1. 提高可测试性 : ViewModel 的存在可以帮助开发者更好地编写测试代码,测试可以针对ViewModel来写。 + +1. 独立开发:对于不同岗位的成员来收,开发人员可以专注于业务逻辑和数据的开发(ViewModel),设计人员可以专注于页面设计,使用Expression Blend可以很容易设计界面并生成xml代码。 + + +#### **三、MVVM的不足** + + + + +1. 非常依赖语言的特性和使用的环境(WPF),对一些动态语言如Lua不是很友好。 + +1. 数据绑定使得 Bug 很难被调试。看到界面异常了,有可能是你 View 的代码有 Bug,也可能是 Model 的代码有问题。数据绑定使得一个位置的 Bug 被快速传递到别的位置,要定位原始出问题的地方就变得不那么容易了。另外,数据绑定的声明是指令式地写在View 的模版当中的,这些内容是没办法去打断点 debug 的。 + +1. 一个大的模块中,model也会很大,虽然使用方便了也很容易保证了数据的一致性,当长期持有,不释放内存,就造成了花费更多的内存。 + +1. 对于大型的图形应用程序,视图状态较多, ViewModel 的构建和维护的成本都会比较高。 + + +#### **四、MVVM的组成部分** + + + +一般来说,MVVM的组成包括四部分:模型,视图,视图模型,绑定器。 + +##### 模型 + + + +模型是指代表真实状态内容的领域模型(面向对象),或指代表内容的数据访问层(以数据为中心)。 + +##### 视图 + + +视图是用户在屏幕上看到的结构、布局和外观(UI)。 + +##### 视图模型 + + +视图模型是暴露公共属性和命令的视图的抽象。MVVM没有MVC模式的控制器,也没有MVP模式的presenter,有的是一个绑定器。在视图模型中,绑定器在视图和数据绑定器之间进行通信。 + +##### 绑定器 + + +绑定器声明性数据和命令绑定隐含在MVVM模式中。在Microsoft解决方案堆中,绑定器是一种名为XAML的标记语言。绑定器使开发人员免于被迫编写样板式逻辑来同步视图模型和视图。在微软的堆之外实现时,声明性数据绑定技术的出现是实现该模式的一个关键因素。 + + + +#### **五、MVVM的理论基础** + + + +MVVM旨在利用WPF中的数据绑定函数,通过从视图层中几乎删除所有GUI代码(代码隐藏),更好地促进视图层开发与模式其余部分的分离。不需要用户体验(UX)开发人员编写GUI代码,他们可以使用框架标记语言(如XAML),并创建到应用程序开发人员编写和维护的视图模型的数据绑定。角色的分离使得交互设计师可以专注于用户体验需求,而不是对业务逻辑进行编程。这样,应用程序的层次可以在多个工作流中进行开发以提高生产力。即使一个开发人员在整个代码库上工作,视图与模型的适当分离也会更加高效,因为基于最终用户反馈,用户界面通常在开发周期中经常发生变化,而且处于开发周期后期。 + +MVVM模式试图获得MVC提供的功能性开发分离的两个优点,同时利用数据绑定的优势和通过绑定数据的框架尽可能接近纯应用程序模型。它使用绑定器、视图模型和任何业务层的数据检查功能来验证传入的数据。结果是模型和框架驱动尽可能多的操作,消除或最小化直接操纵视图的应用程序逻辑(如代码隐藏)。 + +### 熟悉WPF窗体应用程序创建流程 + +#### **一、WPF窗体应用程序创建流程** + + + +1. 打开VS2022,选择创建新项目,项目模板如图所示。 +![输入图片说明](%E5%88%9B%E5%BB%BA%E9%A1%B9%E7%9B%AE.png) +1. 配置新项目,给项目选择项目名称,项目路径等。 +![输入图片说明](%E9%85%8D%E7%BD%AE%E7%8E%AF%E5%A2%83.png) +1. 选择想要的控件,拖动完成程序即可。 +![输入图片说明](%E6%8E%A7%E4%BB%B6.png) + +#### **二、常用控件介绍** + + +##### **1.** Button(按钮): + +按钮控件,该按钮对 Click 事件做出反应,在使用时,双击button即可编写相应的click函数。 + +常用属性介绍: + +对于元素而言 + +- Background:元素的背景色 +- Foreground:前景色 +- Width/Height:宽度和高度 +- BorderBrush:元素边框颜色 +- BorderThickness:元素边框宽度 + +对于字体常用属性有 + +- FontFamily:字体名称 +- FontSize:字体大小 +- FontStretch:字体在屏幕上紧缩或加宽的程度 +- FontWeight:字体粗细 + +除此之外还有一个很重要的clickMode函数。其中,ClickMode获取或设置 Click 事件何时发生。 +ClikMode值有如下三种,具体解析如下: Release:指定当按下和释放按钮时应引发Click 事件。 Press:指定当按下按钮时应引发Click 事件。 Hover:指定当鼠标悬停在控件上时应引发Click 事件。根据需求情况可以编写不同的函数。 + +##### 2. Label 文本标签 + +表示包含一段任意类型内容的控件,可以对文本内容进行修饰编辑等。 + +对于边框和色彩: + +- Background:背景 +- Foreground前景色 +- BorderBrush:用于描述控件的边框背景的画笔 +- BorderThickness:获取或设置控件的边框宽度 +- Width/Height:宽度/高度。 + + +对于字体: + + +- FontFamily:获取或设置控件的字体系列。 +- FontSize:获取或设置字号。 +- FontStretch:获取或设置字体在屏幕上紧缩或加宽的程度。 +- FontStyle:获取或设置字体样式。 +- FontWeight:获取或设置指定字体的粗细。 + +此外还有一些常营属性或者设置 + + +- Name:元素标识名称 +- Opacity:透明度 +- Margin:元素的外边距 +- HorizontalAlignment/VerticalAlignment:获取或设置在父元素(如面板或项控件)中组合此元素时所应用的水平/垂直对齐特征。 HorizontalContentAlignment/VerticalContentAlignment:获取或设置控件内容的水平/垂直对齐方式。 + + + +- Content:获取或设置 ContentControl 的内容,lable使用的是content属性而不是text属性。 +- IsEnabled:使能是否可用。 + +##### **3. TextBox** + +文本输入框控件,它允许最终用户在一行、对话输入、或多行编写,就像是个编辑器。 + +常用属性介绍 : + +对于边框来说 +- Background:背景 +- BorderBrush:边框背景的颜色 +- BorderThickness:边框宽度 + +对于字体来说 + +- FontFamily:字体样式 +- FontSize:字体大小 +- FontStretch:字体在屏幕上紧缩或加宽的程度 + +对于常用的撤销功能 + +- IsEnabled:使能,是否可用 +- IsReadOnly:对用户而言是否只读 +- IsUndoEnabled:是否支持撤销功能 +- CanRedo:是否可重做最新的撤消操作 +- CanUndo:是否可撤消最新的操作 + +对于常用文本 + + +- Text:文本框的文本内容 +- TextAlignment:文本框内容的水平对齐方式 +- TextWrapping:文本框中文本的换行方式 +- LineCount:文本总行数 +- MaxLength:在文本框中手动输入的最大字符数 +- MaxLines/MinLines:最大可见行数/最小行数 +- Name:元素标识名称 +- Opacity:透明度 +- SelectedText:文本框中当前选择的内容 +- SelectionBrush:突出显示选定文本的画笔 +- SelectionLength:文本框中当前选择的字符数 +- SelectionOpacity:选择文本的透明度 +- SelectionStart:当前选择的起始位置的字符索引 +- SelectionTextBrush:选中文本的颜色 + +此外还有: + +- HorizontalContentAlignment/VerticalContentAlignment:获取或设置控件内容的水平对齐方式/垂直对齐方式 +- CaretIndex:获取或设置插入符号的插入位置索引。 +- HorizontalScrollBarVisibility/VerticalScrollBarVisibility:是否显示水平滚动条/垂直滚动条HorizontalOffset/VerticalOffset:获取和设置水平滚动条的位置/垂直滚动条的位置 +HorizontalAlignment/VerticalAlignment:获取或设置在父元素中组合此元素时所应用的水平对齐特征/垂直对齐特征。 +- FlowDirection:获取或设置文本和其他用户界面 (UI) 元素在控制其布局的任何父元素内流动的方向。 + + +##### **4.** ListBox + +ListBox 是一个 ItemsControl,这意味着它可以包含任何类型的对象的集合 。 一个 ListBox 中的多个项是可见的,与仅 ComboBox具有所选项可见的项不同,除非 IsDropDownOpen 属性为 true。 该 SelectionMode 属性确定一次是否可以选择多个项 ListBox 。 + +常用属性介绍 + +对于字体: + +- FontFamily:字体系列 +- FontSize:字体大小 +- FontStretch:字体在屏幕上紧缩或加宽的程度 +- FontWeight:字体粗细 + +对于背景与边框 + +- Background:背景 +- BorderBrush:边框颜色 +- BorderThickness:边框宽度 +- Width/Height:宽度/高度; +- IsEnabled:使能,是否可用 +- Margin:外边距 +- Opacity:透明度 +- Visibility:可见性 +- IsVisible:是否可见 + +对于元素: + +- Name:元素标识名称 +- FlowDirection:其子元素的流动方向 +- LayoutTransform:在执行布局时应该应用于此元素的图形转换方式 +- RenderTransform:元素的呈现位置的转换信息 +- RenderTransformOrigin:由RenderTransform声明的任何可能呈现转换的中心点,相对于元素的边界 +- HorizontalAlignment/VerticalAlignment:在父元素中组合此元素时所应用的水平对齐特征/垂直对齐特征 +- HorizontalContentAlignment/VerticalContentAlignment:控件内容的水平对齐方式/垂直对齐方式。 + +此外,对于select和item,还有一些常用函数: + +- Items:获取用于生成 ItemsControl 的内容的集合。 +- ItemsSource:获取或设置用于生成 ItemsControl 的内容的集合。 SelectedIndex:获取或设置当前选择中第一项的索引,如果选择为空,则返回负一(-1)。 +- SelectedItem:获取或设置当前选择中的第一项,或者,如果选择为空,则返回 null。 +- SelectedItems:获取当前选定的项。 +- SelectedValue:获取或设置通过使用 SelectedItem 而获取的 SelectedValuePath 的值。 +- SelectedValuePath:获取或设置用于从 SelectedValue 获取 SelectedItem 的路径。 +- SelectionMode:获取或设置 ListBox 的选择行为。 +- SnapsToDevicePixels:获取或设置一个值,该值确定在呈现过程中,此元素的呈现是否应使用特定于设备的像素设置。 + + +##### **5.** DataGrid + +DataGrid 表示用于在可自定义的网格中显示数据的控件。 + +常用属性介绍 + +一些常用属性的设置和数据的获取: + + +- CanSelectMultipleItems:获取或设置一个值,该值指示是否可以一次选择 MultiSelector 中的多个项 +- CanUserAddRows:获取或设置一个值,该值指示用户是否可在 DataGrid 中添加新行 +- CanUserDeleteRows:获取或设置一个值,该值指示用户是否可从 DataGrid 中删除行 +- CanUserReorderColumns:获取或设置一个值,该值指示用户能否通过用鼠标拖动列标题来更改列的显示顺序CanUserResizeColumns/CanUserResizeRows:获取或设置一个值,该值指示用户是否可使用鼠标调整列宽/高度 +- CanUserSortColumns:获取或设置一个值,该值指示用户能否通过单击列标题对列进行排序 +- ColumnHeaderHeight:获取或设置列标题行的高度 +- Columns:获取一个集合,该集合包含 DataGrid 中的所有列 +- ColumnWidth:获取或设置 DataGrid 中列和标题的标准宽度和大小调整模式。 CurrentCell:获取或设置具有焦点的单元格CurrentColumn:获取或设置包含当前单元格的列 +- CurrentItem:获取与包含当前单元格的行绑定的数据项 +- DisplayMemberPath:获取或设置源对象上的值的路径,以用作对象的可视表示形式 +- HeadersVisibility:获取或设置用于指定行和列标题可见性的值 +- HorizontalGridLinesBrush:获取或设置用于绘制水平网格线的画笔 + +对于一些单元格: + + +- RowBackground:获取或设置行背景的默认画笔 +- RowHeaderWidth:获取或设置行标题列的宽度 +- RowHeight:获取或设置所有行的建议高度 + +一些常用的select属性: + + +- SelectedIndex:获取或设置当前选择中第一项的索引,如果选择为空,则返回负一(-1) +- SelectedItem:获取或设置当前选择中的第一项,或者,如果选择为空,则返回 null +- SelectedItems:获取在 MultiSelector 中选定的项 +- SelectedValue:获取或设置通过使用 SelectedItem 而获取的 SelectedValuePath 的值 +- SelectedValuePath:获取或设置用于从 SelectedValue 获取 SelectedItem 的路径 +- SelectionMode:获取或设置一个值,该值指示如何在 DataGrid 中选择行和单元格 +- SelectionUnit:获取或设置一个值,该值指示是否可以在 DataGrid 中选择行、单元格或两者 + +一些常用的item属性: + +- Items:获取用于生成 ItemsControl 的内容的集合 +- ItemTemplate:获取或设置用来显示每个项的 DataTemplate +- ItemsPanel:获取或设置模板,该模板定义对项的布局进行控制的面板 +- ItemsSource:获取或设置用于生成 ItemsControl 的内容的集合 + +此外还有: + +- orizontalScrollBarVisibility/VerticalScrollBarVisibility:水平/垂直滚动条可见性 +- SnapsToDevicePixels:获取或设置一个值,该值确定在呈现过程中,此元素的呈现是否应使用特定于设备的像素设置ActualHeight/ActualWidth:元素呈现的高度/宽度 + + + +##### **6.** ComboBox + +表示带有下拉列表的选择控件,通过单击控件上的箭头可显示或隐藏下拉列表。也叫下拉列表控件。 + +常用属性介绍 + +对于字体: + +- FontFamily:字体系列 +- FontSize:字体大小 +- FontStretch:字体在屏幕上紧缩或加宽的程度 +- FontWeight:字体粗细 + +对于背景与边框: + +- Background:背景 +- BorderBrush:边框颜色 +- BorderThickness:边框宽度 +- Foreground:前景色 +- Width/Height:宽度/高度 + +item常用属性: + +- Items:获取用于生成 ItemsControl 的内容的集合 +- ItemTemplate:获取或设置用来显示每个项的 DataTemplate +- ItemsPanel:获取或设置模板,该模板定义对项的布局进行控制的面板 +- ItemsSource:获取或设置用于生成 ItemsControl 的内容的集合 + +select常用属性: + + +- SelectedIndex:获取或设置当前选择中第一项的索引,如果选择为空,则返回负一(-1) +- SelectedItem:获取或设置当前选择中的第一项,或者,如果选择为空,则返回 null +- SelectedItems:获取当前选定的项。 Text:获取或设置当前选定项的文本 +- SelectedValue:获取或设置通过使用 SelectedItem 而获取的 SelectedValuePath 的值 +- SelectedValuePath:获取或设置用于从 SelectedValue 获取 SelectedItem 的路径 +- SelectionBoxItem:获取在选择框中显示的项 +- SelectionBoxItemTemplate:获取选择框内容的项模板 +- SnapsToDevicePixels:获取或设置一个值,该值确定在呈现过程中,此元素的呈现是否应使用特定于设备的像素设置。 + +常用的布尔属性: + +- IsEnabled:使能,是否可用 +- IsDropDownOpen:获取或设置一个值,该值指示组合框的下拉部分当前是否打开 +- IsEditable:获取或设置一个值,该值指示启用或禁用 ComboBox 的文本框中的文本编辑 +- IsReadOnly:获取或设置启用仅限选择模式的值,在此模式中,可选择但不可编辑组合框中的内容 + +此外还有: + + +- Name:元素标识名称 +- FlowDirection:其子元素的流动方向 +- LayoutTransform:在执行布局时应该应用于此元素的图形转换方式 +- RenderTransform:元素的呈现位置的转换信息 +- RenderTransformOrigin:由RenderTransform声明的任何可能呈现转换的中心点,相对于元素的边界HorizontalAlignment/VerticalAlignment:在父元素中组合此元素时所应用的水平对齐特征/垂直对齐特征HorizontalContentAlignment/VerticalContentAlignment:控件内容的水平对齐方式/垂直对齐方式 + + +### 实验准备 + + +1. 安装Windows11 Professional Edition,校园网有正版下载。 + +权衡之下决定采用Windows10 Professional Edition. +![输入图片说明](win10%E4%B8%93%E4%B8%9A%E7%89%88.png) + +2. 安装Office 中的 Word 和 Excel,安装专业增强版2021 + +已经在校园网完成正版下载并激活。 +![输入图片说明](office.png) + +3. 另必须安装 Visual Studio 2022 Community, 并且安装 git,根据PPT内容安装VS相关扩展。 + +![输入图片说明](VS.png) +4. -申请好 gitee 和github 账号,同时Visual Studio 也注册账号。在github及gitee上各建立一个空仓库。 + +5. 学会建立 SSH 连接及推送到远程仓库的方法。 + + +### 选做题 +#### **一、安装Anaconda** + + +1.首先打开Anaconda官网,进入官网后如下图所示,点击Download即可开始下载。 +![输入图片说明](ana%E5%AE%98%E7%BD%91.png) +2.下载完成后得到exe文件,双击即可开始安装。安装一般可以直接点击next,注意路径即可。 + +3.WIN+R键调出运行窗口,输入cmd回车,输入conda命令查看是否安装成功。 +![输入图片说明](cmd%E9%AA%8C%E8%AF%81.jpg) + +4.输入conda -V命令可查看当前Anaconda版本 +![输入图片说明](anacond%E7%89%88%E6%9C%AC.png) + + +#### **二、安装pytorch** +1.在 Anaconda Prompt 中添加镜像源: + +``` +(base) C:\Users\root>conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ +(base) C:\Users\root>conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge +(base) C:\Users\root>conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/msys2/ +(base) C:\Users\root>conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/ +(base) C:\Users\root>conda config --set show_channel_urls yes +(base) C:\Users\root> + +``` +2. +进入Python环境之后,进入PyTorch官网,选择相关参数,获取PyTorch安装指令,并在anaconda prompt 终端中执行红色框中的指令。 +![输入图片说明](pytorch%E5%AE%98%E7%BD%91.png) + +3.安装完成后,继续在在anaconda prompt 终端中执行以下指令,验证PyTorch是否安装成功.验证结果为true即可。 +![输入图片说明](pytorch%E5%AE%89%E8%A3%85%E9%AA%8C%E8%AF%81.png) + +#### **三、安装gym** + + +- 管理员运行进入 anaconda并克隆gym库,命令为 + + git clone https://github.com/openai/gym.git +![输入图片说明](gym%E5%85%8B%E9%9A%86%E5%BA%93.png) +- 进入下载好的 gym 文件夹,激活环境,指令为 + + conda activate env_pytorch + +- pip install gym + +该步骤可以正常进行,一般不会出错,该步骤可以安装基础版的gym。 +- conda install swig +- pip install gym[Box2d] + +如果立刻运行 pip install gym[Box2d] 没有conda install swig 来安装相应的缺失模块会报错。如下图。 +![输入图片说明](gymError.png) +但是在实验中可以先执行conda install swig ,再执行 pip install gym[Box2d] 一定程度上可以避免这种情况。 +![输入图片说明](gym%E6%88%90%E5%8A%9F.png) +经过以上步骤便成功搭建了VS下python调试环境,机器学习平台pytorch和gym。 + + + + + + + + + diff --git a/Homework_wangrunqi/Week7homeWork/MVVP.png b/Homework_wangrunqi/Week7homeWork/MVVP.png new file mode 100644 index 0000000000000000000000000000000000000000..74f889e8bcf89d4cc171501b97b0db20f3f9c44e Binary files /dev/null and b/Homework_wangrunqi/Week7homeWork/MVVP.png differ diff --git "a/Homework_wangrunqi/Week7homeWork/QQ\345\233\276\347\211\20720221022203139.jpg" "b/Homework_wangrunqi/Week7homeWork/QQ\345\233\276\347\211\20720221022203139.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..0b73ca7602ffa35e30d0f363e93573d9fbc8f957 Binary files /dev/null and "b/Homework_wangrunqi/Week7homeWork/QQ\345\233\276\347\211\20720221022203139.jpg" differ diff --git a/Homework_wangrunqi/Week7homeWork/VS.png b/Homework_wangrunqi/Week7homeWork/VS.png new file mode 100644 index 0000000000000000000000000000000000000000..da7d50c27cf2bb5a7838d5a3976ae81d79908f7d Binary files /dev/null and b/Homework_wangrunqi/Week7homeWork/VS.png differ diff --git "a/Homework_wangrunqi/Week7homeWork/anacond\347\211\210\346\234\254.png" "b/Homework_wangrunqi/Week7homeWork/anacond\347\211\210\346\234\254.png" new file mode 100644 index 0000000000000000000000000000000000000000..372e772707944779b4c1929018a5e8aac42b4184 Binary files /dev/null and "b/Homework_wangrunqi/Week7homeWork/anacond\347\211\210\346\234\254.png" differ diff --git "a/Homework_wangrunqi/Week7homeWork/ana\345\256\230\347\275\221.png" "b/Homework_wangrunqi/Week7homeWork/ana\345\256\230\347\275\221.png" new file mode 100644 index 0000000000000000000000000000000000000000..5f94e6d0a350e87d3f916ecf7d103a8282c6cb03 Binary files /dev/null and "b/Homework_wangrunqi/Week7homeWork/ana\345\256\230\347\275\221.png" differ diff --git "a/Homework_wangrunqi/Week7homeWork/cmd\351\252\214\350\257\201.jpg" "b/Homework_wangrunqi/Week7homeWork/cmd\351\252\214\350\257\201.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..4e32048859ab242c3f3db29e64330a9d237f97f7 Binary files /dev/null and "b/Homework_wangrunqi/Week7homeWork/cmd\351\252\214\350\257\201.jpg" differ diff --git a/Homework_wangrunqi/Week7homeWork/gym.jpg b/Homework_wangrunqi/Week7homeWork/gym.jpg new file mode 100644 index 0000000000000000000000000000000000000000..adf0788cd6d194bf3d84f59c7c300f2432a32ea1 Binary files /dev/null and b/Homework_wangrunqi/Week7homeWork/gym.jpg differ diff --git a/Homework_wangrunqi/Week7homeWork/gymError.png b/Homework_wangrunqi/Week7homeWork/gymError.png new file mode 100644 index 0000000000000000000000000000000000000000..f4061431d3df6b679c3c4793bb9c01ce89c3875d Binary files /dev/null and b/Homework_wangrunqi/Week7homeWork/gymError.png differ diff --git "a/Homework_wangrunqi/Week7homeWork/gym\345\205\213\351\232\206\345\272\223.png" "b/Homework_wangrunqi/Week7homeWork/gym\345\205\213\351\232\206\345\272\223.png" new file mode 100644 index 0000000000000000000000000000000000000000..8e648ba4dcb9b12194706fb912f953691694c056 Binary files /dev/null and "b/Homework_wangrunqi/Week7homeWork/gym\345\205\213\351\232\206\345\272\223.png" differ diff --git "a/Homework_wangrunqi/Week7homeWork/gym\346\210\220\345\212\237.png" "b/Homework_wangrunqi/Week7homeWork/gym\346\210\220\345\212\237.png" new file mode 100644 index 0000000000000000000000000000000000000000..9dc57af3727ca71beb096d0e9431fcb6d93bd898 Binary files /dev/null and "b/Homework_wangrunqi/Week7homeWork/gym\346\210\220\345\212\237.png" differ diff --git a/Homework_wangrunqi/Week7homeWork/office.png b/Homework_wangrunqi/Week7homeWork/office.png new file mode 100644 index 0000000000000000000000000000000000000000..42a1a6b48c6d3a571e2b8003d3a3ac1304f039aa Binary files /dev/null and b/Homework_wangrunqi/Week7homeWork/office.png differ diff --git "a/Homework_wangrunqi/Week7homeWork/pytorch\345\256\211\350\243\205\351\252\214\350\257\201.png" "b/Homework_wangrunqi/Week7homeWork/pytorch\345\256\211\350\243\205\351\252\214\350\257\201.png" new file mode 100644 index 0000000000000000000000000000000000000000..b707fee7d74d81d69b78c3287ce6878bc0ca5a73 Binary files /dev/null and "b/Homework_wangrunqi/Week7homeWork/pytorch\345\256\211\350\243\205\351\252\214\350\257\201.png" differ diff --git "a/Homework_wangrunqi/Week7homeWork/pytorch\345\256\230\347\275\221.png" "b/Homework_wangrunqi/Week7homeWork/pytorch\345\256\230\347\275\221.png" new file mode 100644 index 0000000000000000000000000000000000000000..eb3d1cd313a0c27c08c65392a6e6e6bfd8cfaa80 Binary files /dev/null and "b/Homework_wangrunqi/Week7homeWork/pytorch\345\256\230\347\275\221.png" differ diff --git "a/Homework_wangrunqi/Week7homeWork/win10\344\270\223\344\270\232\347\211\210.png" "b/Homework_wangrunqi/Week7homeWork/win10\344\270\223\344\270\232\347\211\210.png" new file mode 100644 index 0000000000000000000000000000000000000000..0f99355af82e2876bcb3e66fe0b0518156bc243e Binary files /dev/null and "b/Homework_wangrunqi/Week7homeWork/win10\344\270\223\344\270\232\347\211\210.png" differ diff --git "a/Homework_wangrunqi/Week7homeWork/\345\210\233\345\273\272\351\241\271\347\233\256.png" "b/Homework_wangrunqi/Week7homeWork/\345\210\233\345\273\272\351\241\271\347\233\256.png" new file mode 100644 index 0000000000000000000000000000000000000000..0a3303e55da469cca0873636d264a8e1675c0294 Binary files /dev/null and "b/Homework_wangrunqi/Week7homeWork/\345\210\233\345\273\272\351\241\271\347\233\256.png" differ diff --git "a/Homework_wangrunqi/Week7homeWork/\346\216\247\344\273\266.png" "b/Homework_wangrunqi/Week7homeWork/\346\216\247\344\273\266.png" new file mode 100644 index 0000000000000000000000000000000000000000..24a57c0f8929463c8cbcf3200028442d65fc36e6 Binary files /dev/null and "b/Homework_wangrunqi/Week7homeWork/\346\216\247\344\273\266.png" differ diff --git "a/Homework_wangrunqi/Week7homeWork/\351\205\215\347\275\256\347\216\257\345\242\203.png" "b/Homework_wangrunqi/Week7homeWork/\351\205\215\347\275\256\347\216\257\345\242\203.png" new file mode 100644 index 0000000000000000000000000000000000000000..5e739b2a4674e8fb7d2d0c6feec7a6384f2f589c Binary files /dev/null and "b/Homework_wangrunqi/Week7homeWork/\351\205\215\347\275\256\347\216\257\345\242\203.png" differ diff --git "a/Homework_wangrunqi/Week8homework&k\350\257\276\345\240\202\344\272\222\345\212\250Interaction&\347\277\273\350\257\221/.keep" "b/Homework_wangrunqi/Week8homework&k\350\257\276\345\240\202\344\272\222\345\212\250Interaction&\347\277\273\350\257\221/.keep" new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git "a/Homework_wangrunqi/Week8homework&k\350\257\276\345\240\202\344\272\222\345\212\250Interaction&\347\277\273\350\257\221/homeWork8&interaction.md" "b/Homework_wangrunqi/Week8homework&k\350\257\276\345\240\202\344\272\222\345\212\250Interaction&\347\277\273\350\257\221/homeWork8&interaction.md" new file mode 100644 index 0000000000000000000000000000000000000000..0e362bf4e85f964b16c8daaab229a64d0686c4b2 --- /dev/null +++ "b/Homework_wangrunqi/Week8homework&k\350\257\276\345\240\202\344\272\222\345\212\250Interaction&\347\277\273\350\257\221/homeWork8&interaction.md" @@ -0,0 +1,202 @@ +## **一、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 + +#### 1结构 + +包含有关注册表值的信息。列表中的RegQueryMultipleValues函数使用此结构。 + + +``` +typedef struct value_entW { + LPWSTR ve_valuename; + DWORD ve_valuelen; + DWORD_PTR ve_valueptr; + DWORD ve_type; +} VALENTW, *PVALENTW; +``` + +##### ve_valuename + +要检索的值的名称。请确保在调用RegQueryMultipleValues之前设置此成员。 + +##### ve_valuelen + +数据的大小被ve_valueptr指向(ve_valueptr指向的数据的大小),以字节为单位 + +##### ve_valueptr + +一个指向值输入数据的指针。这是一个指针,指向在lpValueBuf缓冲区中返回的值的数据的指针,由RegQueryMultipleValues填写的缓冲区中的值的指针。. + +##### ve_type + +ve_valueptr指向的数据类型。有关可能类型的列表,请参阅注册表值类型。 + +#### 2值类型 + +下面的例子是遍历一个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; +} +``` + +## **二、2-8翻译** + +### 枚举注册表子项 + +- https://docs.microsoft.com/en-us/windows/win32/sysinfo/enumerating-registry-subkeys + +此实验示例使用RegQueryInfoKey、RegEnumKeyEx和RegEnumValue函数枚举指定键的子键。传递给每个函数的hKey参数是打开键的句柄。此键必须在函数调用之前打开,然后关闭。 + + +``` +// QueryKey - Enumerates the subkeys of key and its associated values. +// hKey - Key whose subkeys and values are to be enumerated. + +#include +#include +#include + +#define MAX_KEY_LENGTH 255 +#define MAX_VALUE_NAME 16383 + +void QueryKey(HKEY hKey) +{ + TCHAR achKey[MAX_KEY_LENGTH]; // buffer for subkey name + DWORD cbName; // size of name string + TCHAR achClass[MAX_PATH] = TEXT(""); // buffer for class name + DWORD cchClassName = MAX_PATH; // size of class string + DWORD cSubKeys=0; // number of subkeys + DWORD cbMaxSubKey; // longest subkey size + DWORD cchMaxClass; // longest class string + DWORD cValues; // number of values for key + DWORD cchMaxValue; // longest value name + DWORD cbMaxValueData; // longest value data + DWORD cbSecurityDescriptor; // size of security descriptor + FILETIME ftLastWriteTime; // last write time + + DWORD i, retCode; + + TCHAR achValue[MAX_VALUE_NAME]; + DWORD cchValue = MAX_VALUE_NAME; + + // Get the class name and the value count. + retCode = RegQueryInfoKey( + hKey, // key handle + achClass, // buffer for class name + &cchClassName, // size of class string + NULL, // reserved + &cSubKeys, // number of subkeys + &cbMaxSubKey, // longest subkey size + &cchMaxClass, // longest class string + &cValues, // number of values for this key + &cchMaxValue, // longest value name + &cbMaxValueData, // longest value data + &cbSecurityDescriptor, // security descriptor + &ftLastWriteTime); // last write time + + // Enumerate the subkeys, until RegEnumKeyEx fails. + + if (cSubKeys) + { + printf( "\nNumber of subkeys: %d\n", cSubKeys); + + for (i=0; i