自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(0)
  • 资源 (29)
  • 收藏
  • 关注

空空如也

最新PHP中文手册7月1号php_manual_zh.part4.rar

在线手册:中文 英文PHP手册 最新PHP中文手册7月1号php_manual_zh.part1.rar 最新PHP中文手册7月1号php_manual_zh.part2.rar 最新PHP中文手册7月1号php_manual_zh.part3.rar 最新PHP中文手册7月1号php_manual_zh.part4.rar -------------------------------------------------------------------------------- PHP 手册-中文翻译补完计划by: Mehdi Achour Friedhelm Betz Antony Dovgal Nuno Lopes Hannes Magnusson Georg Richter Damien Seguy Jakub Vrana 其他贡献者 2011-07-01 Edited By: Philip Olson 中文翻译人员: 王远之 肖理达 肖盛文 黄啸宇 宋琪 陈伯乐 陈浩 陈岗 刘铭 洪建家 吴煊春 乔楚 © 1997-2011 PHP 文档组 ■版权信息 ■PHP 手册 ■序言 ■入门指引 ■简介 ■简明教程 ■安装与配置 ■安装前需要考虑的事项 ■Unix 系统下的安装 ■Mac OS X 系统下的安装 ■Windows 系统下的安装 ■Installation on Cloud Computing platforms ■FastCGI 进程管理器 (FPM) ■PECL 扩展库安装 ■还有问题? ■运行时配置 ■语言参考 ■基本语法 ■类型 ■变量 ■常量 ■表达式 ■运算符 ■控制结构 ■函数 ■类与对象 ■命名空间 ■异常处理 ■引用的解释 ■预定义变量 ■预定义异常 ■预定义接口 ■Context options and parameters ■Supported Protocols and Wrappers ■安全 ■简介 ■总则 ■以 CGI 模式安装时 ■以 Apache 模块安装时 ■文件系统安全 ■数据库安全 ■错误报告 ■使用 Register Globals ■用户提交的数据 ■魔术引号 ■隐藏 PHP ■保持更新 ■特点 ■用 PHP 进行 HTTP 认证 ■Cookie ■会话 ■处理 XForms ■文件上传处理 ■使用远程文件 ■连接处理 ■数据库永久连接 ■安全模式 ■PHP 的命令行模式 ■垃圾回收机制 ■函数参考 ■影响 PHP 行为的扩展 ■音频格式操作 ■身份认证服务 ■日历和事件相关扩展 ■命令行特有的扩展 ■压缩与归档扩展 ■信用卡处理 ■加密扩展 ■数据库扩展 ■文件系统相关扩展 ■国际化与字符编码支持 ■图像生成和处理 ■邮件相关扩展 ■数学扩展 ■非文本内容的MIME输出 ■进程控制扩展 ■其它基本扩展 ■其它服务 ■搜索引擎扩展 ■面向服务器的扩展 ■Session 扩展 ■文本处理 ■与变量和类型有关的扩展 ■Web Services ■Windows 平台下的扩展 ■XML 操作 ■PHP 核心:Zend 引擎的骇客指南 ■序言 ■"counter" 扩展 - 一个连续的实例 ■PHP 5 构建系统 ■扩展的结构 ■内存管理 ■变量的使用 ■函数的编写 ■类和对象的使用 ■资源的使用 ■INI 设置的使用 ■流的使用 ■PDO 驱动 ■扩展相关 FAQ ■Zend Engine 2 API 参考 ■Zend Engine 2 操作码列表 ■Zend Engine 1 ■FAQ — FAQ:常见问题 ■一般信息 ■邮件列表 ■获取 PHP ■数据库问题 ■安装 — 安装常见问题 ■编译问题 ■使用 PHP ■PHP 和 HTML ■PHP 和 COM ■PHP 和其它语言 ■从 PHP 4 移植到 PHP 5 ■杂类问题 ■附录 ■PHP 及其相关工程的历史 ■从 PHP 5.2.x 移植到 PHP 5.3.x ■Migrating from PHP 5.1.x to PHP 5.2.x ■Migrating from PHP 5.0.x to PHP 5.1.x ■从 PHP 4 移植到 PHP 5 ■类与对象(PHP 4) ■PHP 的调试 ■配置选项 ■php.ini 配置选项 ■扩展库分类 ■函数别名列表 ■保留字列表 ■资源类型列表 ■可用过滤器列表 ■所支持的套接字传输器(Socket Transports)列表 ■PHP 类型比较表 ■解析器代号列表 ■Userland Naming Guide ■关于本手册 ■Creative Commons Attribution 3.0 ■函数索引 ■CHM 版本 ■关于此版本 ■Using PHP Manual CHM Edition ■The Full Text Search ■Specialities of this Edition ■Integrating the PHP Manual ■Skin development ■CHM Edition Credits -------------------------------------------------------------------------------- 在线手册:中文 英文PHP手册

2011-07-05

最新PHP中文手册7月1号php_manual_zh.part3.rar

在线手册:中文 英文PHP手册 最新PHP中文手册7月1号php_manual_zh.part1.rar 最新PHP中文手册7月1号php_manual_zh.part2.rar 最新PHP中文手册7月1号php_manual_zh.part3.rar 最新PHP中文手册7月1号php_manual_zh.part4.rar -------------------------------------------------------------------------------- PHP 手册-中文翻译补完计划by: Mehdi Achour Friedhelm Betz Antony Dovgal Nuno Lopes Hannes Magnusson Georg Richter Damien Seguy Jakub Vrana 其他贡献者 2011-07-01 Edited By: Philip Olson 中文翻译人员: 王远之 肖理达 肖盛文 黄啸宇 宋琪 陈伯乐 陈浩 陈岗 刘铭 洪建家 吴煊春 乔楚 © 1997-2011 PHP 文档组 ■版权信息 ■PHP 手册 ■序言 ■入门指引 ■简介 ■简明教程 ■安装与配置 ■安装前需要考虑的事项 ■Unix 系统下的安装 ■Mac OS X 系统下的安装 ■Windows 系统下的安装 ■Installation on Cloud Computing platforms ■FastCGI 进程管理器 (FPM) ■PECL 扩展库安装 ■还有问题? ■运行时配置 ■语言参考 ■基本语法 ■类型 ■变量 ■常量 ■表达式 ■运算符 ■控制结构 ■函数 ■类与对象 ■命名空间 ■异常处理 ■引用的解释 ■预定义变量 ■预定义异常 ■预定义接口 ■Context options and parameters ■Supported Protocols and Wrappers ■安全 ■简介 ■总则 ■以 CGI 模式安装时 ■以 Apache 模块安装时 ■文件系统安全 ■数据库安全 ■错误报告 ■使用 Register Globals ■用户提交的数据 ■魔术引号 ■隐藏 PHP ■保持更新 ■特点 ■用 PHP 进行 HTTP 认证 ■Cookie ■会话 ■处理 XForms ■文件上传处理 ■使用远程文件 ■连接处理 ■数据库永久连接 ■安全模式 ■PHP 的命令行模式 ■垃圾回收机制 ■函数参考 ■影响 PHP 行为的扩展 ■音频格式操作 ■身份认证服务 ■日历和事件相关扩展 ■命令行特有的扩展 ■压缩与归档扩展 ■信用卡处理 ■加密扩展 ■数据库扩展 ■文件系统相关扩展 ■国际化与字符编码支持 ■图像生成和处理 ■邮件相关扩展 ■数学扩展 ■非文本内容的MIME输出 ■进程控制扩展 ■其它基本扩展 ■其它服务 ■搜索引擎扩展 ■面向服务器的扩展 ■Session 扩展 ■文本处理 ■与变量和类型有关的扩展 ■Web Services ■Windows 平台下的扩展 ■XML 操作 ■PHP 核心:Zend 引擎的骇客指南 ■序言 ■"counter" 扩展 - 一个连续的实例 ■PHP 5 构建系统 ■扩展的结构 ■内存管理 ■变量的使用 ■函数的编写 ■类和对象的使用 ■资源的使用 ■INI 设置的使用 ■流的使用 ■PDO 驱动 ■扩展相关 FAQ ■Zend Engine 2 API 参考 ■Zend Engine 2 操作码列表 ■Zend Engine 1 ■FAQ — FAQ:常见问题 ■一般信息 ■邮件列表 ■获取 PHP ■数据库问题 ■安装 — 安装常见问题 ■编译问题 ■使用 PHP ■PHP 和 HTML ■PHP 和 COM ■PHP 和其它语言 ■从 PHP 4 移植到 PHP 5 ■杂类问题 ■附录 ■PHP 及其相关工程的历史 ■从 PHP 5.2.x 移植到 PHP 5.3.x ■Migrating from PHP 5.1.x to PHP 5.2.x ■Migrating from PHP 5.0.x to PHP 5.1.x ■从 PHP 4 移植到 PHP 5 ■类与对象(PHP 4) ■PHP 的调试 ■配置选项 ■php.ini 配置选项 ■扩展库分类 ■函数别名列表 ■保留字列表 ■资源类型列表 ■可用过滤器列表 ■所支持的套接字传输器(Socket Transports)列表 ■PHP 类型比较表 ■解析器代号列表 ■Userland Naming Guide ■关于本手册 ■Creative Commons Attribution 3.0 ■函数索引 ■CHM 版本 ■关于此版本 ■Using PHP Manual CHM Edition ■The Full Text Search ■Specialities of this Edition ■Integrating the PHP Manual ■Skin development ■CHM Edition Credits -------------------------------------------------------------------------------- 在线手册:中文 英文PHP手册

2011-07-05

最新PHP中文手册7月1号php_manual_zh.part1.rar

在线手册:中文PHP手册 最新PHP中文手册7月1号php_manual_zh.part1.rar 最新PHP中文手册7月1号php_manual_zh.part2.rar 最新PHP中文手册7月1号php_manual_zh.part3.rar 最新PHP中文手册7月1号php_manual_zh.part4.rar -------------------------------------------------------------------------------- PHP 手册-中文翻译补完计划by: Mehdi Achour Friedhelm Betz Antony Dovgal Nuno Lopes Hannes Magnusson Georg Richter Damien Seguy Jakub Vrana 其他贡献者 2011-07-01 Edited By: Philip Olson 中文翻译人员: 王远之 肖理达 肖盛文 黄啸宇 宋琪 陈伯乐 陈浩 陈岗 刘铭 洪建家 吴煊春 乔楚 © 1997-2011 PHP 文档组 ■版权信息 ■PHP 手册 ■序言 ■入门指引 ■简介 ■简明教程 ■安装与配置 ■安装前需要考虑的事项 ■Unix 系统下的安装 ■Mac OS X 系统下的安装 ■Windows 系统下的安装 ■Installation on Cloud Computing platforms ■FastCGI 进程管理器 (FPM) ■PECL 扩展库安装 ■还有问题? ■运行时配置 ■语言参考 ■基本语法 ■类型 ■变量 ■常量 ■表达式 ■运算符 ■控制结构 ■函数 ■类与对象 ■命名空间 ■异常处理 ■引用的解释 ■预定义变量 ■预定义异常 ■预定义接口 ■Context options and parameters ■Supported Protocols and Wrappers ■安全 ■简介 ■总则 ■以 CGI 模式安装时 ■以 Apache 模块安装时 ■文件系统安全 ■数据库安全 ■错误报告 ■使用 Register Globals ■用户提交的数据 ■魔术引号 ■隐藏 PHP ■保持更新 ■特点 ■用 PHP 进行 HTTP 认证 ■Cookie ■会话 ■处理 XForms ■文件上传处理 ■使用远程文件 ■连接处理 ■数据库永久连接 ■安全模式 ■PHP 的命令行模式 ■垃圾回收机制 ■函数参考 ■影响 PHP 行为的扩展 ■音频格式操作 ■身份认证服务 ■日历和事件相关扩展 ■命令行特有的扩展 ■压缩与归档扩展 ■信用卡处理 ■加密扩展 ■数据库扩展 ■文件系统相关扩展 ■国际化与字符编码支持 ■图像生成和处理 ■邮件相关扩展 ■数学扩展 ■非文本内容的MIME输出 ■进程控制扩展 ■其它基本扩展 ■其它服务 ■搜索引擎扩展 ■面向服务器的扩展 ■Session 扩展 ■文本处理 ■与变量和类型有关的扩展 ■Web Services ■Windows 平台下的扩展 ■XML 操作 ■PHP 核心:Zend 引擎的骇客指南 ■序言 ■"counter" 扩展 - 一个连续的实例 ■PHP 5 构建系统 ■扩展的结构 ■内存管理 ■变量的使用 ■函数的编写 ■类和对象的使用 ■资源的使用 ■INI 设置的使用 ■流的使用 ■PDO 驱动 ■扩展相关 FAQ ■Zend Engine 2 API 参考 ■Zend Engine 2 操作码列表 ■Zend Engine 1 ■FAQ — FAQ:常见问题 ■一般信息 ■邮件列表 ■获取 PHP ■数据库问题 ■安装 — 安装常见问题 ■编译问题 ■使用 PHP ■PHP 和 HTML ■PHP 和 COM ■PHP 和其它语言 ■从 PHP 4 移植到 PHP 5 ■杂类问题 ■附录 ■PHP 及其相关工程的历史 ■从 PHP 5.2.x 移植到 PHP 5.3.x ■Migrating from PHP 5.1.x to PHP 5.2.x ■Migrating from PHP 5.0.x to PHP 5.1.x ■从 PHP 4 移植到 PHP 5 ■类与对象(PHP 4) ■PHP 的调试 ■配置选项 ■php.ini 配置选项 ■扩展库分类 ■函数别名列表 ■保留字列表 ■资源类型列表 ■可用过滤器列表 ■所支持的套接字传输器(Socket Transports)列表 ■PHP 类型比较表 ■解析器代号列表 ■Userland Naming Guide ■关于本手册 ■Creative Commons Attribution 3.0 ■函数索引 ■CHM 版本 ■关于此版本 ■Using PHP Manual CHM Edition ■The Full Text Search ■Specialities of this Edition ■Integrating the PHP Manual ■Skin development ■CHM Edition Credits -------------------------------------------------------------------------------- 在线手册:中文 英文PHP手册

2011-07-05

数据恢复软件企业版 绿化版

数据恢复软件企业版 绿化版 适合U盘随身携带

2011-06-30

奶品检验系统(asp.net mvc2,sqlite,ado.net ef)源码

自己写的奶品检验系统,提供源码,供新手学习,涉及到的内容:asp.net mvc2,sqlite,ado.net ef,jquery异步处理,rbac权限管理 附带ADO.NET 2.0 Provider for SQLite

2011-04-07

BlackBerry+Eclipse+Windows开发平台搭建

Windows 下 BlackBerry 基 Eclipse 开发平台搭建

2010-05-11

SSL协议(.doc)

SSL是一种在客户端和服务器端之间建立安全通道的协议。SSL一经提出,就在Internet上得到广泛的应用。SSL最常用来保护Web的安全。为了保护存有敏感信息Web的服务器的安全,消除用户在Internet上数据传输的安全顾虑。 OpenSSL是一个支持SSL认证的服务器.它是一个源码开放的自由软件,支持多种操作系统。OpenSSL软件的目的是实现一个完整的、健壮的、商业级的开放源码工具,通过强大的加密算法来实现建立在传输层之上的安全性。OpenSSL包含一套SSL协议的完整接口,应用程序应用它们可以很方便的建立起安全套接层,进而能够通过网络进行安全的数据传输。

2010-05-11

c# DBF数据库导入导出实例

c# DBF数据库导入导出实例 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Data.Odbc; using System.Data.SqlClient; namespace DbfExample { public partial class Form1 : Form { System.Data.Odbc.OdbcConnection conn; public Form1() { InitializeComponent(); } //导出数据 private void btnOut_Click(object sender, EventArgs e) { string connect = "Driver={Microsoft Visual FoxPro Driver};SourceType=DBF;SourceDB=c:\\; "; OdbcConnection myconn = new OdbcConnection(connect); string sqlt ="CREATE TABLE aa.DBF (cc int(10))"; myconn.Open(); OdbcCommand olec = new OdbcCommand(sqlt, myconn); try { int i = olec.ExecuteNonQuery(); MessageBox.Show("'" + i + "'success"); } catch (Exception ex) { MessageBox.Show(ex.Message); } finally { olec.Dispose(); myconn.Close(); } //string ole_connstring = @"Provider=microsoft.jet.oledb.5.0;Data Source=D:\;"; //System.Data.OleDb.OleDbConnection ole_conn = new System.Data.OleDb.OleDbConnection(ole_connstring); //try //{ // ole_conn.Open(); // System.Data.OleDb.OleDbCommand cmd1 = new System.Data.OleDb.OleDbCommand // ("Create Table TestTable (Field1 int, Field2 char(10),Field float(10,2))", // ole_conn); // System.Data.OleDb.OleDbCommand cmd2 = new System.Data.OleDb.OleDbCommand // ("Insert Into TestTable values (1,'Hello3',520.20)", ole_conn); // System.Data.OleDb.OleDbCommand cmd3 = new System.Data.OleDb.OleDbCommand // ("Insert Into TestTable values (2,'Hello4',18076.60)", ole_conn); // cmd1.ExecuteNonQuery(); // cmd2.ExecuteNonQuery(); // cmd3.ExecuteNonQuery(); //} //catch (Exception ex) //{ // MessageBox.Show(ex.Message); //} //finally //{ // ole_conn.Close(); //} } //导入数据 private void btnIn_Click(object sender, EventArgs e) { } private void Form1_Load(object sender, EventArgs e) { Bind(); } private void Bind() { try { conn = new System.Data.Odbc.OdbcConnection(); string table = @"C:\测试例子\Dbf\prepur.dbf"; string connStr = @"Driver={Microsoft Visual FoxPro Driver};SourceType=DBF;SourceDB=" + table + ";Exclusive=No;NULL=NO;Collate=Machine;BACKGROUNDFETCH=NO;DELETED=NO"; conn.ConnectionString = connStr; conn.Open(); string sql = @"select * from " + table; OdbcDataAdapter da = new OdbcDataAdapter(sql, conn); DataTable dt = new DataTable(); da.Fill(dt); this.dataGridView1.DataSource = dt.DefaultView; //MessageBox.Show(dt.Rows[0][0].ToString()); } catch { } finally { conn.Close(); } } private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e) { try { conn = new System.Data.Odbc.OdbcConnection(); string table = @"C:\测试例子\Dbf\table1.dbf"; string connStr = @"Driver={Microsoft Visual FoxPro Driver};SourceType=DBF;SourceDB=" + table + ";Exclusive=No;NULL=NO;Collate=Machine;BACKGROUNDFETCH=NO;DELETED=NO"; conn.ConnectionString = connStr; conn.Open(); string id = dataGridView1.Rows[e.RowIndex].Cells[0].Value.ToString(); string sql = @"select * from " + table + " where id='" + id + "'"; OdbcDataAdapter da = new OdbcDataAdapter(sql, conn); DataTable dt = new DataTable(); da.Fill(dt); txtId.Text = id; txtName.Text = dt.Rows[0]["name"].ToString(); txtAddress.Text = dt.Rows[0]["address"].ToString(); } catch { } finally { conn.Close(); } } private void Add() { conn = new System.Data.Odbc.OdbcConnection(); string table = @"C:\temp\Dbf\table1.dbf"; string connStr = @"Driver={Microsoft Visual FoxPro Driver};SourceType=DBF;SourceDB=" + table + ";Exclusive=No;NULL=NO;Collate=Machine;BACKGROUNDFETCH=NO;DELETED=NO"; conn.ConnectionString = connStr; conn.Open(); OdbcCommand cmd = new OdbcCommand(); cmd.Connection = conn; string sql = "insert into " + table + " values('" + txtId.Text + "','" + txtName.Text + "','" + txtAddress.Text + "')"; cmd.CommandText = sql; cmd.CommandType = CommandType.Text; cmd.ExecuteNonQuery(); Bind(); } private void btnTOSQL_Click(object sender, EventArgs e) { try { string sql = "Insert Into dbftosql select * From openrowset('MSDASQL','Driver=Microsoft Visual FoxPro Driver;SourceType=DBF;SourceDB=C:\\temp\\Dbf','select * from table1.dbf')"; SqlConnection con = new SqlConnection("server=.;database=labelprint;uid=sa;pwd=sa"); con.Open(); SqlCommand cmd = new SqlCommand(sql, con); cmd.ExecuteNonQuery(); } catch (Exception ex) { MessageBox.Show(ex.Message); } } } }

2010-03-09

在一小时内学会 C#(txt版本)

