忙完啦,这几天的时间表



这一周简直过的不是人过的日子啊…………………………..


时间表回顾,留念


7月6日、7日、8日 一刻不停地写C#大作业,因为10号要交


7月9日 早上考中国近现代史,下午接着写C#,到11点才完成,接着复习到1点半


7月10日 早上考专业英语阅读与交流,下午写C#大作业报告,做演示录像,6点半完成,晚上写JAVA大作业报告


7月11日 全天写JAVA大作业报告,因为涉及的内容比较多,12日交


7月12日 早上等小组其他成员的报告完成,10点检查大作业,检查到下午2点完成,3点开始考英语到5点结束,6点半开始复习自动识别技术到2点


7月13日 早上7点起来继续复习自动识别,8点半开考,10点半结束后立即复习操作系统原理与UNIX,下午3点考UNIX到5点,晚上写专业实践报告


7月14日 坐在这里感叹这周真不是人过的日子,还好已经结束了,还有一门网络原理考试就全完了…………………….

最好的60个国外壁纸网站



收藏,呵呵

原创壁纸

多为1600×1200 Aeiko.net MoodFlow
End Effect
DJ-Designs
Bitaites.org
Wooden Fish
ocksoff.co.uk
Plog
壁纸
Digital Blasphemy
多为1280×1024 Neon Sight Japan Souldcore
多为1024×768 Wallpaper Joe
超高分辨率
VladStudio.com GypySpaceMuffin
RealityDreamShip
各种分辨率
Hebus.com PimpMyDesk
Klowner’s
壁纸

多种类别

超高分辨率
InterfaceList
MacDesktops
Wallpaper Stock
Pixelgirl Presents Quality
壁纸
多为 1152×864 Balta.ikk.sztaki.hu
各种分辨率
Looroll
DeviantArt
Shadowness
Free Wallpaper
Free Digital Wallpaper
多为1024×768 Mapa.co.kr
GetSkinned
Groovy Screens

大量壁纸

多为1600×1200 Shifted Reality
高分辨率
Wikipedia
Club VAIO
WinModify.com
各种分辨率
ThemeXP
Webshots
CrystakXP
KDE-Look.org
Customize.org
WinCustomize.com

汽车壁纸

Streat Dream
多为1280×960
NetCarShow
多为1600×1200
Exotic
汽车壁纸
超高分辨率
Desktop Machine
汽车、美女、影视等, 超高分辨率

其他分类壁纸

3couleurs firefox
壁纸, 多为1600×1200
9x Media
多显示器用, 高分辨率
BellaDonna
美女壁纸, high 分辨率
Desktop Girls
美女壁纸, high 分辨率
Brodyaga
欧洲城市
壁纸, 多为1024×768
WStaylor.net windows
壁纸, 各种分辨率
Gamer
壁纸
游戏壁纸, 超高分辨率
Michael Swanson’s Blog
多为鲜花, 超高分辨率
Arkhipov.com vista,
鲜花壁纸, 超高分辨率


终于把C#大作业搞完了



算起来少说做了也有一周了,这次的工程真是大啊,写完了才发现自己竟然真的完成了它,而且比当初的设计还要好。


真的是感谢 .NET 平台的方便,这次的期末作业涉及到图形化界面的设计、数据库操作、托盘程序的编写、基于Socket通讯的C/S结构程序、多线程程序的编写、注册表修改。如果不是用 .NET 平台,用C#编写,真不知道什么时候才能完成这个程序。而利用 .NET 平台,我们只用了约一周时间就完成了它,而且很完善。


说实话这是我第一次正式的写有GUI的实用的程序,以前不是控制台就是写个小Toy玩一下,正式的像这样写我还是第一次。虽然没有系统的学习过图形化程序的编写,但有了这次的经历我相信编写图形化程序对我来说已不是什么难题。特别是在编写了托盘程序後,更有这样的感觉。


