posts - 7, comments - 5, trackbacks - 0, articles - 4

2009年3月23日

     摘要:   阅读全文

posted @ 2009-03-23 16:21 阿呆 阅读(932) | 评论 (4)编辑 收藏

2008年11月20日

     摘要: 利用回溯法找出一组八皇后的排放位置。  阅读全文

posted @ 2008-11-20 21:54 阿呆 阅读(400) | 评论 (0)编辑 收藏

2008年11月4日


递归与分治一章:

        给定一个由n个互不相同的数组成的集合S,及一个正整数k<=n,试设计
        一个O(n)时间算法找出S中最接近S的中位数的k个数

动态规划一章:

        设有n种不同面值的硬币,各硬币的面值存于数组T[1:n]中。现要用这些
        面值的硬币来找钱。可以使用的各种面值的硬币个数不限。

        1)当只用硬币面值T[1],T[2],……T[i]时,可找出钱数j的最少硬币个数
        记为C(i,j)。若只用这些硬币面值,找不出钱数j时,记C(i,j)=无穷。给
        出C(i,j)的递归表达式,及其初始条件。1<=i<=n,1<=j<=L

        2)设计一个动态规划算法,对1<=j<=L,计算出所有的C(n,j)。算法中只
        允许使用一个长度为L的数组。用L和n作为变量来表示算法的计算时间复杂
        性。

        3)在C(n,j),1<=j<=L,已计算出的情况下,设计一个贪心算法,对任意
        钱数m<=L,给出用最少硬币找钱m的方法。当C(n,m)不等于无穷时,算法的
        计算时间应为O(n+C(n,m))。

贪心算法一章:

        在黑板上写了n个正数组成的一个数列,进行如下操作:每一次擦去其中两
        个数设为a和b,然后在数列中加入一个数a*b+1,如此下去直至黑板上只剩
        下一个数。在所有按这种操作方式最后得到的数中,最大的数记为max,最
        小的数记为min,则该数列的极差M定义为M=max-min。对于给定的数列,设
        计一个有效算法计算出其极差M。并说明算法的正确性。

回溯法一章:
      
        运动员最佳配对问题。一个羽毛球队有男女运动员各n人,给定2个n*n矩阵P
        和Q。P[i][j]是男运动员i和女运动员j配对组成混合双打时的竞赛优势;
        Q[i][j]则是女运动员i和男运动员j配合时的竞赛优势。显然,由于技术的
        配合和心理状态等各种因素的影响,P[i][j]不一定等于Q[i][j]。设计一个
        算法,计算出男女运动员的最佳配对法,使各组男女双方竞赛优势乘积达到
        最大。

分支界限法一章:

        栈式分支界限法将活结点表以后进先出(LIFO)的方式存储于一个栈中。
        试设计一个解0-1背包问题的分支界限法,并说明栈式分支界限法与回溯
        法的区别。


        试设计一个解n后问题的优先队列式分支界限法。

posted @ 2008-11-04 22:40 阿呆 阅读(1275) | 评论 (0)编辑 收藏

2008年11月3日

     摘要:   阅读全文

posted @ 2008-11-03 22:26 阿呆 阅读(1911) | 评论 (0)编辑 收藏

2008年10月27日

 以下代码,在XP上,CreateSoundBuffer失败,返回E_INVALIDARG,即参数设置错误。

 1 pcmwf.wFormatTag    =  WAVE_FORMAT_PCM;  
 2 pcmwf.nChannels    =  2;                            
 3 pcmwf.nSamplesPerSec    =  48000;  
 4 pcmwf.wBitsPerSample    =  24;  
 5 pcmwf.nBlockAlign    =  pcmwf.nChannels * pcmwf.wBitsPerSample / 8;                                  
 6 pcmwf.nAvgBytesPerSec  =  pcmwf.nSamplesPerSec  *  pcmwf.nBlockAlign;  
 7 
 8 dsbd.dwSize =  sizeof(DSBUFFERDESC); 
 9 dsbd.dwFlags =  DSBCAPS_CTRLPAN |   DSBCAPS_CTRLVOLUME 
10| DSBCAPS_GLOBALFOCUS | DSBCAPS_CTRLPOSITIONNOTIFY; 
11 dsbd.dwBufferBytes =  3*11520
12 dsbd.lpwfxFormat =  &pcmwf;  
13
14 lpds->CreateSoundBuffer(&dsbd,&tmp_ds_buf,NULL) 
15


在DirectX的SDK中查看WAVE_FORMAT_PCM可以得到关于wBitsPerSample的说明如下:

 If wFormatTag is WAVE_FORMAT_PCM, then wBitsPerSample should be equal to 8 or 16.
If wFormatTag is WAVE_FORMAT_EXTENSIBLE, this value can be any integer multiple of 8.

也就是说,在格式为WAVE_FORMAT_PCM的时候,设置wBitsPerSample为24是不可以的,所以会创建失败。
在wBitsPerSample = 24时,需要使用WAVE_FORMAT_EXTENSIBLE格式。

参考如下文章:

http://www.eggheadcafe.com/forumarchives/win32programmerdirectxaudio/Nov2005/post24249606.asp