在一小时内学会 C#。使用例程,简单却完整的探索 C# 语言的构造和特点。本文特别适合有 C++ 基础却没有太多精力学习 C# 的读者。 关于作者 Aisha Ikram 我现在在英国一家软件公司任技术带头人。我是计算机科学的硕士。我主要使用 .NET 1.1/2.0, C#, VB.NET, ASP.NET, VC++ 6, MFC, ATL, COM/DCOM, SQL Server 2000/2005等。最近我在学习 .NET 3.x 的全部内容。我的免费源代码和文章网站是 http://aishai.netfirms.com 职业:团队带头人 位置:英国 简介 C# 是一种具有 C++ 特性,Java 样式及 BASIC 快速建模特性的编程语言。如果你已经知晓 C++ 语言,本文将在不到一小时的时间内带你快速浏览 C# 的语法。如果熟悉 Java 语言,Java 的编程结构、打包和垃圾回收的概念肯定对你快速学习 C# 大有帮助。所以我在讨论 C# 语言构造的时候会假设你知道 C++。 本文通过一系列例程以简短但全面的方式讨论了 C# 语言构造和特性,所以你仅需略览代码片刻,即可了解其概念。 注意:本文不是为 C# 宗师而写。有很多初学者的 C# 文章,这只是其中之一。 接下来关于 C# 的讨论主题: ? 编程结构 ? 命名空间 ? 数据类型 ? 变量 ? 运算符与表达式 ? 枚举 ? 语句 ? 类与结构 ? 修饰符 ? 属性 ? 接口 ? 函数参数 ? 数组 ? 索引器 ? 装箱与拆箱 ? 委托 ? 继承与多态 以下主题不会进行讨论: ? C++ 与 C# 的共同点 ? 诸如垃圾回收、线程、文件处理等概念 ? 数据类型转换 ? 异常处理 ? .NET 库 编程结构 和 C++ 一样,C# 是大小写敏感的。半角分号(;)是语句分隔符。和 C++ 有所区别的是,C# 中没有单独的声明(头)和实现(CPP)文件。所有代码(类声明和实现)都放在扩展名为 cs 的单一文件中。 看看 C# 中的 Hello World 程序。 复制内容到剪贴板 代码: using System; namespace MyNameSpace { class HelloWorld { static void Main(string[] args) { Console.WriteLine ("Hello World"); } } } C# 中所有内容都打包在类中,而所有的类又打包在命名空间中(正如文件存与文件夹中)。和 C++ 一样,有一个主函数作为你程序的入口点。C++ 的主函数名为 main,而 C# 中是大写 M 打头的 Main。 类块或结构定义之后没有必要再加一个半角分号。C++ 中是这样,但 C# 不要求。 命名空间 每个类都打包于一个命名空间。命名空间的概念和 C++ 完全一样,但我们在 C# 中比在 C++ 中更加频繁的使用命名空间。你可以用点(.)定界符访问命名空间中的类。上面的 Hello World 程序中,MyNameSpace 是其命名空间。 现在思考当你要从其他命名空间的类中访问 HelloWorld 类。 复制内容到剪贴板 代码: using System; namespace AnotherNameSpace { class AnotherClass { public void Func() { Console.WriteLine ("Hello World"); } } } 现在在你的 HelloWorld 类中你可以这样访问: 复制内容到剪贴板 代码: using System; using AnotherNameSpace; // 你可以增加这条语句 namespace MyNameSpace { class HelloWorld { static void Main(string[] args) { AnotherClass obj = new AnotherClass(); obj.Func(); } } } 在 .NET 库中,System 是包含其他命名空间的顶层命名空间。默认情况下存在一个全局命名空间,所以在命名空间外定义的类直接进到此全局命名空间中,因而你可以不用定界符访问此类。 你同样可以定义嵌套命名空间。 Using #include 指示符被后跟命名空间名的 using 关键字代替了。正如上面的 using System。System 是最基层的命名空间,所有其他命名空间和类都包含于其中。System 命名空间中所有对象的基类是 Object。 变量 除了以下差异,C# 中的变量几乎和 C++ 中一样: 1. C# 中(不同于 C++)的变量,总是需要你在访问它们前先进行初始化,否则你将遇到编译时错误。故而,不可能访问未初始化的变量。 2. 你不能在 C# 中访问一个“挂起”指针。 3. 超出数组边界的表达式索引值同样不可访问。 4. C# 中没有全局变量或全局函数,取而代之的是通过静态函数和静态变量完成的。 数据类型 所有 C# 的类型都是从 object 类继承的。有两种数据类型: 1. 基本/内建类型 2. 用户定义类型 以下是 C# 内建类型的列表: 类型 字节 描述 byte 1 unsigned byte sbyte 1 signed byte short 2 signed short ushort 2 unsigned short int 4 signed integer uint 4 unsigned integer long 8 signed long ulong 8 unsigned long float 4 floating point number double 8 double precision number decimal 8 fixed precision number string - Unicode string char - Unicode char bool true, false boolean 注意:C# 的类型范围和 C++ 不同。例如:long 在 C++ 中是 4 字节而在 C# 中是 8 字节。bool 和 string 类型均和 C++ 不同。bool 仅接受真、假而非任意整数。 用户定义类型文件包含: 1. 类 (class) 2. 结构(struct) 3. 接口(interface) 以下类型继承时均分配内存: 1. 值类型 2. 参考类型 值类型 值类型是在堆栈中分配的数据类型。它们包括了: ? 除字符串,所有基本和内建类型 ? 结构 ? 枚举类型 引用类型 引用类型在堆(heap)中分配内存且当其不再使用时,将自动进行垃圾清理。和 C++ 要求用户显示创建 delete 运算符不一样,它们使用新运算符创建,且没有 delete 运算符。在 C# 中它们自动由垃圾回收系统回收。 引用类型包括: ? 类 ? 接口 ? 集合类型如数组 ? 字符串 枚举 C# 中的枚举和 C++ 完全一样。通过关键字 enum 定义。 例子: 复制内容到剪贴板 代码: enum Weekdays { Saturday, Sunday, Monday, Tuesday, Wednesday, Thursday, Friday } 类与结构 除了内存分配的不同外,类和结构就和 C++ 中的情况一样。类的对象在堆中分配,并使用 new 关键字创建。而结构是在栈(stack)中进行分配。C# 中的结构属于轻量级快速数据类型。当需要大型数据类型时,你应该创建类。 例子: 复制内容到剪贴板 代码: struct Date { int day; int month; int year; } class Date { int day; int month; int year; string weekday; string monthName; public int GetDay() { return day; } public int GetMonth() { return month; } public int GetYear() { return year; } public void SetDay(int Day) { day = Day ; } public void SetMonth(int Month) { month = Month; } public void SetYear(int Year) { year = Year; } public bool IsLeapYear() { return (year/4 == 0); } public void SetDate (int day, int month, int year) { } ... } 属性 如果你熟悉 C++ 面向对象的方法,你一定对属性有自己的认识。对 C++ 来说,前面例子中 Date 类的属性就是 day、month 和 year,而你添加了 Get 和 Set 方法。C# 提供了一种更加便捷、简单而又直接的属性访问方式。 所以上面的类应该写成这样: 复制内容到剪贴板 代码: using System; class Date { public int Day{ get { return day; } set { day = value; } } int day; public int Month{ get { return month; } set { month = value; } } int month; public int Year{ get { return year; } set { year = value; } } int year; public bool IsLeapYear(int year) { return year%4== 0 ? true: false; } public void SetDate (int day, int month, int year) { this.day = day; this.month = month; this.year = year; } } 这里是你 get 和 set 属性的方法: 复制内容到剪贴板 代码: class User { public static void Main() { Date date = new Date(); date.Day = 27; date.Month = 6; date.Year = 2003; Console.WriteLine ("Date: {0}/{1}/{2}", date.Day, date.Month, date.Year); } } 修饰符 你必须知道 C++ 中常用的 public、private 和 protected 修饰符。我将在这里讨论一些 C# 引入的新的修饰符。 readonly readonly 修饰符仅用于修饰类的数据成员。正如其名字说的,一旦它们已经进行了写操作、直接初始化或在构造函数中对其进行了赋值,readonly 数据成员就只能对其进行读取。readonly 和 const 数据成员不同之处在于 const 要求你在声明时进行直接初始化。看下面的例程: 复制内容到剪贴板 代码: class MyClass { const int constInt = 100; //直接进行 readonly int myInt = 5; //直接进行 readonly int myInt2; public MyClass() { myInt2 = 8; //间接进行 } public Func() { myInt = 7; //非法 Console.WriteLine(myInt2.ToString()); } } sealed 带有 sealed 修饰符的类不允许你从它继承任何类。所以如果你不想一个类被继承,你可以对该类使用 sealed 关键字。 复制内容到剪贴板 代码: sealed class CanNotbeTheParent { int a = 5; } unsafe 你可以使用 unsafe 修饰符在 C# 中定义一个不安全上下文。在不安全上下文中,你可以插入不安全代码,如 C++ 的指针等。参见以下代码: 复制内容到剪贴板 代码: public unsafe MyFunction( int * pInt, double* pDouble) { int* pAnotherInt = new int; *pAnotherInt = 10; pInt = pAnotherInt; ... *pDouble = 8.9; } 接口 如果你有 COM 的思想,你马上就知道我在说什么了。接口是只包含函数签名而在子类中实现的抽象基类。在 C# 中,你可以用 interface 关键字声明这样的接口类。.NET 就是基于这样的接口的。C# 中你不能对类进行多重继承——这在 C++ 中是允许的。通过接口,多重继承的精髓得以实现。即你的子类可以实现多重接口。(译注:由此可以实现多重继承) 复制内容到剪贴板 代码: using System; interface myDrawing { int originx { get; set; } int originy { get; set; } void Draw(object shape); } class Shape: myDrawing { int OriX; int OriY; public int originx { get{ return OriX; } set{ OriX = value; } } public int originy { get{ return OriY; } set{ OriY = value; } } public void Draw(object shape) { ... // 做要做的事 } // 类自身的方法 public void MoveShape(int newX, int newY) { ..... } } 数组 数组在 C# 中比 C++ 中要高级很多。数组分配于堆中,所以是引用类型的。你不能访问数组边界外的元素。所以 C# 防止你引发那种 bug。同时也提供了迭代数组元素的帮助函数。foreach 是这样的迭代语句之一。C++ 和 C# 数组的语法差异在于: 方括号在类型后面而不是在变量名后面 创建元素使用 new 运算符 C# 支持一维、多维和交错数组(数组的数组) 例子: 复制内容到剪贴板 代码: int[] array = new int[10]; // int 型一维数组 for (int i = 0; i < array.Length; i++) array = i; int[,] array2 = new int[5,10]; // int 型二维数组 array2[1,2] = 5; int[,,] array3 = new int[5,10,5]; // int 型三维数组 array3[0,2,4] = 9; int[][] arrayOfarray = new int[2]; // int 型交错数组 - 数组的数组 arrayOfarray[0] = new int[4]; arrayOfarray[0] = new int[] {1,2,15}; 索引器 索引器用于书写一个可以通过使用 [] 像数组一样直接访问集合元素的方法。你所需要的只是指定待访问实例或元素的索引。索引器的语法和类属性语法相同,除了接受作为元素索引的输入参数外。 例子: 注意:CollectionBase 是用于建立集合的库类。List 是 CollectionBase 中用于存放集合列表的受保护成员。 复制内容到剪贴板 代码: class Shapes: CollectionBase { public void add(Shape shp) { List.Add(shp); } //indexer public Shape this[int index] { get { return (Shape) List[index]; } set { List[index] = value ; } } } 装箱/拆箱 装箱的思想在 C# 中是创新的。正如前面提到的,所有的数据类型,无论是内建的还是用户定义的,都是从 System 命名空间的基类 object 继承的。所以基础的或是原始的类型打包为一个对象称为装箱,相反的处理称为拆箱。 例子: 复制内容到剪贴板 代码: class Test { static void Main() { int myInt = 12; object obj = myInt ; // 装箱 int myInt2 = (int) obj; // 拆箱 } } 例程展示了装箱和拆箱两个过程。一个 int 值可以被转换为对象,并且能够再次转换回 int。当某种值类型的变量需要被转换为一个引用类型时,便会产生一个对象箱保存该值。拆箱则完全相反。当某个对象箱被转换回其原值类型时,该值从箱中拷贝至适当的存储空间。 函数参数 C# 中的参数有三种类型: 1. 按值传递/输入参数 2. 按引用传递/输入-输出参数 3. 输出参数 如果你有 COM 接口的思想,而且还是参数类型的,你会很容易理解 C# 的参数类型。 按值传递/输入参数 值参数的概念和 C++ 中一样。传递的值复制到了新的地方并传递给函数。 例子: 复制内容到剪贴板 代码: SetDay(5); ... void SetDay(int day) { .... } 按引用传递/输入-输出参数 C++ 中的引用参数是通过指针或引用运算符 & 传递的。C# 中的引用参数更不易出错。你可以传递一个引用地址,你传递一个输入的值并通过函数得到一个输出的值。因此引用参数也被称为输入-输出参数。 你不能将未初始化的引用参数传递给函数。C# 使用关键字 ref 指定引用参数。你同时还必须在传递参数给要求引用参数的函数时使用关键字 ref。 例子: 复制内容到剪贴板 代码: int a= 5; FunctionA(ref a); // 使用 ref,否则将引发编译时错误 Console.WriteLine(a); // 打印 20 复制内容到剪贴板 代码: void FunctionA(ref int Val) { int x= Val; Val = x* 4; } 输出参数 输出参数是只从函数返回值的参数。输入值不要求。C# 使用关键字 out 表示输出参数。 例子: 复制内容到剪贴板 代码: int Val; GetNodeValue(Val); 复制内容到剪贴板 代码: bool GetNodeValue(out int Val) { Val = value; return true; } 参数和数组的数量变化 C# 中的数组使用关键字 params 进行传递。一个数组类型的参数必须总是函数最右边的参数。只有一个参数可以是数组类型。你可以传送任意数量的元素作为数组类型的参数。看了下面的例子你可以更好的理解: 注意:使用数组是 C# 提供用于可选或可变数量参数的唯一途径。 例子: 复制内容到剪贴板 代码: void Func(params int[] array) { Console.WriteLine("number of elements {0}", array.Length); } 复制内容到剪贴板 代码: Func(); // 打印 0 Func(5); // 打印 1 Func(7,9); // 打印 2 Func(new int[] {3,8,10}); // 打印 3 int[] array = new int[8] {1,3,4,5,5,6,7,5}; Func(array); // 打印 8 运算符与表达式 运算符和表达式跟 C++ 中完全一致。然而同时也添加了一些新的有用的运算符。有些在这里进行了讨论。 is 运算符 is 运算符是用于检查操作数类型是否相等或可以转换。is 运算符特别适合用于多态的情形。is 运算符使用两个操作数,其结果是布尔值。参考例子: 复制内容到剪贴板 代码: void function(object param) { if(param is ClassA) //做要做的事 else if(param is MyStruct) //做要做的事 } } as 运算符 as 运算符检查操作数的类型是否可转换或是相等(as 是由 is 运算符完成的),如果是,则处理结果是已转换或已装箱的对象(如果操作数可以装箱为目标类型,参考 装箱/拆箱)。如果对象不是可转换的或可装箱的,返回值为 null。看看下面的例子以更好的理解这个概念。 复制内容到剪贴板 代码: Shape shp = new Shape(); Vehicle veh = shp as Vehicle; // 返回 null,类型不可转换 Circle cir = new Circle(); Shape shp = cir; Circle cir2 = shp as Circle; //将进行转换 object[] objects = new object[2]; objects[0] = "Aisha"; object[1] = new Shape(); string str; for(int i=0; i&< objects.Length; i++) { str = objects as string; if(str == null) Console.WriteLine("can not be converted"); else Console.WriteLine("{0}",str); } 复制内容到剪贴板 代码: Output: Aisha can not be converted 语句 除了些许附加的新语句和修改外,C# 的语句和 C++ 的基本一致。 以下是新的语句: foreach 用于迭代数组等集合。 例子: 复制内容到剪贴板 代码: foreach (string s in array) Console.WriteLine(s); lock 在线程中使代码块称为重点部分。 (译注:lock 关键字将语句块标记为临界区,方法是获取给定对象的互斥锁,执行语句,然后释放该锁。lock 确保当一个线程位于代码的临界区时,另一个线程不进入临界区。如果其他线程试图进入锁定的代码,则它将一直等待(即被阻止),直到该对象被释放。) checked/unchecked 用于数字操作中的溢出检查。 例子: 复制内容到剪贴板 代码: int x = Int32.MaxValue; x++; // 溢出检查 { x++; // 异常 } unchecked { x++; // 溢出 } 下面的语句已修改:(译注:原文如此,疑为作者笔误) Switch Switch 语句在 C# 中修改过。 1.现在在执行一条 case 语句后,程序流不能跳至下一 case 语句。之前在 C++ 中这是可以的。 例子: 复制内容到剪贴板 代码: int var = 100; switch (var) { case 100: Console.WriteLine(""); // 这里没有 break case 200: Console.WriteLine(""); break; } C++ 的输出: 复制内容到剪贴板 代码: 而在 C# 中你将得到一个编译时错误: 复制内容到剪贴板 代码: error CS0163: Control cannot fall through from one case label ('case 100:') to another 2.然而你可以像在 C++ 中一样这么用: 复制内容到剪贴板 代码: switch (var) { case 100: case 200: Console.WriteLine("100 or 200"); break; } 3.你还可以用常数变量作为 case 值: 例子: 复制内容到剪贴板 代码: const string WeekEnd = "Sunday"; const string WeekDay1 = "Monday"; .... string WeekDay = Console.ReadLine(); switch (WeekDay ) { case WeekEnd: Console.WriteLine("It's weekend!!"); break; case WeekDay1: Console.WriteLine("It's Monday"); break; } 委托 委托让我们可以把函数引用保存在变量中。这就像在 C++ 中使用 typedef 保存函数指针一样。 委托使用关键字 delegate 声明。看看这个例子,你就能理解什么是委托: 例子: 复制内容到剪贴板 代码: delegate int Operation(int val1, int val2); public int Add(int val1, int val2) { return val1 + val2; } public int Subtract (int val1, int val2) { return val1- val2; } public void Perform() { Operation Oper; Console.WriteLine("Enter + or - "); string optor = Console.ReadLine(); Console.WriteLine("Enter 2 operands"); string opnd1 = Console.ReadLine(); string opnd2 = Console.ReadLine(); int val1 = Convert.ToInt32 (opnd1); int val2 = Convert.ToInt32 (opnd2); if (optor == "+") Oper = new Operation(Add); else Oper = new Operation(Subtract); Console.WriteLine(" Result = {0}", Oper(val1, val2)); } 继承与多态 C# 只允许单一继承。多重继承可以通过接口达到。 例子: 复制内容到剪贴板 代码: class Parent{ } class Child : Parent 虚函数 虚函数在 C# 中同样是用于实现多态的概念的,除了你要使用 override 关键字在子类中实现虚函数外。父类使用同样的 virtual 关键字。每个重写虚函数的类都使用 override 关键字。(译注:作者所说的“同样”,“除……外”都是针对 C# 和 C++ 而言的) 复制内容到剪贴板 代码: class Shape { public virtual void Draw() { Console.WriteLine("Shape.Draw") ; } } class Rectangle : Shape { public override void Draw() { Console.WriteLine("Rectangle.Draw"); } } class Square : Rectangle { public override void Draw() { Console.WriteLine("Square.Draw"); } } class MainClass { static void Main(string[] args) { Shape[] shp = new Shape[3]; Rectangle rect = new Rectangle(); shp[0] = new Shape(); shp[1] = rect; shp[2] = new Square(); shp[0].Draw(); shp[1].Draw(); shp[2].Draw(); } } Output: Shape.Draw Rectangle.Draw Square.Draw 使用“new”隐藏父类函数 你可以隐藏基类中的函数而在子类中定义其新版本。关键字 new 用于声明新的版本。思考下面的例子,该例是上一例子的修改版本。注意输出,我用 关键字 new 替换了 Rectangle 类中的关键字 override。 复制内容到剪贴板 代码: class Shape { public virtual void Draw() { Console.WriteLine("Shape.Draw") ; } } class Rectangle : Shape { public new void Draw() { Console.WriteLine("Rectangle.Draw"); } } class Square : Rectangle { //这里不用 override public new void Draw() { Console.WriteLine("Square.Draw"); } } class MainClass { static void Main(string[] args) { Console.WriteLine("Using Polymorphism:"); Shape[] shp = new Shape[3]; Rectangle rect = new Rectangle(); shp[0] = new Shape(); shp[1] = rect; shp[2] = new Square(); shp[0].Draw(); shp[1].Draw(); shp[2].Draw(); Console.WriteLine("Using without Polymorphism:"); rect.Draw(); Square sqr = new Square(); sqr.Draw(); } } Output: Using Polymorphism Shape.Draw Shape.Draw Shape.Draw Using without Polymorphism: Rectangle.Draw Square.Draw 多态性认为 Rectangle 类的 Draw 方法是和 Shape 类的 Draw 方法不同的另一个方法,而不是认为是其多态实现。所以为了防止父类和子类间的命名冲突,我们只有使用 new 修饰符。 注意:你不能在一个类中使用一个方法的两个版本,一个用 new 修饰符,另一个用 override 或 virtual。就像在上面的例子中,我不能在 Rectangle 类中增加另一个名为 Draw 的方法,因为它是一个 virtual 或 override 的方法。同样在 Square 类中,我也不能重写 Shape 类的虚方法 Draw。 调用基类成员 如果子类的数据成员和基类中的有同样的名字,为了避免命名冲突,基类成员和函数使用 base 关键字进行访问。看看下面的例子,基类构造函数是如何调用的,而数据成员又是如何使用的。 复制内容到剪贴板 代码: public Child(int val) :base(val) { myVar = 5; base.myVar; } OR public Child(int val) { base(val); myVar = 5 ; base.myVar; } 前景展望 本文仅仅是作为 C# 语言的一个快速浏览,以便你可以熟悉该语言的一些特性。尽管我尝试用实例以一种简短而全面的方式讨论了 C# 几乎所有的主要概念,但我认为还是有很多内容需要增加和讨论的。 以后,我会增加更多的没有讨论过的命令和概念,包括事件等。我还想给初学者写一下怎么用 C# 进行 Windows 编程。 参考文献: 我们都知道的 MSDN Tom Archer 著,Inside C# Eric Gunnerson 著,A Programmer's Introduction to C# Karli Watson 著,Beginning C# O'Reilly(奥莱利出版),Programming C# 修改: 2003年6月12日:按引用传递/输入-输出参数一节中增加了 ref 关键字 2003年6月20日:为可选参数增加了一条注意事项,纠正了交错数组例子中赋值运算符的笔误 许可 本文及其任何关联的源代码和文件均以 The Code Project Open License (CPOL)执行。(译注:代码计划网站公开许可)

2009-08-19

100小时学会SAP(pdf)

100小时学会SAP 100小时学会SAP 100小时学会SAP

2009-08-18

php常用算法(doc)