最近没有时间作总结,在期末考试。等考试结束了,这次的经验一定要好好总结一下。有太多的经验和教训了,走了不少弯路,但同时学到了很多的东西,更做出了连自己都感到高兴的成果。真的好好庆祝一下。


Celebrate The Final Of This Project!!!

封闭式耳机初感

这是我第一次听封闭式耳机,还谈不上什么经验,只是感觉而已。

用的是SENNHEISER大名鼎鼎的PX200 Bass加强版,煲机两周,初具素质。


以前都是听开放式耳机,PX100,K24p之类的,先说一下感觉。这类耳机给我的感觉是开阔。没有将声音压在耳朵上的感觉,自然而舒适。而且个人感觉PX100,K24p的低音都很强。这无疑是音染,是厂商加在耳机上的噱头。初听感觉是震撼,但是听久了就没意思了。虽然这两款耳机的素质都不错,但隆隆的低音还是会掩盖细节。


再来说PX200,刚刚煲机两周。初听的时候感觉的确是"白开水"(大概煲机3-5天的时候),低音紧绷,没有上面两款开放式的震撼感觉,不过已经能听出它们的不同。用PX200,耳朵很容易捕捉到以前忽略的细节,绝对是一种新的感受。随着耳机逐渐的煲开,封闭式的特点就能听到了。在"开阔"上和前两者是没法相比的,但这并不代表PX200不"宽阔"。声音被PX200限制在耳机外壳和你的鼓膜之间,带来的感觉似是在一个适中的房间中听音乐。声音的震动被完全展现,低音带来的感觉不是震撼,而是震动,每当用PX100或是K24p听来隆隆的低音到来时,PX200给人的感觉是稍显紧绷,细节明显和整个耳机的震动。这种方式绝对会带给你对低音新的认识。

反病毒常用工具及免费多引擎检测网站



转自:http://www.ljack.com.cn


以下绝大部分工具都收集于网上,如果涉及到版权,请告之~下载后尽量用杀软进行扫描
杀毒前需要做的准备工作:1、断网 2、尽可能关闭所运行的程序,比如IE浏览器等 3、注意备份


部分免费反流氓软件下载及简单介绍

几个多引擎杀软检测样本的网站
进入免费检测网站之一
进入免费检测网站之二
进入免费检测网站之三

Hijackthis扫描工具
点击下载Hijackthis

SREng扫描工具
SREng官方下载页面
SReng扫描工具使用教程

Killbox强力删除工具
killbox下载

Unlocker强力卸载删除工具
Unlocker下载
Unlocker使用说明帮助教程

冰刃IceSword下载及使用帮助
冰刃IceSword作者网站及下载地址
杀毒辅助工具冰刃IceSword的基本操作
杀毒辅助工具冰刃IceSword详细介绍

Procexp进程管理工具
Process Explorer微软官方下载页面

Autoruns启动项管理工具
Autoruns微软官方下载页面

修复文件关联小批处理
点击下载小批处理

修复启动组
点击下载小批处理

常见注册命令
点击下载小批处理

XPSP2无法进入安全模式
点击下载

LSPfix修复工具
点击下载

关闭潜在威胁端口的小工具
点击下载

显示所有隐藏文件
显示所有无法被显示的隐藏文件

光华小工具
解决注册表禁用、任务管理器禁用等非常实用的小工具

SSM(System Safety Monitor)安全防护及处理工具
SSM官方下载页面
SSM使用帮助教程

SREng 日志分析方法



---------------------------------
teYqiu【天下无毒】原创文章,转载请标明。http://hi.baidu.com/teyqiu
百度知道反病毒知识专家崔衍渠 授权。
---------------------------------


转载说明:本贴参考了自水木社区病毒版版主sihecun的精华区总结,为谢。
http://www.newsmth.net 水木社区
http://hi.baidu.com/teyqiu teyqiu【天下无毒】


