编程沙龙(14)
IT商界
本月有奖问答的题目是:
若由两个人A、B承担N个作业的任务。设第i个作业交给A处理需要的时间为ai,而交给B处理,则需要时间bi。由于各作业的特点和各人擅长的技能不同的关系,很可能对于某些i,有ai≥bi,而对于某些j,j≠i,有aj<bj。既不能将一个作业分开由两个人处理,也没有一个人能同时处理2个作业。设计一个算法,使得这两个人处理完这N个作业的时间最短(从任何一个人开工到最后一个人停工的总时间)。研究一个实例:(a1,a2,a3,a4,a5,a6,a7)=(2,8,9,11,4,5,7);(b1,b2,b3,b4,b5,b6,b7)=(4,5,12,10,3,4,8)。
读者朋友可以用你最擅长的语言和编程工具来完成这道题,答题方式为:把你的答案发送到software@cpcw.com,邮件主题写上“算法演义答题”。我们会从中选取答题最好的参赛者,并发送精美奖品。
另外,我们已经做了两期有奖征答活动了。这期间,我看了不少读者朋友寄来的程序。有一点我觉得有必要讲一下。记得我在学校学编程的时候,我的老师特别重视培养我们自己检验自己程序的能力。其实,上两期的题目,如果用一些简单的测试条件,很容易就能判断出解题的正误。就拿上期的“最长公共子序列”的问题来讲,用两对检测的字符串,就基本能判断程序的对错。我选用的字符串是s1=“basdtr”、s2=“dasbtr”以及s1=“street”、s2=“asteert”。一轮检测下来,基本就能把有问题的程序挑出个八九不离十了。当然如果是自己判断出程序有问题以后,就应该根据出问题的检测条件在程序中一步一步地分析,最终找出程序错误的症结。这对学习编写程序可是很有益处的,不信你试试。
有朋友询问“怎样利用VB动态注册、删除数据源?”
答:一般而言,我们可以用两种方法来动态注册、删除数据源。
一是利用程序在注册表里加入或删除有关数据源配置的相关参数。使用这种方法实现的依据是:用户在控制面板中配置ODBC数据源后,Windows系统会将用户配置的信息写入注册表中。当应用程序需要用到数据源时,Windows会通知底层接口查阅注册表中该数据源的配置。所以只要我们能找到ODBC数据源在注册表中储存的位置以及格式就可以达成这一目的。关于ODBC数据源的秘密,其实如果你看一下注册表“HKEY_CURRENT_USER\Software\ODBC”、“HKEY_OCAL_MACHINE\Software\ODBC”就会全明白了。其中“HKEY_CURRENT_USER\Software\ODBC”下储存着“用户页”下的数据源名,而“HKEY_LOCAL_MACHINE\Software\ODBC”下储存着“系统页”下的数据源名。
下面以创建一个名为“testdb”的ACCESS系统数据源为例。首先我们要在“HKEY_LOCAL_MACHINE\Software\ODBC\ODBC.INI\ODBC Data Source”子键下创建一个字符串项。项名称就是我们要的数据源名“testdb”,而项值应该是“Microsoft Access Driver (*.mdb)”(项值根据不同的数据源类型会有不同)。另外,我们还要在“HKEY_LOCAL_MACHINE\Software\ODBC\ ODBC.INI”下创建一个主键,主键名就是我们的数据源名“testdb”。在这个主键下,我们还要创建一些有关的参数项。这些参数项主要有DBQ(数据库文件位置)、Driver(数据源驱动文件,对于ACCESS文件一般是“C:\WINDOWS\SYSTEM\odbcjt32.dll”)等。当然还有一些其他的参数,而且不同类型的数据源的参数也有所不同,你可以自己摸索一下其他参数的设置。至于删除数据源只要将上面创建的内容从注册表里清除掉就可以了。这里要用到几个关于操作注册表的API函数,它们的声明如下(以下函数声明要写在一行里):
打开或创建一个注册表主键的RegCreateKey函数:
Declare Function RegCreateKey Lib "advapi32.dll" Alias "RegCreateKeyA"(ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
关闭已经打开的注册表主键的RegClose函数:
Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
设置注册表指定键名的数值的RegQueryValueEx函数:
Declare Function RegSetValueEx Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long,lpData As Any, ByVal cbData As Long) As Long
还有一种办法就是用专门的ODBC API函数来设置数据源。在Windows系统目录的动态链接库Odbcinst.dll中,提供了一个可以动态地增加、删除和修改数据源的函数“SQLConfigDataSource”。微软在MSDN的帮助文档中提供了对该函数的详细使用说明。这种程序比较简单,但需要比较专业的知识。由于版面限制,我在这里就不多加说明,我的范例程序在http://paladin.nease.net/cpcw/salon/09/odbc.zip提供下载。