这里是用PHP写的几个基础算法,算法的重要性貌似对于PHP程序员不怎么重要,其实是非常重要的,经典名句:算法+数据结构=程序。作为一名真正的高级PHP程序员,我认为应该熟悉C,如果你想成为真正的程序员,请好好学C,学好数据结构与算法。这里仅仅只是几个基础算法,还有很多东东要学…… 1、首先来画个菱形玩玩,很多人学C时在书上都画过,咱们用PHP画下,画了一半。 思路:多少行for一次,然后在里面空格和星号for一次。 <?phpfor($i=0;$i<=3;$i++){ for($j=0;$j<=3-$i;$j++){ echo '&nbsp;'; } for($k=0;$k<=2*$i;$k++){ echo '*'; } echo '<br/>'; } 2、冒泡排序,C里基础算法,从小到大对一组数排序。 思路:这题从小到大,第一轮排最小,第二轮排第二小,第三轮排第三小,依次类推…… <?php$arr = array(3, 2, 1);$n = count($arr); //每循环一次,就跑一趟后面的排序for($j=0; $j<$n-1; $j++) {//对后面没排好的,循环查找出最大(最小)的,进行一趟排序 for($i=$j; $i<$n-1; $i++) { if($arr[$j] > $arr[$i+1]) { $t = $arr[$j]; $arr[$j] = $arr[$i+1]; $arr[$i+1] = $t; } }}print_r($arr); 3、杨辉三角,用PHP写。 思路:每一行的第一位和最后一位是1,没有变化,中间是前排一位与左边一排的和,这种算法是用一个二维数组保存,另外有种算法用一维数组也可以实现,一行一行的输出,有兴趣去写着玩下。 11 11 2 11 3 3 11 4 6 4 11 5 10 10 5 1 <?php//每行的第一个和最后一个都为1,写了6行 for($i=0; $i<6; $i++) { $a[$i][0]=1; $a[$i][$i]=1; } //出除了第一位和最后一位的值,保存在数组中 for($i=2; $i<6; $i++) { for($j=1; $j<$i; $j++) { $a[$i][$j] = $a[$i-1][$j-1]+$a[$i-1][$j]; } } //打印 for($i=0; $i<6; $i++){ for($j=0; $j<=$i; $j++) { echo $a[$i][$j].'&nbsp;'; } echo '<br/>'; } 4、在一组数中,要求插入一个数,按其原来顺序插入,维护原来排序方式。 思路:找到比要插入数大的那个位置,替换,然后把后面的数后移一位。 <?php$in = 2;$arr = array(1,1,1,3,5,7);$n = count($arr);//如果要插入的数已经最大,直接打印if($arr[$n-1] < $in) { $arr[$n+1] = $in; print_r($arr); } for($i=0; $i<$n; $i++) {//找出要插入的位置 if($arr[$i] >= $in){ $t1= $arr[$i]; $arr[$i] = $in;//把后面的数据后移一位 for($j=$i+1; $j<$n+1; $j++) { $t2 = $arr[$j]; $arr[$j] = $t1; $t1 = $t2; }//打印 print_r($arr); die; }} 5、对一组数进行排序(快速排序算法)。 思路:通过一趟排序分成两部分,然后递归对这两部分排序,最后合并。 <?phpfunction q($array) { if (count($array) <= 1) {return $array;}//以$key为界,分成两个子数组 $key = $array[0]; $l = array(); $r = array(); //分别进行递归排序,然后合成一个数组 for ($i=1; $i<count($array); $i++) { if ($array[$i] <= $key) { $l[] = $array[$i]; } else { $r[] = $array[$i]; } } $l = q($l); $r = q($r); return array_merge($l, array($key), $r);} $arr = array(1,2,44,3,4,33);print_r( q($arr) ); 6、在一个数组查找你所需元素(二分查找算法)。 思路:以数组中某个值为界,再递归进行查找,直到结束。 <?phpfunction find($array, $low, $high, $k){ if ($low <= $high){ $mid = intval(($low+$high)/2); if ($array[$mid] == $k){ return $mid; }elseif ($k < $array[$mid]){ return find($array, $low, $mid-1, $k); }else{ return find($array, $mid+1, $high, $k); } } die('Not have...');} //test$array = array(2,4,3,5);$n = count($array);$r = find($array,0,$n, 7、合并多个数组,不用array_merge(),题目来于论坛。 思路:遍历每个数组,重新组成一个新数组。 <?phpfunction t(){ $c = func_num_args()-1; $a = func_get_args(); //print_r($a); for($i=0; $i<=$c; $i++){ if(is_array($a[$i])){ for($j=0; $j<count($a[$i]); $j++){ $r[] = $a[$i][$j]; } } else { die('Not a array!'); } } return $r;} //testprint_r(t(range(1,4),range(1,4),range(1,4)));echo '<br/>';$a = array_merge(range(1,4),range(1,4),range(1,4));print_r($a); 8、牛年求牛:有一母牛,到4岁可生育,每年一头,所生均是一样的母牛,到15岁绝育,不再能生,20岁死亡,问n年后有多少头牛。(来自论坛) <?phpfunction t($n) { static $num = 1 for($j=1; $j<=$n; $j++){ if($j>=4 && $j<15) {$num++;t($n-$j);} if($j==20){$num--;} } return $num;} //testecho t(8); 这里是用PHP写的几个基础算法,算法的重要性貌似对于PHP程序员不怎么重要,其实是非常重要的,经典名句:算法+数据结构=程序。作为一名真正的高级PHP程序员,我认为应该熟悉C,如果你想成为真正的程序员,请好好学C,学好数据结构与算法。这里仅仅只是几个基础算法,还有很多东东要学…… 1、首先来画个菱形玩玩,很多人学C时在书上都画过,咱们用PHP画下,画了一半。 思路:多少行for一次,然后在里面空格和星号for一次。 <?phpfor($i=0;$i<=3;$i++){ for($j=0;$j<=3-$i;$j++){ echo '&nbsp;'; } for($k=0;$k<=2*$i;$k++){ echo '*'; } echo '<br/>'; } 2、冒泡排序,C里基础算法,从小到大对一组数排序。 思路:这题从小到大,第一轮排最小,第二轮排第二小,第三轮排第三小,依次类推…… <?php$arr = array(3, 2, 1);$n = count($arr); //每循环一次,就跑一趟后面的排序for($j=0; $j<$n-1; $j++) {//对后面没排好的,循环查找出最大(最小)的,进行一趟排序 for($i=$j; $i<$n-1; $i++) { if($arr[$j] > $arr[$i+1]) { $t = $arr[$j]; $arr[$j] = $arr[$i+1]; $arr[$i+1] = $t; } }}print_r($arr); 3、杨辉三角,用PHP写。 思路:每一行的第一位和最后一位是1,没有变化,中间是前排一位与左边一排的和,这种算法是用一个二维数组保存,另外有种算法用一维数组也可以实现,一行一行的输出,有兴趣去写着玩下。 11 11 2 11 3 3 11 4 6 4 11 5 10 10 5 1 <?php//每行的第一个和最后一个都为1,写了6行 for($i=0; $i<6; $i++) { $a[$i][0]=1; $a[$i][$i]=1; } //出除了第一位和最后一位的值,保存在数组中 for($i=2; $i<6; $i++) { for($j=1; $j<$i; $j++) { $a[$i][$j] = $a[$i-1][$j-1]+$a[$i-1][$j]; } } //打印 for($i=0; $i<6; $i++){ for($j=0; $j<=$i; $j++) { echo $a[$i][$j].'&nbsp;'; } echo '<br/>'; } 4、在一组数中,要求插入一个数,按其原来顺序插入,维护原来排序方式。 思路:找到比要插入数大的那个位置,替换,然后把后面的数后移一位。 <?php$in = 2;$arr = array(1,1,1,3,5,7);$n = count($arr);//如果要插入的数已经最大,直接打印if($arr[$n-1] < $in) { $arr[$n+1] = $in; print_r($arr); } for($i=0; $i<$n; $i++) {//找出要插入的位置 if($arr[$i] >= $in){ $t1= $arr[$i]; $arr[$i] = $in;//把后面的数据后移一位 for($j=$i+1; $j<$n+1; $j++) { $t2 = $arr[$j]; $arr[$j] = $t1; $t1 = $t2; }//打印 print_r($arr); die; }} 5、对一组数进行排序(快速排序算法)。 思路:通过一趟排序分成两部分,然后递归对这两部分排序,最后合并。 <?phpfunction q($array) { if (count($array) <= 1) {return $array;}//以$key为界,分成两个子数组 $key = $array[0]; $l = array(); $r = array(); //分别进行递归排序,然后合成一个数组 for ($i=1; $i<count($array); $i++) { if ($array[$i] <= $key) { $l[] = $array[$i]; } else { $r[] = $array[$i]; } } $l = q($l); $r = q($r); return array_merge($l, array($key), $r);} $arr = array(1,2,44,3,4,33);print_r( q($arr) ); 6、在一个数组查找你所需元素(二分查找算法)。 思路:以数组中某个值为界,再递归进行查找,直到结束。 <?phpfunction find($array, $low, $high, $k){ if ($low <= $high){ $mid = intval(($low+$high)/2); if ($array[$mid] == $k){ return $mid; }elseif ($k < $array[$mid]){ return find($array, $low, $mid-1, $k); }else{ return find($array, $mid+1, $high, $k); } } die('Not have...');} //test$array = array(2,4,3,5);$n = count($array);$r = find($array,0,$n, 7、合并多个数组,不用array_merge(),题目来于论坛。 思路:遍历每个数组,重新组成一个新数组。 <?phpfunction t(){ $c = func_num_args()-1; $a = func_get_args(); //print_r($a); for($i=0; $i<=$c; $i++){ if(is_array($a[$i])){ for($j=0; $j<count($a[$i]); $j++){ $r[] = $a[$i][$j]; } } else { die('Not a array!'); } } return $r;} //testprint_r(t(range(1,4),range(1,4),range(1,4)));echo '<br/>';$a = array_merge(range(1,4),range(1,4),range(1,4));print_r($a); 8、牛年求牛:有一母牛,到4岁可生育,每年一头,所生均是一样的母牛,到15岁绝育,不再能生,20岁死亡,问n年后有多少头牛。(来自论坛) <?phpfunction t($n) { static $num = 1 for($j=1; $j<=$n; $j++){ if($j>=4 && $j<15) {$num++;t($n-$j);} if($j==20){$num--;} } return $num;} //testecho t(8);

2009-05-29

一套erp系统的详细设计报告

一、总体概述 5 二、名称解释 6 1、名称解释 6 2、流程图例解释 7 三、V2.0 ERP系统总体架构图 8 四、V2.0业务处理主要数据流程总图 9 五、系统基本参数说明 11 六、辅助资料 15 1.货物类别资料 15 2.采购员资料 17 3.销售员资料 19 4.存货地点资料 21 5.编制货币资料 23 6.汇率资料 24 7.编制港口资料 26 8.国家资料 27 9.单位资料 28 10.付款方式 29 11.科目资料 30 12.凭证摘要资料库维护 32 13.客户投诉原因资料定义 33 14.硬件设备资料 34 15.新旧货物替换关系资料 36 16.生产线资料(车间资料) 38 17.退货退料等原因资料定义 40 18.材料 41 19.颜色 42 20.银行资料定义 43 21.付款方法(结算方式) 44 22.产品特性 46 23.海关合同 47 25.折扣类型 49 26.生产线员工资料 50 27.工序资料定义 52 28.产地资料 53 29.付款条件 55 30.送货条件 57 29.装运条件 59 30.装运方式 61 31.供应商客户分析类别档案 63 32.附加费用定义 65 33.员工资料 67 34.部门资料定义 70 区域定义 71 七、主档部分 72 1.货物资料 72 2.货品SCM关系管理 77 3.物料清单BOM 79 4.工艺工序管理(加工中心) 82 5.供应商资料管理 86 6.客户资料管理 91 7.BOM反向查询报表 96 八、系统维护 97 1.公司资料定义 97 2.货物编号规则定义 100 3.文件头管理 104 4.语文言设置 107 5.日志数据处理 108 6.历史数据处理 110 7.注销状态数据处理 111 8.操作日志处理 112 9.单据号码规则维护 113 10.参数设置 116 11.角色管理 119 12.用户管理 120 13.权限管理 122 14.操作用户通信中心 125 15.提示资料维护 126 16、用户接口(界面)定制中心—销售订单(系统维护功能) 128 17.系统程序错误管理 131 17.1应用程序错误处理 131 17.2数据窗口错误处理 133 17.3数据验证错误处理 135 17.4错误处理报表 137 九、仓库管理 138 总概说明 138 1.转仓处理 141 2.库存调整 145 3.仓库盘点 148 4.货品交易记录报表 152 十一、分销管理 153 1、货品包装要求 154 2、包装形式资料 156 3、价格引擎 159 4、销售报价 162 5、销售订单 167 6、销售订单更改 178 7、销售出货 179 8、QC控制(分销出货) 185 9、销售发票 188 10、销售退货 193 11、销售退货通知单 197 12、分销订单应出货监控 198 13、包装资料维护 200 14、销售预测 200 15、客户销售业绩分析 201 16、销售人员业绩分析 202 17、货品利润分析 202 18、销售月结 202 19、货品装柜 202 十二、采购管理 203 1、采购询价 203 2、采购订单 208 3、采购收货 214 4、IQC控制(外购品质量控制) 220 5、采购退货[PO06] 223 6、供应商发票[PO07] 227 7、采购订单修改 231 8、订单采购应收货跟踪维护(谭建明) 233 9、采购退货通知书 235 十三、计划 236 1、行事历 236 2、计划周期定义(管理) 239 3、MRP运算 243 4、主生产计划 244 5、物料需求计划 244 6、粗能力计划 244 7、盘点计划 244 十四、生产 245 1、 生产单开单 245 2、 生产单进度处理 249 3、 排产 249 4、 生产领料 249 5、 成品回仓 249 6、 生产退料 249 7、 生产单清单 249 7、工程变动 250 十五、客户服务 251 1.服务性质资料定义 251 2.服务项目资料定义 252 3.咨询投诉处理() 253 4.服务跟踪及完成处理() 257 5.服务报告处理 257 十七、专用数据报表 258 货物清单报表 258 成本预算报表 258 货品存量分布报表 260 附记 261 模块编码表: 261 功能编码表: 261

2009-05-26

高级PHP 模式,框架,测试和其他(英文版)