部分修改。

前言:免责声明:以下总结系私人经验之总结,由此造成的任何后果不负责任。



系统分析是一项纷繁复杂的工作,需要大胆和心细(例如注意数字 1 和字母l的微小的区别,字母o p q的o与数字0 1 2的0的区别等等),刚开始学习的朋友会感到有很多困难,要多借助搜索引擎(推荐google.com !!!baidu.com就算了。不要跟我争这个)


要随时关注目前流行病毒的行情(例如看到rundll32.exe 基本上就可以判定是威金等)刚开始的时候可能会有困难,应静下心来好好研究,等你练到一目N行的时候,基本上就略有小成了。经验的积累也十分的重要!


跟大家一起探讨。 (崔衍渠)


【主要链接】
SREng最新版用法 http://hi.baidu.com/teyqiu/blog/item/f706213fc52346ec54e72351.html
包括SRENG的软件下载、如果获得日志、如何删除问题项的图解。


一、SREng 启动项目 注册表 分析方法


对应的注册表位置在log中可以看到
熟悉常见项,主要包括输入法、音频视频应用程序、杀毒软件、安装的应用软件等
每个进程后有公司名属性,可以辅助辨别
对于不确认的进程 google

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run]
[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run]
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce]
[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnce]
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunServices]
[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServices]
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunServicesOnce]
[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServicesOnce]
[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunOnceEx]
以上需要具体分析
[HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows]
<load><> []
<run><> []
以上2个位置 如果加载了进程,通常是问题项
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run]
[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer
\Run]
以上2个位置 如果加载了进程,通常是问题项
[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Winlogon]
<shell><Explorer.exe> [Microsoft Corporation]
<Userinit><C:\WINDOWS\system32\userinit.exe,> [Microsoft Corporation] 逗号不可省略。
如果是NT系统(如win2000),相应路径为 C:\WINNT 不再累述。


[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Windows]
<AppInit_DLLs><> []
[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Winlogon]
<UIHost><logonui.exe> [Microsoft Corporation]
以上4个位置如果和默认的有区别,通常是可疑项
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\ShellServiceObjectDelayLoad]
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellExecuteHooks]
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\SharedTaskScheduler]
以上3个位置如果有加载项(除了第二个位置加载瑞星防病毒软件),通常是问题项


二、 SREng — 启动文件夹


对应以下2个位置
Startup: c:\documents and settings*USERNAME\「开始」菜单\程序\启动


(Username为具体的用户名,例如 teyqiu, 王小丫 之类的)


Global Startup: c:\documents and settings\All Users\「开始」菜单\程序\启动

常见问题项:
[IE-Bar]
<C:\Documents and Settings\All Users\Start Menu\Programs\Startup\IE-Bar.lnk>
<N>


三、SREng服务的分析方法


对应注册表位置如下:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services

服务后有公司属性,辅助分析,有假冒公司属性的服务需要注意
服务对应的文件位于windows下的要注意
不确认的google


不过有些没公司属性的也没问题 常见的有 要强记!别误删。


[Secdrv / Secdrv]
<system32\DRIVERS\secdrv.sys><N/A>



[TSP / TSP]
<\??\C:\WINDOWS\system32\drivers\klif.sys><N/A> 卡巴斯基


