一 Basic入门
一个基本Basic程序
某班32人,电脑成绩如下:A等(5分)13人,B等(4分)12人,C等(3分)5人,D等(2分)2人,求全班该科目平均成绩
10 LET A=13
20 LET B=12
30 LET C=5
40 LET D=2
50 LET U=A+B+C+D
60 LET G=(5*A+4*B+3*C+2*D)/U
70 PRINT G
80 END
二 C语言入门
高级语言是面向问题的语言。
第一个C程序;
main()
{
printf("Hello World!");
}
C程序由函数构成;函数由两部分组成:函数说明,函数体。
C的数据类型有:基本类型,构造类型,指针类型,空类型。基本类型包括:整型,实型,字符型,枚举型。
变量的三要素:变量名,变量的值,变量的存储单元。
字符输出函数 - putchar。
输出单词 Boy 的程序;
#include "stdio.h"
main()
{
char a,b,c;
a='B'; b='o'; c='y';
putchar(a);
putchar(b);
putchar(c);
}
十 XNA编程入门
一
XNA Framework 是建置于 .NET Framework 2.0上,另外还加入了一些专注于游戏开发上类别库。
XNA Framework 把所有用作游戏编程的低阶技术包起来,由此,游戏开发员就可以专注于游戏内容开发而不用关心游戏移植至不同平台上的问题,游戏只要开发于XNA 的平台上,所有硬件只要支援XNA都能运行。XNA Framework 还内置一些工具,例如XACT以帮助游戏内容开发。这些工具还能帮助开发视觉和听觉效果和和像真度很高的模型制作。
XNA Framework 同时支持2D 和3D 的游戏开发也支援XBox 360 的控制器和震动效果。
第一个XNA程序
安装完XNA Framework后,在VS中即出现XNA的相关项目Template. 随便创建一个名曰 WindowsGame1的XNA项目。编译后,出现蓝天白云一片。
在每个游戏中,都存在消息循环,即不断计算和控制界面不断刷新的循环。
Initialize用于对游戏界面内一些对象的初始化。
LoadContent用于加载游戏内的一些资源,如图像,文件,声音等。
紧接着,Update和Draw 便开始游戏内的消息循环,前者主要用于相关计算,后者用于绘制。
XNA的默认刷新率是60fps(Frame/Second)
编译后,任意资源都会被编译成.XNB(XNA二进制文件)。
GraphicsDevice.Clear(Color.CornflowerBlue);用于擦除当前屏幕内的图像
spriteBatch 通常用于绘制Sprite,即精灵。
二十 DirectDraw编程入门
高速图形显示的基本方法是用一种叫做 Page Flipping的技术.
在 Windows95/NT下做 Page Flipping 分为全屏的和窗口的两种. 在全屏下Page Flipping 叫做Flip, 在窗口下叫做 Blit.
写所有 DirectDraw的程式, 差不多都有以下几个步骤,
1. 初始化,
2. 设置显示模式.
3. 在内存里建立PageFlipping所需要的两个页, 前页和后页.
4. 给显示的区域加个画框以免画到外面来.
5. 在后页画图, 然后"刷"的一下子换到前页来.
步骤一: 初始化
DirectDraw 是一个面向对象的函数库. "面向对象"的意思并不是指面对著你的女朋友, "对象" 在这里, 你可以简单地想象成是一个模板, 比方说,"政府", 一旦你说:"我成立了一个政府". 别人 就会立即把你套入"政府模板", 自然而然地认为你有印钞票的功能. 在我们的程式里, 你一旦声明 一个变量(比如 myDD)是 DirectDraw对象 (DirectDraw对象的正式名为 LPDIRECTDRAW) , 这个myDD就有了 DirectDraw对象的所有的功能和特性. 定义 的语法是:
LPDIRECTDRAW pMyDD;
除了 DD的对象外, 还有几个重要的对象, "页面", "裁剪板" 和 "调色板". "页对象"用来定义"前页"和"后页". 定义如下:
LPDIRECTDRAWSURFACE pMyDDSFront;
LPDIRECTDRAWSURFACE pMyDDSBack;
一个"裁剪板对象", 在窗口模式下用来剪去画出窗口边界的部份.
LPDIRECTDRAWCLIPPER pMyClipper;
"调色板"设定屏幕的颜色表, 在读取256色的 Bitmap时要用到.
LPDIRECTDRAWPALETTE myDDPal;
最最重要的"对象"就是这些了. 当然 DirectX还有很多复杂晦涩的对象. 这是速成不起来的.
编制 Windows 程式有一大堆变量和对象是 Windows所要求的, 这也是我最烦 Microsoft的地方. Microsoft 似乎知道这点. 所以在 VC4.0后的版本有了 Wizard的功能帮你自动生成代码. 尽量地去用它的 Wizard使我们的生活变得容易.
由于我们的程式可能会占用一个窗口, 就给这个窗口一个 handle:
HWND myWnd
初始化的工作还没有完, 我们要把这些对象指向一个安全的地方 Null.
pMyDD = NULL;
pMyDDSFront = NULL;
pMyDDSBack = NULL;
pMyClipper = NULL;
pMyDDPal=NULL;
最后, 在 Windows系统为我们的 myDD对象开辟相应的区域:
DirectDrawCreate( NULL, //用当前的显示驱动
&pMyDD, NULL))
Okay, 烦人的初始化总算完了.
步骤二: 设置屏幕的显示方式.
DirectDraw 有自己的设置屏幕的方式, 而且它的屏幕模式分为"全屏"( exclusive mode)和"窗口"( normal mode). 各有各的设置方法. 设置的主要区别在于 SetCooperativeLeve的参数.
SetCooperativeLeve 在"窗口"模式下这样设置:
pMyDD->SetCooperativeLevel(AfxGetMainWnd()->GetSafeHwnd(),DDSCL_NORMAL);
而在"全屏"模式下这样设置:
pMyDD->SetCooperativeLevel( hwnd, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN );
如果它们的返回值为 DD_OK表示成功. 我们就可以把屏幕调节成我们想要的样子, 例如 640x480x8. 也就是256色. 究竟有那些屏幕模式可用取决于你的显示卡
pMyDD->SetDisplayMode( 640, 480, 8 );
现在, 我们已经有了一个屏幕, 不过还不能在上面画画, 我们需要步骤三来 替我们建立一个可供画画涂涂用的画板.
步骤三: 建立前后页(两块画板).
两块画板的好处是可以一边在一块上面画, 一边给别人看已经画好的另一块. 等这块画好了, 两块板就对调一下, 让别人看新画好的这块. 如果画的足够快, 换的足够快. 看的人就会看到动画了, 就象电影的效果一样. 我们把这叫做 Page Flipping.
这里先要介绍的是怎样在系统中建立两块画板( double buffering), 不过你也可以根据需要建立三块,四块画板.
DDSURFACEDESC ddsd; //这个结构描述"页"的特徵.
ddsd.dwFlags = DDSD_CAPS;
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;//指定我们用的是前页.
ddsd.dwSize = sizeof(ddsd); //尺寸
// 做前页:
HRESULT result;
result = pMyDD->CreateSurface(&ddsd, &pMyDDSFront, NULL);
当发生错误时, 要记得 Release对象.
if (result!=DD_OK)
{
pMyDD->Release();
pMyDD = NULL;
}
ddsd.dwWidth = scr_width; //设定后页的大小,
ddsd.dwHeight = scr_height;
//指定 我们要后页
ddsd.dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_CAPS;
ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
//做后页
result = pMyDD->CreateSurface(&ddsd, &pMyDDSBack, NULL);
}
步骤四: 给显示区加一个画框(裁剪板).
在窗口下. 为了防止 DirectDraw 画到窗口外面去. 需要加一个画框(裁剪板). 可以用 CreateClipper来 创建剪贴板.
result = pMyDD->CreateClipper(0, &pMyClipper, NULL);
创建后,把它套到窗口上去, 所以要知道是那一个窗口( Handle).
myWnd = AfxGetMainWnd()->GetSafeHwnd();// 从系统中拿到窗口的 Handle
result = pMyClipper->SetHWnd(0, myWnd);
// 把剪贴板加到窗口上去
result = pMyDDSFront->SetClipper(myClipper);
步骤五: 在后页画图, 前后页互换.
其实到这里才是真正开始写游戏的地方, 以前在 DOS下写游戏, 就是直接从 这个步骤开始的. 以上这些工作, 都是 Microsoft强加给我们的.
写游戏之前我们先来解决前后互换的问题.
// 如果前页的内存被 Windows"征用"了, 这里把它要回来. 这个检察常常会被忘记.
if (pMyDDSFront->IsLost() == DDERR_SURFACELOST)
pMyDDSFront->Restore();
DirectDraw 用来互换的语句有 Blt和 BltFast. BltFast据称比 Blt快10%.
result = pMyDDSFront->Blt(&rcTo, pMyDDSBack, &rcFrom, DDBLT_WAIT,NULL);
result = pMyDDSFront->BltFast( 0, 0, pMyDDSBack, &rcFrom, DDBLTFAST_SRCCOLORKEY);
如果程式工作在"全屏"模式下. 前后页互换容易得多, 只是一句:
result = pMyDDSFront->Flip( NULL, 0 );
现在就到了游戏的主要部份了, 我们称之为"游戏逻辑"部, 在普通的游戏中, "游戏逻辑" 通常 要做很多事, 如画游戏场景, 故事处理等等. 做完这些事后, 再和前页做换屏.
打开Visual C++, 别忘了检查一下你的 DirectX SDK 有没有安装好. 打开VC, 选择 MFC app EXE Wizard 来生成程式的框架
。进入 IDE环境后, 加入一个新 CPP file, 把上面用到的子函数的代码打入.
当然你还需要一个 .H file 来放变量名, 对象名和子程式名.
MFC(Microsoft Fried Checken)的 Wizard会帮你生成 ::InitInstance() 和 ::OnIdle(LONG lCount), 把你的 初始化部份, 建页等步骤放在 InitInstance子类里. 把"游戏逻辑"和换页放在 OnIdle里.
三十 微软BI工具入门
Business Intelligence - 连接数据与决策者
BI是一种运用了数据仓库、在线分析和数据挖掘等技术来处理和分析数据的崭新技术,目的是为企业决策者提供决策支持。
BI 是一个工厂:
BI 的原材料是海量的数据;
BI 的产品是由数据加工而来的信息和知识;
BI 将这些产品推送给企业决策者;
企业决策者利用 BI 工厂的产品做出正确的决策,促进企业的发展;这就是 Business Intelligence,即商业智能——连接数据与决策者,变数据为价值。
BI 应用的两大类别是信息类应用 和 知识类应用,其特征如下:
信息类 BI 应用
指由原始数据加工而来的数据查询、报表图表、多维分析、数据可视化等应用,这些应用的共同特点是:将数据转换为决策者可接受的信息,展现给决策者。 例如将银行交易数据加工为银行财务报表。
仅负责提供信息,而不会主动去分析数据。
例如,银行财务报表工具没有深入分析客户流失和银行利率之间关系的能力,而只能靠决策者结合信息,通过人的思考,得出知识。
知识类 BI 应用
指通过数据挖掘技术和工具,将数据中隐含的关系发掘出来,利用计算机直接将数据加工为知识,展现给决策者。
会主动去数据中探查数据关联关系,发掘那些决策者人脑无法迅速发掘的隐含知识,并将其以可理解的形式呈现在决策者面前。
BI 初级应用模式概览——数据查询(Querying)
数据查询是最简单的 BI 应用,属于 MIS 系统遗产,虽然出身比较老土,但是目前仍然是决策者获取信息的最直接的方法。
如今,数据查询界面已经彻底摆脱了传统 SQL 命令行,大量的下拉菜单、输入框、列表框等元素甚至是鼠标拖拽界面将后台干苦力的 SQL 语句包装成一个妖艳无比的数据获取系统,而本质仍然没有离开数据查询的几大要素:
查什么
从哪儿查
过滤条件
展示方法
目前国外比较流行的数据查询应用已经完全释放了数据查询的灵活性,如右图所示的是 Cognos ReportNet 的数据查询界面 Query Studio,允许用户通过纯浏览器界面,以鼠标拖拽操作定义数据查询要素,并以报表和图表等多种方式展现数据。
BI 初级应用模式概览——报表(Reporting)
报表是国内最热衷的 BI 应用之一,这与报表在我国企事业单位中的历史地位是分不开的。我国的报表以其格式诡异、数据集中、规则古怪等特征著称于世。
报表的两大要素是数据和格式,如果没有格式,则报表应用几乎等同于数据查询应用。可以说,报表就是将查询出来的数据按照指定的格式展现。
报表应用包含了报表展现和报表制作两大模块。报表展现就是让决策者看到报表,并允许决策者通过条件定义来选择报表数据,例如选择报表年度、部门、机构等等;报表制作面向报表的开发人员,其格式定义灵活性、数据映射灵活性、计算方法的丰富程度等均影响了 BI 报表应用的质量。
需要澄清一下的是,Microsoft Excel 不算是一个 BI 报表工具,因为 Excel 没有连接数据源的能力,充其量是一个 Spread Sheet。但是 Excel 强大的格式功能让报表制作人员竟折腰,乃至到后来,几乎所有 BI 厂商都提供了面向 Microsoft Excel 的插件,通过插件,Excel 可以连接到 BI 的数据源上,摇身一变为 BI 报表工具。
三十一 Prolog编程入门
Prolog编程入门
目标子句(goal clause)、事实(facts)、规则(rules)合起来称为Horn子句,因而得名Horn子句逻辑。
Prolog可以作为专家系统来使用,但它本身却是作为一种程序设计语言而设计出来的。把Horn子句逻辑变为一种程序设计语言的2个重要因素:
(1) 严格的搜索顺序或程序控制;
(2) 副效应。
1 程序控制
Prolog不使用随机搜索策略,而总是使用同一种策略。系统保持一个当前目标,始终从左到右进行求解。当求解一个特定子目标时,当前目标中待求解的那个子目标将被其规则右边的那些子目标所代替。所谓的“谓词”,就是相当于其他编程语言中的过程或者子例程。它们之间的区别在于一个Prolog谓词对于一个单个提问可以返回多个结果或者没有结果(即失败)。
例:
parent(Person, Parent) :- mother(Person, Parent).
parent(Person, Parent) :- father(Person, Parent).
sibling(Person, Sibling) :- mother(Person, Mother), mother(Sibling, Mother).
sibling(Person, Sibling) :- father(Person, Father), father(Sibling, Father).
fullBolodeSibling(Person, Sibling) :-
mother(Person, Mother),
mother(Sibling, Mother),
father(Person, Father),
father(Sibling, Father).
1.1 失败(fail)
如果目标失败了,则说明定理中完全不存在针对该目标的解。
1.2 回溯
1.3 改进家庭定理
问题在于:选择了一个不好的方式来形式化这个定理。原因是从考虑实体间的关系开始的。如果首先考虑实体本身呢?
person("Bill", "male").
person("John", "male").
person("pam", "female").
parent("Bill", "John").
parent("Pam", "Bill").
father(Person, Father) :- person(Father, "male"), parent(Person, Father).
1.4 递归
如何定义“祖先”关系?
ancestor(Person, Ancestor) :- parent(Person, Ancestor).
ancestor(Person, Ancestor) :- parent(Person, P1), ancestor(P1, Ancestor).
递归具有非常强大的功能,但也有一点难于控制。使用递归时,要记住:
(1) 递归必须能够前进;
(2) 递归必须能够终止。
1.5 副效应(side effects)
例:
ancestor("Pam",X), write("Ancestor of Pam: ", X), nl().
Ancestor of Pam: Bill
X = Bill
Ancestor of Pam: John
X = John
2 Solutions
PIE给出的结果和自己给出的结果混在一起,怎么办?一个简单的办法是确保该目标没有解,例如:
ancestor("Pam",X), write("Ancestor of Pam: ", X), nl(),fail.
Ancestor of Pam: Bill
Ancestor of Pam: John
No solutions
Fail是一个预先定义的谓词,它总是失败,没有解。
注意:
(1) 目标本身不存在单一的解,从而使想要的全部解都作为副效应形式给出;
(2) 副效应在失败计算中也存在。
建议:
将计算性代码与执行输入输出的代码分开。