--------------------------------------- 原名:<<Pro PHP Patterns, Frameworks, Testing and More>> 作者:Kevin MCArthur 出版者: APress,Mar 24,2008。 页数:349页。 ------------------------------------------ 难度指数:中-高级。 推荐指数: (推荐指数分级:0-最低级;5-最高级) 内容祥略 -- 指书本内容对论述领域的覆盖面和深入程度 实用性 -- 指书本内容能否直接用在项目上 重要性 -- 指书本内容对适用读者的参考程度和启发程度 独创性 -- 指书本论述的内容是否独创的,或之前没有同类型的书 写作风格 -- 指语言的流畅性,条理性,易读性。是否突出重点,难点,有没有介绍深入的学习材料,等。 -- 内容祥略:3 (主要覆盖了OOP的高级概念和应用介绍。) -- 实用性: 4 (实践性强,很容易将其原理用到项目上) -- 重要性: 3 (对企业开发和大项目开发有帮助。也可以作为学习OOP的高级内容的材料。) -- 独创性: 5 (论述的深度比较深,主要面向有OOP经验的PHPERE。目前国内还没有同类型的书) -- 写作风格:4 (使用语言正规,风格正统。) (注:难度指数和推荐指数是依照本人的认识来确定,通过细分推荐指数来尽量保持其客观性) ======================================================= 目录: 第一部分 OOP和模式 (OOP and Patterns) 抽象类,接口,和合约编程 (Abstract Classes, Interfaces, and Programming by Contract) 抽象类 (Abstract Classes) 接口 (Interfaces) instanceof 操作器 (The instanceof Operator) 合约编程 (Programming by Contract) 小结 (Just the Facts) 静态变量,成员,和方法 (Static Variables, Members, and Methods) 静态变量 (Static Variables) 类中的静态用法 (Static Usage in Classes) 静态方法讨论 (The Static Debate) 小结 (Just the Facts) 单一模式和工厂模式 (Singleton and Factory Patterns) 责任制和单一模式 (Responsibility and the Singleton Pattern) 工厂模式 (The Factory Pattern) 小结 (Just the Facts) 异常 (Exceptions) 异常的实施 (Implementing Exceptions) 异常日志 (Logging Exceptions) 异常负荷 (Exception Overhead) 错误代码 (Error Coding) 类型暗示和异常 (Type Hinting and Exceptions) 异常的再抛出 (Rethrowing Exceptions) 小结 (Just the Facts) PHP6中有哪些变化 (What's New in PHP 6) 安装PHP (PHP Installation) PHP中的Unicode码 (Unicode in PHP 6) 命名空间 (Namespaces) 静态的迟绑定 (Late Static Binding) 变化的静态方法 (Dynamic Static Methods) 三元指定简略法 (Ternary Assignment Shorthand (ifsetor)) XMLWriter 类 (XMLWriter Class) 小结 (Just the Facts) 第二部分 测试和文档 (Testing and Documentation) 文档和编程规范 (Documentation and Coding Conventions) 编程规范 (Coding Conventions) PHP评论和解释 (PHP Comments and Lexing) PHPDoc (PHPDoc) DocBook (DocBook) 小结 (Just the Facts) API反射 (Reflection API) API反射介绍 (Introducing the Reflection API) 基於反射的文档数据解析 (Parsing Reflection-Based Documentation Data) API反射扩展 (Extending the Reflection API) 小结 (Just the Facts) 测试,部署,和持续整合 (Testing, Deployment, and Continuous Integration) Subversion 版本控制 (Subversion for Version Control) PHPUnit 用于单元测试 (PHPUnit for Unit Testing) Phing 用于部署 (Phing for Deployment) Xinc,持续整合服务器 (Xinc, the Continuous Integration Server) Xdebug 用于查错 (Xdebug for Debugging) 小结 (Just the Facts) 第三部分 标准PHP库 (SPL) SPL介绍 (Introduction to SPL) SPL 基础 (SPL Fundamentals) 遍历器 (Iterators) 数组重载 (Array Overloading) 观测器模式 (The Observer Pattern) 序列化 (Serialization) SPL 自动装载 (SPL Autoloading) 对象证实 (Object Identification) 小结 (Just the Facts) SPL遍历方法 (SPL Iterators) 遍历器接口和遍历器 (Iterator Interfaces and Iterators) 在真实项目中贯彻遍历器 (Real-World Iterator Implementations) 小结 (Just the Facts) SPL文件和目录处理方法 (SPL File and Directory Handling) 文件和目录信息 (File and Directory Information) 目录的遍历 (Iteration of Directories) SPL 文件对象操作器 (SPL File Object Operations) 小结 (Just the Facts) SPL数组重载方法 (SPL Array Overloading) ArrayAccess 介绍 (Introducing ArrayAccess) ArrayObject 介绍 (Introducing ArrayObject) SPL 购物车的建造 (Building an SPL Shopping Cart) 把对象当作键 (Using Objects As Keys) 小结 (Just the Facts) SPL异常 (SPL Exceptions) 逻辑异常 (Logic Exceptions) 编译异常 (Runtime Exceptions) 调用不良函数与方法异常 (Bad Function and Method Call Exceptions) 领域异常 (Domain Exceptions) 范围异常 (Range Exceptions) 参数无效异常 (Invalid Argument Exceptions) 长度异常 (Length Exceptions) 溢出异常 (Overflow Exceptions) 不足异常 (Underflow Exceptions) 小结 (Just the Facts) 第四部分 MVC模式 MVC架构 (MVC Architecture) 为什么要用MVC? (Why Use MVC?) MVC应用概述 (MVC Application Layout) 从Web服务的角度来看 (From the Web Server) 行动和控制器 (Actions and Controllers) 模型 (Models) 视图 (Views) MVC 框架的选择条件 (Criteria for Choosing an MVC Framework) MVC 框架的架构 (Architecture of the MVC Framework.) MVC 框架文档 (MVC Framework Documentation) MVC 框架社区 (MVC Framework Community) MVC 框架支持 (MVC Framework Support) MVC 框架的可变性 (MVC Framework Flexibility) 建立自己的MVC 框架 (Roll Your Own MVC Framework) 设立虚拟主机 (Setting Up a Virtual Host) 创建MVC 框架 (Creating an MVC Framework) 小结 (Just the Facts) Zend Framework 介绍 (Introduction to the Zend Framework) 建立Zend Framework (Setting Up the Zend Framework) 控制器,视图,模型的创建 (Creating Controllers, Views, and Models) 增加功能 (Adding Functionality) 小结 (Just the Facts) Zend Framework 高级特征 (Advanced Zend Framework) 配置文件管理 (Managing Configuration Files) 全址视图变量设定 (Setting Site-Wide View Variables) 对象分享 (Sharing Objects) 错误处理 (Error Handling) 日志应用 (Application Logging) 缓存 (Caching) 用户鉴证 (Authorizing Users) 在PHP中使用JSON (Using JSON with PHP) 路径设定 (Customizing Routes) 会话管理 (Managing Sessions) 发送邮件 (Sending Mail) 创造PDF文件 (Creating PDF Files) 整合Web服务 (Integrating with Web Services) 小结 (Just the Facts) Zend Framework 应用 (The Zend Framework Applied) 建立模块和模型 (Module and Model Setup) 需要循环 (The Request Cycle) 插件的创建 (Creating Plug-ins) 协助器的创建 (Creating Helpers) 进程控制的实施 (Implementing Access Control) 两步法视图的使用 (Using a Two-Step View) 小结 (Just the Facts) 第五部分 Web 2.0 Ajax 和 JSON 介绍 (Ajax and JSON) JSON 和 PHP (JSON and PHP) JSON 和 Javascrīpt (JSON and Javascrīpt) Ajax 项目介绍 (Some Ajax Projects) 小结 (Just the Facts) SOAP的Web服务介绍 (Introduction to Web Services with SOAP) PHP Web服务架构介绍 (Introduction to the PHP Web Services Architecture) WSDL 介绍 (Introduction to WSDL) SOAP 介绍 (Introduction to SOAP) 使用PHP SOAP 扩展 (Using the PHP SOAP Extension) 实际例子 (A Real-World Example) 小结 (Just the Facts) 高级Web服务介绍 (Advanced Web Services) 复杂类型 (Complex Types) 鉴证 (Authentication) 会话 (Sessions) 对象 和 持续 (Objects and Persistence) 二进制数据传送 (Binary Data Transmission) 小结 (Just the Facts) 证书鉴证 (Certificate Authentication) 公匙构造的安全性 (Public Key Infrastructure Security) 建立客户端证书鉴证 (Setting Up Client Certificate Authentication) PHP 鉴证控制 (PHP Authentication Control) 小结 (Just the Facts) 索引 (INDEX) -------------------------------------------------------- 原书介绍: 过去十年来,PHP已经变成了羽毛丰满的OOP语言了。现在越来越多的企业使用PHP,因为现在PHP既易学,功能又强大。 此书为你介绍了很多工作中会遇到的事情,比如,深入理解OOP概念,框架的使用,系统的高级应用,等等。 这是一个高级论题的书。材料都是精心挑选的。读者应该已经对PHP和HTTP有很强的了解。如果你觉得自己是中-高级水平的人,这本书就是为你所写的。 ========================================================= 我的介绍: 这本书给我的第一印象是新--因为是刚发行就拿到了,呵呵。看完后的感觉还是新--因为内容很新。 如果把PHP的知识从初级到高级,从旧到新排列好,此书作者在中间恰好一刀两断,把前面的一段扔掉,把后面的一段留了下来。此书一开始就是什么抽象类,接口,静态变量,模式,等等,全是OOP的高级概念。 第一部分主要讨论了OOP的高级概念,其中异常部分讲的比较深入,PHP6的介绍则是独创性的。(PHP6正式版还没出来呢。) 第二部分讨论了做大项目时的一些要素,包括编程规范,测试和文档。第三部分深入讨论了SPL,也主要是用于做一些大项目的。 第四部分讨论了如何建立基於MVC模式的框架,并以Zend Framework为例,作了介绍。我对这部分比较感兴趣,可惜Zend Framework的内容太重了点。 第五部分则是讲了在创造Web2。0应用时会用到的一些技术,如:AJAX/JSON, SOAP,Web Servers,用户验证证书,等等。 所有这些概念的讨论都带有例子讲述,因此实用性还是很强的,使用的语言则是比较正规,相对而言也比较沉闷,如果不是工作需要,或是个人对内容很有兴趣,能把书从头到未看完的人(即使是看中文),我还是满佩服的。不过,作者好像也知道这点,所以在写作上,各章之间还是比较独立的,方便跳跃阅读。 总而言之,这本书覆盖了PHP OOP语言应用上高级内容,以及一些应用,如使用框架,SPL,测试,异常处理,Web Servers,等等。而这些应用主要是偏向于大项目和企业级应用的。讲述的内容比较深,我感觉,学习或使用OO少於一年的同学,看这本书可能会感到吃力。但如果你要做大项目,这本书是一本很好的学习材料。

2009-05-11

跑调网页配色工具.CHM

网页配色方案创建工具 网页配色方案创建工具 网页配色方案创建工具 网页配色方案创建工具

2009-05-09

pb资料收集(数据窗口)

pb资料收集 数据窗口 datawindow powerbuilder

2009-04-29

中软培训中心 CSS网站布局与开发技巧(pdf)

中软培训中心 CSS网站布局与开发技巧 第一章 Web标准与CSS布局 第二章 XHTML与CSS基础 第三章 CSS网页布局 第四章:CSS网站元素设计

2009-04-25

PHP中文分词扩展(demoPHPCWS)

PHP中文分词扩展(demoPHPCWS)

2009-04-21

PHP 面向对象技术(全面讲解).txt

1.面向对象的概念 面向对象编程(Object Oriented Programming, OOP, 面向对象程序设计)是一种计算机编程 架构,OOP 的一条基本原则是计算机程序是由单个能够起到子程序作用的单元或对象组合而成,OOP 达到了软件工程的三个目标:重用性、灵活性和扩展性。为了实现整体运算,每个对象都能够接收 信息、处理数据和向其它对象发送信息。面向对象一直是软件开发领域内比较热门的话题,首先, 面向对象符合人类看待事物的一般规律。其次,采用面向对象方法可以使系统各部分各司其职、各 尽所能。为编程人员敞开了一扇大门,使其编程的代码更简洁、更易于维护,并且具有更强的可重 用性。有人说PHP 不是一个真正的面向对象的语言,这是事实。PHP 是一个混合型语言,你可以使 用OOP,也可以使用传统的过程化编程。然而,对于大型项目,你可能需要在PHP 中使用纯的OOP 去声明类,而且在你的项目里只用对象和类。这个概念我先不多说了,因为有很多朋友远离面向对 象编程的主要原因就是一接触面向对象概念的时候就理解不上去, 所以就不想去学下去了。等读 者看完整篇内容后再去把概念搞明白吧。 2.什么是类,什么是对象,类和对象之间的关系 类的概念:类是具有相同属性和服务的一组对象的集合。它为属于该类的所有对象提供了统一 的抽象描述,其内部包括属性和服务两个主要部分。在面向对象的编程语言中,类是一个独立的程 序单位,它应该有一个类名并包括属性说明和服务说明两个主要部分。 LAMP 大讲堂PHP 面向对象技术(全面讲解) 网站:http://www.phpchina.com 投稿:[email protected] 《PHPer》66/104 对象的概念:对象是系统中用来描述客观事物的一个实体,它是构成系统的一个基本单位。一 个对象由一组属性和对这组属性进行操作的一组服务组成。从更抽象的角度来说,对象是问题域或 实现域中某些事物的一个抽象,它反映该事物在系统中需要保存的信息和发挥的作用;它是一组属 性和有权对这些属性进行操作的一组服务的封装体。客观世界是由对象和对象之间的联系组成的。 类与对象的关系就如模具和铸件的关系,类的实例化结果就是对象,而对一类对象的抽象就是 类。类描述了一组有相同特性(属性)和相同行为(方法)的对象。 上面大概就是它们的定义吧,也许你是刚接触面向对象的朋友, 不要被概念的东西搞晕了,给 你举个例子吧,如果你去中关村想买几台组装的PC 机,到了那里你第一步要干什么,是不是装机 的工程师和你坐在一起,按你提供的信息和你一起完成一个装机的配置单呀,这个配置单就可以想 象成是类,它就是一张纸,但是它上面记录了你要买的PC 机的信息,如果用这个配置单买10 台机 器,那么这10 台机子,都是按这个配置单组成的,所以说这10 台机子是一个类型的,也可以说是 一类的。那么什么是对象呢,类的实例化结果就是对象,用这个配置单配置出来(实例化出来)的 机子就是对象,是我们可以操作的实体,10 台机子,10 个对象。每台机子都是独立的,只能说明 他们是同一类的,对其中一个机做任何动作都不会影响其它9 台机器,但是我对类修改,也就是在 这个配置单上加一个或少一个配件,那么装出来的9 个机子都改变了,这是类和对象的关系(类的 实例化结果就是对象)。 3.什么是面向对象编程呢? 就不说他的概念,如果你想建立一个电脑教室,首先要有一个房间, 房间里面要有N 台电脑, 有N 张桌子, N 把椅子, 白板, 投影机等等,这些是什么,刚才咱们说了,这就是对象,能看 到的一个个的实体,可以说这个电脑教室的单位就是这一个个的实体对象, 它们共同组成了这个 电脑教室,那么我们是做程序,这和面向对象有什么关系呢?开发一个系统程序和建一个电脑教室 类似,你把每个独立的功能模块抽象成类,形成对象,由多个对象组成这个系统,这些对象之间都 能够接收信息、处理数据和向其它对象发送信息等等相互作用。就构成了面向对象的程序。 4.如何抽象出一个类? 上面已经介绍过了,面向对象程序的单位就是对象,但对象又是通过类的实例化出来的,所以 我们首先要做的就是如何来声明类,做出来一个类很容易,只要掌握基本的程序语法定义规则就可 以做的出来,那么难点在那里呢?一个项目要用到多少个类,用多少个对象,在那要定义类,定义 一个什么样的类,这个类实例化出多少个对象,类里面有多少个属性,有多少个方法等等,这就需 要读者通过在实际的开发中就实际问题分析设计和总结了。 类的定义: class 类名{ } 使用一个关键字class 和后面加上一个你想要的类名以及加上一对大括号, 这样一个类的结构 就定义出来了,只要在里面写代码就可以了,但是里面写什么?能写什么?怎样写才是一个完整的 类呢?上面讲过来,使用类是为了让它实例出对象来给我们用,这就要知道你想要的是什么样的对 象了,像上面我们讲的一个装机配置单上写什么,你装出来的机子就有什么。比如说,一个人就是 一个对象,你怎么把一个你看好的人推荐给你们领导呢?当然是越详细越好了: 首先,你会介绍这个人姓名、性别、年龄、身高、体重、电话、家庭住址等等。 然后,你要介绍这个人能做什么,可以开车,会说英语,可以使用电脑等等。 只要你介绍多一点,别人对这个人就多一点了解,这就是我们对一个人的描述, 现在我们总结 一下,所有的对象我们用类去描述都是类似的,从上面人的描述可以看到, 做出一个类来,从定 义的角度分两部分,第一是从静态上描述,第二是从动态上描述, 静态上的描述就是我们所说的 LAMP 大讲堂PHP 面向对象技术(全面讲解) 网站:http://www.phpchina.com 投稿:[email protected] 《PHPer》67/104 属性,像上面我们看到的,人的姓名、性别、年龄、身高、体重、电话、家庭住址等等。动态上也 就是人的这个对象的功能,比如这个人可以开车,会说英语,可以使用电脑等等,抽象成程序时, 我们把动态的写成函数或者说是方法,函数和方法是一样的。所以,所有类都是从属性和方法这两 方面去写, 属性又叫做这个类的成员属性,方法叫做这个类的成员方法。 class 人{ 成员属性:姓名、性别、年龄、身高、体重、电话、家庭住址 成员方法:可以开车, 会说英语, 可以使用电脑 } 属性: 通过在类定义中使用关键字" var "来声明变量,即创建了类的属性,虽然在声明成员属性 的时候可以给定初始值, 但是在声明类的时候给成员属性初始值是没有必要的,比如说要 是把人的姓名赋上“张三”,那么用这个类实例出几十个人,这几十个人都叫张三了,所以 没有必要, 我们在实例出对象后给成员属性初始值就可以了。 如: var $somevar; 方法(成员函数): 通过在类定义中声明函数,即创建了类的方法。 如: function somefun(参数列表) { ... ... } <?php class Person { //下面是人的成员属性 var $name; //人的名字 var $sex; //人的性别 var $age; //人的年龄 //下面是人的成员方法 function say() //这个人可以说话的方法 { echo "这个人在说话"; }f unction run() //这个人可以走路的方法 { echo "这个人在走路"; } } ?> 上面就是一个类的声明,从属性和方法上声明出来的一个类,但是成员属性最好在声明的时候 不要给初始的值,因为我们做的人这个类是一个描述信息,将来用它实例化对象,比如实例化出来 10 个人对象,那么这10 个人, 每一个人的名字、性别、年龄都是不一样的,所以最好不要在这个 地方给成员属性赋初值,而是对每个对象分别赋值的。 用同样的办法可以做出你想要的类了,只要你能用属性和方法能描述出来的实体都可以定义成 类,去实例化对象。 为了加强你对类的理解,我们再做一个类,做一个形状的类,形状的范围广了点, 我们就做个 矩形吧,先分析一下,想一想从两方面分析,矩形的属性都有什么?矩形的功能都有什么? class 矩形 LAMP 大讲堂PHP 面向对象技术(全面讲解) 网站:http://www.phpchina.com 投稿:[email protected] 《PHPer》68/104 { //矩形的属性 矩形的长; 矩形的宽; //矩形的方法 矩形的周长; 矩形的面积; } <?php class Rect { var $kuan; var $gao; function zhouChang() { 计算矩形的周长; }f unction mianJi() { 计算矩形的面积; } } ?> 如果用这个类来创建出多个矩形对象,每个矩形对象都有自己的长和宽, 都可以求出自己的周 长和面积了。 类的声明我们就到这里吧!! 5.如何实例化对象 我们上面说过面向对象程序的单位就是对象,但对象又是通过类的实例化出来的,既然我们类 会声明了,下一步就是实例化对象了。 当定义好类后,我们使用new 关键字来生成一个对象。 $对象名称= new 类名称(); <?php class Person { //下面是人的成员属性 var $name; //人的名字 var $sex; //人的性别 var $age; //人的年龄 //下面是人的成员方法 function say() //这个人可以说话的方法 { echo "这个人在说话"; }f unction run() //这个人可以走路的方法 { echo "这个人在走路"; } } $p1=new Person(); $p2=new Person(); LAMP 大讲堂PHP 面向对象技术(全面讲解) 网站:http://www.phpchina.com 投稿:[email protected] 《PHPer》69/104 $p3=new Person(); ?> $p1=new Person(); 这条代码就是通过类产生实例对象的过程,$p1 就是我们实例出来的对象名称,同理,$p2, $p3 也是我们实例出来的对象名称,一个类可以实例出多个对象,每个对象都是独立的,上面的代码相 当于实例出来3 个人来,每个人之间是没有联系的,只能说明他们都是人类,每个人都有自己的姓 名,性别和年龄的属性,每个人都有说话和走路的方法,只要是类里面体现出来的成员属性和成员 方法,实例化出来的对象里面就包含了这些属性和方法。 对像在PHP 里面和整型、浮点型一样,也是一种数据类,都是存储不同类型数据用的,在运行 的时候都要加载到内存中去用, 那么对象在内存里面是怎么体现的呢?内存从逻辑上说大体上是 分为4 段,栈空间段、堆空间段、代码段、初始化静态段,程序里面不同的声明放在不同的内存段 里面,栈空间段是存储占用相同空间长度并且占用空间小的数据类型的地方,比如说整型1,10, 100,1000,10000,100000 等等,在内存里面占用空间是等长的,都是64 位4 个字节。那么数据 长度不定长,而且占有空间很大的数据类型的数据放在那内存的那个段里面呢?这样的数据是放在 堆内存里面的。栈内存是可以直接存取的,而堆内存是不可以直接存取的内存。对于我们的对象来 数就是一种大的数据类型而且是占用空间不定长的类型,所以说对象是放在堆里面的,但对象名称 是放在栈里面的,这样通过对象名称就可以使用对象了。 $p1=new Person(); 对于这个条代码, $p1 是对象名称在栈内存里面,new Person()是真正的对象是在堆内存里面 的,具体的请看下图: 从上图可以看出$p1=new Person();等号右边是真正的对象实例,在堆内存里面的实体,上图一 共有3 次new Person(),所以会在堆里面开辟3 个空间,产生3 个实例对象,每个对象之间都是相 互独立的,使用自己的空间,在PHP 里面,只要有一个new 这个关键字出现就会实例化出来一个对 象,在堆里面开辟一块自己的空间。 每个在堆里面的实例对象是存储属性的,比如说,现在堆里面的实例对象里面都存有姓名、性 别和年龄。每个属性又都有一个地址。 $p1=new Person();等号的右边$p1 是一个引用变量,通过赋值运算符“=”把对象的首地址赋 给“$p1”这个引用变量,所以$p1 是存储对象首地址的变量,$p1 放在栈内存里边,$p1 相当于一 个指针指向堆里面的对象,所以我们可以通过$p1 这个引用变量来操作对象,通常我们也称对象引用 为对象。 6.如何去使用对象中的成员 上面看到PHP 对象中的成员有两种一种是成员属性,一种是成员方法。对象我们以经可以声明 了,$p1=new Person();怎么去使用对象的成员呢?要想访问对象中的成员就要使用一个特殊的操 作符“->”来完成对象成员的访问: LAMP 大讲堂PHP 面向对象技术(全面讲解) 网站:http://www.phpchina.com 投稿:[email protected] 《PHPer》70/104 对象->属性$p1->name; $p2->age; $p3->sex; 对象->方法$p1->say(); $p2->run(); 如下面实例: <?php class Person { //下面是人的成员属性 var $name; //人的名字 var $sex; //人的性别 var $age; //人的年龄 //下面是人的成员方法 function say() //这个人可以说话的方法 { echo "这个人在说话"; }f unction run() //这个人可以走路的方法 { echo "这个人在走路"; } } $p1=new Person(); //创建实例对象$p1 $p2=new Person(); //创建实例对象$p2 $p3=new Person(); //创建实例对象$p3 //下面三行是给$p1对象属性赋值 $p1->name=”张三”; $p1->sex=”男”; $p1->age=20; //下面三行是访问$p1对象的属性 echo “p1对象的名字是:”.$p1->name.”<br>”; echo “p1对象的性别是:”.$p1->sex.”<br>”; echo “p1对象的年龄是:”.$p1->age.”<br>”; //下面两行访问$p1对象中的方法 $p1->say(); $p1->run(); //下面三行是给$p2对象属性赋值 $p2->name=”李四”; $p2->sex=”女”; $p2->age=30; //下面三行是访问$p2对象的属性 echo “p2对象的名字是:”.$p2->name.”<br>”; echo “p2对象的性别是:”.$p2->sex.”<br>”; echo “p2对象的年龄是:”.$p2->age.”<br>”; //下面两行访问$p2对象中的方法 $p2->say(); $p2->run(); //下面三行是给$p3对象属性赋值 $p3->name=”王五”; $p3->sex=”男”; $p3->age=40; //下面三行是访问$p3对象的属性 echo “p3对象的名字是:”.$p3->name.”<br>”; echo “p3对象的性别是:”.$p3->sex.”<br>”; LAMP 大讲堂PHP 面向对象技术(全面讲解) 网站:http://www.phpchina.com 投稿:[email protected] 《PHPer》71/104 echo “p3对象的年龄是:”.$p3->age.”<br>”; //下面两行访问$p3对象中的方法 $p3->say(); $p3->run(); ?> 从上例中可以看出只是对象里面的成员就要使用对象->属性、对象->方法形式访问,再没有第 二种方法来访问对象中的成员了。 7.特殊的引用“$this”的使用 现在我们知道了如何访问对象中的成员,是通过“对象->成员”的方式访问的,这是在对象的外 部去访问对象中成员的形式,那么如果我想在对象的内部,让对象里的方法访问本对象的属性,或 是对象中的方法去调用本对象的其它方法这时我们怎么办?因为对象里面的所有的成员都要用对 象来调用,包括对象的内部成员之间的调用,所以在PHP 里面给我提供了一个本对象的引用$this, 每个对象里面都有一个对象的引用$this 来代表这个对象,完成对象内部成员的调用, this 的本意就是 “这个”的意思,上面的实例里面,我们实例化三个实例对象$P1、$P2、$P3,这三个对象里面各 自存在一个$this 分别代表对象$p1、$p2、$p3 。 通过上图我们可以看到,$this 就是对象内部代表这个对象的引用,在对象内部和调用本对象的 成员和对象外部调用对象的成员所使用的方式是一样的。 $this->属性$this->name; $this->age; $this->sex; $this->方法$this->say(); $this->run(); 修改一下上面的实例,让每个人都说出自己的名字,性别和年龄: <?php class Person { //下面是人的成员属性 var $name; //人的名字 var $sex; //人的性别 var $age; //人的年龄 //下面是人的成员方法 function say() //这个人可以说话的方法 { echo "我的名字叫:".$this->name." 性别:".$this->sex." 我的年龄是: ".$this->age."<br>"; }f unction run() //这个人可以走路的方法 { echo "这个人在走路"; } } $p1=new Person(); //创建实例对象$p1 $p2=new Person(); //创建实例对象$p2 LAMP 大讲堂PHP 面向对象技术(全面讲解) 网站:http://www.phpchina.com 投稿:[email protected] 《PHPer》72/104 $p3=new Person(); //创建实例对象$p3 //下面三行是给$p1对象属性赋值 $p1->name="张三"; $p1->sex="男"; $p1->age=20; //下面访问$p1对象中的说话方法 $p1->say(); //下面三行是给$p2对象属性赋值 $p2->name="李四"; $p2->sex="女"; $p2->age=30; //下面访问$p2对象中的说话方法 $p2->say(); //下面三行是给$p3对象属性赋值 $p3->name="王五"; $p3->sex="男"; $p3->age=40; //下面访问$p3对象中的说话方法 $p3->say(); ?> 输出结果为: 我的名字叫:张三性别:男我的年龄是:20 我的名字叫:李四性别:女我的年龄是:30 我的名字叫:王五性别:男我的年龄是:40 分析一下这个方法: function say() //这个人可以说话的方法 { echo "我的名字叫:".$this->name." 性别:".$this->sex." 我的年龄是: ".$this->age."<br>"; } 在$p1、$p2 和$p3 这三个对象中都有say()这个方法,$this 分别代表这三个对象, 调用相应 的属性,打印出属性的值,这就是在对象内部访问对象属性的方式, 如果相在say()这个方法里调 用run()这个方法也是可以的,在say()这个方法中使用$this->run()的方式来完成调用。 8.构造方法与析构方法 大多数类都有一种称为构造函数的特殊方法。当创建一个对象时,它将自动调用构造函数,也 就是使用new 这个关键字来实例化对象的时候自动调用构造方法。 构造函数的声明与其它操作的声明一样,只是其名称必须是__construct( )。这是PHP5 中的变化, 以前的版本中,构造函数的名称必须与类名相同,这种在PHP5 中仍然可以用,但现在以经很少有 人用了,这样做的好处是可以使构造函数独立于类名,当类名发生改变时不需要改相应的构造函数 名称了。为了向下兼容,如果一个类中没有名为__construct( )的方法,PHP 将搜索一个php4 中的写 法,与类名相同名的构造方法。 格式:function __construct ( [参数] ) { ... ... } 在一个类中只能声明一个构造方法,而是只有在每次创建对象的时候都会去调用一次构造方法, 不能主动的调用这个方法,所以通常用它执行一些有用的初始化任务。比如对成属性在创建对象的 时候赋初值。 <? //创建一个人类 class Person { LAMP 大讲堂PHP 面向对象技术(全面讲解) 网站:http://www.phpchina.com 投稿:[email protected] 《PHPer》73/104 //下面是人的成员属性 var $name; //人的名字 var $sex; //人的性别 var $age; //人的年龄 //定义一个构造方法参数为姓名$name、性别$sex和年龄$age function __construct($name, $sex, $age) { //通过构造方法传进来的$name给成员属性$this->name赋初使值 $this->name=$name; //通过构造方法传进来的$sex给成员属性$this->sex赋初使值 $this->sex=$sex; //通过构造方法传进来的$age给成员属性$this->age赋初使值 $this->age=$age; }/ /这个人的说话方法 function say() { echo "我的名字叫:".$this->name." 性别:".$this->sex." 我的年龄是: ".$this->age."<br>"; } } //通过构造方法创建3个对象$p1、p2、$p3,分别传入三个不同的实参为姓名、性别和年龄 $p1=new Person(“张三”,”男”, 20); $p2=new Person(“李四”,”女”, 30); $p3=new Person(“王五”,”男”, 40); //下面访问$p1对象中的说话方法 $p1->say(); //下面访问$p2对象中的说话方法 $p2->say(); //下面访问$p3对象中的说话方法 $p3->say(); ?> 输出结果为: 我的名字叫:张三性别:男我的年龄是:20 我的名字叫:李四性别:女我的年龄是:30 我的名字叫:王五性别:男我的年龄是:40 如图: LAMP 大讲堂PHP 面向对象技术(全面讲解) 网站:http://www.phpchina.com 投稿:[email protected] 《PHPer》74/104 析构函数: 与构造函数相对的就是析构函数。析构函数是PHP5 新添加的内容,在PHP4 中没有析构函数。 析构函数允许在销毁一个类之前执行的一些操作或完成一些功能,比如说关闭文件,释放结果集等, 析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行,也就是对象在内存中 被销毁前调用析构函数。与构造函数的名称类似,一个类的析构函数名称必须是__destruct( )。析构 函数不能带有任何参数。 格式:function __destruct ( ) { ... ... } <? //创建一个人类 class Person { //下面是人的成员属性 var $name; //人的名字 var $sex; //人的性别 var $age; //人的年龄 //定义一个构造方法参数为姓名$name、性别$sex和年龄$age function __construct($name, $sex, $age) { //通过构造方法传进来的$name给成员属性$this->name赋初使值 $this->name=$name; //通过构造方法传进来的$sex给成员属性$this->sex赋初使值 $this->sex=$sex; //通过构造方法传进来的$age给成员属性$this->age赋初使值 $this->age=$age; } //这个人的说话方法 function say() { echo "我的名字叫:".$this->name." 性别:".$this->sex." 我的年龄是: ".$this->age."<br>"; } //这是一个析构函数,在对象销毁前调用 function __destruct() { echo “再见”.$this->name.”<br>”; } //通过构造方法创建3个对象$p1、p2、$p3,分别传入三个不同的实参为姓名、性别和年龄 $p1=new Person(“张三”,”男”, 20); $p2=new Person(“李四”,”女”, 30); $p3=new Person(“王五”,”男”, 40); //下面访问$p1对象中的说话方法 $p1->say(); //下面访问$p2对象中的说话方法 $p2->say(); //下面访问$p3对象中的说话方法 $p3->say(); ?> 输出结果为: 我的名字叫:张三性别:男我的年龄是:20 我的名字叫:李四性别:女我的年龄是:30 我的名字叫:王五性别:男我的年龄是:40 LAMP 大讲堂PHP 面向对象技术(全面讲解) 网站:http://www.phpchina.com 投稿:[email protected] 《PHPer》75/104 再见张三 再见李四 再见王五 9.封装性 封装性是面向对象编程中的三大特性之一,封装性就是把对象的属性和服务结合成一个独立的 相同单位,并尽可能隐蔽对象的内部细节,包含两个含义:1.把对象的全部属性和全部服务结合在一 起,形成一个不可分割的独立单位(即对象)。2.信息隐蔽,即尽可能隐蔽对象的内部细节,对外形 成一个边界〔或者说形成一道屏障〕,只保留有限的对外接口使之与外部发生联系。 封装的原则在软件上的反映是:要求使对象以外的部分不能随意存取对象的内部数据(属性), 从而有效的避免了外部错误对它的"交叉感染",使软件错误能够局部化,大大减少查错和排错的难 度。 用个实例来说明吧,假如某个人的对象中有年龄和工资等属性,像这样个人隐私的属性是不想 让其它人随意就能获得到的,如果你不使用封装,那么别人想知道就能得到,但是如果你封装上之 后别人就没有办法获得封装的属性,除非你自己把它说出去,否则别人没有办法得到。 再比如说,个人电脑都有一个密码,不想让其它人随意的登陆,在你的电脑里面拷贝和粘贴。 还有就是像人这个对象,身高和年龄的属性,只能是自己来增长,不可以让别人随意的赋值等等。 使用private 这个关键字来对属性和方法进行封装: 原来的成员: var $name; //声明人的姓名 var $sex; //声明人的性别 var $age; //声明人的年龄 function run(){… … .} 改成封装的形式: private $name; //把人的姓名使用private 关键字进行封装 private $sex; //把人的性别使用private 关键字进行封装 private $age; //把人的年龄使用private 关键字进行封装 private function run(){… … } //把人的走路方法使用private 关键字进行封装 注意:只要是成员属性前面有其它的关键字就要去掉原有的关键字“var”。 通过private 就可以把人的成员(成员属性和成员方法)封装上了。封装上的成员就不能被类外 面直接访问了,只有对象内部自己可以访问;下面的代码会产生错误: class Person { //下面是人的成员属性 private $name; //人的名字,被private封装上了 private $sex; //人的性别, 被private封装上了 private $age; //人的年龄, 被private封装上了 //这个人可以说话的方法 function say() { echo "我的名字叫:".$this->name." 性别:".$this->sex." 我的年龄是: ".$this->age."<br>"; }/ /这个人可以走路的方法, 被private封装上了 private function run() { LAMP 大讲堂PHP 面向对象技术(全面讲解) 网站:http://www.phpchina.com 投稿:[email protected] 《PHPer》76/104 echo "这个人在走路"; } } //实例化一个人的实例对象 $p1=new Person(); //试图去给私有的属性赋值, 结果会发生错误 $p1->name="张三"; $p1->sex="男"; $p1->age=20; //试图去打印私有的属性, 结果会发生错误 echo $p1->name.”<br>”; echo $p1->sex.”<br>”; echo $p1->age.”<br>” //试图去打印私有的成员方法, 结果会发生错误 $p1->run(); 输出结果为: Fatal error: Cannot access private property Person::$name Fatal error: Cannot access private property Person::$sex Fatal error: Cannot access private property Person::$age Fatal error: Cannot access private property Person::$name Fatal error: Call to private method Person::run() from context '' 从上面的实例可以看到,私有的成员是不能被外部访问的,因为私有成员只能在本对象内部自 己访问,比如,$p1 这个对象自己想把他的私有属性说出去,在say()这个方法里面访问了私有属性, 这样是可以。(没有加任何访问控制,默认的是public 的,任何地方都可以访问) //这个人可以说话的方法, 说出自己的私有属性,在这里也可以访问私有方法 function say() { echo "我的名字叫:".$this->name." 性别:".$this->sex." 我的年龄是: ".$this->age."<br>"; //在这里也可以访问私有方法 //$this->run(); } 因为成员方法say()是公有的, 所以我们在类的外部调用say()方法是可以的,改变上面的代码; class Person { //下面是人的成员属性 private $name; //人的名字,被private封装上了 private $sex; //人的性别, 被private封装上了 private $age; //人的年龄, 被private封装上了 //定义一个构造方法参数为私有的属性姓名$name、性别$sex和年龄$age进行赋值 function __construct($name, $sex, $age) { //通过构造方法传进来的$name给私有成员属性$this->name赋初使值 $this->name=$name; //通过构造方法传进来的$sex给私有成员属性$this->sex赋初使值 $this->sex=$sex; //通过构造方法传进来的$age给私有成员属性$this->age赋初使值 $this->age=$age; }/ /这个人可以说话的方法, 说出自己的私有属性,在这里也可以访问私有方法 function say() { echo "我的名字叫:".$this->name." 性别:".$this->sex." 我的年龄是: ".$this->age."<br>"; LAMP 大讲堂PHP 面向对象技术(全面讲解) 网站:http://www.phpchina.com 投稿:[email protected] 《PHPer》77/104 } } //通过构造方法创建3个对象$p1、p2、$p3,分别传入三个不同的实参为姓名、性别和年龄 $p1=new Person(“张三”,”男”, 20); $p2=new Person(“李四”,”女”, 30); $p3=new Person(“王五”,”男”, 40); //下面访问$p1对象中的说话方法 $p1->say(); //下面访问$p2对象中的说话方法 $p2->say(); //下面访问$p3对象中的说话方法 $p3->say(); 输出结果为: 我的名字叫:张三性别:男我的年龄是:20 我的名字叫:李四性别:女我的年龄是:30 我的名字叫:王五性别:男我的年龄是:40 因为构造方法是默认的公有方法(构造方法不要设置成私有的),所以在类的外面可以访问到, 这样就可以使用构造方法创建对象, 另外构造方法也是类里面的函数,所以可以用构造方法给私 有的属性赋初值。Say()的方法是默认公有的, 所以在外面也可以访问的到, 说出他自己的私有属 性。 从上面的例子中我们可以看到,私有的成员只能在类的内部使用,不能被类外部直接来存取, 但是在类的内部是有权限访问的,所以有时候我们需要在类的外面给私有属性赋值和读取出来,也 就是给类的外部提供一些可以存取的接口,上例中构造方法就是一种赋值的形式,但是构造方法只 是在创建对象的时候赋值,如果我们已经有一个存在的对象了,想对这个存在的对象赋值,这个时 候,如果你还使用构造方法传值的形式传值,那么就创建了一个新的对象,并不是这个已存在的对 象了。所以我们要对私有的属性做一些可以被外部存取的接口,目的就是可以在对象存在的情况下, 改变和存取属性的值,但要注意,只有需要让外部改变的属性才这样做,不想让外面访问的属性是 不做这样的接口的,这样就能达到封装的目的,所有的功能都是对象自己来完成,给外面提供尽量 少的操作。 如果给类外部提供接口,可以为私有属性在类外部提供设置方法和获取方法,来操作私有属性. 例如: prvate $age; //私有的属性年龄 function setAge($age) //为外部提供一个公有设置年龄的方法 { if($age<0 || $age>130) //在给属性赋值的时候,为了避免非法值设置给属性 return; $this->age=$age; }f unction getAge() //为外部提供一个公有获取年龄的方法 { return($this->age); } 上面的方法是为一个成员属性设置和获取值, 当然你也可以为每个属性用同样的方法对其进行 赋值和取值的操作,完成在类外部的存取工作。 10.__set() __get() __isset() __unset()四个方法的应用 一般来说,总是把类的属性定义为private,这更符合现实的逻辑。但是,对属性的读取和赋值 操作是非常频繁的,因此在PHP5 中,预定义了两个函数“__get()”和“__set()”来获取和赋值其 属性,以及检查属性的“__isset()”和删除属性的方法“__unset()”。 LAMP 大讲堂PHP 面向对象技术(全面讲解) 网站:http://www.phpchina.com 投稿:[email protected] 《PHPer》78/104 上一节中,我们为每个属性做了设置和获取的方法,在PHP5 中给我们提供了专门为属性设置 值和获取值的方法,“__set()”和“__get()”这两个方法,这两个方法不是默认存在的,而是我们手 工添加到类里面去的,像构造方法(__construct())一样, 类里面添加了才会存在,可以按下面的方式 来添加这两个方法,当然也可以按个人的风格来添加: //__get()方法用来获取私有属性 private function __get($property_name) { if(isset($this->$property_name)) { return($this->$property_name); }else { return(NULL); } }/ /__set()方法用来设置私有属性 private function __set($property_name, $value) { $this->$property_name = $value; } __get()方法:这个方法用来获取私有成员属性值的,有一个参数,参数传入你要获取的成员属性 的名称,返回获取的属性值,这个方法不用我们手工的去调用,因为我们也可以把这个方法做成私 有的方法,是在直接获取私有属性的时候对象自动调用的。因为私有属性已经被封装上了,是不能 直接获取值的(比如:“echo $p1->name”这样直接获取是错误的),但是如果你在类里面加上了这 个方法,在使用“echo $p1->name”这样的语句直接获取值的时候就会自动调用__get($property_name) 方法,将属性name 传给参数$property_name,通过这个方法的内部执行,返回我们传入的私有属性 的值。如果成员属性不封装成私有的,对象本身就不会去自动调用这个方法。 __set()方法:这个方法用来为私有成员属性设置值的,有两个参数,第一个参数为你要为设置 值的属性名,第二个参数是要给属性设置的值,没有返回值。这个方法同样不用我们手工去调用, 它也可以做成私有的,是在直接设置私有属性值的时候自动调用的,同样属性私有的已经被封装上 了, 如果没有__set()这个方法,是不允许的, 比如:$this->name=‘zhangsan’, 这样会出错,但 是如果你在类里面加上了__set($property_name, $value)这个方法,在直接给私有属性赋值的时候, 就会自动调用它,把属性比如name 传给$property_name, 把要赋的值“zhangsan”传给$value,通过 这个方法的执行,达到赋值的目的。如果成员属性不封装成私有的,对象本身就不会去自动调用这 个方法。为了不传入非法的值, 还可以在这个方法给做一下判断。代码如下: <?php class Person { //下面是人的成员属性, 都是封装的私有成员 private $name; //人的名字 private $sex; //人的性别 private $age; //人的年龄 //__get()方法用来获取私有属性 private function __get($property_name) { echo "在直接获取私有属性值的时候,自动调用了这个__get()方法<br>"; if(isset($this->$property_name)) { return($this->$property_name); }e lse { LAMP 大讲堂PHP 面向对象技术(全面讲解) 网站:http://www.phpchina.com 投稿:[email protected] 《PHPer》79/104 return(NULL); } }/ /__set()方法用来设置私有属性 private function __set($property_name, $value) { echo "在直接设置私有属性值的时候,自动调用了这个__set()方法为私有属性赋值<br>"; $this->$property_name = $value; } } $p1=new Person(); //直接为私有属性赋值的操作, 会自动调用__set()方法进行赋值 $p1->name="张三"; $p1->sex="男"; $p1->age=20; //直接获取私有属性的值, 会自动调用__get()方法,返回成员属性的值 echo "姓名:".$p1->name."<br>"; echo "性别:".$p1->sex."<br>"; echo "年龄:".$p1->age."<br>"; ?> 程序执行结果: 在直接设置私有属性值的时候,自动调用了这个__set()方法为私有属性赋值 在直接设置私有属性值的时候,自动调用了这个__set()方法为私有属性赋值 在直接设置私有属性值的时候,自动调用了这个__set()方法为私有属性赋值 在直接获取私有属性值的时候,自动调用了这个__get()方法 姓名:张三 在直接获取私有属性值的时候,自动调用了这个__get()方法 性别:男 在直接获取私有属性值的时候,自动调用了这个__get()方法 年龄:20 以上代码如果不加上__get()和__set()方法,程序就会出错,因为不能在类的外部操作私有成员, 而上面的代码是通过自动调用__get()和__set()方法来帮助我们直接存取封装的私有成员的。 __isset() 方法:在看这个方法之前我们看一下“isset()”函数的应用,isset()是测定变量是否设 定用的函数,传入一个变量作为参数,如果传入的变量存在则传回true,否则传回false。那么如果 在一个对象外面使用“isset()”这个函数去测定对象里面的成员是否被设定可不可以用它呢?分两种 情况,如果对象里面成员是公有的,我们就可以使用这个函数来测定成员属性,如果是私有的成员 属性,这个函数就不起作用了,原因就是因为私有的被封装了,在外部不可见。那么我们就不可以 在对象的外部使用“isset()”函数来测定私有成员属性是否被设定了呢?可以,你只要在类里面加上 一个“__isset()”方法就可以了,当在类外部使用”isset()”函数来测定对象里面的私有成员是否被设 定时, 就会自动调用类里面的“__isset()”方法了帮我们完成这样的操作,“__isset()”方法也可以 做成私有的。你可以在类里面加上下面这样的代码就可以了: private function __isset($nm) { echo "当在类外部使用isset()函数测定私有成员$nm时,自动调用<br>"; return isset($this->$nm); } __unset()方法:看这个方法之前呢,我们也先来看一下“unset()”这个函数,“unset()”这个函 数的作用是删除指定的变量且传回true,参数为要删除的变量。那么如果在一个对象外部去删除对 LAMP 大讲堂PHP 面向对象技术(全面讲解) 网站:http://www.phpchina.com 投稿:[email protected] 《PHPer》80/104 象内部的成员属性用“unset()”函数可不可以呢,也是分两种情况,如果一个对象里面的成员属性 是公有的,就可以使用这个函数在对象外面删除对象的公有属性,如果对象的成员属性是私有的, 我使用这个函数就没有权限去删除,但同样如果你在一个对象里面加上“__unset()”这个方法,就 可以在对象的外部去删除对象的私有成员属性了。在对象里面加上了“__unset()”这个方法之后, 在对象外部使用“unset()”函数删除对象内部的私有成员属性时,自动调用“__unset()”函数来帮 我们删除对象内部的私有成员属性,这个方法也可以在类的内部定义成私有的。在对象里面加上下 面的代码就可以了: private function __unset($nm) { echo "当在类外部使用unset()函数来删除私有成员时自动调用的<br>"; unset($this->$nm); } 我们来看一个完整的实例: <?php class Person { //下面是人的成员属性 private $name; //人的名字 private $sex; //人的性别 private $age; //人的年龄 //__get()方法用来获取私有属性 private function __get($property_name) { if(isset($this->$property_name)) { return($this->$property_name); }else { return(NULL); } }/ /__set()方法用来设置私有属性 private function __set($property_name, $value) { $this->$property_name = $value; }/ /__isset()方法 private function __isset($nm) { echo "isset()函数测定私有成员时,自动调用<br>"; return isset($this->$nm); }/ /__unset()方法 private function __unset($nm) { echo "当在类外部使用unset()函数来删除私有成员时自动调用的<br>"; unset($this->$nm); } } $p1=new Person(); $p1->name="this is a person name"; //在使用isset()函数测定私有成员时,自动调用__isset()方法帮我们完成,返回结果为true echo var_dump(isset($p1->name))."<br>"; LAMP 大讲堂PHP 面向对象技术(全面讲解) 网站:http://www.phpchina.com 投稿:[email protected] 《PHPer》81/104 echo $p1->name."<br>"; //在使用unset()函数删除私有成员时,自动调用__unset()方法帮我们完成,删除name私有属性 unset($p1->name); //已经被删除了, 所这行不会有输出 echo $p1->name; ?> 输出结果为: isset()函数测定私有成员时,自动调用 bool(true) this is a person name 当在类外部使用unset()函数来删除私有成员时自动调用的 __set()、__get()、__isset()、__unset() 这四个方法都是我们添加到对象里面的,在需要时自动调 用的,来完成在对象外部对对象内部私有属性的操作。

2009-04-21

华为内部员工C++中级培训教材

华为内部员工C++中级培训教材 我们在C++基础课程中已经了解了C++的一些基本概念,知道了什么是类什么是对象。也了解了继承、封装、多态等C++面向对象的基本特征,本课程主要是更进一步探讨一下C++一些基本模型的应用,加深对概念的理解,由于课程时间有限,C++,模型和内容又如此之多,对任何一个模型都无法深入进去,所以只能泛泛而谈。 第一章 类、接口 ………………………………………………………………… 7 1.1 Handle-Body与接口、抽象接口 …………………………………………7 1.2 多继承、与菱形缺陷、this跳转等……………………… ……………… 13 1.3 C++多态的两种多态形式和区别…………………………………………… 18 第二章 重载 ………………………………………………………………………18 2.1 函数重载 ………………………………………………………………………19 2.2 运算符重载 ………………………………………………………………… 20 第三章 模板 ………………………………………………………………………29 3.1 模块函数 ……………………………………………………………………29 3.2 模块类……………………………………………………………………………31 3.3 STL标准模板库…………………………………………………………………34 附录:参考资料 ……………………………………………………………………… 39

2009-04-21

精通SQL数据库连接.doc

精通SQL数据库连接 要高效地处理查询和数据库设计,你必须对SQL连接声明有较好的了解。在基本的逻辑句法之外,还有一些关于连接和简便数据参考方面的概念,例如别名,自连接和ON子句。 别名不只是做连接 别名是一个SQL功能,他允许你在一个查询中为表格或专栏创建一个速记符号,他在处理自连接时也可以很便利地使用,这一点我会在后面提到。 一个别名通用的格式是table_name.column_name AS alias,他允许你通过指派的处理器来参照已别名化的项目。在非常复杂的JOIN声明中,别名使得阅读和录入变得很容易。 下面这个例子是典型的别名使用: SELECT Co.company_name AS coname, Ind.industry_name AS indname FROM Company AS Co LEFT JOIN Industry AS Ind ON Co.industry_id = Ind.industry_id WHERE coname LIKE ‘%Tech%’ AND indname = ‘Computing’; 注意AS关键字是任选的,然而我建议使用他从而更加清楚。而且,专栏可以使用格式alias = table_name.column_name来别名化,但表格不能这样来别名化。 自连接只使用一个表格 自连接是一种在单一标准化表格上使用的JOIN声明,实质上,你可以使用自连接在一个表格内获得行与行之间的等级关系。你必须使用别名作为表格的两个实例来描述表格,然后将其连接起来。 使用自连接的实例可以体现在列有所有雇员和经理的员工表格中,自连接允许你与单一查询建立联合,否则你就不得不在代码中处理一个循环。 使用自连接的另一个实例是在包含工作任务的表格中追踪一个开发项目,在其他信息中,表格里包括一个TaskID专栏,他的每一行都有一个唯一的数字;一个DependenceID专栏,其中包括在现有任务可以开始之前必须完成的任务的ID。 得到任务和其附属的列表,你可以使用如下连接: SELECT Current.task_descr AS Task, Previous.task_descr AS Dependence FROM Project AS Current LEFT JOIN Project AS Previous ON Current.DependenceID = Previous.TaskID; 这个声明会在两个专栏中得到结果,标注为Task和Dependence且每一行里都具有相关信息。通过使用自连接,你可以使用来自单一表格的数据来创建一个内建载数据自身内部的等级的参照描述。 USING和ON子句可以在多个专栏做连接 除了ON子句,你还可以使用USING子句来实现一个等连接,他与连接表格中从一个表格到一个专栏的值相等。你也可以使用这两个声明来连接多个专栏,这在你构筑JOIN声明时会很方便使用。 在ON子句中你可以指定专栏名称,这意味着你可以对两个专栏名不相配的表格中的数据进行比较,要在多个专栏上实现一个搜索行为,需要用AND关键字来分隔条件(见下段的使用实例)。 在USING子句中,专栏名必须一致,并必须在要连接的两个表格中都要存在。如果你使用多个专栏做连接,用逗号分隔专栏名。下面是USING子句句法的基本实例: SELECT * FROM User INNER JOIN Event USING (userid);   控制JOIN的顺序 JOIN声明中并不要求做插入,但你可以在涉及多于两个表格时使用插入来改变JOIN声明的顺序。通常地,JOIN声明或者从左至右处理(以在查询中出现顺序为序),或者由数据库查询优化器在执行前决定。 一些数据库,如SQL Server, Oracle和DB2也支持JOIN HINT关键字的概念。这些关键字被插入到JOIN声明中来控制JOIN被处理的顺序。例如,一个MERGE JOIN会在处理其他连接之前将两个表格连接在一起。HASH JOIN会将一个表格和一个已经被执行的JOIN声明的结果连接在一起。JOIN HINT会导致数据库性能的极端低下并应留给DBA处理。 你的另一个选择是使用插入来控制JOIN的执行顺序,下面是使用实例,其中Catalog, Product和Color是表格: SELECT Catalog.item, Catalog.item_color, Product.item, Color.color_name FROM Catalog FULL OUTER JOIN ( Product CROSS JOIN Color ) ON Catalog.item = Product.item AND Catalog.item_color = Color.color_name;   成为数据库专家 JOIN声明可以有效地找到你所需要的信息并避免带来麻烦。通过使用上面提到的概念,你可以逐渐掌握JOIN声明和数据库的使用。总的来说,别名,自连接和JOIN声明的使用会帮助你成为标准化数据库的专家。

2009-03-23

四级数据库重难点(word版)

第1章 引言 1. 数据是描述现实世界事物的符号记录,是用物理符号记录下来的可以识别的信息。 数据是信息的符号表示,是载体;信息是数据的语义解释,是内涵。 2. 数据模型是对现实世界数据特征的抽象,是数据库系统的形式框架,用来描述数据的一组概念和定义,包括描述数据、数据联系、数据操作、数据语义以及数据一致性的概念工具。 满足三条件:比较真实地模拟现实世界;易于人们理解;易于计算机实现 三个组成要素:数据结构(静态,数据对象本身结构及之间的联系)、数据操作(对数据对象操作及操作规则的集合)和完整性约束(语义约束:数据模型、数据内部及之间联系) 3. 模式是对数据库中全体数据的逻辑结构和特征的描述,是所有用户的公共数据视图,也称为逻辑模式或概念模式。 外模式是对数据库用户能够看见和使用的局部数据的逻辑结构和特征的描述,是与某一应用有关的数据的逻辑表示,也称为子模式、用户模式或用户视图。 内模式是对数据库中数据的物理结构和存储方式的描述,也称为物理模式或存储模式。 当数据库模式发生变化时,通过调整外模式/模式间的映像关系,使得应用程序不必随之修改,从而保证数据与应用程序间的逻辑独立性,简称数据的逻辑独立性。 当数据库数据的物理存储结构改变时,通过调整模式/内模式映像关系,保持数据库模式不变,使数据库系统的外模式和应用程序不随之改变,保证数据与应用程序间的物理独立性,简称数据的物理独立性。 4. 数据库是存储在计算机内的共享数据集合,数据库管理系统是一种数据管理系统软件。数据库系统则是在计算机系统中引入数据库后的软硬件系统构成,包括了数据库、数据库管理系统和数据库应用程序。 5. DBMS的主要功能有数据定义、数据操纵、数据库运行管理与控制、数据库建立与维护。 DBMS包括查询处理器和存储管理器。查询处理器实现面向用户的查询分析处理和优化功能。存储管理器为用户和应用程序提供了访问存储在数据库文件中的应用数据的接口。 6.关系模型 用二维表表示实体及实体之间的联系,现实世界中的每个客观对象对应表中的一行叫做一条记录,表中的每个列(属性)描述对象类的某一特征,列的值(属性的取值)刻画和描述客观对象的某一具体的特征。 优缺点:建立在“集合”“关系”上,严格成熟的理念基础;用关系表示实体及之间联系,简单易懂;存储路径透明,较好的数据独立性和安全保密性;查询效率低于非关系模型。 第2章 数据库应用系统生命周期 2.1 软件生命周期是指软件产品从考虑其概念开始,到该产品不再使用的整个时期。一般包括概念阶段、需求阶段、设计阶段、实现阶段、测试阶段、安装部署及交付阶段、运行阶段与维护阶段。数据库应用系统需求是指用户对数据库应用系统在功能、性能、行为、设计约束等方面的期望和要求:数据及数据处理、业务、性能、其他存储安全备份与恢复等。 2.2 数据库应用系统生命周期模型 1.瀑布模型原理,项目规划、需求分析、系统设计、实现与部署、运行管理与维护五部分 2.快速原型模型和增量模型原理,允许渐进、迭代地开发DBAS。 3.根据DBAS的软件组成和各自功能,细化DBAS需求分析和设计阶段,引入了数据组织与存储设计、数据访问与处理设计、应用设计三条设计主线,分别用于设计DBAS中的数据库、数据库事务和应用程序。 4.设计阶段细分为概念设计、逻辑设计、物理设计三个步骤,每一步涵盖三条设计主线。 第3章 需求分析及功能建模方法 3.1 数据元素(列)是数据处理中的最小单位。 3.2 DFD图:数据流(标有名字的箭头)、处理、数据存储(横圆柱)、数据源/终点(棱形) 3.3 IDEF0图:更好地理解需求;ICOM(输入、控制、输出、机制)码;至少一个控制和输出箭头。A-0;A0(顶层图);A1;A11 3.4 DFD与IDEF0的比较:结构化分析思想:自顶而下逐级细化 1.DFD图用箭头也叫数据流来描述数据移动的方向、数据处理之间的数据依赖关系,IDEF0图也用箭头表示数据流,但不强调流或顺序,强调数据约束,箭头语义更丰富。 2.DFD模型有四种元素,IDEF0图只有两种:箭头和活动 3.IDEF0图更加规范。其概念、建模方法、画图规则等均有说明和规定 4.IDEF0模型结构更清楚,便于理解和沟通 3.5 结构化分析及建模方法的优点: 1)不过早陷入具体的细节,从整体或宏观入手分析问题,如业务系统的总体结构,系统及子系统的关系。 2)通过图形化的模型对象直观地表示系统完成什么功能,方便系统分析员理解和描述系统。 3)模型对象不涉及太多技术术语,便于用户理解模型。 第4章 数据库概念设计与数据建模 4.1 概念设计的目的和任务:面向现实世界,理解和描述应用领域中的数据需求,分析确定系统需要存储和处理什么数据。过程:确定实体集;确定联系和联系类型;建立由信息模型表示的业务模型;确定实体集属性;优化信息模型。 4.2 实体集描述具有相同属性特征和性质的事物集合;属性描述实体集具有的某一特征或性质 4.3 IDEF1X:标定型(子依父实例才标定)(确定型);非标定型(确定型);分类;不确定 第5章 关系数据库逻辑设计 5.1 关系数据库:按照二维表格组织和存储的相互关联的关系(表)的集合。 关系数据库采用关系模型在计算机中组织、存储、处理和管理数据。 5.2 主码约束:惟一性;最小性,不能取空值,并且取值要唯一 外码约束:如果两个关系R和S,X是R的属性或属性组,且X不是R的码,但X是S的码,则称X是R的外码。或者取空值,或者等于S中某个元组的主码的值。 5.3 逻辑设计的内容:定义和描述数据库的全局逻辑结构、数据之间的关系、数据的完整性等 目的:得到实际数据库管理系统可以处理的数据库模式。 步聚:ER图转化关系模式;优化关系模式;数据完整性设计;外模式设计 5.4 关系模式描述关系的静态结构,由模式名、属性、完整性约束组成,关系是一个表中记录的集合,关注和强调的是值(模式实例)的集合,也是关系模式在某一时刻状态的反映。 5.5 关系的完整性(完整性约束):对关系所满足条件的定义。作用:限定和检查数据库所含实例的合法性和正确性。静态:主码、外码、域(用户定义);动态:基于业务规则 5.6 伪传递规则:X-Y,YW-Z,则XW-Z成立。 5.7 规范化设计理论的主要内容是范式,即关系模式满足的条件,它是数据库逻辑设计的指南,也是衡量关系模式设计优劣的标准。目的:消除数据冗余及避免操作异常,基本过程:对关系进行分解。一个低级范式的关系模式通过分解(投影)方法可转换成多个高一级范式的关系模式的集合,这个过程叫规范化。 5.8 1NF:R的每一属性均不可再分; 2NF:是1NF且每个非主属性完全依赖于主码。在1上消除非主属性对主码的部分函数依赖; 3NF:是1NF且每个非主属性只依赖于主码。在2上消除非主属对主码的传递函数依赖。 5.9 ER模型转换关系模型:实体集转为同名关系;联系转为一个关系,各实体集的码及联系的属性转为关系的属性(1:1均可、1:n取n、m:n取集);合并具有相同码的关系。 第6章 存储技术与数据库物理设计 6.1 物理设计是在具体的硬件环境、OS、DBMS约束下,基于逻辑设计,设计具体数据存储结构和存取方式。目的:占用空间少、访问效率高、维护代价低。主要步骤有数据库逻辑模式调整、文件组织与存取设计、数据分布设计、安全模式设计、确定系统配置、物理模式评估。 6.2 索引技术(Indexing)是一种快速文件访问技术,它将文件记录在某个或某些域(或称为属性)上的取值与该记录的物理地址直接联系起来,提供了一种根据记录域的取值快速访问文件记录的机制。索引文件是一种利用索引技术支持快速文件访问的文件组织和存取方法。 索引加快了查询记录却减慢了数据更新速度,本身还占用一定的存储空间。 6.3 文件组织:如何将关系数据库中的关系映射为操作系统中的数据库文件,及管理文件。 文件结构:如何将DB文件中的逻辑记录映射到物理文件的中磁盘块。 文件存取:针对某种结构的DB文件,如何查、添删改其中的逻辑记录 6.4 数据字典:数据库各类对象的描述信息、数据库管理系统的控制信息。包括关系模式信息、与视图描述有关的信息、关系的存储结构和存取方法信息、完整性约束、安全性有关的信息、数据库运行统计信息。 作用:DBA用来监视DBMS的使用情况并协助完成管理工作;一般用户可用于查阅部分数据库结构信息;DBS运行时各子系统频繁使用以完成相应的存储和查询处理功能。 6.5 DBMS的三种完整性控制机制:CHECK子句、断言、触发器 断言语句:Create assertion 断言约束名 check (…) 6.6 堆文件:数据量少且操作频繁;批量加载数据(先选为堆文件再调整文件结构) 顺序文件:查询条件定义在查找码上;快速的二分查找 散列文件:基于散列域值的等值匹配,特别是访问顺序是随机的。非精确查询;非散列域 B-树和B+-树:大数据量基本表;聚焦文件:多表连接操作 6.7有序索引技术利用索引文件实现查找码取值到记录物理地址间的映射关系。索引文件由索引记录组成,每个记录中的索引项记录了某个特定的查找码值和具有该值的数据文件记录的物理地址。 当需要访问数据文件中某个数据记录时,先根据查找码值查阅索引文件,找到对应的索引项,然后从索引项中找出数据记录在数据文件中的物理地址.根据这个地址访问数据记录。 6.8散列技术是一种快速文件访问技术,它利用散列函数实现文件记录域取值到记录物理地址间的直接映射关系。当需要访问数据文件中查找码值为si的某个或某些文件记录时,将si作为散列函数h的输入计算得出的散列函数输出值h(si)就是文件记录在数据文件中的物理地址。 6.9 权限:允许用户对一给定的数据库对象可执行的操作(查询、添删改、新建、备份等)。 第7章 数据库应用系统功能设计 7.1软件体系结构:软件架构={构件,连接件,约束} 7.2 软件设计包括系统的总体结构设计、系统的过程设计、系统的数据设计三方面内容(+人机界面设计),从工程管理的角度,分为概要设计、详细设计 7.3 应用软件分为数据库事务和应用程序。后者一方面可以与数据库事务协调合作,另一方面还可实现与数据库访问无关的功能,如通信、人机交互。 7.4 事务:具有逻辑独立功能的一系列操作的集合,实现了某些特定的业务规则。 7.5 事务概要设计的核心是辨识和设计事务自身的事务处理逻辑,采用面向数据流的程序设计方法设计事务内部的数据处理流程和结构。 7.6 C/S结构特点:数据管理和数据处理被分在客户端和服务器上;服务器可支持多个客户端;客户端也可访问多个服务器;客户端=人机交互+数据处理 B/S结构特点:表示层,WEB浏览器;功能层,WEB应用服务器;数据层,DBMS服务 优点:实现人面交互、应用业务逻辑处理、数据管理三层分离,提高了系统的可维护性;用WEB浏览器可访问多个异构应用平台,解决了跨平台数据管理问题。 第8章 SQL 8.1 SQL=Structured Query Language,结构化查询语言 8.2 二进制字符串是用十六进制表示的,0x前缀 8.3 创建表:CREATE TABLE Table_Card (CardID varchar(8) NOT NULL, StartDate datetime NOT NULL, EndDate datetime NOT NULL, Score int NOT NULL CHECK(Score >=0) DEFAULT 0, State char(1) NOT NULL CHECK(State in (0,1,2)), Sex char(1) CHECK(Sex in(‘男’,’女’)), Age int CHECK( Age between[16,85]), CustomerID varchar(8), CHECK(EndDate > StartDate), PRIMARY KEY (CardID), FOREIGN KEY (CustomerID) REFERENCES Table_Customer (CustomerID) ) 删除表:DROP TABLE Table_Card 修改表:ALTER TABLE Table_Card ADD CardType char(4) NULL ALTER TABLE Table_Card ALTER COLUMN CardType char(8) ALTER TABLE Table_Card DROP COLUMN CardType 8.4 SELECT Cname FROM Tablb_Customer WHERE Address IN (‘海淀区’,’朝阳区’) AND age BETWEEN 40 AND 50 AND Cname LIKE ‘[王张李]%’ (‘王_ _’) ORDER BY StartDate ASC, EndDate DESC 8.5 除COUNT(*)不忽略空值外,其他函数COUNT(DISTINCT 列名)、SUM()、AVG()、MAX()、MIN()均忽略空值。均返回单值。 SELECT SUM (Score),MAX(Age),MIN(Age),AVG(Age),COUNT (DISTINCT ..)FROM Table 8.6 分组(GROUP BY)依据列不能是text,ntext,image和bit类型的列。先分组后计算 统计每种类别商品的商品数,只列出商品数大于4个的商品类别编号和商品数: SELECT GoodClassID as 商品类别编号,COUNT(*)as 商品数 FROM Table_Goods GROUP BY GoodClassID HAVING COUNT(*)>4 8.7 自连接:查询与王晓在同一个区的顾客的姓名及地址: SELECT T2.Name,T2.Address FROM Table_Customer as T1 JION Table_Customer as T2 ON T1.Address = T2.Address WHERE T1.Name = ‘王晓’ AND T2.Name !=’王晓’ 子查询:一个SELECT语句嵌套在一个SELECT、UPDATE、INSERT或DELETE语句中 SELECT Name,Address FROM Table_Customer WHERE Address IN (SELECT Address FROM Table_Customer WHERE Name=’王晓’) AND Name!=’王晓’ 8.8 外连接:LEFT OUTER JOIN 左外连接(左表全输出)RIGHT OUTER JOIN 右外连接 8.9 子查询: [NOT] IN()集合 不相关子查询,先内后外 WHERE 列 =/</> () 比较 不相关子查询,先内后外 [NOT] EXIST(SELECT *)存在 相关子查询,先外后内 8.10 修改数据:INSERT [INTO]表名 [列名表] VALUES(值列表) UPDATE 表名 SET 列名=表达式 [WHERE子句]/ DELETE [FROM] 表名 [WHERE子句] 分情况修改:UPDATE Table_Goods SET SalePrice= CASE GoodsClassName WHEN ‘家用电器’ THEN SalePrice – SalePrice*0.05 WHEN ‘服装’ THEN SalePrice + SalePrice*0.06 ELSE SalePrice END FROM Table_Goods a JION Table_GoodsClass b ON a.ClassID=b.ClassID 8.11 创建索引:CREATE [UNIQUE][CLUSTERED][NONCLUSTERED] INDEX 索引名 ON 表名 (列名 [顺序(ASC/DESC)]) 8.12 视图:由从数据库基本表中选取出来的数据组成的逻辑窗口,是一个虚表,数据库只存放视图的定义而不存放视图包括的数据。对视图的操作最终都会转换为对基本表的操作。 CREATE VIEW 视图名 [视图列名表] AS SELECT 语句 [WITH CHECK OPTION] 作用:简化数据查询语句;使用户从多角度观察同一数据;提高了数据安全性(屏蔽掉敏感数据);提供一定程度的逻辑独立性 8.13 定点数:numeric(p,q)或decimal(p,q),p为精度(数字位个数),不大于38,q为小数位个数;bit类型:只存储1和0,不多于8个bit列则只用1个字节存储 8.14 Char(n)代表的是普通字符编码按定长存储的字符串,“n”的含义是字符的个数,固定占用n个字节的空间。varchar(n) 代表的是普通字符编码按不定长存储的字符串,“n”的含义也是字符的个数,按字符的实际长度占用空间。 第9章 事务高度与并发控制 9.1 调度:定义在多个事务上的调度是这些事务的所有操作的一个执行序列,代表了这些操作的执行顺序;冲突操作:事务Ti 的操作Ii与事务Tj的操作Ij是冲突的,当且仅当Ii 和 Ij访问数据库中同一个数据项Q,并且Ii 和 Ij中至少有一个是写操作write(Q);冲突可串行:一个并发调度冲突等价于某个串行调度(判断一个并行调度是否正确) 死锁是指数据库系统中部分或全部事务由于无法获得对需要访问的数据项的控制权而处于等待状态,并且将一直等待下去的一种系统状态。 9.2 ACID:Atomicity原子性;Consistency一致性;Isolation隔离性;Durability持久性 9.3 1级加锁协议要求事务T在修改数据项Q之前必须先对Q加X锁,直到事务结束才释放该锁。事务结束包括正常结束(commit)和非正常结束(rollback)。但事务如果是只读Q而不对其进行修改,是不需要对Q加锁的。 2级加锁协议是在1级加锁协议基础上,要求事务T在读取数据项Q之前必须先对其加S锁,读完Q后可以立即释放S锁。 3级加锁协议则是在1级加锁协议基础上,要求事务T在读取数据项Q之前必须先对其加S锁,但是需要等到事务结束时才释放该S锁。 9.4 2阶段锁协议将每个事务的执行过程分为加锁阶段和解锁阶段。在加锁阶段,事务可以申请获得数据项上的任何类型的锁,但不允许释放任何锁。在解锁阶段,事务可以释放任何数据项上的任何类型的锁,但不能再申请任何锁。每个事务开始执行后就进入了加锁阶段。当第一次释放锁后,即转入解锁阶段。 9.5解决死锁主要采用死锁预防和死锁检测与恢复两类方法。 死锁预防利用死锁预防协议,通过破坏死锁产生的必要条件来避免系统进入死锁状态。 一次性加锁法;顺序加锁法 死锁检测与恢复则是允许系统进入死锁状态,并且定期检查系统是否发生死锁。当发现系统发生死锁后,采取相应的恢复机制使系统摆脱死锁状态。 9.6活锁产生的原因是在系统非死锁状态下,某些事务由于始终无法获得对所需访问的数据项的控制权而长期等待下去,无法继续执行。 9.7 锁粒度大:被加锁数据项少、事务并发执行度低、系统开销小;锁粒度小则反之 9.8 基于锁的并发控制技术的原理 P166 第10章 数据库的实施、运行和维护 10.1 试运行:功能测试;性能测试 10.2 数据库维护:数据库的转储和恢复;数据库的安全性、完整性控制;数据库性能的检测和改善;数据库的重组和重构 10.3 数据库安全:行政手段制定规范;权限管理、口令等;维护多个数据副本;防及除毒 10.4 数据库重组:按照系统设计要求对数据库存储空间进行全面调整;数据库重构:业务小范围变化需对数据库逻辑结构作必要改变。 10.5 数据库监控分析:DBA借助相应工具监测数据库系统的运行情况,对监测数据进行分析,评估整个系统的运行状态,为系统的安全运行和性能优化提供依据。 10.6 数据库空间管理:数据量增加和碎片使性能降低;空间溢出会带来灾难性停机故障。 包括:创建修改删除数据库空间、新建移动关联数据文件等。 10.7 数据库参数调整:外部调整:CPU、网络;调整内存分配(改善程度大);调整磁盘I/O(I/O时间是响应时间的最大组成部分);调整竞争 10.8 数据库查询优化:合理使用索引;避免或简化排序(Order by、Group by,磁盘排序比内存排序开销大速度慢);避免相关子查询、外连接(左右连接比内连接消耗大);存储过程 10.9 属于Oracle 但不属于SQL Server的逻辑和物理空间结构:表空间、段、区 第11章 故障管理 11.1 故障种类:事务内部故障(事务回滚撤消修改)、系统故障(影响事务不坏数据)、介质故障(软件容错、硬件容错)、病毒 11.2 系统故障对策:重启,撤消(UNDO)未提交的事务,重做(REDO)已提交的事务 11.3 软件容错:备份、日志文件,利用恢复技术;硬件容错:双物理存储设备 11.4 恢复基本原理:冗余,即所有数据均可通过存储在别处的冗余数据来重建。 11.5 对于经常进行数据操作的数据库:完全转储+差异转储 11.6 以记录为单位的日志文件:开始标记(Ti BEGIN TRANSACTION)、结束标记(Ti COMMIT或者Ti ROLLBACK)、每个事务的所有操作(Ti,A,50,80) 11.7 以数据块为单位的日志文件:存放更新前和更新后的整个数据块。只有事务标识和被更新的数据块,没有操作类型和操作对象。 11.8 日志的作用:用来进行业务故障和系统故障恢复;协助后备副本进行介质故障恢复(动态转储必用);记录操作监视行为分析问题 登记原则:登记次序严格按并行事务执行次序;必须先写日志文件再写数据库 11.9 检查点:最大限度减少数据库完全恢复时所必须执行的日志部分(针对系统故障)。 11.10 数据库镜像:提高数据库可用性的解决方案(比如介质故障,两台服务器相互备份) 优点:提供完整或几近完整的数据冗余,增强数据保护;发生介质故障时,数据不会丢失且服务不会中断,提高数据库可用性;提高镜像数据库在升级期间的可用性。 双机互备援模式(均为主);双机热备份模式(一主一备份机)。数据库镜像可用于并发操作。 11.11 RAID廉价冗余磁盘阵列:(镜像冗余、)校验冗余:对成员磁盘上的数据执行异或(XOR)操作得到其校验值并存放在另外的校验磁盘上。当某个磁盘发生故障时,只须计算其他磁盘上的校验数据和数据的异或便可重新得到该磁盘的值。 第12章 SQL Server2000数据库管理系统 12.1 四个服务:SQL Server 核心服务; SQL Server Agent:代理服务,代理定期进行的管理工作; DTC:Distributed Transaction Coordinator,分布式事务协调器,同一事务访问多个服务器 Microsoft Search:全文检索服务 12.2 四个版本:企业版(全部功能、大型数据库)、标准版(小部门)、开发版(同企业版,作开发测试系统用,不作生产服务用)个人版(移动环境、本地数据) 12.3 服务帐户:使用本地系统帐户:自动取当前登录到Windows的用户,没有Windows的网络访问权限,适用于非网络服务器操作系统(如XP);使用域用户帐户:使用Windows身份验证设置连接到SQL Server,用户必是Windows系统管理员,适用于网络服务器OS 12.4网络库:在SQL S客户端和服务器间传递网络数据包。服务器可一次监听多个网络库 12.5 SQLServer的两大类数据库:系统数据库:DBMS自动创建及维护,存放维护系统正常运行的信息,master(系统级信息)、msdb(支持自动执行任务)、model(所有用户数据库的公共信息)、tempdb(临时数据库),示例Pubs、Northwind;用户数据库 12.6 估算存储空间:SQLServer数据存储单位为页(Page),一个数据页是一块8KB的连续磁盘空间,行不能跨页存储,一行数据的大小不能超过一页的大小。一个表10000行数据,每行3000字节,则需要(10000/2)*8KB=40MB的空间。 12.7 主数据文件:扩展名为.mdf,包含数据库系统信息并可存放用户数据库数据,每个数据库只有一个主数据文件。辅助数据文件:扩展名为.ndf,数据量很大时使用,可存放在不同的磁盘驱动器上,以便得利用多个磁盘上的存储空间并提高数据存取的并发性。 12.8 每个数据文件及日志文件(.ldf)初始大小均不得小于512KB,主数据文件大小不得小于model数据库主数据文件,日志文件最好不小于1MB 12.9 创建数据库:CREAT DATABASE jessymin ON ――表示数据库按下面参数创建 ( NAME = jessymin, ――逻辑文件名 FILENAME = ‘…\MSSQL\Data\jessymin_Data.mdf’, ――OS下的物理文件名 SIZE = 10,――文件初始大小,单位默认为MB,下同 MAXSIZE =30,――文件最大大小 FILEGROWTH = 5,――文件增量,为0表示不自动增长,默认按当前10%增长) LOG ON ――表示该数据库日志文件按下面参数创建 (……..同上,只是物理文件名为jessymin.LDF) 12.10 删除数据库:DROP DATABASE jessymin。删除六种数据库对象均用DROP 12.11 Transact-SQL:非过程化高级语言,全司变量@@,局部变量@,局部变量可以是自定义类型但不能是text或image类型。 12.12 Transact-SQL示例:计算1+2+3+…+100的和: DECLARE @i int, @sum int SET @i = 1,@sum = 0 --SET可换为SELECT WHILE @i <=100 BEGIN SET @sum = @sum + @i SET @i = @i +1 END PRINT @sum 12.13 DTS(Data Transformation Service)数据转换服务。注意区别DTC(分布式事务协调器)。导出数据时用户必须是要连接的数据库服务器的合法用户,且对要导出的表具有查询权限 第13章 数据库对象 13.1 存储过程的:SQL语句和控制流语句的预编译集合,应用程序可通过调用方法来执行 优点:模块化程序设计;提高性能;减少网络流量;可作为安全机制使用 13.2 带有多个参数并有默认值及输出参数的存储过程示例: CREATE PROCEDURE p_Example @area varchar(20) = ‘武汉大学’,@Price money,@Sum int output AS SELECT/UPDATE/INSERT/DELETE…… SET @Sum = ….. 应用程序中执行的SQL语句: Declare @res int EXECUTE p_Example ‘武汉大学信息学部’,1000,@res output 或者 EXECUTE p_Example @Price =1000,@res output 13.3 用户自定义函数:标量函数(返回单值,非text、Image类型,任何允许出现表达式的地方)、内嵌表值函数(返回一个表,放在查询语句的From子句中)、多语句表值函数(返回一个可自定义的表,也放在查询语句的From子句中,视图和存储过程的结合) 13.4 标量函数救示例:根据指定的商品类别查询该类的商品个数。 CREAT FUNCTION dbo.f_GoodsCount(@class varchar(10)) RETURNS int AS BEGIN DECLARE @x int SELECT @x=count(*) From T_GoodsClass a JION T_Goods b ON a.GoodClassID = b.GoodClassID WHERE GoodClassName = @class RETURN @x END 调用:SELECT dbo.f_GoodsCount(‘服装’) 或者 SELECT GoodsName AS 商品名,dbo.f_GoodsCount(‘服装’) AS 种类数 From …. 13.5 内嵌表值函数的不同之处在于RETURNS 后只能是table,RETURN后面只能是单个的 SELECT语句,没有相关联的返回变量也没有函数体。调用时放在查询语句的FROM子句中。 13.6 触发器是一种不需要由用户来调用的存储过程,当用户对表进行UPDATE、INSERT或DELETE操作时自动触发执行。作用:保证业务规则和数据完整性。优点:用编程方法来实现复杂的处理逻辑和业务规则,增强数据完整性约束。 13.7 触发器适用场合:比CHECK语句更复杂的数据约束(可引用其他表中的列);为保证数据库性能而维护的非规范化数据(如增加统计总值的列);实现复杂的业务规则 13.8 AFTER/FOR:后触发型触发器,可在同一操作上建立多个;INSTEAD OF:前触发型,在同一操作上只能建立一个。所有的涉及对数据库对象操作的语句均不允许出现在触发器中。 13.9 DELETED表:存储UPDATE和DELETED操作语句所影响行的更新前的旧数据; INSERTED表:存储UPDATE和INSERT操作语句所影响行的更新后的新数据。 13.10 维护数据操作完整性的后触发器示例:销售量大于库存量则撤销当前销售,小于时则在插入销售单据明细时同时修改库存量。 Create Trigger OperatonCon ON T_SaleDetail FOR INSERT AS IF EXISTS(Select * From inserted a Jion T_Goods b ON a.GoodsID = b.GoodsID WHERE a.Quanity > b.TotalCharge) BEGIN ROLLBACK PRINT ‘此商品库存量小于此次销售数量’ END ELSE UPDATE T_Goods SET TotalCharge = TotalCharge – (SELECT Quanity From inserted) 13.11 维护不同列之间取值完整性的后触发器示例:保证商品表中的单价与价格变动表中一致 CREATE TRIGGER PriceConstraint ON T_PriceHistory FOR INSERT, UPDATE AS DECLARE @newprice money SELECT @newprice = SalePrice From inserted UPDATE T_Goods SET SaleUnitPrice = @newprice WHERE GoodsID IN (SELECT GoodID From inserted ) 13.12 前触发器指定执行触发器而不执行引发触发器的SQL语句,因此,如果数据操作满足完整性约束则在触发器中必须重新执行这些数据操作语句。 前触发器示例:保证销售单据中的会员卡是有效日期内的会员卡: CREATE TRIGGER CardValid ON T_SaleDetail INSTEAD OF INSERT, UPDATE AS IF NOT EXISTS (SElETCT * From inserted a JOIN T_Card b ON a.CardID=b.CardID WHERE a.SalDate NOT BETWEEN b.StartDate AND b.EndDate) INSERT INTO T_SaleDetail SELECT * From inserted (若满足条件此语句重新执行) 13.13 用SQL语句修改存储过程、用户自定义函数、触发器的语法与创建基本一致,只是将CREATE改为了ALTER。(查询分析器中实现) 第14章 安全管理 14.1 数据库的安全控制:在DBMS的不同层次提供对有意和无意损害行为的安全防范。 有意的非法活动:加密存、取数据;有意的非法操作:用户身份验证、限制操作权; 无意的损坏:提高系统的可靠性和数据备份 14.2 数据库权限的种类:对DBMS进行维护的权限;对数据库对象和数据进行操作的权限 SQL Server权限种类(与数据库用户分类对应):隐含权限(预定义的内置权限);语句权限(DDL语句权限,创建删除数据库对象);对象权限(DML语句权限,操作数据库对象) 14.3 数据库用户的分类:数据库系统管理员(SA,全部权限);数据库对象拥有者(创建数据库对象的用户,对所拥有的对象具有一切权限);普通用户:只具有对数据的编辑查询功能 14.4 三个认证过程:身份认证,只认证用户是否有连接到数据库服务器的“连接权”;合法用户,验证是否是数据库的合法用户;权限认证,验证用户是否具有要进行的操作的操作权限 14.5 系统内置的登录账户:BUILTIN\Administrator;SA;域名\Administrator,均DBMS管理员 14.6 创建SQL Server身份认证的登录账户:EXECUTE sp_addlogin ‘user3’,’123’,’jessymin’ User3为登录账户,123为密码,jessymin为默认数据库;WINDOWS认证:sp_grantlogin 14.7 删除登录账户存储过程:EXEC droplogin ‘user3’(SQL Server身份验证);EXEC revokelogin ‘Server1\nt_user’(WINDOWS身份验证) 14.8 登录账户可以连接到SQL Server服务器上但并不具有访问任何数据库的能力,必须再成为数据库的合法用户。一个登录账户可以映射为多个数据库用户,管理数据库用户的过程实际上就是建立登录账户与数据库用户之间的映射关系的过程。新建的数据默认只有一个用户:dbo,它是数据库的拥有者。 14.9 创建数据库用户:EXEC sp_adduser ‘U2’,’U2’,’user_role’,用户名与登录账户一致,并让其成为“user_role”角色的成员。删除:EXEC sp_dropuser ‘U2’ 14.10 合法用户除了对所属数据库系统表具有一些查询权限外并不对数据库中的用户数据和对象具有任何权限,还得得到对数据库数据和对象的操作权限 14.11 收回权限:不允许用户或角色具有某种操作权,或者收回曾经授予的权限,置空标记; 拒绝访问:拒绝某用户或角色具有某种操作权,即使由于继承获得的权限也无效,叉叉标记 14.12 用Transact-SQL语句管理对象权限入管理语句权限:P245 14.13 角色:数据库中具有相同权限的一组用户。系统预定义的固定角色;自定义用户角色 14.14 固定的服务器角色:*amdin + dbcreator,权限最重要最高的是sysadmin,角色成员源均为系统的登录账户:EXEC sp_addsrvrolemember ‘Server1\nt_user’ ,‘sysadmin’ 14.15 固定的数据库角色:db_*+public,权限最高的是db_owner:EXEC sp_addrolemember ‘db_owner’,’user3’ (注意用户和用色的顺序) 14.16 public角色:每个用户均自动为其成员,不具任何权限但可赋予权限。如果想让所有数据库用户均具有某个特定权限则可将该权限授予public 14.17 用户自定义的用户角色:EXEC sp_addrole ‘myrole’ 14.18 只要权限没有被拒绝过,角色中成员权限是角色的权限加上成员自己的权限。 第15章 备份和恢复数据库 15.1 备份的两种方式:先创建备份设备(备份数据库的场所),再将数据库备份到备份设备上(永久备份设备);直接将数据库备份到物理文件上(临时备份设备) 15.2 创建磁盘备份设备:EXEC sp_addumpdevice ‘disk’,’mydiskdump’,’..\mydump.bak’ 15.3 常用备份策略:完全备份加差异备份加日志备份,备份和恢复速度都比较快,而且当系统出现故障时丢失的数据较少。 15.4 Transact-SQL语句:BACKUP DATABASE\LOG jessymin TO mydiskdump WITH INIT WITH INIT表示覆盖掉原有内容,相当于“重写现有媒体” 15.5 恢复的一般顺序:先恢复最近的完全数据库备份;再恢复完全备份之后的最近的差异备份;最后按日志备份的先后顺序恢复自最近的完全备份或差异备份之后的所有日志备份。 15.6 Transact-SQL语句恢复过程示例: 1)首先恢复完全备份 RESTORE DATABASE jessymin FROM mydiskdump WITH FILE=1,NORECOVERY 2)然后恢复差异备份(如果有的话) RESTORE DATABASE jessymin FROM mydiskdump WITH FILE=2,NORECOVERY 3)最后恢复日志文件 RESTORE LOG jessymin FROM mydiskdump Norecovery表示对数据库的恢复操作尚未完成,相当于“使数据不再运行,但能还原其他事务的日志文件”。默认为RECOVERY。 第16章 VB开发环境与数据访问接口 (鄙人此前未曾用过VB,疏漏浅薄之处敬请见谅…) 16.1 标准数据绑定控件:TextBox、CheckBox、ListBox、ComboxBox等 外部(ActiveX)数据绑定控件:DataCombo、DataList、DataGrid、MSHFGrid等 16.2 DBMS支持的两种数据接口:专用接口(与特定的DBMS有关);通用接口(屏蔽掉每个DBMS底层接口的差异,提供一种标准的访问方法) 16.3 通用接口:ODBC、OLE DB、JDBC,让应用程序具有很好的适应性和可移植性;具备同时访问多种DBMS系统的能力。 16.4 ODBC(只访关系型DB):开放数据库互连Open DataBase Connectivity,ODBC应用系统大致工作流程从开始配置数据源到回收各种句柄为此。句柄是32位整数值,代表一个指针。 16.5 OLE DB:对象链接与嵌入的数据库Object Linked and Embed DataBase,是Microsof t OLE对象标准的一个实现,是COM对象,是为数据访问而设计的一系列COM接口。 16.6 ADO:动态数据对象ActiveX Data Object,建在OLE DB之上的高层接口集,是介于OLE DB底层接口和应用程序之间的接口,它避免了开发人员直接使用OLE DB底层接口的麻烦。 16.7 ODBC与OLE DB的主要区别: 1)ODBC只能访问关系型数据库,而OLE DB可以访问关系和非关系型甚至是无结构的数据。 2)OLE DB克服了ODBC的一个主要缺点:一个ODBC驱动程序需要支持几乎所有的DBMS特征和功能,这需要大量的工作和初始投资,而OLE DB允许DBMS提供商只实现他们产品的一部分功能。 第17章 VB数据库应用编程 17.1 CommandType属性: adCmdUnknown,表示RecordSource中的命令类型未知; adCmdTable表示RecordSource属性的内容来自一张表; adCmdText表示RecordSource属性的内容来自一个查询语句; adCmdStoredType表示RecordSource属性的内容来自一个存储过程 17.2 RecordSet的Move方法组中,MovePrevios和MoveNext没有自动检测记录的当前行指针是否移出了结果集边界的功能,需编码实现: myadodc.RecordSet.MoveNext/MovePrevious If myadodc.RecordSet.EOF/BOF = True Then myadodc.RecordSet.MoveLast/MoveFirst End If 17.3 保存缓冲区中的记录:Update方法;对当前记录指针作一个移动操作 17.4 CancelUpdate方法:应在Update方法之前调用,调用了Update方法之后的修改是不能撤销的;如果没有添加新记录也没有对当前记录做任何修改,调用CancelUpdate会出错。 17.5 Find方法:用于在当前结果集中查找满足条件的记录 myadodc.RecordSet.Find(“查找条件表达式”) 与 RecordSet对象名.Filter “选择表达式” 相似(.Filter=adFilterNone还原) 17.6 更新记录: mydocdc.RecordSet.Fields(“CustomID”) = Trim(txtCID.Text) mydocdc.RecordSet.Fields(“Age”) = CInt(txtAge.Text) mydocdc.RecordSet.Update 17.7 删除记录提示窗口: Dim res As Integer res = MsgBox(“确实要删除此行记录吗?”,vbExclamation+vbYesNo+vbDefaultButton2) If res = vbYes Then Myadodc.RecordSet.Delete End If 17.8 在DataGrid中显示全部列: Dim intCol As Integer With mydg For intCol = 0 To .Columns.Count – 1 .Columns(intCol).Visible = True Next End With 另一种For 循环:For Each par IN adocm.Parameters ………. Next par 17.9 排序功能实现: (mydg.DataSource = adodc) With adodc.RecordSet If optAsc.Value = True Then .Sort = .Field(intCol).Name & “ASC” Else .Sort = .Field(intCol).Name & “DESC” End If End With mydg.Refresh 17.10 ADO对象模型 Connection对象 -----ErrorS集合-----Error对象 Command对象 -----Parameters集合 ------Parameter对象 RecordSet对象 -----Fields集合 -----Field对象 17.11 Connection对象可以完成的操作:连接数据源打开数据库;执行一个数据库操作命令;利用Error对象检查数据源返回的出错信息。 17.12 销毁内存中的对象:Set 对象名= Nothing 17.13 Command对象的CommandText属性相当于ADO数据控件的RecordSource属性; Command对象的CommandType属性相当于ADO数据控件的CommandType属性 17.14 RecordSet对象的主要功能是建立记录集,并支持对记录集中各数据的各种操作。允许用户直接获取数据,因此RecordSet对象与ADO的访问过程无关。 17.15 CursorType属性: adOpenDynamic动态游标:反映所有用户对数据的修改,支持向前及向后移动; adOpenStatic静态游标:不能反映其他用户的修改,支持向前及向后,当打开客户端RecordSet对象时,adOpenStatic为唯一允许的游标类型。当打印报表和其他不需要即时完成更新数据的应用程序来说很有用。 adOpenFowardOnly仅向前游标:默认值。仅支持向前移动,其他与adOpenStatic一致。 adOpenKeyset键集游标:介于动态和静态游标。只看到其他用户更改的看不到添加删除的 17.16 CursorLocation属性: adUseClient:本地客户端游标。将整个结果集传给客户端,网络流量大但下载后浏览速度快 adUseServer:默认值,仅传送客户端需要的数据,网络流量小但服务器资源消耗大。不支持BookMark属性(书签,快速再定位)和AbsolutePosition属性 adUseNone:没有使用游标服务。 17.17 RecordSet.Open方法: myRs.Open Source, ActiveConnection, CursorType, LockType, Options 1)Source支持的类别: 5)Options的可选项 一个返回记录的Command对象 ///adCmdFile SQL语句 ――adCmdText 表名 ――adCmdTable 存储过程名 ――adComdStoredProc 2)ActiveConnection:已打开的Connection对象;一个连接字符串 示例: Dim myCnn As New ADODB.Connection Dim myRs As New ADODB.RecordSet myCnn.Connection = “Provider = SQLOLEDB.1;User ID = sa;”_ & “Initial Catalog = 商品经营管理数据库;Data Source=(local)” myCnn.Open ‘别忘了“打开” myRs.Source = “select * from T_Customer” myRs.ActiveConnection = myCnn myRs.CursorType = adOpenDynamic myRs.CursorLocation = adUseClient myRs.Open , , , , adCmdTalbe 17.18 创建RecordSet对象的三种方法: 1)使用Connection对象:Set myRs = myConn.Execute(“select * from T_customer”); 2)使用Command对象:Set myRs = myComm.Execute; 3)直接使用Open方法:myRs.Open , , , , 17.19 Error对象:如果最后一次的操作成功则这个集合为空。只有在OLE DB层产生错误才会将每个错误被翻译成Error对象,如果指向一个不存在的提供者则Errors集合不会得到任何信息,因为ADO不能发现这个指定的驱动程序,因此会将错误传递到Visual Basic Errors中。 17.20 三对象结合使用的典型示例: Dim myCnn As New ADODB.Connection Dim myCmm As New ADODB.Command Dim myRs As New ADODB.RecordSet myCnn.ConnectionString = “Provider = SQLOLEDB.1;User ID = loginID;” _ & “Initial Catalog = jessymin;Data Source =(local) ” myCnn.Open ‘别忘了“打开” Set myCmm.ActiveConnection = myCnn myCmm.CommandText = “select * from T_Customer” Set myRs = myCmm.Execute 17.21 VB自定义函数示例:将字段空值转化为空字符串 Private Function convertNull(val As Variant) As Variant If IsNull(val) = True Then convertNull = “” Else convertNull = val End If End Function 第18章 统一建模语言 18.1 UML视图分类:用例视图:用例图;结构视图:类图、对象图;行为视图:顺序图、交互图、状态图、活动图;实现视图:组件图;环境视图:部署图 18.2 类与类之间有关联(聚集,共享聚集+组成)、通用化(继承)(带空心三角形的实线)、依赖(单向实线)、精化(带空心三角形的虚线) 18.3 包(子系统)的四种可见性还包括实现可见性,与私有可见性类似。A指向B的单向虚线表示子系统B被子系统A引用。 18.4 顺序图强调时间,协作图强调空间,状态图强调一个实体在不同时刻的状态变化,活动图强调程序对象逻辑流程的串行执行顺序和并行次序 第19章 分布式数据库、对象数据库和并行数据库 19.1 分布式数据库(物理分散逻辑集中)最基本特征:本地自治、非集中式管理、高可用性;分片透明性(最高级)、位置透明性、局部数据模型透明性构成了分布式数据库的分布透明性。 19.2 分片是对关系(表)的操作,分配是对分片结果的操作。 19.3 分布式数据库的模式结构:全局外模式、全局概念模式、分片模式、分配模式、局部概念模式、局部内模式;系统组成结构:GDBMS全局、GDD、LDBMS局部、CM通信管理 19.4 分布式事务管理:恢复控制(基于两阶段的提交协议)和并发控制(基于封锁协议) 19.5 分布查询数据传输量大的主要原因:连接操作和并操作 19.6 单继承:一颗树;多继承:带根的有向无回路图 19.7 面向对象数据库(面向对象语言中引入数据库):实现方法主要是扩充面向对象程序设计语言,使之能处理持久数据。所谓持久数据,指创建这些数据的程序运行终止后,数据仍然存在于系统之中。数据库中的关系就是持久数据。ObjectStore、Ontos、O2等 19.8 对象关系数据库(关系数据库中引入面向对象):扩展的数据类型定义;继承性;扩充的SQL语言.Informix Universal Server、DB2 UDB、Adaptive Server、Oracle8i、SQL Server 19.9 并行数据库体系结构:共享内存;共享磁盘(中小型);无共享(最好的,银行出纳、民航售票等OLTP类,缺点:通信代价和非本地磁盘访问代价);层次结构(综合) 19.10 一维数据划分方法:轮转法:最适合于扫描整个关系;散列划分法:比转转法更适合点查询,也适合顺序扫描关系;范围划分法:明显利于范围查询和点查询。缺点:均不能有效支持非划分属性上具有选择谓词的查询。 第20章 数据他仓库与数据挖掘 20.1 数据仓库解决的问题是如何更合理和理有效的组织企业的数据体系,目的在于根据决策需求对数据采取适当的手段进行集成,形成一个综合的面向分析的数据环境;数据挖掘解决的问题是如何针对具体的分析对象和分需求,尝试智能和自动化的手段把数据转换为新的有用的信息和知识。 20.2 数据分类:操作型数据(操作型处理,以业务处理为主的联机事务处理OLTP);分析型数据(分析型处理,以分析为主的决策支持系统DDS) 20.3 数据仓库是一个面向主题的、集成的(最重要,抽取、转换、清理、装载)、非易失的、且随时间变化的(时变性)数据集合,用来支持管理人员的决策。 20.4 数据仓库的体系结构:操作型数据、操作型数据存储、数据仓库、数据集市;功能层次:数据管理、数据处理、数据应用 20.5 粒度涉及数据仓库的数据量和支持的查询类型。粒度小,细节度高,数据量大,查询多 20.6 ODS(Operational Data Store,操作型数据存储):一方面,类似于操作型环境,可进行企业全局性联机操作型处理;另外一方面,是一个面向主题的、集成的数据环境,但数据量小,适合于辅助企业完成日常决策的数据处理分析。(秒级、小时级、天级、含反馈信息) 20.7 数据仓库设计以数据仓库的主题数据模型设计和实现为核心。 20.8 OLAP(联机分析处理,On-Line Analytical Processing):支持复杂的分析操作,侧重对决策人员和高层管理人员的决策支持。 20.9 多维分析的基本活动:钻取Drill-Down与卷起Roll-Up;切片Slice与切块Dice;旋转 20.10 OLAP的实现方式:基于多维数据库的;基于关系数据库的;混合型的 20.11 数据挖掘:数据库知识发现KDD,从存放在数据库、数据仓库或其他信息库中的大量数据中挖掘有趣知识的过程。三阶段:数据准备、数据挖掘、结果的解释评估 20.12 数据仓库维护策略一般分为:实时维护、延时维护、快照维护 20.13 建立ODS的目的一般是为支持即时OLAP和全局OLTP两类应用