常见的问题项:
灰鸽子
[Performance Moniter / BARCASE]
<C:\WINDOWS\SYSTEM32\RUNDLL32.EXE C:\WINDOWS\SYSTEM32\WBEM*
IRJIT.DLL,Export
1087><N/A>
[JMediaService / JMediaService]
<C:\WINNT\system32\rundll32.exe C:\PROGRA~1\MMSASS~1\MMSSVER.DLL,Service><N/A>
[StdService / StdService]
<C:\WINNT\system32\rundll32.exe C:\WINNT\System32\STDSVER.DLL,Service><N/A>
[VIPTray / VIPTray]
<C:\WINDOWS\System32\VIPTray.exe><N/A>
[WinWrCup / WinWrCup]
<C:\WINNT\wincup\wincup.exe -R><MsWinCup>
[WinKld / WinKld]
<C:\WINDOWS\System32\RunDLL32.exe "C:\PROGRA~1\winkld\winkld.dll",Run -r><N/A>
[wint / wint]
<C:\WINDOWS\System32\RunDLL32.exe "C:\PROGRA~1\wint\wint.dll",Run -r><N/A>
[WinkldUP / WinkldUP]
<C:\DOCUME~1\wq\LOCALS~1\Temp\wz\wz.exe -R><N/A>
[XDownloadService / XDownloadService]
<C:\WINDOWS\system32\Rundll32.exe "C:\WINDOWS\Downloader.dll",Run><N/A>



[Server Advance / ServerAC] <C:\WINDOWS\System32\Security.exe><N/A>
[Windows DHCP Service / WinDHCPsvc]
<C:\WINDOWS\System32\rundll32.exe
windhcp.ocx,start><Microsoft Corporation>
此处省略路径的为 C:\WINDOWS\System32\windhcp.ocx

[WinXP DHCP Service / WinXPDHCPsvc]

<C:\WINDOWS\System32\rundll32.exe
xpdhcp.dll,start><Microsoft Corporation>
此处省略路径的为 C:\WINDOWS\System32\windhcp.dll

—驱动的分析与服务类似 注意最近的飘雪等双驱动的案例。



四、 SREng 浏览器加载项 分析方法


对应hijackhtis的02、03、08、09、016项,可以用hijackthis辅助分析
最近出现假冒microsoft和macromedia的项


五、SREng 正在运行的进程 分析方法


注意**没有公司名字属性【显示为 N/A 】的exe文件,不确认的 google
没公司属性(或者说显示不出来)但是却是正常文件的也有 例如
[C:\WINDOWS\system32\msdmo.dll] [N/A, N/A] 要强记!


注意exe文件调用的dll文件,对于不确认的dll文件 google


有公司属性的也要注意分析是否是冒牌货,如最近的飘雪等动不动就冒充Microsoft Corporation。。。。


六、SREng 文件关联 分析方法


SREng提示的error项,通常需要修复
例外:关联的应用程序是自己安装的


七、SREng Winsock 提供者 分析方法


用检测到的文件google
修复方法及常见的问题文件参考《hijackthis的010项修复方法》


附:《hijackthis的010项修复方法》


HijackThis日志细解正文(十四):组别——O10

www.rising.com.cn 2004-8-5 15:09:00 信息源:瑞星社区 作者:风之咏者

1. 项目说明

O10项提示Winsock LSP(Layered Service Provider)"浏览器劫持"。某些间谍软件会修改Winsock 2的设置,进行LSP"浏览器劫持",所有与网络交换的信息都要通过这些间谍软件,从而使得它们可以监控使用者的信息。著名的如New.Net插件或WebHancer组件,它们是安装一些软件时带来的你不想要的东西。相关的中文信息可参考——
http://tech.sina.com.cn/c/2001-11-19/7274.html

2. 举例

O10 - Hijacked Internet access by New.Net
这是被广告程序New.Net劫持的症状(可以通过"控制面板——添加删除"来卸载)。
O10 - Broken Internet access because of LSP provider c:\progra~1\common~2\toolbar\cnmib.dll missing
这一般出现在已清除间谍软件但没有恢复LSP正常状态的情况下。此时,网络连接可能丢失。
O10 - Unknown file in Winsock LSP: c:\program files\newton knows\vmain.dll
这是被广告程序newtonknows劫持的症状,相关信息可参考http://www.pestpatrol.com/PestInfo/n/newtonknows.asp

3. 一般建议

