博文
2005图灵奖获得者产生(2006-03-04 00:39:00)
摘要:2005图灵奖获得者产生 Peter Naur因Algol 60语言获奖
2006.03.03 来自:acm.org
3月1日,ACM(美国计算机学会)决定将2005年图灵奖颁发给Peter Naur,以表彰他在设计Algol 60语言上的贡献。由于其定义的清晰性,Algol 60成为了许多现代程序设计语言的原型。在语法描述中广泛使用的BNF范式,其中的“N”便是来自Peter Naur的名字。图灵奖被称为“计算科学界的诺贝尔奖”,它创立于1960年,现在的奖金10万美元,由Intel公司赞助。
详见:
http://campus.acm.org/public/pressroom/press_releases/3_2006/turing_3_01_2006.cfm......
一个java布局管理的小程序(2006-02-16 16:38:00)
摘要:import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class LoginDialog extends JFrame{
/**
* Method main
*
*
* @param args
*
*/
JButton b = new JButton("click me");
JPanel p = new JPanel();
public static void main(String[] args) {
// TODO: Add your code here
LoginDialog frame = new LoginDialog();
}
/**
* Method LoginDialog
*
*
*/
public LoginDialog() {
// TODO: Add your code here
final JFrame frame = this;
this.getContentPane().add(p,BorderLayout.SOUTH);
p.add(b);
b.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
showLoginDialog(frame);
}
&nbs......
工作分配问题(2005-12-01 11:30:00)
摘要:【试验题目】
工作分配问题。设有n件工作要分配给n个不同的人去完成。将工作i分配给第j个人所需要花费的费用为Cij。设计一个算法,为每个人都分配一件不同的工作,并使总费用达到最小。
【程序代码】
#include<iostream>
#include<ctime>
#include<iomanip>
using namespace std;
void Swap(int &x,int &y);
class WorkAssignment
{
friend void WorkAsmt(int **c,int n,int *bestx);
private:
void Backtrack(int i);
int **c,//个作业所需要的处理时间
*x,//当前作业调度
*bestx,//当前最优分配
best,//当前最优值
n,//作业数
cx;//当前值
};
//回溯
void WorkAssignment::Backtrack(int i)
{
if(i......
0—1背包问题的回溯法(2005-11-27 01:23:00)
摘要:【实验目的】
学习掌握回溯算法。
【实验内容】
用回溯法求解0—1背包问题,并输出问题的最优解。0—1背包问题描述如下:
给定n种物品和一背包。物品i的重量是Wi,其价值为Vi,背包的容量是c,问应如何选择装入背包中的物品,使得装入背包中物品的总价值最大。
【实验条件】
Microsoft Visual C++ 6.0
【需求分析】
对于给定n种物品和一背包。在容量最大值固定的情况下,要求装入的物品价值最大化。
【设计原理】
一、回溯法:
回溯法是一个既带有系统性又带有跳跃性的的搜索算法。它在包含问题的所有解的解空间树中,按照深度优先的策略,从根结点出发搜索解空间树。算法搜索至解空间树的任一结点时,总是先判断该结点是否肯定不包含问题的解。如果肯定不包含,则跳过对以该结点为根的子树的系统搜索,逐层向其祖先结点回溯。否则,进入该子树,继续按深度优先的策略进行搜索。回溯法在用来求问题的所有解时,要回溯到根,且根结点的所有子树都已被搜索遍才结束。而回溯法在用来求问题的任一解时,只要搜索到问题的一个解就可以结束。这种以深度优先的方式系统地搜索问题的解的算法称为回溯法,它适用于解一些组合数较大的问题。
二、算法框架:
1、问题的解空间:应用回溯法解问题时,首先应明确定义问题的解空间。问题的解空间应到少包含问题的一个(最优)解。
2、回溯法的基本思想:确定了解空间的组织结构后,回溯法就从开始结点(根结点)出发,以深度优先的方式搜索整个解空间。这个开始结点就成为一个活结点,同时也成为当前的扩展结点。在当前的扩展结点处,搜索向纵深方向移至一个新结点。这个新结点就成为一个新的活结点,并成为当前扩展结点。如果在当前的扩展结点处不能再向纵深方向移动,则当前扩展结点就成为死结点。换句话说,这个结点不再是一个活结点。此时,应往回移动(回溯)至最近的一个活结点处,并使这个活结点成为当前的扩展结点。回溯法即以这种工作方式递归地在解空间中搜索,直至找到所要求的解或解空间中已没有活结点时为止。
运用回溯法解题通常包含以下三个步骤:
(1)针对所给问题,定义问题的解空间;
(2)确定易于搜索的解空间结构;
(3)以深度优先的方式搜索解空间,并且在搜索过程中用......
[转]Java初学者常用开发工具介绍图解 (2005-11-26 02:29:00)
摘要:Java的应用越来越广泛,学习Java的人也越来越多。学过程序设计的人知道,使用Basic进行程序设计,可以使用QBasic、Visual Basic等开发工具;使用C语言进行程序设计,可以使用Turbo C、Visual C++、C++ Builder等开发工具。这些开发工具集成了编辑器和编译器,是集成开发工具,很方便使用。学习Java程序设计,同样需要方便易用的开发工具。
Java的开发工具很多,而且各有优缺点,初学者往往不知道有哪些常用的开发工具,或者由于面临的选择比较多而产生困惑。本文对初学者常使用的Java开发工具作一介绍,有助于初学者了解Java常用开发工具并做出选择。
要建立Java开发环境,离不开Sun的JAVA2 SDK。1998年12月Sun公司发布了Java Software Development Kit(简称JAVA2 SDK),目前的最新版本是J2sdk-1.4.2.05。可在http://Java.sun.com下载。根据运行平台的不同,下载相应的版本并设置好PATH和CLASSPATH。这个软件包提供了Java编译器、Java解释器,但没有提供Java编辑器,因此需要使用者自己选择一个方便易用的编辑器或集成开发工具。下面就介绍几种适合初学者适用的Java开发工具。
一、UltraEdit
UltraEdit是共享软件,它的官方网址是:www.ultraedit.com 。最新版本是V10.20b。它是一个功能强大的文本、HTML、程序源代码编辑器。作为源代码编辑器,它的默认配置可以对C/C++, VB, HTML, Java和 Perl进行语法着色。
用它设计Java程序时,可以对Java的关键词进行识别并着色,方便了Java程序设计。它具有完备的复制、粘贴、剪切、查找、替换、格式控制等编辑功能。可以在Advanced菜单的Tool Configuration 菜单项配置好Java的编译器Javac和解释器Java,直接编译运行Java程序。
配置Javac:在Command Line里输入:D:\jsp\j2sdk\bin\Javac %f,这里Javac的路径要根据JDK的实际安装路径来指定,%f是指当前活动文档的全文件名。在Menu Item N......
[转]每个初学者都应该搞懂的问题系列之二 (2005-11-26 02:25:00)
摘要:问题四:final关键字到底修饰了什么?
final使得被修饰的变量"不变",但是由于对象型变量的本质是“引用”,使得“不变”也有了两种含义:引用本身的不变,和引用指向的对象不变。引用本身的不变:
final StringBuffer a=new
StringBuffer("immutable");
final StringBuffer b=new
StringBuffer("not immutable");
a=b;
//编译期错误
引用指向的对象不变:
final StringBuffer a=new
StringBuffer("immutable");
a.append(" broken!");
//编译通过
可见,final只对引用的“值”(也即它所指向的那个对象的内存地址)有效,它迫使引用只能指向初始指向的那个对象,改变它的指向会导致编译期错误。至于它所指向的对象的变化,final是不负责的。这很类似==操作符:==操作符只负责引用的“值”相等,至于这个地址所指向的对象内容是否相等,==操作符是不管的。
理解final问题有很重要的含义。许多程序漏洞都基于此----final只能保证引用永远指向固定对象,不能保证那个对象的状态不变。在多线程的操作中,一个对象会被多个线程共享或修改,一个线程对对象无意识的修改可能会导致另一个使用此对象的线程崩溃。一个错误的解决方法就是在此对象新建的时候把它声明为final,意图使得它“永远不变”。其实那是徒劳的。
问题五:到底要怎么样初始化!
本问题讨论变量的初始化,所以先来看一下Java中有哪些种类的变量。
1. 类的属性,或者叫值域
2. 方法里的局部变量
3. 方法的参数
对于第一种变量,Java虚拟机会自动进行初始化。如果给出了初始值,则初始化为该初始值。如果没有给出,则把它初始化为该类型变量的默认初始值。
int类型变量默认初始值为0
float类型变量默认初始值为0.0f <......
[转]每个初学者都应该搞懂的问题系列之一(2005-11-26 02:24:00)
摘要:问题一:我声明了什么!
String s = "Hello world!";
许多人都做过这样的事情,但是,我们到底声明了什么?回答通常是:一个String,内容是“Hello world!”。这样模糊的回答通常是概念不清的根源。如果要准确的回答,一半的人大概会回答错误。
这个语句声明的是一个指向对象的引用,名为“s”,可以指向类型为String的任何对象,目前指向"Hello world!"这个String类型的对象。这就是真正发生的事情。我们并没有声明一个String对象,我们只是声明了一个只能指向String对象的引用变量。所以,如果在刚才那句语句后面,如果再运行一句:
String string = s;
我们是声明了另外一个只能指向String对象的引用,名为string,并没有第二个对象产生,string还是指向原来那个对象,也就是,和s指向同一个对象。
问题二:"=="和equals方法究竟有什么区别?
==操作符专门用来比较变量的值是否相等。比较好理解的一点是:
int a=10;
int b=10;
则a==b将是true。
但不好理解的地方是:
String a=new String("foo");
String b=new String("foo");
则a==b将返回false。
根据前一帖说过,对象变量其实是一个引用,它们的值是指向对象所在的内存地址,而不是对象本身。a和b都使用了new操作符,意味着将在内存中产生两个内容为"foo"的字符串,既然是“两个”,它们自然位于不同的内存地址。a和b的值其实是两个不同的内存地址的值,所以使用"=="操作符,结果会是false。诚然,a和b所指的对象,它们的内容都是"foo",应该是“相等”,但是==操作符并不涉及到对象内容的比较。
对象内容的比较,正是equals方法做的事。
看一下Object对象的equals方法是如何实现的:
boolean equ......
[转]从C++到Java——理解面向对象的关键所在 (1)(2005-11-26 02:16:00)
摘要:Java在虚拟机上运行
Java源代码并不是被编译成为普通的机器代码。而是被翻译成为虚拟机可以执行的代码。一个Java解释器最终执行这些代码。这其中没有连接的过程;解释在需要的时候动态的加载一些类;
Java是完全面向对象的
Java是一种完全面向对象的语言。这意味着你对任何一个Java对象所做的动作都是通过一个方法实现的。第一点就是,再也没有没有主函数这样的孤立的东西了。取而代之的是,你必须开始用一个对象的看法看待一个程序,一个类的对象。但是这个对象又什么对象呢?大多数Java程序只是简单的通过继承Java基础类Object来实现所需要的东西,但是你可以通过创建程序基础类用于多个特性相似的应用程序来节省时间。
严格的面向对象的规定意味着理用原有的C/C++代码不可以直接不加改动的使用;系统调用也是这样的。C++中,你可以通过在C++正常的命名空间外声明extern"C"来使用原有的C的过程调用,包括系统调用。
在Java中,只有一个类似的安全回溯的方法,但是并不是十分简单的方法。你必须定义一个本地方法,其目的是为C语言提供接口,然后提供连接的介质。Java环境提供了完成这种任务的工具,但是整个过程和C++中提供的extern比微不足道,完成使用C++类的过程则更加复杂,因为这样会引入对C的借口和C函数和C++成员函数的问题。
幸运的是,许多常用的系统实用工具函数已经在系统类中的方法中提供出来,但是这些明显没有包含经过许多年来你所创建的那些类和过程。所以,在你需要的时候你应该去钻研一下。
Java中没有独立的头文件
在Java中,关于类的一切东西都被放到一个单独的文件中。方法的位置只可能在一个地方出现,一个方法的实现必须在它的定义过程中同时进行。这样做得优点是在实现程序的时候不容易因为文件的非同步错误而失败,或者获取到一个没有实现的声明。类的声明可以被Java解释器利用甚至是从一个编译过的单元中获取,所以不再需要有头文件,只要有编译过的文件。
这样做的缺点与我们编程的过程有关。许多C++程序员喜欢用头文件来代替文档。要看一个成员函数的接口参数,只需要看头文件中的声明即可。你可以经常的看头文件即可了解怎样去使用这个类。在Java中,没有这样的总......
[转]从C++到Java——理解面向对象的关键所在 (2)(2005-11-26 02:14:00)
摘要:Java限制了常量对象和方法
在C++中,你可以正式的声明一个函数参数或者函数返回值为const类型,这样可以有效的防止对参数或者返回值的不正当修改。另外,你可以声明一个成员函数为const,表明它不可以修改任何他操作的对象。
Java支持常量操作符,只读变量,这些通过final关键字实现。但是Java没有支持强制的使一个可写变量在函数传递、返回的过程中变为只读。或者定义一个不操作修改对象的常量方法。
在Java中,这个省略带来的影响和在C++中相比就非常小了,这很大程度上因为字符串变量和字符数组的不同,但是这也带来一个引起错误的隐患。特别地,没有办法检验一个方法是否可以改动对象。
Java没有指针
理解指针的概念是一个C或C++程序员最难应付的问题。指针也是错误产生的一大根源。Java中没有指针,对象的句柄直接作为参数传递,而不是传递指针。另外,你必须通过索引使用数组。这些都不是什么大问题。然而,没有指针是在写含有函数指针或者成员函数指针的系统的时候引起很大麻烦。这个问题在处理回调函数的时候更加显著。
Java没有参数化类型
参数化类型提供了用一段程序处理许多相似程序的方法。一个例子就是开平方根的方法,它可以对int或者float操作。在C++中,这一特性是由模板提供的。
Java中不包含C++中的模板的等价物。如果你经常使用模板来简化程序,比如说构造许多使用相似参数类型的函数,这简直就是灾难。这意味着更多使用复制、粘贴的过程来手动的完成。然而,如果你使用模板来生成类的话,没有简单的方法。
Java使用垃圾回收
在垃圾回收的语言中,运行时环境一直监测哪些内存不被使用。当一块内存不用的时候,系统自动的回收内存。比如说,一个对象在一个方法中生成,但是没有被调用着返回或者没有储存为全局变量,不能在方法外部使用。系统自己会知道哪些变量是你用不到的,哪些是可以用到的。因此,你不必再为破坏对象回收内存而担心。
在C++中,很多的调试时间都被使用到检查内存漏洞中。Java的这种方法很大程度上降低了这种错误的可能。但是他依然不能处理逻辑混乱的程序,他们不能够被回收。许多C++的类中的析构函数是用来释放对象引用的内存的。
J......
C++编程中的四个调试小技巧(2005-11-26 02:12:00)
摘要:1、调试标记
适用预处理#define定义一个或多个调试标记,在代码中把调试部分使用#ifdef和#endif进行管理。当程序最终调试完成后,只需要使用#undef标记,调试代码就会消失。常用的调试标记为DEBUG, 语句序列:
#define DEBUG
#ifdef DEBUG
调试代码
#endif
2、运行期间调试标记
在程序运行期间打开和关闭调试标记。通过设置一个调试bool标记可以实现。这对命令行运行的程序更为方便。例如下面代码:
#include<iostream>
#include <string>
using namespace std;
bool debug =false;
int main(int argc,char*argv[])
{
for(int i=0;i<argc;i++)
if(string(argv[i])==“--debug=on“)
debug = true;
bool go=true;
while(go)
{
if(debug)
{
调试代码
}else {}
}
}
3、把变量和表达式转换成字符串
可是使用字符串运算符来实现转换输出定义
#define PR(x) cout<<#x”=”<<x<<'\n'
4、c语言的assert()
该宏在中,,当使用assert时候,给他个参数,即一个判读为真的表达式。预处理器产生测试该断言的代码,如果断言不为真,则发出一个错误信息告诉断言是什么以及它失败一会,程序会终止。
#include< assert>
using namsapce std;
int main()
{
int i=100;
assert(i!=100);
//Fails
}
当调试完毕后在#include<assert&......