2009-01-21

HP Officejet J5700 All-in-One series 使用说明书

HP Officejet J5700 All-in-One series ?查找更多信息 ?HP All-in-One概述 ?完成HP All-in-One的设置 ?如何操作? ?放入原件和纸张 ?从计算机打印 ?使用传真功能 ?使用复印功能 ?使用扫描功能 ?维护HP All-in-One ?疑难排解 ?订购耗材 ?HP保修和支持 ?技术信息

2009-01-01

vfp学生信息管理系统

1、 系统管理 (1)、管理员信息 浏览 添加 更新 删除 (2)、备份数据库 (3)、恢复数据库 (4)、退出系统 2、人员管理 (1)、插入 (2)、更新 (3)、删除 3、查询打印 (1)、查询 (2)、打印 4、帮助信息 (1)、关于系统 (2)、帮助信息

2008-12-29

From C to C++

GreenCppC 2008-8-24 ========================================= // I 类,对象,函数重载 //-------- From C to C++ ------------ // A simple C Program! // convert a string to uppercase! #include <stdio.h> #define N 200 int main(){ char ms[N]; int i; printf("Input ms: "); gets(ms); for(i=0;ms[i];i++) if(ms[i]>='a'&&ms[i]<='z') ms[i]-='\x20'; puts(ms); return 0; } /* path d:\wingw\bin gcc abc.c -o abc.exe */ //------------------------------ // A better C Program! #include <stdio.h> #define N 200 void strUpper(char *s); void strLower(char *s); int main(){ char ms[N]; printf("Input ms: "); gets(ms); strUpper(ms); puts(ms); strLower(ms); puts(ms); return 0; } void strUpper(char *s) { for(;*s;s++) if(*s>='a'&&*s<='z')*s-='\x20'; } void strLower(char *s) { for(;*s;s++) if(*s>='A'&&*s<='Z')*s+='\x20'; } //------------------------------ // A C++ Program without class and object! #include <iostream> using namespace std; const int N=200; void strUpper(char *s); void strLower(char *s); int main(){ char ms[N]; cout<<"Input ms: "; cin.getline(ms,N); strUpper(ms); cout<<ms<<"\n"; strLower(ms); cout<<ms<<endl; return 0; } void strUpper(char *s) { for(;*s;s++) if(*s>='a'&&*s<='z')*s-='\x20'; } void strLower(char *s) { for(;*s;s++) if(*s>='A'&&*s<='Z')*s+='\x20'; } //------------------------------ // A C++ Program with class and object! #include <iostream> using namespace std; const int N=200; class Str{ char s[N]; public: void out(){cout<<s<<"\n";} void in(){cout<<"s: "; cin.getline(s,N);} void upper(); void lower(); }; void Str::upper() {char *p; for(p=s;*p;p++) if(*p>='a'&&*p<='z')*p-='\x20'; } void Str::lower() { for(char *p=s;*p;p++) if(*p>='A'&&*p<='Z')*p+='\x20'; } // - - - int main(){ Str a; cin>>a.s; //error! a.in(); a.upper(); a.out(); a.lower(); a.out(); return 0; } ========================================= // II. 构造与析构函数 #include <iostream> #include <cstring> using namespace std; class child { char name[20]; int age; public: child(); child(char *n,int a); void ask(char *n); void ask(int a); ~child(); }; // --- child::child(){ strcpy(name,"Tomme"); age=3; } // --- child::child(char *name,int age){ strcpy(this->name,name); this->age=age; // this -- address of self object } // --- void child::ask(char *n){ if(!strcmp(name,n)) cout<<"Yes, i am "<<n<<".\n"; else cout<<"No, i am not "<<n<<".\n"; } // --- void child::ask(int age){ if(this->age==age) cout<<"Yes, i am "<<age<<" years old.\n"; else cout<<"No, i am not "<<age<<" years old.\n"; } // --- child::~child(){ cout<<name<<": Bye!\n"; } //---------- int main(){ child tom,rose("Rosie",4); tom.age=4; // error! tom.ask("tom"); rose.ask("Alice"); tom.ask(2); return 0; } ========================================= // III. 继承 #include <iostream> #include <cstring> using namespace std; class child { protected: //note this change! char name[20]; int age; public: child(); child(char *n,int a); void ask(char *n); void ask(int a); }; // --- child::child(){ strcpy(name,"Tomme"); age=3; } // --- child::child(char *n,int a){ strcpy(name,n); age=a; } // --- void child::ask(char *n){ if(!strcmp(name,n)) cout<<"Yes, i am "<<n<<".\n"; else cout<<"No, i am not "<<n<<".\n"; } // --- void child::ask(int a){ if(a==age) cout<<"Yes, i am "<<a<<" years old.\n"; else cout<<"No, i am not "<<a<<" years old.\n"; } // ----------- class pupil: public child{ char book[20]; public: pupil(char *n,int a,char *b); void list(); }; // --- pupil::pupil(char *n,int a,char *b): child(n,a) { strcpy(book,b); } // --- void pupil::list() { cout<<name<<" "<<age<<" "<<book<<"\n"; } //---------- int main(){ child tom,rose("Rosie",4); tom.ask("tom"); rose.ask("Alice"); tom.ask(2); pupil green("Green",9,"Nature"); green.ask("Jack"); green.ask(10); green.list(); return 0; } ========================================= // IV. 增加与基类成员函数同名的函数; // 调用基类成员函数;内联函数(in-line) #include <iostream> #include <cstring> using namespace std; class child { protected: char name[20]; int age; public: child(); child(char *n,int a); void ask(char *n); void ask(int a); }; // --- child::child(){ strcpy(name,"Tomme"); age=3; } // --- child::child(char *n,int a){ strcpy(name,n); age=a; } // --- void child::ask(char *n){ if(!strcmp(name,n)) cout<<"Yes, i am "<<n<<".\n"; else cout<<"No, i am not "<<n<<".\n"; } // --- void child::ask(int a){ if(a==age) cout<<"Yes, i am "<<a<<" years old.\n"; else cout<<"No, i am not "<<a<<" years old.\n"; } // ----------- class pupil: public child{ char book[20]; public: pupil(char *n,int a,char *b); void ask(char *n){child::ask(n);} // in-line! void ask(int a){child::ask(a);} void ask(); }; // --- pupil::pupil(char *n,int a,char *b): child(n,a) { strcpy(book,b); } // --- void pupil::ask() { cout<<name<<" "<<age<<" "<<book<<"\n"; } //---------- int main(){ child tom,rose("Rosie",4); tom.ask("tom"); rose.ask("Alice"); tom.ask(2); pupil green("Green",9,"Nature"); green.ask("Jack"); green.ask(10); green.ask(); return 0; } ===================================== // V. 对象数组 #include <iostream> using namespace std; class C1{ int a,b; public: C1(int m,int n){a=m;b=n;} int getAdd(){return a+b;} }; int main() {C1 ob[3]={C1(1,2),C1(3,4),C1(5,6)}; int i; for(i=0;i<3;i++) cout << ob[i].getAdd() << " "; // C1 oe[2]; -- Error! means constructor is C1() // -- need reload C1::C1(){ ... } // -- eg, C1::C1(){a=b=0;} return 0; } ========================================= // VI. 指向对象的指针 C1 obA(2,3), *p; p=&obA; cout << p->getAdd(); //------------- C1 ob[3]={C1(1,2),C1(3,4),C1(5,6)}, *q; q=ob; for(int i=0;i<3;i++) {cout << q->getAdd() << " "; q++; } //------------- class C2{ public: int a; C2(int k){a=k*k;} }; // . . . C2 obB(9); int *p; p=&obB.a; // Note! a is public, p to member cout << *p; // 指向派生类的指针 class Base{ public: int a,b; Base(int m,int n){a=m;b=n;} int getAdd(){return a+b;} }; class Derived: public Base{ int c; public: Derived(int x,int y,int z): Base(x,y) {c=z;} float getAve(){return (a+b+c)/3.0F;} }; // ... Base *bp; Derived d(6,7,9); bp=&d; cout << bp->getAdd(); cout << bp->getAve(); // Error! cout << ((Derived *) bp) ->getAve(); ========================================= // VII. 动态分配:new, delete #include <iostream> #include <new> using namespace std; int main() {int *p; try{ p=new int; } catch(bad_alloc ex){ cout << "New failed!\n"; return -1; } *p=20; cout << "At "<<p<<" is "<< *p <<"\n"; delete p; return 0; } //------------- #include <iostream> #include <new> using namespace std; int main() {int *p; try{ p=new int[6]; } catch(bad_alloc ex){ cout << "New failed!\n"; return -1; } float ave=0.0F; int i; cout<<"Enter numbers: "; for(i=0;i<6;i++) {cin>>p[i]; ave+= *(p+i); cout<< *(p+i); } ave/=6.0F; cout << "Ave = "<< ave <<"\n"; delete [] p; return 0; } //------------- #include <iostream> #include <cstring> #include <new> using namespace std; class Balance{ char name[40]; double curValue; public: Balance(char *n,double v){ strcpy(name,n); curValue=v; } void getValue(char *n,double &v){ strcpy(n,name); v=curValue; } }; int main() { Balance *p; char s[40]; double bal; try{ p=new Balance("Robin Hood",3536.45); } catch(bad_alloc ex){ cout << "New failed!\n"; return -1; } p->getValue(s,bal); cout<<s<<"\'s balance is "<<bal<<"\n"; delete p; return 0; } ========================================= // VIII. 传递引用 #include <iostream> using namespace std; void neg1(int k); void neg2(int *p); void neg3(int &k); int main() { int x=20; neg1(x); neg2(&x); cout << x<< "\n"; neg3(x); cout << x<< "\n"; } // - - - void neg1(int k) { k=-k;} void neg2(int *p) { *p=-*p;} void neg3(int &k) { k=-k; } //------------- #include <iostream> using namespace std; class C1{ public: int k; void neg(C1 &o){o.k=-o.k;} // -- no temp object created }; int main() { C1 ob; ob.k=20; ob.neg(ob); cout << ob.k <<"\n"; return 0; } //----------------------------------- /* Input a sentence,reverse all the words except other chars, eg: etihw, dna kcalb! => white, and black! NOT: !black and ,white */ #include <iostream> #include <new> #include <cstdlib> #include <cctype> using namespace std; const int N=200; /* - - - - - - */ class CharStack{ const int StkLen; char *data; int top; public: CharStack(); ~CharStack(){delete []data;} int push(char x) {if(top>=StkLen-1)return -1; // it's full top++; data[top]=x; return 0; } int pop(char &x) {if(top<=-1)return -1; // empty! x= *(data+top); top--; return 0; } }; CharStack::CharStack():StkLen(40) {try{ data=new char[StkLen]; }catch(bad_alloc){cout<<"New failed!"; exit(-1);} top=-1; } // --------- class WordRev{ char ms[N]; public: void reads() { cout<<"Input str:\n"; cin.getline(ms,N); } void prints() { cout<<ms<<"\n"; } void wRev(); }; void WordRev::wRev() {CharStack stk; int i=0,wStart,wEnd; while(ms[i]) {if(!isalpha(ms[i]))i++; else {wStart=i; while(isalpha(ms[i]))stk.push(ms[i++]); wEnd=i; i=wStart; while(!stk.pop(ms[i]))i++; i=wEnd; } } } // --------- int main() { WordRev sr; sr.reads(); sr.wRev(); sr.prints(); return 0; } ========================================= // IX 函数形参使用默认值 #include <iostream> #include <cstring> using namespace std; // ----------- class pupil{ public: char name[20]; int age; char book[20]; pupil(char *n,int a,char *b); void list(); }; // --- pupil::pupil(char *n,int a,char *b){ strcpy(name,n); age=a; strcpy(book,b); } // --- void pupil::list() { cout<<name<<" "<<age<<" "<<book<<"\n"; } //---------- void nextYear(pupil &c,char *book="Math"); //---------- int main(){ pupil green("Green",9,"Chinese"); green.list(); nextYear(green); green.list(); nextYear(green,"Nature"); green.list(); return 0; } //---------- void nextYear(pupil &c,char *book="Math") { // ="Math" Should be omitted, for previous prototype c.age++; strcpy(c.book,book); return; } /* D:\green>g++ pupil.cpp -o pupil.exe pupil.cpp: In function `void nextYear(pupil&, char*)': pupil.cpp:41: error: default argument given for parameter 2 of `void nextYear(pupil&, char*)' pupil.cpp:25: error: after previous specification in `void nextYear(pupil&, char*)' */ ========================================= // X. 虚函数 virtual #include <iostream> using namespace std; class base{ public: virtual void vf(){cout<<"base's vf.\n";} }; class derived1:public base{ public: virtual void vf(){cout<<"derived1's vf.\n";} }; class derived2:public base{ public: virtual void vf(){cout<<"derived2's vf.\n";} }; void f(base &r){r.vf();} int main() {base b, *p; derived1 d1; derived2 d2; b.vf(); d1.vf(); d2.vf(); p=&b; p->vf(); p=&d1; p->vf(); // derived1's vf. p=&d2; p->vf(); // derived2's vf. f(b); f(d1); // derived1's vf. f(d2); // derived2's vf. return 0; } ========================================= // XI. 对象赋值问题 #include <iostream> #include <cstdlib> #include <new> using namespace std; class Myclass{ int *p; public: Myclass(int i); void show(){cout<< *p<<"\n";} ~Myclass(){delete p;} }; Myclass::Myclass(int i){ try{ p=new int; } catch(bad_alloc e) {cout<< "New failed!\n"; exit(-1); } *p=i; } int main() {Myclass a(20); Myclass b=a; //copy by bits b.show(); return 0; // 错误!对象中 p 所指向的内存空间将被释放 2 次! } ========================================= // XII. 拷贝构造函数 ---- 解决对象参数传递的副作用问题 #include <iostream> #include <new> using namespace std; class array{ public: int *p; int size; array( ){p=NULL;size=0; }; array(int sz); array(const array &a); ~array(){if(!p){delete [ ]p; size=0;}} void input(); }; array::array(int sz){ size=sz; try{ p=new int[size]; }catch (bad_alloc xa){ cout <<"Alloc failed!"; exit(EXIT_FAILURE); } } array::array(const array &a){ try{ p=new int[a.size]; }catch (bad_alloc xa){ cout <<"Alloc failed!"; exit(EXIT_FAILURE); } size=a.size; for(int i=0;i<size;i++)p[i]=a.p[i]; } void array::input(){ cout<<"Input "<<size<<" integers: "; for(int i=0;i<size;i++)cin>>p[i]; } void inc(array a){ int i; for(i=0;i<a.size;i++) if(a.p[i]==59)a.p[i]++; cout<<"Result is: " ; for(i=0;i<a.size;i++)cout<<a.p[i]<<' '; cout<<"\n"; } int main(){ array a(4),c; a.input(); array b(a); // 调用拷贝构造函数 inc(b); //调用拷贝构造函数(隐式) for(int i=0;i<b.size;i++)cout<<b.p[i]<<' '; return 0; } ========================================= // XIII. 运算符重载 #include <iostream> using namespace std; class loc{ int longitude,latitude; public: loc(){} //needed to construct temp objects loc(int lg,int lt){longitude=lg; latitude=lt;} void show(){cout<<longitude<<" "<<latitude<<"\n";} loc operator+(loc op2); loc operator++(); loc operator=(loc op2); loc operator+=(loc op2); }; loc loc::operator+(loc op2) {loc temp; temp.longitude=op2.longitude+longitude; temp.latitude=op2.latitude+latitude; return temp; } loc loc::operator++() //前缀形式 prefix {longitude++; latitude++; return *this; } loc loc::operator=(loc op2) { longitude=op2.longitude; latitude=op2.latitude; return *this; //为连续赋值 } loc loc::operator+=(loc op2) { longigude=op2.longitude+longitude; latitude=op2.latitude+latitude; return *this; //为连续赋值 } // operator=和operator++等都改变了对象的值 int main() {loc ob1(10,20),ob2(5,30),ob3; ob3=ob1+ob2; ++ob3; ob3.show(); ob1+=ob2; ob1=ob1+ob2; // ob1.+(ob2) like (ob1+ob2).show(); ++ob1; ob1=ob2=ob3; ... ... } ========================================= // XIV. 异常的抛出,捕获与处理 #include <iostream> using namespace std; int main() {cout <<"Start\n"; try { cout << "Inside try block\n"; throw 100; cout << "This will not execute"; } catch (int i) { cout << "Caught an exception, value is: "; cout << i <<"\n"; } cout << "End\n"; return 0; } // -------------------- #include <iostream> using namespace std; void xtest(int test) { cout << "Inside xtest!\n"; if(test) throw test; } int main() {cout <<"Start\n"; try { cout << "Inside try block\n"; xtest(0); xtest(1); xtest(2); } catch (int i) { cout << "Caught an exception, value is: "; cout << i <<"\n"; } cout << "End\n"; return 0; } // 捕获异常类 #include <iostream> #include <cstring> using namespace std; class MyException{ public: char how[80]; int what; MyException(){*how=0; what=0;} MyException(char *s, int n) {strcpy(how,s); what=n; } }; int main() {int i; try { cout <<"Enter a positive number: "; cin >> i; if(i<0) throw MyException("Not Positive",i); } catch (MyException e) { cout << e.how<<": "; cout << e.what <<"\n"; } return 0; } // 捕获派生异常类 #include <iostream> using namespace std; class B { }; class D: public B { }; int main() {D derived; try { throw derived; } catch (D d) { cout << "Caught a derived class, not the base! \n"; } catch (B b) { cout << "Caught the base class! \n"; } return 0; } // 异常的限制及捕获所有异常 #include <iostream> using namespace std; void xtest(int test) throw (int,char,double,char *) { try { if(test==0) throw test; if(test==1) throw 'a'; if(test==2) throw 12.34; if(test==3) throw "A string."; } catch (int i) { cout << "Caught an integer!"; } catch (...) { cout << "Caught Another!"; } } int main() {cout <<"Start\n"; xtest(0); xtest(1); xtest(2); xtest(3); cout << "End\n"; return 0; } // 异常的再次抛出 #include <iostream> using namespace std; void xhandler() { try { throw "Hello!"; } catch (const char *) { cout << "Caught a string inside!\n"; throw; //rethrow char * out of function } } int main() {cout <<"Start\n"; try { xhandler(); } catch (const char *) { cout << "Caught a string outside!\n"; } cout << "End\n"; return 0; } // 一个简单的程序 #include <iostream> using namespace std; int main() {int a,b; cout <<"Enter a b: "; cin >> a >> b; try { if(!b) throw b; cout << "Result: "<< a/b << endl; } catch (int i) { cout << "Can't divide by zero!\n"; } return 0; } ========================================= XV. 模板 //模板之通用函数 #include <iostream> using namespace std; template <class X> void superSwap(X &a, X &b) { X t; t=a; a=b; b=t; }; int main() { int m=10, n=20; double x=10.1, y=20.2; char a='A', b='\x42'; superSwap(m,n); superSwap(x,y); superSwap(a,b); cout<<"m="<<m<<", n="<<n<<'\n'; cout<<"x="<<x<<", y="<<y<<'\n'; cout<<"a="<<a<<", b="<<b<<'\n'; return 0; } ---------------------------------- #include <iostream> using namespace std; template <class type1,class type2> void myfunc(type1 x, type2 y) { cout<<x<<' '<<y<<'\n'; } int main() { myfunc("C++ is great!", 100); // char* , int myfunc(1234.56, 20L); // double , long int return 0; } // 模板之通用类 #include <iostream> using namespace std; const int Size=20; template <class DataType> class SuperStack{ DataType data[Size]; int top; public: SuperStack(){top= -1;} int push(DataType x); int pop(DataType &x); }; template <class DataType> int SuperStack<DataType>::push(DataType x) { if(top>=Size-1) return -1; // stack is full data[++top]=x; return 0; } template <class DataType> int SuperStack<DataType>::pop(DataType &x) { if(top<0) return -1; // stack is empty x=data[top--]; return 0; } int main() { SuperStack<char> chStack; SuperStack<double> dbStack; char s[Size]="ABC"; double a[Size]={20.1, 21.2, 22.3}; int i; for(i=0;i<3;i++) { chStack.push(s[i]); dbStack.push(a[i]); } for(i=0;i<3;i++) { chStack.pop(s[i]); dbStack.pop(a[i]); } cout << s << '\n'; for(i=0;i<3;i++) cout << a[i]<<' '; cout<<'\n'; return 0; } ========================================= XVI. 名字空间 #include <iostream> using namespace std; namespace GreenNamespace{ char Say[80]="TRUTH, Must thou Know!"; bool isUpperLetter(char ch) { if(ch>='A' &&ch<='Z')return true; return false; } class X{ public: int year; X(int y){year=y;} }; // note this semi-colon! } using namespace GreenNamespace; int main() {cout << Say <<'\n'; char *p=Say; int count=0; for(;*p;p++) if(isUpperLetter(*p))count++; cout << "count = " << count <<'\n'; X ob(2006); cout << ob.year <<"\n"; return 0; } //------------------------ ////////// OneCount.cpp//////// namespace BitsSpace{ int onePerByte(char x); int oneCount(char *buf,int bytes); // ------------------- int onePerByte(char x) {int count=0,i; for(i=0;i<8;i++) {if(x & '\x1') count++; // 'A'<=> '\x41' x>>=1; //x=x>>1; } return count; } // --- int oneCount(char *buf,int bytes) {int count=0,i; for(i=0;i<bytes;i++) count+=onePerByte(buf[i]); return count; } // --- } ---------------- ////////// testOne.cpp//////// #include <iostream> #include "OneCount.cpp" using namespace std; //using namespace BitsSpace; const int SLen=80; // ---- int main(){ char ms[SLen],*p; cout<<"Enter your words:\n> " ; cin.getline(ms,SLen); cout<< BitsSpace::oneCount(ms,strlen(ms))<<"\n"; cout<<"Size of char: "<<sizeof(char)<<"\n"; return 0; } ========================================= //////////////////////////////// // XVII. C++ file handle, 6 programs // by Hs.li 2007.4.28 //////////////////////////////// // Write text strings! #include <iostream> #include <fstream> using namespace std; #define MaxN 200 // - - - - - - int main() {fstream outF; char text[MaxN]; cout<<"Enter lines, end with empty line:\n"; outF.open("str.txt",ios::out); if(!outF.is_open()) {cout<<"File open failed!\n"; return -1; } while(1) { cin.getline(text,MaxN); if(!text[0])break; outF<<text<<"\n"; if(outF.bad()||outF.fail()) {cout<<"Write file error!\n"; outF.close(); return -2; } } cout<<"Write text file okey!\n"; outF.close(); return 0; } ========================= // Read text strings! #include <iostream> #include <fstream> using namespace std; #define MaxN 200 // - - - - - - int main() {fstream inF; char text[MaxN]; cout<<"The text lines are:\n"; inF.open("str.txt",ios::in); if(!inF.is_open()) {cout<<"File open failed!\n"; return -1; } while(1) { inF.getline(text,MaxN); if(inF.eof()|inF.fail()|inF.bad())break; cout<<text<<"\n"; } if(!inF.eof()) {cout<<"Read file error!\n"; inF.close(); return -2; } cout<<"---- End!\n"; inF.close(); return 0; } ====================== // Write text data! #include <iostream> #include <fstream> using namespace std; // - - - - - - int main() { const int MaxN=8; fstream outF; double a[MaxN]; char *fname="data.txt"; int i; cout<<"Please input 8 double: "; for(i=0;i<MaxN;i++) cin>>a[i]; outF.open(fname,ios::out); if(!outF.is_open()) {cout<<"File open failed!\n"; return -1; } outF.exceptions(fstream::failbit| fstream::badbit); try{ for(i=0;i<MaxN;i++) outF<<a[i]<<" "; } catch(std::exception &e) {cout<<"Exception caught:"<<e.what()<<endl; outF.close(); return -2; } outF.close(); cout<<"Text data file write okey!\n"; return 0; } ============================ // Read text data! #include <iostream> #include <fstream> using namespace std; // - - - - - - int main() { fstream inF; double b; char *fname="data.txt"; cout<<"Please wait for reading data:\n"; inF.open(fname,ios::in); if(!inF.is_open()) {cout<<"File open failed!\n"; return -1; } inF.exceptions(fstream::failbit| fstream::badbit|fstream::eofbit); try{ while(1) { inF>>b; cout<<b<<" "; } }catch(std::exception &e) { if(!inF.eof()) { cout<<"Exception caught:"<<e.what()<<endl; inF.close(); return -2; } } inF.close(); cout<<"\nText data file read okey!\n"; return 0; } =============================== // Write binary data! #include <iostream> #include <fstream> using namespace std; // - - - - - - int main() { const int MaxN=8; fstream outF; double a[MaxN]; char *fname="data.dat"; int i; cout<<"Please input 8 double: "; for(i=0;i<MaxN;i++) cin>>a[i]; outF.open(fname,ios::out|ios::binary); if(!outF.is_open()) {cout<<"File open failed!\n"; return -1; } outF.exceptions(fstream::failbit| fstream::badbit); try{ outF.write((char *)a,MaxN*sizeof(double)); } catch(std::exception &e) {cout<<"Exception caught:"<<e.what()<<endl; outF.close(); return -2; } outF.close(); cout<<"Binary data file write okey!\n"; return 0; } ================================ // Read binary data! #include <iostream> #include <fstream> using namespace std; // - - - - - - int main() { fstream inF; double b; char *fname="data.dat"; cout<<"Please wait for reading data:\n"; inF.open(fname,ios::in|ios::binary); if(!inF.is_open()) {cout<<"File open failed!\n"; return -1; } inF.exceptions(fstream::failbit| fstream::badbit|fstream::eofbit); try{ while(1) { inF.read((char *)&b,sizeof(double)); cout<<b<<" "; } }catch(std::exception &e) { if(!inF.eof()) { cout<<"Exception caught:"<<e.what()<<endl; inF.close(); return -2; } } inF.close(); cout<<"\nBinary data file read okey!\n"; return 0; } ////////////////////////////////////////////////