一定要注意,由于LSP的特殊性,单单清除间谍软件而不恢复LSP的正常状态很可能会导致无法连通网络!如果您使用杀毒软件清除间谍程序,可能遇到如上面第二个例子的情况,此时可能无法上网。有时HijackThis在O10项报告网络连接破坏,但其实仍旧可以连通,不过无论如何,修复O10项时一定要小心。

遇到O10项需要修复时,建议使用专门工具修复。

(1)LSPFix http://www.cexx.org/lspfix.htm

(2)Spybot-Search&Destroy(上面提到过,但一定要使用最新版)

这两个工具都可以修复此问题,请进一步参考相关教程。

4. 疑难解析

某些正常合法程序(特别是一些杀毒软件)也会在Winsock水平工作。比如
O10 - Unknown file in Winsock LSP: c:\windows\system32\kvwsp.dll

这一项就属于国产杀毒软件KV。所以,在O10项遇到"Unknown file in Winsock LSP"一定要先查询一下,不要一概修复。


---------------------------------
teYqiu【天下无毒】原创文章,转载请标明。http://hi.baidu.com/teyqiu
百度知道反病毒知识专家崔衍渠 授权。
---------------------------------

[原] JDBC连接SQL server 2005 全过程



在网上查找了半天,没有找到完整的例子和过程介绍,在这里汇总一下。

在开始之前,我要说的是如果你有不明白的地方请查找SQL JDBC Driver压缩包中提供的help,双击default查看。

我使用的环境:SQL Server 2005 Express Edition ; Eclipse 3.2.2 + MyEclipse 5.1.1

