【现代程序设计】【期末作业】【homework-09】

作业要求说明:

http://www.cnblogs.com/xinz/p/3441537.html

 

我在做一个什么样的应用:

展示如何逐步求解一个加权矩阵的

  1. 最大子矩阵
  2. 最大子联通图

 

下面是软件的截图

 

包含的基本功能:

 

  1. 从文件读入矩阵随机生成矩阵
    1. 本软件将保存最近使用的3个文件(若包含当前正在使用的文件,则为4个)
  2. 随机生成矩阵
    1. 可设置矩阵的大小,不超过10*10
    2. 超过10*10将导致anymaxsum步骤过多,而没有什么教学意义了。
  3. 播放
    1. 自动
      1. 随时调整播放间隔(播放中亦可)
    2. 手动
      1. 回退和下一步
    3. 重置
    4. 选择播放类型

 

 

结果展示:(包含一个矩阵和两个文本框)

 

  • 矩阵:用于显示详细步骤和状态(详细见软件)
  • 最大值(文本框):显示当前最大值
  • 当前值(文本框):显示当前选定值

 

 

应用设计语言和平台:

 

  • 语言:C#+XAML
  • 运行平台:.Net 4.0+ and 浏览器(IE9+)

 

 

什么工作占用了我比较大的时间?

GUI的设计

思考到底怎样的设计才能让初学者理解DP动态规划执行的过程和原理,而不是看着动画一闪而过,完全不明白整个过程是在做什么。

  1. 例子需简单,即矩阵不能包含过多的元素,4*4,5*5,6*6是可接受的值。
  2. 执行过程需可控,用户可以选择手动或者自动模式,自动模式下,播放速度可以调节。
  3. 每一个中间步骤需要有对应的解释说明,解释还需要贴合人们的思维模式,比如 a.红色代表错误 b.绿色代表可行。
  4. 用户大多数时候都在看算法执行的过程,因此初始值相关的GUI控件应该只占用小部分空间
  5. 【停止】,【播放】,【上一步】等等控件应该被设计的比较大,因为它们会被访问的更频繁。

  

下面是该软件的详细设计时遇到几个问题:

 

安全问题,浏览器文件访问权限

浏览器端的应用均运行于沙盒之中,所以浏览器无法直接使用使用文件选取器

解决办法

提升应用的权限,在属性中更改

 

 

如何将二维数组绑定到控件 DataGrid?

代码DataGrid

 1                    <DataGrid x:Name="dataGrid" ItemsSource="{Binding CollectionSource}" SelectionUnit="CellOrRowHeader" IsReadOnly="True"  MaxColumnWidth="100" MinColumnWidth="100" AutoGenerateColumns="True" CanUserResizeRows="False" CanUserSortColumns="False"  CanUserReorderColumns="False"  LoadingRow="dataGrid_LoadingRow" HorizontalAlignment="Center" VerticalAlignment="Center" AutoGeneratedColumns="dataGrid_AutoGeneratedColumns" AutoGeneratingColumn="dataGrid_AutoGeneratingColumn" Margin="0,0,0,30" FontSize="20" FontFamily="Segoe UI">
 2                         <DataGrid.ColumnHeaderStyle>
 3                             <Style TargetType="DataGridColumnHeader">
 4                                 <Setter Property="HorizontalContentAlignment" Value="Center"/>
 5                                 <Setter Property="Background" Value="AliceBlue" />
 6                                 <Setter Property="Foreground" Value="Black"/>
 7                                 <Setter Property="FontSize" Value="20" />
 8                             </Style>
 9                         </DataGrid.ColumnHeaderStyle>
10 
11                     </DataGrid>
View Code

PageSource

    <Page.Resources>
        <DataTemplate x:Key="CellTemplate">
            <TextBlock Background="{Binding Back}" Text="{Binding Value}" TextAlignment="Center"  Foreground="White"/>
        </DataTemplate>

    </Page.Resources>
View Code

 

首先,在PageSource 里面申明了一个CellTemplate,将DataGrid 每一个Cell 设置为 一个TextBlock

后台定义了一个类 item,包含元素 Back,Value

分别对应该TextBlock的Background和Text两个属性

定义了 一个 继承于 ObservableCollection<item> items 收集DataGrid每一行的数据

并定义了一个 ObservableCollection<items> CollectionSource,收集DataGrid所有行的数据

再在DataGrid代码里将 ItemsSource绑定到CollectionSource: [ItemsSource="{Binding CollectionSource}"]

 

 

 

后台算法

因在第三次作业中已经完成了这部分工作

所以这次作业,我只是在maxsum类中加入了两个属性:

并设置了访问器

在实体化maxsum类之后,便可以直接获取数据

1 /// <summary>
2  /// 结果存储于下面两个list
3  /// result_maxsum 矩阵
4 /// result_any_maxsum 任意
5 /// </summary>
6         public List<step_detail> result_maxsum { get; set; }
7         public List<step_detail> result_any_maxsum { get; set; }

 

几个测试用例

 

完整代码:

https://github.com/11061027zsx/homework-09/

posted @ 2013-12-15 17:52  早餐  阅读(278)  评论(0编辑  收藏  举报