博文
从唐朝的军事强国到宋朝的经济强国(2011-04-17 15:45:00)
摘要:唐朝一直都是四面为敌的,也怪不得唐朝,太过强大边邻就会忌讳,然后就想方设法削弱你,偏偏那个时代唐朝的四邻都是当时世界强国,就变成一团乱麻了。当时唐朝东北契丹,西北回纥,西南吐蕃,东南南诏,打来打去,安史之乱前唐朝国力强消耗的起,安史之乱后半个中国都打成了废墟就耗不起了。安史之乱后唐朝国力不足并且四面为敌恢复不过来,所以外交政策在中后期转型为拉拢为主了,经常是联合一方打另一方,长久的战争导致唐,吐蕃,回纥,南诏不堪重负,最终全都耗尽国力亡国了。
盛唐时候边兵49万,实际上当时唐朝不止49万的,这就要从府兵制讲起,最开始时候唐朝是府兵制,就是多少户中有1户是职业军人就是世世代代当兵的。但是府兵制随着唐朝国力人口和疆域的扩大根本无法承受,第一,军户的子女也是世代当兵的,可是生出来个残疾怎么办,那就意味着这兵没啥作用。第二,军户长期驻扎在各地方,战时才会集结,等集结完毕仗都打完了,第三,折冲府边境地区训练还好,可富庶的核心地区训练一塌糊涂,等到战时一集结,训练好的和训练差的混在一起根本就没法打仗。前期唐朝多是以一个国家为敌,打败一家再去打另一家,中期四邻被唐朝打怕了就一起来攻,而且唐朝强大的国力支持着唐朝有能力进行多场同时的局部战争,所以府兵根本得不到休整也没啥战斗力。在中期唐朝是废除了府兵制改为募兵制,就是志愿兵。这种兵战斗力非常强,因为一辈子当兵,当兵的目的就是发财升官,战斗意志高的可怕,很类似于罗马帝国的常驻军团。志愿兵就是后来的边兵,从当上边兵开始就受到优待,然后分为战区,就是各节度使,边兵通常是集中在一个地区所建的兵营中,训练是不间断的,而且因为处于边境打仗频繁,没有敢怠练的。装备精良,国力强了自然要配好装备,一个边兵训练不易,就得要他们生存率高战斗力高耐久力高,所以边兵多数配备横刀,至于槊都是常备兵器,大......
求二叉树深度的算法(2011-04-17 11:22:00)
摘要:题目:二叉树用二叉链表表示,编写求二叉树深度的算法。
答案是:
int height(Bitree T)
{
if (T==NULL) return 0;
u=height(T->lchild);
v=height(T->rchild);
if (u>n) return (u+1)
return (v+1)
}
关于递归,你可以看成是一句一句往下运行嘛。需要保存状态的时候,系统就会自动用栈帮你保存。就依你说得那个为例:
n为全局变量,初值为0;
第一次调用height(T),假设T!=NULL
由于T!=NULL:跳过if (T==NULL) return 0;
关键到了u=height(T->lchild); 调用本身的函数:此时的T->lchild保存在栈中,既然是调用就得从函数开头执行:
看下这时候T2(其实就是T->lchild),if (T==NULL) return 0;
这里假设T不是NULL,就继续运行在遇到u=height(T->lchild); 在调这个函数本身——
这里就假设它为T->lchild==NULL吧。这下可好,这个函数执行return 0;
慢着:第二次函数调用u=height(T->lchild)中的函数值已经计算出来啦。这时u=0;
你还记得第二次调用运行到了v=height(T->rchild); 这句话吧?好,这个过程就和u=height(T->lchild)完全一样。
这里也假设得到的v=0
则第二次调用到了if (u>n) return (u+1)
return (v+1)
得到一个返回值,不如就假设u〉n,于是返回值1;
好,这一波完毕;
你还记得第一次调用的height吧,这时把返回值给u,u=1;
然后执行到第一次调用中的v=height(T->rchild); 了。分析同上。
这个过程的确比较复杂。慢慢琢磨吧。呵呵。 基本思路就......
图的遍历(深度优先算法)(C语言程序)(2011-04-17 10:53:00)
摘要:图的遍历(深度优先算法)(C语言程序)
图的遍历是指按某条搜索路径访问图中每个结点,使得每个结点均被访问一次,而且仅被访问一次。图的遍历有深度遍历算法和广度遍历算法,最近阿杰做了关于图的遍历的算法,下面是图的遍历深度优先的算法(C语言程序):
#include<stdio.h>
#include<malloc.h>
#define MaxVertexNum 5
#define m 5
#define TRUE 1
#define NULL 0
typedef struct node
{
int adjvex;
struct node *next;
}JD;
typedef struct EdgeNode
{
int vexdata;
JD *firstarc;
}TD;
typedef struct
{
TD ag[m];
int n;
}ALGRAPH;
void DFS(ALGRAPH *G,int i)
{
JD *p;
int visited[80];
printf("visit vertex:%d->",G->ag[i].vexdata);
visited[i]=1;
p=G->ag[i].firstarc;
while(p)
{
if (!visited[p->adjvex])
DFS(G,p->......
ASP.NET MVC 入门6、TempData【转】(2011-04-16 21:19:00)
摘要:本系列文章基于ASP.NET MVC Preview5.
ASP.NET MVC提供了很多Hellper的方法,Hellper就是一些生成HTML代码的方法,方便我们书写HTML代码(有一部分的朋友更喜欢直接写HTML代码)。我们也可以利用.NET 3.5的扩展方法来书写我们自己的Hellper。
例如:
<%=Html.ActionLink("首页","index","Home")%>
生成的HTML代码就是:<a href="/Home/Index">首页</a>。这里有一点需要注意的就是,Html.ActionLink()和Url.Link()方法生成的URL和你在Global.asax里面配置的Route的先后顺序是有关的。
具体的关于Hellper的各个方法的使用我就不详细介绍了,你可以参考重典的Asp.net Mvc Framework 系列文章。
我们来实现前面提到的Setting,用于设置Blog的基本设置。我们看一下在Views/Admin/Setting.aspx页面的代码:
<p>
<label for="Name">Blog的名称</label>
<%=Html.TextBox("Name")%>
<%=Html.ValidationMessage("Name")%>
阅读全文(2394) | 评论:0
ASP.NET MVC 入门6、TempData【转】(2011-04-16 21:18:00)
摘要:本系列文章基于ASP.NET MVC Preview5.
ASP.NET MVC的TempData用于传输一些临时的数据,例如在各个控制器Action间传递临时的数据或者给View传递一些临时的数据,相信大家都看过“在ASP.NET页面间传值的方法有哪几种”这个面试题,在ASP.NET MVC中TempData的就是其中的一种传值方法。TempData默认是使用Session来存储临时数据的,TempData中存放的数据只一次访问中有效,一次访问完后就会删除了的。这个一次访问指的是一个请求到下一个请求,因为在下一个请求到来之后,会从Session中取出保存在里面的TempData数据并赋值给TempData,然后将数据从Session中删除。我们看一下ASP.NET MVC Preview5源码:
也就是说TempData只保存到下一个请求中,下一个请求完了之后,TempData就会被删除了。注意这里TempData使用Session来做存储的,Session是对应特定用户的,所以并不存在并发问题。如果你用数据库来做TempData的存储介质的话,必须要考虑这个情况的。至于如何自定义TempData的存储介质,你可以参考“ASP.NET MVC: 用db4o来做TempDataProvider(另附一个泛型的RedirectToAction方法)”这一篇文章。
前面说到的在我们的BaseController中有一个显示提示信息给用户的方法,这个提示信息就是临时的信息,我们可以使用TempData来实现。下面让我们来实现这个提示信息的方法:
protected ActionResult ShowMsg(List<string> msgs)
{
TempData["Messages"]&n......
ASP.NET MVC 入门5、View与ViewData【转】(2011-04-16 21:17:00)
摘要:
本系列文章基于ASP.NET MVC Preview5.
view在MVC模式中与用户进行最直接的接触,它负责数据的呈现。这里要注意一点就是,view只是负责数据的呈现,所以我们应该要尽量让view中不涉及业务逻辑的处理。
我们来添加一个Blog首页的view。在安装了ASP.NET MVC后,我们在添加新项目的时候可以看到有MVC的view模板:
注:如果你的是中文版的VS,安装完后可能会出现找不到这个模板的现象,你可以参考在中文版VS 08中安装MVC这篇文章设置一下。
其中MVC View Content Page是有母版页的。我们在Views/Home目录下添加一个MVC View Content Page,并选择我们Views/Shared目录下的Site.Master母版页:
public partial class Index : ViewPage
{
}
ASP.NET MVC默认是使用WebForm来作为view的。所以我们看到新建的aspx页面继承自ViewPage,如果使用aspx页面作为ASP.NET MVC的视图引擎,则所有的aspx页面都必须继承自ViewPage。我们再看一下ViewPage:
我们看到ViewPage继承自ASP.NET WebForm的Page页,还实现了IViewDataContainer接口,同时还提供了一些Helper类的实例。我们可以使用ViewData来从Controller中往view页面中传递数据。下面我们在HomeController中的Index Action中取......
ASP.NET MVC 入门4、Controller与Action【转】(2011-04-16 21:16:00)
摘要:本系列文章基于ASP.NET MVC Preview5.
Controller是MVC中比较重要的一部分。几乎所有的业务逻辑都是在这里进行处理的,并且从Model中取出数据。在ASP.NET MVC Preview5中,将原来的Controller类一分为二,分为了Controller类和ControllerBase类。Controller类继承自ControllerBase类,而ControllerBase实现是了IController接口。
ControllerBase实现了IController接口的Execute方法,在Route匹配到Controller之后,就会调用Execute方法来进入Controller的处理。这里还定义了一个抽象的方法ExecuteCore方法,该方法会在Execute方法的最后被调用。ControllerBase还定义了三个核心的属性。我们在后面会详细讨论TempData和ViewData。
Controller类除了继承自ControllerBase类以外,还实现了好几个Filter接口,Filter我们在后面再详细讨论。
public abstract class Controller : ControllerBase, IActionFilter, IAuthorizationFilter, IDisposable, IExceptionFilter, IResultFilter{ }
Controller类还定义很多有用的方法,我们新建的Controller都必须继承自这个Controller类。例如我们新建一个AdminController:
public class AdminController : Controller
{
阅读全文(1524) | 评论:0
ASP.NET MVC 入门2、项目的目录结构与核心的DLL[转](2011-04-16 21:13:00)
摘要:我们新建一个ASP.NET MVC的Web Application后,默认的情况下,项目的目录结构如下:
App_Data :这个目录跟我们一般的ASP.NET website是一样的,用于存放数据。
Content :这个目录是建议用来存放一下资源文件的。例如CSS、JS、图片等等。当然你不愿意的话,完全可以不放到这里来。
Controllers :这个目录是建议将Controller类都放到这里来,方便管理。Controller类的命名必须以Controller结尾,例如一个名为Home的Controller则要命名为HomeController。
Models :这个目录是建议用来存放你的业务实体、数据访问层代码的类的。当然,更好的做法我觉得应该是将Models独立为一个类库。
Views :在默认情况下,所有的view文件都必须放到这个目录下来,每一个Controller对应一个子目录,而且子目录的命名必须以Controller的命名一样。例如,HomeController的view就应该放到Home子目录中。我们见到Views目录下还有一个Shared的子目录,这个子目录是用于存放一些共享的view的,例如Error.aspx和Site.Master。Controller在Views\ControllerNmae 中找不到指定的view的时候,会到Shared中去寻找。
下面我们来看一下ASP.NET MVC比较核心的DLL,见下图红框部分:
System.Web.Routing :URL路由。将一个URL路由到对应的Controller上靠的就是这个。是在HttpModule里面处理的。
System.Web.Extensions :这个是ASP.NET AJAX的。
System.Web.Mvc: ASP.NET MVC最主要的程序集。在CodePlex上放出源代码的就是这个DLL。
System.Web.Abstractions :这个程序集是一些相关的基类来的。例如HttpContextBase、HttpRequestBase 等等。
Microsoft.Web.Mvc :这个程序集只要放一些MVC的特性与扩展的方法。在A......
ASP.NET MVC 入门1、简介[转](2011-04-16 21:11:00)
摘要:什么是MVC模式
MVC(Model-View-Controller,模型—视图—控制器模式)用于表示一种软件架构模式。它把软件系统分为三个基本部分:模型(Model),视图(View)和控制器(Controller)。
那么MVC模式和我们熟悉的WebForm模式有什么不同呢?他的各个部分又是怎样分工的呢?
我们先来看一下普通的WebForm模式下,我们请求一个例如http://www.51mvc.com/blog/index.aspx的URL,那么我们的WebForm程序会到网站根目录下去寻找blog目录下的index.aspx文件,然后由index.aspx页面的CodeBehind文件(.CS文件)进行逻辑处理,其中或许也包括到数据库去取出数据(其中的经过怎样的BLL到DAL这里就不谈了),然后再由index.aspx页面来呈现给用户。简单的示意图如下所示:
也就是一个URL请求的是在服务器与该URL对应路径上的物理文件(ASPX文件或其他),然后由该文件来处理这个请求并返回结果给客户端。
但是,对于MVC模式,这是怎样的一个过程呢?
我们先来建一个ASP.NET MVC的项目吧。VS2008默认是没有ASP.NET MVC的项目模板的,首先我们需要到http://www.microsoft.com/downloads/details.aspx?FamilyId=A24D1E00-CD35-4F66-BAA0-2362BDDE0766&displaylang=en去下载最新的ASP.NET MVC的安装程序,目前最新版本的Microsoft ASP.NET MVC Beta(10/15/2008)。下载安装完后,我们可以在新建项目那里找到ASP.NET MVC的项目:
注:如果你的是中文版的VS,安装完后可能会出现找不到这个模板的现象,你可以参考在中文版VS 08中安装MVC这篇文章设置一下。
建立一个ASP.NET MVC项目后,默认的项目大概如下图:
我们可以看到项目中有几个文件夹的命名和MVC(Model-View......
什么是ASP.NET MVC?(2011-04-16 20:33:00)
摘要:1,什么是ASP.NET MVC?
在了解ASP.NET MVC之前,先了解一下什么是MVC。MVC是Model-View-Controller的缩写,也就是模型—视图—控制器的意思。MVC用于表示一种软件架构模式,它把软件系统分为三个基本部分:模型(Model),视图(View)和控制器(Controller)。模型(Model)一般是指“数据模型”,用于封装与应用程序的业务逻辑相关的数据以及对数据的处理方法。“模型”有对数据直接访问的权利,例如对数据库的访问。“模型”不依赖“视图”和“控制器”,也就是说,模型不关心它会被如何显示或是如何被操作。视图(View)也就是UI层,实现数据的显示。控制器(Controller)起到不同层面间的组织作用,用于控制应用程序的流程,它处理事件并作出响应。
ASP.NET MVC是在现有ASP.NET 3.5运行时的顶层提供一种新的模型-视图-控制器(MVC, Model-View-Controller)框架。这就允许开发人员利用MVC设计模式的优势创建自己的ASP.NET Web应用程序,它将内容显示(UI或者View)、业务逻辑和后台数据进行了清晰分离,可以说是MVC在ASP.NET中的实现。
2,ASP.NET MVC和ASP.NET Web Form有什么关系?
ASP.NET MVC只是另外一种开发ASP.NET应用程序的设计模式,不会取代ASP.NET Web Form模式,两者是不行的,不会冲突。
3,ASP.NET MVC的优点:
不再有ViewState:传统的ASP.NET WebForm模式利用ViewState保存表单的状态信息,由于B/S程序本身的限制,ViewState存储数据需要在隐藏表单域里面放置很大一段字符串,这会大大增加页面的字节数,导致网页加载变慢;
简介的HTML:最终生成的 HTML代码完全由自己控制,不会生成任何“垃圾代码”;
更快的服务器端处理和客户端呈现:MVC只简单地处理“模板”,而无需构建复杂的控件树,因此,无论是在服务器处理的时间,和客户端的呈现速度都会有所提高;
为多种视图只需一种模型:有时候一个页面要显示的数据是同一个,但表现形式有细微的差别,此时只需要修改视图部分,可以......