1.
下载Microsoft SQL Server 2005 JDBC 驱动程序
[<span style="font-family:微软雅黑;">点击下载Microsoft SQL Server 2005 JDBC 驱动程序1.0.809.102 for SQL Server 2005简体中文版</span>](http://download.microsoft.com/download/1/c/a/1cae7cc0-c010-4e0c-b1b8-7915360ee0b9/sqljdbc_1.0.809.102_chs.exe)<span style="font-family:微软雅黑;">
            </span>
  1. 安装JDBC驱动。

    解压下载的驱动程序,默认生成一个目录(Microsoft SQL Server 2005 JDBC Driver),将此目录复制到C:\Program Files\目录下;

在系统环境变量中设置Classpath路径,添加: C:\Program Files\Microsoft SQL Server 2005 JDBC Driver\sqljdbc_1.0\chs\sqljdbc.jar

注意:若CLASSPATH中有其他值,注意添加时应用 ; 分隔

  1. 配置Microsoft SQL Server 2005

    若安装时选择使用Windows帐户登录SQL Server,那么首先要打开sa账户。

使用Manager Studio连接SQL Server,在数据库服务器图标(左侧树状图最顶端)点右键,选择属性,选择弹出对话框中左侧的安全性,使用SQL Server和Windows身份验证模式 。 关闭该对话框。

展开左侧树状图中 安全性,展开 登录名,配置sa帐户的属性,为sa重设密码。并将sa的 状态(弹出对话框左侧最下面)中的 登录 设为启用。

点击确定保存设置。

配置SQL Server Configuration Manager(配置管理器)。

选择 SQL Server 2005 网络配置 中的 SQLEXPRESS的协议 ,启用 TCP/IP 协议。

SQL Server 2005 服务 中 重启所有服务。

选择 SQL Server 2005 网络配置 中的 SQLEXPRESS的协议 ,双击 TCP/IP ,在IP地址 页中设置TCP动态端口为1433(此为SQL Server默认端口,当然可以使用其它的,但在后面连接时须说明)

SQL Server 2005 服务 中 重启所有服务。

  1. 使用Eclipse创建连接数据库的Project

    打开Eclipse3.21,创建Project

在需要连接SQL Server 2005的Project上点右键,选择Properties

选择Java Bulid Path,选择Libraries,Add External JAR,添加C:\Program Files\Microsoft SQL Server 2005 JDBC Driver\sqljdbc_1.0\chs\sqljdbc.jar

  1. 测试是否成功

    在上一步创建的Project中创建Class名为SQLtest,并执行以下代码(注意代码中的注释,需要进行修改)

import java.sql.*;

class SQLtest

{

public static void main(String args[]) throws InstantiationException, IllegalAccessException, SQLException

{

String classdriver="com.microsoft.sqlserver.jdbc.SQLServerDriver";

try{

Class.forName(classdriver).newInstance();

}catch(ClassNotFoundException e){

System.out.println("连接数据库失败");

}

String url="jdbc:sqlserver://localhost:1433;DatabaseName=ATM_DB"; //localhost后的冒号后跟你第3步中设置的端口号,DatabaseName=你要连接的数据库名称,如master

String user="sa";

String password="*";//sa的密码

Connection con=null;

Statement stmt=null;

ResultSet rs=null;

try{

con=DriverManager.getConnection(url,user,password);

stmt=con.createStatement();

rs=stmt.executeQuery("select * from dbo.Cards"); //数据库中待操作的表名称

while(rs.next())

{

System.out.println(rs.getString("Card_ID") + ", " + rs.getString("Passwd")); //待操作表的列名

}

}catch(SQLException e)

{

System.out.println("用户没有连接上去!");

}finally{

rs.close();

stmt.close();

con.close();

}

}

}

注意:如有不明白的部分参照SQL JDBC Driver压缩包中提供的help,SQL语句的具体使用也请参照

噩梦啊,Oh My God!!!



今天提交JAVA作业的时候才发现,那个JAVA课的老师在原来订的作业表里加了一个作业,搞得我从作业6开始往后的全部交错了………………………


噩梦啊………………………………

今天心情好,顺便给异常处理做一个简单小结吧

其实我对异常处理还是个门外汉,毕竟在我的学习中编的一些 Toy Program 都太小,不太用得到Exception。但它毕竟很重要,在大型的、复杂的、工程化的程序编写中重要性可想而知。总结一点从网上得到的经验。

1. 异常处理相对于返回错误代码的一个最大优点在于,异常可以被自动传递,这样,在编程时异常更加难以被忽视。

  • 通常,只在最上层(一般是UI层)捕捉异常。如果要在其它层捕捉异常,除非是下列情况之一:
    (1)能够处理该异常,或者
    (2)能够忽略该异常,或者
    (3)需要转换该异常为其它特定异常后抛出新异常

  • UI层捕获异常后,可以
    (1)将无关紧要的异常忽略。
    (2)将异常转换为错误信息展现给用户。
    (3)如果是重大异常,可以考虑终止应用程序。

  • 最上层(一般是UI层)不得抛出新的异常;最上层需要捕捉所有异常,否则异常会直接导致程序终止,这将是非常不好的用户体验。
  • 可以在非最上层抛出自定义异常。如果是自定义异常,请保证其是可序列化的,并且保证其实现了Exception的三个构造函数。
  • 异常的抛出与截获需要很多的cpu时间,请谨慎的使用异常。
  • 在可能抛出异常的地方,如果需要,请确保使用finally进行资源清理,而无论此处是否捕捉了异常。
  • 在一个catch块中的代码都应该至少部分地处理了所捕捉的异常。否则,就不要使用catch块。
  • 从构造函数中抛出异常。
    因为构造函数没有返回值,所以没有简单的方法来想构造函数的调用者发出构造失败的信号,这时便可以通过抛出异常来做到。比如构造参数与指定条件不符时,就抛出一个异常。

  • 在以上前提的保证下,可以在非最上层使用AOP截获(intercept)异常而进行日志记录,这样通过日志记录,我们可以了解系统的 运行状态。记不起在哪里看到过这样一句话:在软件实现中,异常和日志都是重要的质量保证手段,异常和日志总是同时出现的。可以说,异常是日志记录的重要/主要组成部分。

    以上是CSDN的大侠zhuweisky总结的,我觉得对于我这种菜鸟级的来说是很值得学习的东西。毕竟我们平常太少用到异常处理,依照这样的原则来写异常处理不至于走太多弯路。

  • 通宵实验结束了..........终于结束了



    奋战一晚上,把这学期的C#实验全部搞定了。刚刚提交完实验,从实验室出来时间只有一种隔世为人的感觉………….

    几个实验里最难的是一个文档分析的程序,可以进行文档的关键词搜索,并支持通过对Key Word添加逻辑符号进行搜索的方式。做完了这个突然有一种编搜索引擎的冲动 >_< 呵呵…………..

    其实现在想起来挺笨的,最多的时间花在了对表达式的解析上,应该使用数据结构中的模式匹配来做比较简单,虽然用到了栈结构,但毕竟是现成的拿来就能用。最后我还是用了比较复杂的递归算法,现在是能满足实验要求了,但在复杂度上还有很多问题。贴在这里留个纪念吧…………….

    class
    OPTs


    {

    public
    static
    ArrayList ReadFile(String input)


    {

    //读文件并返回字典


    ArrayList text = new
    ArrayList();


    String text_line;

    int totalLength = 0;

    StreamReader freader = File.OpenText(input);

    Console.WriteLine("Reading {0} – please wait !", input);

    while ((text_line = freader.ReadLine()) != null)

    {

    if (text_line.Length == 0)

    continue;

    text.Add(text_line);

    totalLength += text_line.Length;

    }

    freader.Close();

    Console.WriteLine("Reading {0} – OK, done !", input);

    Console.WriteLine("\nThe text file {0}\n contains {1} lines in {2} bytes.\n", input, text.Count, totalLength);

    Console.WriteLine("entering text into dictionary – please wait !");

    return text;

    }

    public
    static
    void GetQuery(/String input/)


    {

    //导入字典


    ArrayList dictionary = new
    ArrayList();


    String input = "F:/alice_emma.txt";

    dictionary = ReadFile(input); //读文件


    Console.WriteLine("entering text into dictionary – OK, done !");

    //取得要求


    String TheQuery;

    do

    { //循环区的需求式


    Console.Write("\nPlease enter a query or ‘q’ to Quit : ");

    TheQuery = Console.ReadLine();

    TheQuery.ToLower();

    if (!TheQuery.Equals("q"))

    analyse(TheQuery, dictionary);

    }

    while (!TheQuery.Equals("q"));

    }

    public
    static
    void analyse(String TheQuery, ArrayList dictionary)


    {

    //分析需求,调整顺序,显示查询结果


    String[] queryelement = TheQuery.Split(‘ ‘);

    Query result; //结果Query

    String[] queryelement_turn = new
    String[queryelement.Length];


    for (int a = 0; a < queryelement.Length; a++) // 为后面的递归分析做准备,反向需求式


    queryelement_turn[queryelement.Length - 1 - a] = queryelement[a];

    for (int a = 0; a < queryelement.Length; a++)

    {

    if (queryelement_turn[a] == "!")

    {

    queryelement_turn[a] = queryelement_turn[a - 1];

    queryelement_turn[a - 1] = "!";

    }

    if (queryelement_turn[a] == "(")

    queryelement_turn[a] = ")";

    else
    if (queryelement_turn[a] == ")")


    queryelement_turn[a] = "(";

    }

    result = done(queryelement_turn, dictionary, 0);

    result.eval(); //Query计算结果


    result.display(); //Query显示


    Console.WriteLine("");

    foreach(Object i in result.Solution) //显示句子


    Console.WriteLine("[" + ( (int)i + 1 ) + "]: " + dictionary[ (int)i ] );

    }

    public
    static
    Query done(String[] queryelement, ArrayList dictionary, int now) //
    递归分析需求式


    {

    Query result = null;

    int i = now;

    switch (queryelement[i])

    { //依据不同的判断结果构造NEW语句


    case
    "!":


    if (i + 1 == queryelement.Length - 1 || queryelement[i + 2] == ")")

    result = new
    NotQuery(new
    NameQuery(queryelement[i + 1], dictionary), dictionary);


    else
    if (queryelement[i + 1] == "(")


    {

    if (searchbracketmatch(queryelement, i) == (queryelement.Length - 1))

    result = new
    NotQuery(done(queryelement, dictionary, i + 1), dictionary);


    else
    if (queryelement[searchbracketmatch(queryelement, i) + 1] == "||")


    result = new
    OrQuery(new
    NotQuery(done(queryelement, dictionary, i + 1), dictionary)


    , done(queryelement, dictionary, searchbracketmatch(queryelement, i) + 2), dictionary);

    else
    if (queryelement[searchbracketmatch(queryelement, i) + 1] == "&&")


    result = new
    AndQuery(new
    NotQuery(done(queryelement, dictionary, i + 1), dictionary)


    , done(queryelement, dictionary, searchbracketmatch(queryelement, i) + 2), dictionary);

    }

    else
    if (queryelement[i + 2] == "||")


    result = new
    OrQuery(new
    NotQuery(new
    NameQuery(queryelement[i + 1],dictionary), dictionary)


    , done(queryelement, dictionary, i + 3), dictionary);

    else
    if (queryelement[i + 2] == "&&")


    result = new
    AndQuery(new
    NotQuery(new
    NameQuery(queryelement[i + 1], dictionary), dictionary)


    , done(queryelement, dictionary, i + 3), dictionary);

    break;

    case
    "(":


    if (searchbracketmatch(queryelement, i) == (queryelement.Length - 1))

    result = done(queryelement, dictionary, i + 1);

    else
    if (queryelement[searchbracketmatch(queryelement, i) + 1] == "||")


    result = new
    OrQuery(done(queryelement, dictionary, i + 1)


    , done(queryelement, dictionary, searchbracketmatch(queryelement, i) + 2), dictionary);

    else
    if (queryelement[searchbracketmatch(queryelement, i) + 1] == "&&")


    result = new
    AndQuery(done(queryelement, dictionary, i + 1)


    , done(queryelement, dictionary, searchbracketmatch(queryelement, i) + 2), dictionary);

    break;

    default:

    if (i == (queryelement.Length - 1) || queryelement[i + 1] == ")")

    result = new
    NameQuery(queryelement[i], dictionary);


    else
    if (queryelement[i + 1] == "||")


    result = new
    OrQuery(new
    NameQuery(queryelement[i], dictionary)


    , done(queryelement, dictionary, i + 2), dictionary);

    else
    if (queryelement[i + 1] == "&&")


    result = new
    AndQuery(new
    NameQuery(queryelement[i], dictionary)


    , done(queryelement, dictionary, i + 2), dictionary);

    break;

    }

    return result; //返回生成的Query

    }

    public
    static
    int searchbracketmatch(String[] queryelement, int now)


    { //查询括号匹配函数


    int leftbracket = 1;

    int rightbracket = 0;

    int i = 0;

    for (i = now + 1; i < queryelement.Length; i++)

    {

    if (queryelement[i] == "(")

    leftbracket++;

    else
    if (queryelement[i] == ")")


    rightbracket++;

    if (leftbracket == rightbracket)

    break;

    }

    return i; //返回对应括号在数组中的位置


    }

    }

    现在看递归的部分简直像是rubbish啊,臃肿又难以理解。不过这个程序让我第一次体会到了面向对象编程的巨大优势,那就是多态。在程序中我不需要知道那些Objects具体是什么类型,只要用它们的基类来指向它们,并应用基类中定义的methods,不用管那么多,反正编译器回自己判断我调用的是什么类型,它是否重载了我所调用的method………….