2008-12-21

数据挖掘教程(浙大).zip

数据挖掘教程(浙大).zip 数据挖掘教程(浙大).zip 数据挖掘教程(浙大).zip

2008-11-21

IBM DB2通用数据库SQL入门

IBM DB2通用数据库SQL入门 IBM DB2通用数据库SQL入门 IBM DB2通用数据库SQL入门

2008-11-21

路由模拟仿真软件(计算机网络实验工具)

《 使 用 说 明 》 命令要在一行内打完,窗体可以拉大。 支持三级Switch网络,包含路由器的网络支持两级Switch。 要求vlan号<6,即vlan 1、vlan 2、vlan 3、...、vlan 6 设置交换机和路由器的主机名时,名称中不要含有空格。 F3键 清屏(为了方便而加) Ctrl+P 历史命令,建议使用方向键。 Ctrl+z 回根, 建议使用end命令。 Ctrl+Break 路由器进入ROM监控状态。 Ctrl+Break 交换机清除特权密码。 双击设备进入终端操作 单击设备的接口可以实现画线 单击画有线的接口可以删除连线 在指定的设备按下鼠标左键可以实现移动。 在指定的设备按下鼠标右键可以删除设备。 输入命令时,按Tab键,可以得到命令全称。 键入"?" 可以得到当前状态下的命令帮助。 复选框是选择"?"键帮助类型:学习方式和仿真方式。 Aux 口这个版本不支持使用。 系统配置文件名是:sim.ini 考试题目文件名是:sim.txt

2008-11-21

计算机第六届分区联赛提高组初赛

第六届分区联赛提高组初赛试题(附答案) 一. 选择一个正确答案代码(A/B/C/D),填入每题的括号内(每题1.5分,多选无分,共30分) 1.下列无符号数中,最小的数是(  ) A.(11011001)2  B.(75)10  C.(37)8  D.(2A)16 2.在外部设备中,绘图仪属于(  ) A. 输入设备  B.输出设备  C. 辅(外)存储器  D.主(内)存储器 3.计算机主机是由CPU与(  )构成的 A. 控制器  B. 输入、输出设备  C. 运算器  D.内存储器 4.计算机病毒的特点是(  ) A. 传播性、潜伏性、易读性与隐蔽性  B. 破坏性、传播性、潜伏性与安全性 C. 传播性、潜伏性、破坏性与隐蔽性  D. 传播性、潜伏性、破坏性与易读性 5.WINDOWS 9X是一种(  )操作系统 A. 单任务字符方式  B. 单任务图形方式  C. 多任务字符方式  D. 多任务图形方式 6.Internet的规范译名应为(  ) A. 英特尔网  B. 因特网  C. 万维网  D. 以太网 ……

2008-10-13

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除