posted @ 2008-10-27 22:41 阿呆 阅读(1655) | 评论 (0)编辑 收藏

一般来说,无效化菜单项可以用EnableMenuItem(ID,enable)来实现。但是,如果某个菜单项下还有subitem,那这个菜单项是没有ID的,这时不能用EnableMenuItem来实现,但可以用SetMenuItemInfo来灰化。

可以在MainFram类的OnCreate函数中添加以下代码:
 1    CMenu* pMainMenu = GetMenu();
 2    if (pMainMenu != NULL && pMainMenu->GetMenuItemCount() >= 5)
 3    {
 4        CMenu* pSubMenu = pMainMenu->GetSubMenu(4);//start from 0
 5        assert(pSubMenu);
 6         MENUITEMINFO MenuItemInfo;
 7         MenuItemInfo.cbSize = sizeof(MENUITEMINFO);
 8         MenuItemInfo.fMask = MIIM_STATE;
 9         MenuItemInfo.fState = MFS_GRAYED;
10         pSubMenu->SetMenuItemInfo(0&MenuItemInfo, TRUE);//start from 0
11    }

posted @ 2008-10-27 21:37 阿呆 阅读(2189) | 评论 (0)编辑 收藏

2008年7月4日

 一个windows服务程序大体可以三步来写,其大体框架如下:

 1// TestService.cpp : Defines the entry point for the console application.
 2//
 3
 4#include "stdafx.h"
 5#include <Windows.h>
 6
 7LPTSTR g_ServiceName = _T("TestService");
 8
 9void WINAPI ServiceCtrlHandler(DWORD code)
10{
11    //process control requests.
12    //比如,当收到SERVICE_CONTROL_STOP请求时,设置server状态为stop
13}

14
15void MyServiceTestFuncion()
16{
17    //service功能函数。在这里写我们要service做什么事情
18}

19
20//服务入口函数,一些初始化动作在此处进行
21void WINAPI ServiceMain()
22{
23    SERVICE_STATUS_HANDLE hStatus;
24    hStatus = RegisterServiceCtrlHandler(
25        g_ServiceName,    //服务名称
26        ServiceCtrlHandler);//处理服务控制请求的函数
27    if (!hStatus)
28    {
29        //注册失败
30    }

31    else
32    {
33        MyServiceTestFuncion();
34    }

35}

36
37//函数入口函数
38int _tmain(int argc, _TCHAR* argv[])
39{
40    SERVICE_TABLE_ENTRY ServiceTable[] = {
41        {g_ServiceName, (LPSERVICE_MAIN_FUNCTIONW)ServiceMain},
42        {NULL, NULL}
43    }
;
44
45    StartServiceCtrlDispatcher(ServiceTable);
46    return 0;
47}

48
49


以下介绍这3个步骤:
1、在main函数中调用StartServiceCtrlDispatcher函数,该函数会启动新线程来执行程序中所要执行的服务。

1    SERVICE_TABLE_ENTRY ServiceTable[] = {
2        {g_ServiceName, (LPSERVICE_MAIN_FUNCTIONW)ServiceMain},
3        {NULL, NULL}
4    }
;
5
6    StartServiceCtrlDispatcher(ServiceTable);

 

其中,SERVICE_TABLE_ENTRY是一个结构,其中包括两个域:

 LPTSTR lpServiceName;
  LPSERVICE_MAIN_FUNCTION lpServiceProc;


lpServiceName
指定在service进程中运行的服务的名字,它可以是空字符串("”),但不能是NULL

我们在程序的开始处指定如下:LPTSTR g_ServiceName = _T("TestService");

lpServiceProc指向服务入口函数的指针,即新启动的服务线程的指针。

一个服务程序可以启动几个线程,取决于ServiceTable中元素的个数。注意,ServiceTable的最后一个元素必须是{NULL, NULL},以表示结束。

StartServiceCtrlDispatcher函数(其后所用的windowsAPI也是)的头文件是Windows.h,因此要包含该头文件

2、定义服务的入口函数ServiceMain

ServiceMain函数中调用RegisterServiceCtrlHandler函数来注册一个函数处理服务控制请求。函数调用方式如下:

RegisterServiceCtrlHandler( 
 g_ServiceName,     
//服务名称 
 ServiceCtrlHandler);
//处理服务控制请求的函数

RegisterServiceCtrlHandler 函数返回一个SERVICE_STATUS_HANDLE类型的handle来表明service的状态,如果是0,则表示注册失败。

然后调用我们的服务最主要的函数实现我们所要实现的功能:

MyServiceTestFuncion();//实现该服务要实现的功能

3、实现ServiceCtrlHandler函数

ServiceCtrlHandler函数的定义如下:

VOID WINAPI ServiceCtrlHandler (

  DWORD fdwControl

);

其中,fdwControlControl Code,监控服务的状态,可以在其中针对服务的各种状态进行动作,比如,当fdwControlSERVICE_CONTROL_STOP时,停止该服务。

一个service程序实现的大致步骤如上。

 

posted @ 2008-07-04 23:17 阿呆 阅读(861) | 评论 (0)编辑 收藏