求解 初学对迭代器的疑问

CHEN_JYXHM 2019-08-07 01:06:37
//学习迭代器时的疑问
/* find返回的是是输入型迭代器
template <class InputIterator, class T>
InputIterator find (InputIterator first, InputIterator last, const T& val);
*/
int main()
{
vector<int> vi = {0,1,2,3,4,5,6,7,8,9};
auto itr = find(vi.begin(),vi.end(),1);
*(--itr) = 10;// 问题在这里->find返回的是是输入型迭代器 那itr就是输入型的迭代器。那为什么还能对itr进行--操作,而且输入行迭代器不是只能从容器中读取吗,为什么还能写进入?
for(auto &i:vi)
cout<<i<<endl;
return 0;
}

...全文
33 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
NorZ 2019-08-07
  • 打赏
  • 举报
回复
输入和输出是相对于对象,而不是相对于程序员,所以input类型,表示你对其的赋值,可以直接修改到容器对象本身
NorZ 2019-08-07
  • 打赏
  • 举报
回复
https://zh.cppreference.com/w/cpp/iterator
一、本书的内容 目前,市面上有关计算机算法的书很多,有些叙述严谨但不全面,另外一些则是容量很大但不够严谨。本书将叙述的严谨性以及内容的深度和广度有机地结合了起来。第1版推出后,即在世界范围内受到了广泛的欢迎,被各高等院校用作多种课程的教材和业界的标准参考资料。它深入浅出地介绍了大量的算法及相关的数据结构,以及用于解决一些复杂计算问题的高级策略(如动态规划、贪心算法、平摊分析等),重点在于算法的分析和设计。对于每一个专题,作者都试图提供目前最新的研究成果及样例解答,并通过清晰的图示来说明算法的执行过程。. 本书是原书的第2版,在第1版的基础之上增加了一些新的内容,涉及算法的作用、概率分析和随机化算法、线性规划,以及对第1版中详尽的、几乎涉及到每一小节的修订。这些修订看似细微,实际上非常重要。书中引入了“循环不变式”,并贯穿始终地用来证明算法的正确性。在不改动数学和分析重点的前提下,作者将第1版中的许多数学基础知识从第一部分移到了附录中。 二、本书的特点 本书在进行算法分析的过程中,保持了很好的数学严谨性。书中的分析和设计可以被具有各种水平的读者所理解。相对来说,每一章都可以作为一个相对独立的单元来教授或学习。书中的算法以英语加伪代码的形式给出,只要有一点程序设计经验的人都能读懂,并可以用任何计算机语言(如C/C++和Java等)方便地实现。在书中,作者将算法的讨论集中在一些比较现代的例子上,它们来自分子生物学(如人类基因项目)、商业和工程等领域。每一小节通常以对相关历史素材的讨论结束,讨论了在每一算法领域的原创研究。 本书的特点可以概括为以下几个方面: 1.概念清晰,广度、深度兼顾。 本书收集了现代计算机常用的数据结构和算法,并作了系统而深入的介绍。对涉及的概念和背景知识都作了清晰的阐述,有关的定理给出了完整的证明。 2.“五个一”的描述方法。 本书以相当的深度介绍了许多常用的数据结构和有效的算法。编写上采用了“五个一”,即一章介绍一个算法、一种设计技术、一个应用领域和一个相关话题。.. 3.图文并茂,可读性强。 书中的算法均以通俗易懂的语言进行说明,并采用了大量插图来说明算法是如何工作的,易于理解。 4.算法的“伪代码”形式简明实用。 书中的算法均以非常简明的“伪代码”形式来设计,可以很容易地把它转化为计算机程序,直接应用。 注重算法设计的效率,对所有的算法进行了仔细、精确的运行时间分析,有利于进一步改进算法。 三、本书的用法 本书对内容进行了精心的设计和安排,尽可能考虑到所有水平的读者。即使是初学计算机算法的人,也可以在本书中找到所需的材料。 每一章都是独立的,读者只需将注意力集中到最感兴趣的章节阅读。 1.适合作为教材或教学参考书。 本书兼顾通用性与系统性,覆盖了许多方面的内容。本书不但阐述通俗、严谨,而且提供了大量练习和思考题。针对每一节的内容,都给出了数量和难度不等的练习题。练习题用于考察对基本内容的掌握程度,思考题有一定的难度,需进行精心的研究,有时还通过思考题介绍一些新的知识。 前言回到顶部↑本书提供了对当代计算机算法研究的一个全面、综合性的介绍。书中给出了多个算法,并对它们进行了较为深入的分析,使得这些算法的设计和分析易于被各个层次的读者所理解。力求在不牺牲分析的深度和数学严密性的前提下,给出深入浅出的说明。. 书中每一章都给出了一个算法、一种算法设计技术、一个应用领域或一个相关的主题。算法是用英语和一种“伪代码”来描述的,任何有一点程序设计经验的人都能看得懂。书中给出了230多幅图,说明各个算法的工作过程。我们强调将算法的效率作为一种设计标准,对书中的所有算法,都给出了关于其运行时间的详细分析。 本书主要供本科生和研究生的算法或数据结构课程使用。因为书中讨论了算法设计中的工程问题及其数学性质,因此,本书也可以供专业技术人员自学之用。 本书是第2版。在这个版本里,我们对全书进行了更新。所做的改动从新增了若干章,到个别语句的改写。 致使用本书的教师 本书的设计目标是全面、适用于多种用途。它可用于若干课程,从本科生的数据结构课程到研究生的算法课程。由于书中给出的内容比较多,只讲一学期一般讲不完,因此,教师们应该将本书看成是一种“缓存区”或“瑞典式自助餐”,从中挑选出能最好地支持自己希望教授的课程的内容。 教师们会发现,要围绕自己所需的各个章节来组织课程是比较容易的。书中的各章都是相对独立的,因此,你不必担心意想不到的或不必要的各章之间的依赖关系。每一章都是以节为单位,内容由易到难。如果将本书用于本科生的课程,可以选用每一章的前面几节内容;在研究生课程中,则可以完整地讲授每一章。 全书包含920多个练习题和140多个思考题。每一节结束时给出练习题,每一章结束时给出一些
一、本书的内容 目前,市面上有关计算机算法的书很多,有些叙述严谨但不全面,另外一些则是容量很大但不够严谨。本书将叙述的严谨性以及内容的深度和广度有机地结合了起来。第1版推出后,即在世界范围内受到了广泛的欢迎,被各高等院校用作多种课程的教材和业界的标准参考资料。它深入浅出地介绍了大量的算法及相关的数据结构,以及用于解决一些复杂计算问题的高级策略(如动态规划、贪心算法、平摊分析等),重点在于算法的分析和设计。对于每一个专题,作者都试图提供目前最新的研究成果及样例解答,并通过清晰的图示来说明算法的执行过程。. 本书是原书的第2版,在第1版的基础之上增加了一些新的内容,涉及算法的作用、概率分析和随机化算法、线性规划,以及对第1版中详尽的、几乎涉及到每一小节的修订。这些修订看似细微,实际上非常重要。书中引入了“循环不变式”,并贯穿始终地用来证明算法的正确性。在不改动数学和分析重点的前提下,作者将第1版中的许多数学基础知识从第一部分移到了附录中。 二、本书的特点 本书在进行算法分析的过程中,保持了很好的数学严谨性。书中的分析和设计可以被具有各种水平的读者所理解。相对来说,每一章都可以作为一个相对独立的单元来教授或学习。书中的算法以英语加伪代码的形式给出,只要有一点程序设计经验的人都能读懂,并可以用任何计算机语言(如C/C++和Java等)方便地实现。在书中,作者将算法的讨论集中在一些比较现代的例子上,它们来自分子生物学(如人类基因项目)、商业和工程等领域。每一小节通常以对相关历史素材的讨论结束,讨论了在每一算法领域的原创研究。 本书的特点可以概括为以下几个方面: 1.概念清晰,广度、深度兼顾。 本书收集了现代计算机常用的数据结构和算法,并作了系统而深入的介绍。对涉及的概念和背景知识都作了清晰的阐述,有关的定理给出了完整的证明。 2.“五个一”的描述方法。 本书以相当的深度介绍了许多常用的数据结构和有效的算法。编写上采用了“五个一”,即一章介绍一个算法、一种设计技术、一个应用领域和一个相关话题。.. 3.图文并茂,可读性强。 书中的算法均以通俗易懂的语言进行说明,并采用了大量插图来说明算法是如何工作的,易于理解。 4.算法的“伪代码”形式简明实用。 书中的算法均以非常简明的“伪代码”形式来设计,可以很容易地把它转化为计算机程序,直接应用。 注重算法设计的效率,对所有的算法进行了仔细、精确的运行时间分析,有利于进一步改进算法。 三、本书的用法 本书对内容进行了精心的设计和安排,尽可能考虑到所有水平的读者。即使是初学计算机算法的人,也可以在本书中找到所需的材料。 每一章都是独立的,读者只需将注意力集中到最感兴趣的章节阅读。 1.适合作为教材或教学参考书。 本书兼顾通用性与系统性,覆盖了许多方面的内容。本书不但阐述通俗、严谨,而且提供了大量练习和思考题。针对每一节的内容,都给出了数量和难度不等的练习题。练习题用于考察对基本内容的掌握程度,思考题有一定的难度,需进行精心的研究,有时还通过思考题介绍一些新的知识。 前言回到顶部↑本书提供了对当代计算机算法研究的一个全面、综合性的介绍。书中给出了多个算法,并对它们进行了较为深入的分析,使得这些算法的设计和分析易于被各个层次的读者所理解。力求在不牺牲分析的深度和数学严密性的前提下,给出深入浅出的说明。. 书中每一章都给出了一个算法、一种算法设计技术、一个应用领域或一个相关的主题。算法是用英语和一种“伪代码”来描述的,任何有一点程序设计经验的人都能看得懂。书中给出了230多幅图,说明各个算法的工作过程。我们强调将算法的效率作为一种设计标准,对书中的所有算法,都给出了关于其运行时间的详细分析。 本书主要供本科生和研究生的算法或数据结构课程使用。因为书中讨论了算法设计中的工程问题及其数学性质,因此,本书也可以供专业技术人员自学之用。 本书是第2版。在这个版本里,我们对全书进行了更新。所做的改动从新增了若干章,到个别语句的改写。 致使用本书的教师 本书的设计目标是全面、适用于多种用途。它可用于若干课程,从本科生的数据结构课程到研究生的算法课程。由于书中给出的内容比较多,只讲一学期一般讲不完,因此,教师们应该将本书看成是一种“缓存区”或“瑞典式自助餐”,从中挑选出能最好地支持自己希望教授的课程的内容。 教师们会发现,要围绕自己所需的各个章节来组织课程是比较容易的。书中的各章都是相对独立的,因此,你不必担心意想不到的或不必要的各章之间的依赖关系。每一章都是以节为单位,内容由易到难。如果将本书用于本科生的课程,可以选用每一章的前面几节内容;在研究生课程中,则可以完整地讲授每一章。 全书包含920多个练习题和140多个思考题。每一节结束时给出练习题,每一章结束时给出一些
本教程共分为5个部分,第一部分是C语言提高部分,第二部分为C++基础部分,第三部分为C++进阶部分,第四部分为C、C++及数据结构基础部分,第五部分为C_C++与设计模式基础,内容非常详细. 第一部分 C语言提高部分目录 01_初学者的企业用人标准寻找引言 02_socketclient_api模型的抽象_初学者应知的标准_传智扫地僧 03_本套视频总体课程简介 04_就业班课程总体简介_课堂答疑 05_初学者建立信心 06_学员学习标准_排序及问题抛出 07_数组做函数参数退化问题剖析_传智扫地僧 08_数据类型基础提高 09_数据类型引申和思考 10_变量本质剖析和内存四区模型引出_传智扫地僧 11_c的学习重理解到位_对初学者_传智扫地僧 12_直接通过内存标号操作内存空间_课堂答疑 13_中午课程回顾 14_内存四区基本原理_全局区案例理解 15_内存四区_堆栈案例理解 16_课堂答疑_理解指针的关键关键在内存 17_vs20102013上配置#系列快捷方式 18_栈的属性和buf地址增长方向是两个不同的概念 19_函数调用模型_主调函数和被调用函数 20_课堂答疑_函数调用流程入栈出栈过程 21_指针也是一种数据类型_基础 22_指针也是一种数据类型_强化_传智扫地僧 源码及文档 01_课程回顾 02_作业题强化和野指针 03_向null地址copy数据和不断改变指针指向强化 04_有关字面量 05_间接赋值从0级指针到1级指针 06_间接赋值从1级指针到2级指针_技术推演_传智扫地僧 07_间接赋值是指针存在的最大意义 08_间接赋值成立的三个条件和应用场景 09_指针学习思路应用清晰起来 10_指针强化3和指针强化4思想讲解 11_字符串的基本操作 12_数组中括号与指针关系和数组名常量指针分析 13_字符串一级指针内存模型_传智扫地僧 14_字符串copy函数技术推演 15_字符串copy函数强化训练_判断null_引入辅助指针变量_传智扫地僧 16_项目开发模型强化_strstr_while模型_重要 17_作业考试强化 源码及文档 01_上一次课程回顾 02_两头堵模型 03_字符串反转_方法1指针 04_字符串反转_方法2递归逆序(3个点)_传智扫地僧 05_考试题解答和项目开发代码书写手法 06_一级指针易错模型分析_重点 07_C语言中的const知识点总结 08_指针的输入和输出模型 09_课堂答疑_指针所指向内存释放 10_二级指针做输入_第1种内存模型 11_二级指针做输入_第2种内存模型 12_二级指针做输入_第2种内存模型_课堂答疑_多维数组名本质抛砖 13_二级指针做输入_第3种内存模型_传智扫地僧 14_二级指针三种内存模型示意图_传智扫地僧 15_玩转多级指针_传智扫地僧 16_两个辅助指针变量挖字符串测试框架搭建 18_作业 源码及文档 01_课程回顾 02_两个赋值指针变量挖字符训练_第3种内存模型_传智扫地僧 03_多级指针的野指针问题(释放问题)_传智扫地僧 04_学员作业点评_典型错误吸取教训 05_数组类型 06_数组指针类型和定义数组指针变量的3种方法 07_多维数组名本质剖析_传智扫地僧 08_多维数组的【】和多级指针星号转化推演 09_多维数组做函数参数技术推演和退化原因抛出 10_多维数组做函数参数退化总结_ 11_指针数组的应用场景01 12_指针数组自我结束能力(三种表示方法) 13_干活要知道在什么框架之下干活 14_结构体类型和变量定义及基本操作 15_结构体元素做函数参数pk结构指针做函数参数 16_结构体做函数基本操作 17_结构体做函数内存分配指针 18_结构中套一级指针 19_结构体中套二级指针_传智扫地僧 20_作业强化 21_C提高课程_day01-day04_知识体系梳理_传智扫地僧 源码及文档 01_上次课程回顾 02_二级指针三种内存模型综合训练_框架搭建 03_二级指针三种内存模型综合训练_实现 04_二级指针三种内存模型综合训练_典型错误 05_结构体作业点评 06_结构体中的深copy和浅copy 07_结构中的高级话题_偏移量 08_结构中的高级话题_偏移量强化 09_文件操作api基本概念 10_按照字符读写文件 11_按照行方式操作文件 12_按照块的方式操作文件 13_中午课程回顾 14_配置文件读写案例功能介绍 15_配置文件读写案例_接口设计 16_配置文件读写案例_集成框架搭建 17_配置文件读写案例_读配置项实现 18_配置文件读写案例_写和修改接口实现 19_文件加密案例_思路分析 20_文件加密案例_文件搬运实现 21_文件加密案例_文件加密功能集成 22_文件加密案例_文件加密实现 23_作业 24_学员二级指针代码bug调试_传智扫地僧 源码及文档 01_课程回顾 02_解密作业 03_指针用法杂项 04_再谈多级指针做输出_传智扫地僧 05_动态库的基本概念和使用 06_动态库测试环境和调试环境搭建 07_socketclient动态库函数_初始化实现wmv 08_socketclient动态库函数_发送接受释放实现wmv 09_socketclient动态库_第二套api函数_传智扫地僧 10_socketclient动态库_日志功能集成 11_项目中检索内存泄漏使用和基本原理 12_动态库基本知识和环境调试注意 13_动态库内存释放问题 源码及文档 01_上一次课程回顾 02_链表热身_结构体中套元素和指针 03_结构体数据类型的嵌套定义和函数的嵌套调用是两个不同的概念 04_静态链表及局限性 05_链表的分类和链表的辅助指针变量 06_链表api函数搭建 07_链表的创建和打印 08_链表的插入操作和辅助指针变量分析_传智扫地僧 09_链表的删除和销毁 10_链表的逆置_传智扫地僧 11_链表的逆置_课堂答疑 12_课堂答疑pheadnextnext 13_中午课程回顾 14_传统链表和非传统链表 15_链表的技术体系推演 16_通用链表库集成和测试 17_C提高课程_day05-day07_知识体系梳理_传智扫地僧 源码及文档 第二部分 C++基础目录 01_C++基础课程的安排和需要持之以恒的学习态度 02_简单的C++程序helloworld 03_用面向过程和面向对象方法求解圆形面积_类和对象的关系思考_传智扫地僧 04_类中不写成员函数易犯错误模型 05-易犯错误模型-为什么需要成员函数(补充资料)-传智扫地僧 06_课堂答疑类中写成员函数_调用的时才会执行 07_程序设计方法发展历程 08_C语言和C++语言的关系_工作经验分享 09_namespace和iotream 10_实用性加强_register增强_检测增强 11_struct关键字类型增强 12_c++类型类型检查加强 13_新增数据类型bool类型 14_中午课程回顾 15_c++中的三目运算符_传智扫地僧 16_const的基础和const符号表机制探究_传智扫地僧 17_const和#define的对比_传智扫地僧 18_引用的基础知识(定义和函数参数) 19_复杂数据类型引用做函数参数__传智扫地僧 20_引用的本质剖析_传智扫地僧 21_函数返回值是引用(当左值右值)_传智扫地僧 源码及文档 01_上一次课程复习 02_指针的引用_传智扫地僧 03_常引用 04_inline内联函数 05_函数参数相关扩展 06_函数重载 07_函数重载和函数指针在一起 08_中午课程回顾 09_c++学习路线和c++基础课程学习标准_传智扫地僧 10_类的封装和访问控制 11_struct和class关键字区别 12_类的声明和类的实现分开 13_面向过程向面向对象转变案例1 14_面向过程向面向对象转变案例2 15_面向过程向面向对象转变案例3 16_作业 17_C++基础课程day01-day02_知识体系梳理_传智扫地僧 源码及文档 01_上一次课程回顾 02_构造和析构的基础知识 03_构造和析构的用途演示 04_构造函数的调用(无参数和有参构造)_传智扫地僧 05_课堂答疑对象的初始化和对象的赋值是两个不同的概念 06_为什么需要构造和析构函数 07_copy构造函数的调用时机1和2 08_课堂答疑 09_copy构造函数调用时机3_传智扫地僧 10_copy构造函数调用时机4_函数返回值是匿名对象_传智扫地僧 11_copy构造函数调用时机4_函数返回值是匿名对象的去和留的剖析_传智扫地僧 12_构造和析构的重点整理 13_构造和析构总结 14_中午课程复习 15_构造函数的调用规则研究 16_浅拷贝问题抛出 17_浅拷贝问题分析_传智扫地僧 18_浅拷贝问题解决_深拷贝_显示编写拷贝构造函数 19_深拷贝和浅拷贝_默认的等号操作符也是浅拷贝_传智扫地僧 20_构造函数的初始化列表 21_强化训练1_构造和析构调用顺序 22_强化训练2_匿名对象生命周期 23_强化训练3_构造中调用构造(产生匿名对象)_传智扫地僧 24_new和delete的基本语法 25_new和delete的深入分析 26_静态成员变量和静态成员函数 27_C++面向对象模型初探_传智扫地僧 28_this指针 29_作业 源码及文档 01_上一次课程回顾 02_const修饰的是谁_传智扫地僧 03_this的const修饰课堂答疑 04_全局函数pk成员函数(返回元素,引用,星号this) 05_强化训练数组类_类的设计和测试程序 06_强化训练数组类_类的实现和测试 07_友元函数 08_友元类 09_运算符重载入门基础推演_传智扫地僧 10_运算符重载语法理论知识介绍 11_中午课程回顾 12_成员函数和友元函数完成二元运算符重载 13_成员函数和友元函数完成一元运算符重载(前置) 14_成员函数和友元函数完成一元运算符重载(后置) 15_友元函数实现左移右移操作符重载(函数返回值当左值需返回引用)_传智扫地僧 16_友元函数实现操作符重载知识总结 17_重载等号操作符_传智扫地僧 18_数组类小案例_操作符重载需求 19_数组类小案例_重载[]_传智扫地僧 20_数组类小案例_重载等号_传智扫地僧 21_数组类小案例_重载==和!= 22_作业 源码及文档 01_上一次课程的回顾 02_()运算符重载 03_逻辑与和逻辑或运算符重载说明 04_课堂答疑_逻辑与和逻辑或运算符重载 05_MyString类案例_构造和析构函数 06_MyString类案例_重载等号和数组操作符_传智扫地僧 07_MyString类案例_重载左移操作符 08_MyString类案例_重载双等号和不等号 操作符 09_MyString类案例_重载大于和小于操作符 10_MyString类案例_其他技巧 11_MyString类案例_重载右移操作符 12_C++基础课程day03-day05_知识体系梳理 13_作业和考试 源码及文档 01_继承的概念 02_子类可以访问父类的属性和方法 03_派生类的访问控制 04_派生类的访问控制综合训练_传智扫地僧 05_类型兼容性原则_传智扫地僧 06_继承中的构造和析构 07_继承和组合混搭下的构造和析构_传智扫地僧 08_继承中的同名成员变量和同名成员函数 09_继承的static关键字 10_多继承的基本语法 11_二义性和虚继承解决方案 12_中午课程回顾 13_多继承原理抛砖_传智扫地僧 14_多态思想引言 15_类型兼容性原则遇上还是函数重写_面向对象新需求_传智扫地僧 16_多态案例_多态的意义_多态成立的三个条件_传智扫地僧 17_多态案例丰富多彩和多态的理论知识 18_虚析构函数 19_重载重写重定义_问题抛出 20_重载重写重定义_概念分析_传智扫地僧 21_重载重写重定义_课堂答疑_传智扫地僧 文档和源码 01_上一次课程回顾 02_多态原理探究_传智扫地僧 03_证明vptr指针的存在 04_子类的vptr指针是分步初始化的_传智扫地僧 05_面试题强化_多态相关 06_父类指针的步长和子类指针的步长不一样 07_课堂答疑什么时候子类的步长和父类的步长一样 08_抽象类基本语法 09_抽象类在多继承中的应用 10_面向抽象类编程_计算程序员工资 11_中午课程回顾 12_信息系统框架集成第三方产品案例_背景和需求 13_信息系统框架集成第三方产品案例_编码实现分析_传智扫地僧 14_信息系统框架集成第三方产品案例_socket抽象类和框架搭建__传智扫地僧 15_信息系统框架集成第三方产品案例_框架实现第一个socket类厂商实现 16_信息系统框架集成第三方产品案例_第二个socket类厂商实现 17_信息系统框架集成第三方产品案例_加解密抽象类和加解密厂商类实现 18_信息系统框架集成第三方产品案例_集成测试加密厂商和socket厂商入围 19_信息系统框架集成第三方产品案例_集成框架变成类方式_传智扫地僧 20_信息系统框架集成第三方产品案例_几个重要的面向对象思想_传智扫地僧 21_作业 文档和源码 01_上一次课程回顾 02_数组指针语法梳理 03_函数指针语法梳理_传智扫地僧 04_函数指针做函数参数思想剖析_传智扫地僧 05_函数指针的正向调用案例 06_C动态库升级成框架案例_项目需求和基本思想_传智扫地僧 07_C动态库升级成框架案例_开发环境搭建 08_C动态库升级成框架案例_方法1动态库中直接添加回调函数_传智扫地僧 09_C动态库升级成框架案例_方法2把回调函数缓存到动态库_编写 10_C动态库升级成框架案例_方法2把回调函数混存到动态库_测试 11_C++基础课程day06-day08_知识体系梳理 文档和源码 第三部分 C++进阶部分目录 01_上一次课程知识点_梳理 02_函数模板为什么和函数模板语法基础 03_课堂答疑_遇到莫名其妙的问题_重新编译 04_函数模板当函数参数 05_普通函数和模板函数区别_传智扫地僧 06_函数模板和函数重载在一起(调用规则研究)_传智扫地僧 07_函数模板机制探究上 08_函数模板机制探究下_传智扫地僧 09_课堂答疑_二次编译 10_类模板语法_数据类型和算法的分离_抛砖 11_单个类模板基本语法 12_类模板_派生_普通类语法 13_类模板_派生_类模板语法 14_中午知识点梳理 15_复数类_所有函数都写在类的内部 16_复数类_所有函数都写在类的外部_上 17_复数类_所有函数都写在类的外部_下 18_复数类_所有函数都写在类的外部(h和cpp分开) 19_类模板中的static关键字 20_案例_数组模板类_需求和类的初步设计 21_案例_数组模板类_测试框架搭建 22_案例_数组模板类_类的实现和测试_传智扫地僧 23_案例_数组模板类_数组元素存储的是类对象思想抛砖_传智扫地僧 24_作业 代码 文档 01_泛型编程_知识点梳理 02_模板数组类_作业讲解和思想强化(数据类型和算法的分离)_传智扫地僧 03_类型转换_static_cast和reinterpret_cast 04_类型转换_dynamic_cast和reinterpret_cast_传智扫地僧 05_类型转换_const_cast 06_异常的基本语法 07_异常机制基本思想梳理 08_栈解旋unwinding 09_异常接口声明 10_异常类型_异常变量的生命周期上 11_异常类型_异常变量的生命周期下_传智扫地僧 12_中午知识点梳理 13_异常的层次结构_传智扫地僧 14_标准异常库 15_流类库结构 16_标准IO_输入api_上 17_标准IO_输入api_下 18_标准IO输出_api和格式控制 19_文件的读写 代码 文档 01_stl总体课程安排 02_stl容器算法迭代器三大概念入门 03_stl理论知识_基本概念串讲 04_stl的string的典型操作1_初始化_遍历_连接_和字符指针转化_查找替换传智扫地僧 05_stl的string的典型操作2_删除和插入 06_stl的string的常用算法 07_vector基本操作_对象创建_头部尾部操作元素_数组方式遍历vector 08_vector的迭代器遍历和迭代器的种类_传智扫地僧 09_vector基本操作_删除和插入_传智扫地僧 10_中午知识点回顾 11_deque容器基本操作 12_stack栈模型 13_queue模型 14_list容器模型基本操作 15_优先级队列priority_queue基本操作 16_set容器_插入_遍历_基本数据类型比较 17_set容器_自定义数据类型排序(仿函数应用)_insert判断返回值(pair的使用)_传智扫地僧_ 18_set容器_find查找_equal_range(pair的使用)_传智扫地僧_ 19_multiset容器基本操作_ 文档 源码 01_上一次课程知识点回顾 02_map容器基本操作_插入和插入结果判断_传智扫地僧 03_map容器基本操作_查找和查找的异常处理 04_multimap容器案例_按照部门_增删改查员工信息 05_容器的值拷贝语意 06_各个容器特点比较 07_stl算法设计理念_函数对象和函数对象当参数和返回值_传智扫地僧 08_stl算法设计理念_一元函数对象和一元谓词 09_中午课程知识点回顾 10_stl算法设计理念_二元函数对象和二元谓词 11_stl算法设计理念_二元谓词在set集合的应用 12_stl算法设计理念_预定义函数对象和函数适配器1_传智扫地僧 13_stl算法设计理念_预定义函数对象和函数适配器2_案例_传智扫地僧 14_stl容器算法迭代器的设计理念_重要理论思想总结_传智扫地僧 15_stl的算法概念和分类 16_stl算法_foreach和transform基本使用 17_stl算法_foreach和transform算法比较_transform算法源码追踪_传智扫地僧 文档 源码 01_上一次课程复习 02_stl常用算法_查找相关 03_stl常用算法_排序相关 04_stl常用算法_拷贝和替换相关 05_stl常用算法_算法和生成 06_stl常用算法_集合运算 07_STL案例_演讲比赛_比赛介绍和需求分析 08_STL案例_演讲比赛_搭建案例框架_传智扫地僧 09_STL案例_演讲比赛_实现思路分析_传智扫地僧 10_STL案例_演讲比赛_业务函数实现_产生选手和选手抽签 11_STL案例_演讲比赛_业务函数实现_选手比赛_传智扫地僧 12_STL案例_演讲比赛_业务函数实现_比赛晋级结果打印 13_STL课程_知识体系梳理_传智扫地僧 文档 源码 第四部分 01_数据结构课程_学习思路_学习基础 02_数据结构概念_基本概念 03_数据结构概念_逻辑关系_物理结构 04_算法基本概念和大O表示 05_算法的时间复杂度 06_算法的空间复杂度_空间换时间案例 07_课堂答疑_学员思路 08_线性表的理论知识梳理_重点在链表算法和具体数据类型的分离 09_线性表顺序存储设计和实现_环境搭建 10_线性表顺序存储设计和实现_api函数实现1 11_线性表顺序存储设计和实现_api函数实现2_插入算法 12_线性表顺序存储设计和实现_api函数实现3_get和delete 13_线性表顺序存储设计和实现_总结 14_线性表链式存储_设计与实现_框架搭建和链表技术领域推演_传智扫地僧 15_线性表链式存储_设计与实现_api实现_传智扫地僧 16_线性表链式存储_设计与实现_api实现下_传智扫地僧 17_线性表链式存储_总结 18_c++模板链表_类设计和测试框架搭建 19_c++模板链表_类实现 代码 文档 01_数据结构day01_知识点梳理 02_c++链表模板类_思想加强 03_循环链表api熟悉 04_循环链表应用_约瑟夫问题求解 05_循环链表_插入算法分析_传智扫地僧 06_循环链表_删除算法分析 07_循环链表_游标课堂答疑 08_循环链表_api串讲 09_循环链表_api熟悉 10_栈的顺序存储_设计与实现_测试框架搭建 11_中午课程回顾 12_栈模型和链表模型_顺序存储_思想分析_传智扫地僧 13_栈的顺序存储_设计与实现_api实现和调试 14_栈的顺序存储_设计与实现_课堂答疑 15_栈链式存储_设计与实现_测试框架搭建 16_栈链式存储_设计与实现_栈结点转换成链表结点_思想分析_传智扫地僧 17_栈链式存储_设计与实现_api实现_传智扫地僧 18_栈链式存储_设计与实现_内存管理 19_栈的应用案例_就近匹配 20_栈的应用案例_中缀转后缀 21_栈的应用案例_基于后缀表达式的计算_传智扫地僧 22_栈的应用案例_程序讲解 23_树模型抛砖 代码 文档 01_上一次课程_知识点回顾 02_队列顺序存储_设计与实现_测试框架 03_队列顺序存储_设计与实现_api函数的实现 04_队列链式存储_设计与实现_测试框架 05_队列链式存储_设计与实现_api函数实现 06_树的概念_定义_表示法_二叉树转换_树的存储 07_二叉树的概念_定义和性质 08_二叉树的概念_表示法_二叉树遍历 09_中午课程回顾 10_二叉树编程_遍历本质剖析和递归方式遍历_传智扫地僧 11_二叉树编程案例1_求叶子结点的数目 12_二叉树编程案例2和3_求树高度_拷贝二叉树 13_二叉树编程案例_课堂答疑 14_树非递归中序遍历_思想分析 15_树非递归中序遍历_遍历过程演示 16_树非递归中序遍历_实现(stl方式)_传智扫地僧 17_stl栈模型组合容器类对象_思想抛砖 18_创建树思想抛砖 代码 文档 01_上一次课程回顾 02_创建树_先序和中序确定树 03_学习数据结构_常用工具介绍 04_创建树_#号法 05_创建树_#号法编程实践 06_创建树_#号法课堂答疑 07_线索化_概念_过程分析 08_线索化_两个赋值指针变量线索化思想 09_线索化_线索化初始化流程 10_线索化_遍历思想 11_线索化_遍历树时,把结点插入链表中 12_中午课程总结和线索化逆序访问 13_霍夫曼树概念 14_排序_概念 15_排序_选择法 16_排序_插入法 17_排序_冒泡 18_排序_希尔排序 19_排序_希尔排序_分组很重要 20_排序_快速排序 21_排序_归并 22_数据结构课程_知识体系梳理 代码 文档 01_上一次课程知识点回顾 02_递归需要需要掌握的点补充 03_链表类_链式存储_测试 04_链表类_链式存储_api实现 05_链表类_链式存储_课堂答疑 06_栈类_链式存储_api实现 07_队列类_链式存储设计与实现_api 08_链表类_顺序存储_类设计和测试框架 09_链表类_顺序存储_类api实现 10_栈类_顺序存储_实现 11_队列类_顺序存储设计与实现 c++基础串讲复习1 c++基础串讲复习2 c++基础串讲复习3 c++基础串讲复习4 c++基础串讲复习5 代码 数据结构书籍和工具收集 文档 第四部分 C和C++与数据结构基础 01_数据结构课程_学习思路_学习基础 02_数据结构概念_基本概念 03_数据结构概念_逻辑关系_物理结构 04_算法基本概念和大O表示 05_算法的时间复杂度 06_算法的空间复杂度_空间换时间案例 07_课堂答疑_学员思路 08_线性表的理论知识梳理_重点在链表算法和具体数据类型的分离 09_线性表顺序存储设计和实现_环境搭建 10_线性表顺序存储设计和实现_api函数实现1 11_线性表顺序存储设计和实现_api函数实现2_插入算法 12_线性表顺序存储设计和实现_api函数实现3_get和delete 13_线性表顺序存储设计和实现_总结 14_线性表链式存储_设计与实现_框架搭建和链表技术领域推演_传智扫地僧 15_线性表链式存储_设计与实现_api实现_传智扫地僧 16_线性表链式存储_设计与实现_api实现下_传智扫地僧 17_线性表链式存储_总结 18_c++模板链表_类设计和测试框架搭建 19_c++模板链表_类实现 代码 文档 01_数据结构day01_知识点梳理 02_c++链表模板类_思想加强 03_循环链表api熟悉 04_循环链表应用_约瑟夫问题求解 05_循环链表_插入算法分析_传智扫地僧 06_循环链表_删除算法分析 07_循环链表_游标课堂答疑 08_循环链表_api串讲 09_循环链表_api熟悉 10_栈的顺序存储_设计与实现_测试框架搭建 11_中午课程回顾 12_栈模型和链表模型_顺序存储_思想分析_传智扫地僧 13_栈的顺序存储_设计与实现_api实现和调试 14_栈的顺序存储_设计与实现_课堂答疑 15_栈链式存储_设计与实现_测试框架搭建 16_栈链式存储_设计与实现_栈结点转换成链表结点_思想分析_传智扫地僧 17_栈链式存储_设计与实现_api实现_传智扫地僧 18_栈链式存储_设计与实现_内存管理 19_栈的应用案例_就近匹配 20_栈的应用案例_中缀转后缀 21_栈的应用案例_基于后缀表达式的计算_传智扫地僧 22_栈的应用案例_程序讲解 23_树模型抛砖 代码 文档 01_上一次课程_知识点回顾 02_队列顺序存储_设计与实现_测试框架 03_队列顺序存储_设计与实现_api函数的实现 04_队列链式存储_设计与实现_测试框架 05_队列链式存储_设计与实现_api函数实现 06_树的概念_定义_表示法_二叉树转换_树的存储 07_二叉树的概念_定义和性质 08_二叉树的概念_表示法_二叉树遍历 09_中午课程回顾 10_二叉树编程_遍历本质剖析和递归方式遍历_传智扫地僧 11_二叉树编程案例1_求叶子结点的数目 12_二叉树编程案例2和3_求树高度_拷贝二叉树 13_二叉树编程案例_课堂答疑 14_树非递归中序遍历_思想分析 15_树非递归中序遍历_遍历过程演示 16_树非递归中序遍历_实现(stl方式)_传智扫地僧 17_stl栈模型组合容器类对象_思想抛砖 18_创建树思想抛砖 代码 文档 01_上一次课程回顾 02_创建树_先序和中序确定树 03_学习数据结构_常用工具介绍 04_创建树_#号法 05_创建树_#号法编程实践 06_创建树_#号法课堂答疑 07_线索化_概念_过程分析 08_线索化_两个赋值指针变量线索化思想 09_线索化_线索化初始化流程 10_线索化_遍历思想 11_线索化_遍历树时,把结点插入链表中 12_中午课程总结和线索化逆序访问 13_霍夫曼树概念 14_排序_概念 15_排序_选择法 16_排序_插入法 17_排序_冒泡 18_排序_希尔排序 19_排序_希尔排序_分组很重要 20_排序_快速排序 21_排序_归并 22_数据结构课程_知识体系梳理 代码 文档 01_上一次课程知识点回顾 02_递归需要需要掌握的点补充 03_链表类_链式存储_测试 04_链表类_链式存储_api实现 05_链表类_链式存储_课堂答疑 06_栈类_链式存储_api实现 07_队列类_链式存储设计与实现_api 08_链表类_顺序存储_类设计和测试框架 09_链表类_顺序存储_类api实现 10_栈类_顺序存储_实现 11_队列类_顺序存储设计与实现 c++基础串讲复习1 c++基础串讲复习2 c++基础串讲复习3 c++基础串讲复习4 c++基础串讲复习5 代码 数据结构书籍和工具收集 文档 第5部分 C_C++与设计模式基础 01_设计模式课程安排和要求 02_UML的建模和基本概念 03_UML图_用例图_基础 04_UML图_用例图_人事管理系统案例_传智扫地僧 05_UML图_类图_基础和类关系依赖 06_UML图_类图_关联_聚合_组合_传智扫地僧 07_UML图_时序图_传智扫地僧 08_UML图_活动图_传智扫地僧 09_UML图_状态图_进程状态案例 10_UML图_协作图_包图_部署图 11_设计模式_概念和设计原则 12_中午课程回顾 13_设计模式基本原则_依赖倒转 14_设计模式基本_依赖倒置和迪米特法则 15_单例模式_懒汉式和饿汉式 16_懒汉式遇上多线程问题 17_懒汉式多线程同步优化 18_简单工厂模式 19_工厂模式_传智扫地僧 文档 源码 01_上一次课程知识点梳理 02_抽象工厂模式 03_抽象工厂课堂答疑 04_建造者模式_理论模型 05_建造者模式_实现 06_建造者模式_问题抛出 07_原型模式 08_建造模式总结 09_课堂交流从建造者模式说开去 10_厚积薄发话题 11_代理模式_传智扫地僧 12_装饰模式_传智扫地僧 13_中午课程回顾 14_适配器模式 15_桥接模式_理论模型 16_桥接模式_实现_传智扫地僧 17_组合模式_上 18_组合模式_下 19_外观模式 20_享元模式 文档 源码 01_设计模式知识体系梳理01 02_模板模式_传智扫地僧 03_命令模式_技术推演上 04_命令模式_技术推演下_传智扫地僧 05_责任链模式 06_策略模式_及题外话 07_策略模式_实现 08_中介者模式_问题抛出上 09_中介者模式_实现下 10_中午知识点回顾 11_观察者模式_传智扫地僧 12_备忘录模式 13_访问者模式_概念基本原理_案例了解 14_访问者模式_实现_传智扫地僧 15_状态模式_原理及代码串讲 16_解释器模式 17_迭代器模式_思想_传智扫地僧 18_迭代器模式_实现_传智扫地僧 19_设计模式知识体系梳理02 文档 源码
内容简介 本书全面介绍了应用C语言进行开发的各种技术和技巧,全书共分12章,内容包括基础知识、指针、数据结构、算法、数学应用、文件操作、库函数应用、图形图像、系统调用、加解密与安全性、游戏、综合应用等。全书共提供300个实例,每个实例都突出了其实用性。   本书既可作为C程序的初学者学习用书,也可作为程序开发人员、相关培训机构老师和学生的参考用书。 第1章 基础知识 1 1.1 进制转换 2 实例001 十进制转换为十六进制 2 实例002 十进制转换为二进制 3 实例003 n进制转换为十进制 4 实例004 以IP地址形式输出 5 1.2 条件判断 6 实例005 3个数由小到大排序 6 实例006 a2+b2 8 实例007 整倍数 9 实例008 判断闰年 10 实例009 阶梯问题 11 实例010 评定成绩 12 实例011 整数加减法练习 13 实例012 模拟ATM机界面程序 14 1.3 多重循环打印图形 17 实例013 用#打印三角形 17 实例014 用*打印图形 18 实例015 绘制余弦曲线 20 实例016 打印乘法口诀表 21 实例017 打印杨辉三角 22 1.4 循环的数学应用 23 实例018 序列求和 23 实例019 简单的级数运算 24 实例020 用while语句求n! 25 实例021 特殊等式 26 实例022 求一个正整数的所有因子 27 实例023 一元钱兑换方案 28 实例024 对调数问题 29 实例025 数平方和运算的问题 30 1.5 数组 31 实例026 逆序存放数据 32 实例027 相邻元素之和 33 实例028 选票统计 34 实例029 模拟比赛打分 35 实例030 对调最大与最小数位置 36 实例031 二维数组行列互换 37 实例032 使用数组统计学生成绩 39 实例033 打印5阶幻方 40 1.6 字符和字符串操作 41 实例034 统计各种字符个数 41 实例035 字符串倒置 43 实例036 字符串替换 44 实例037 回文字符串 45 实例038 不用strcat连接两个字符串 46 实例039 删除字符串中连续字符 47 实例040 字符升序排列 49 实例041 在指定的位置后插入字符串 50 1.7 函数 51 实例042 求字符串中字符的个数 51 实例043 递归解决年龄问题 53 实例044 求学生的平均身高 54 实例045 分数计算器程序 55 1.8 趣味计算 57 实例046 加油站加油 57 实例047 小球下落问题 58 实例048 灯塔数量 59 实例049 买苹果问题 60 实例050 猴子吃桃 61 实例051 老师分糖果 62 实例052 新同学的年龄 63 实例053 百钱百鸡问题 64 实例054 彩球问题 65 实例055 求总数问题 66 1.9 宏定义与位运算 67 实例056 用宏定义实现值互换 67 实例057 普通的位运算 69 实例058 循环移位 70 第2章 指针 73 2.1 指针变量 74 实例059 使用指针实现数据交换 74 实例060 使用指针实现整数排序 75 实例061 指向结构体变量的指针 76 2.2 指针与数组 77 实例062 使用指针输出数组元素 77 实例063 用指针实现逆序存放数组元素值 79 实例064 输出二维数组有关值 80 实例065 输出二维数组任一行任一列值 81 实例066 使用指针查找数列中最大值、最小值 83 实例067 用指针数组构造字符串数组 84 实例068 将若干字符串按照字母顺序输出 85 2.3 指针与函数 86 实例069 用指向函数的指针比较大小 86 实例070 使用返回指针的函数查找最大值 88 实例071 使用指针函数求学生成绩 89 实例072 寻找指定元素的指针 90 实例073 寻找相同元素的指针 91 2.4 字符串与指针 92 实例074 使用指针实现字符串复制 92 实例075 字符串的连接 94 实例076 字符串插入 95 实例077 字符串的匹配 96 2.5 指向指针的指针 97 实例078 使用指针的指针输出字符串 98 实例079 实现输入月份号输出该月份英文名 99 实例080 使用指向指针的指针对字符串排序 100 第3章 数据结构 103 3.1 结构体 104 实例081 结构体简单应用 104 实例082 找最高分 106 实例083 平均成绩 108 实例084 比较计数 109 实例085 信息查询 110 实例086 计算开机时间 111 3.2 链表 112 实例087 创建单向链表 112 实例088 创建双向链表 114 实例089 创建循环链表 117 实例090 双链表逆置 118 实例091 双链表逆序输出 120 实例092 约瑟夫环 122 实例093 创建顺序表并插入元素 123 实例094 向链表中插入结点 125 实例095 从链表中删除结点 126 实例096 合并两个链表 129 实例097 单链表就地逆置 130 实例098 头插入法建立单链表 132 3.3 栈和队列 133 实例099 应用栈实现进制转换 133 实例100 用栈设置密码 135 实例101 栈实现行编辑程序 138 实例102 括号匹配检测 141 实例103 用栈及递归计算多项式 143 实例104 链队列 144 实例105 循环缓冲区问题 147 3.4 串与广义表 149 实例106 串的模式匹配 149 实例107 简单的文本编辑器 151 实例108 广义表的存储 154 实例109 广义表的复制 156 3.5 二叉树 160 实例110 二叉树的递归创建 160 实例111 二叉树的遍历 162 实例112 线索二叉树的创建 164 实例113 二叉排序树 166 实例114 哈夫曼编码 167 3.6 图及图的应用 169 实例115 图的邻接表存储 170 实例116 图的深度优先搜索 172 实例117 图的广度优先搜索 175 实例118 Prim算法求最小生成树 177 实例119 迪杰斯特拉算法 180 第4章 算法 183 4.1 简单问题算法 184 实例120 任意次方后的最后三位 184 实例121 计算π的近似值 184 实例122 小于500的所有勾股数 185 实例123 能否组成三角形 186 实例124 偶数拆分 187 实例125 乘积大于和的数 188 实例126 求各位上和为5的数 189 实例127 计算某日是该年第几天 190 4.2 排序算法 191 实例128 直接插入排序 192 实例129 希尔排序 193 实例130 起泡排序 194 实例131 快速排序 195 实例132 选择排序 197 实例133 归并排序 198 4.3 查找算法 199 实例134 顺序查找 199 实例135 二分查找 201 实例136 分块查找 202 实例137 哈希查找 203 4.4 定理与猜想 206 实例138 斐波那契数列 206 实例139 角谷猜想 207 实例140 哥德巴赫猜想 208 实例141 四方定理 209 实例142 尼科彻斯定理 210 4.5 逻辑推理与判断 211 实例143 魔术师的秘密 211 实例144 婚礼上的谎言 212 实例145 谁讲了真话 213 实例146 黑纸与白纸 215 实例147 判断坏球 216 第5章 数学应用 221 5.1 素数问题 222 实例148 求100~200的素数 222 实例149 可逆素数 223 实例150 回文素数 224 5.2 整数趣题 225 实例151 阿姆斯特朗数 225 实例152 特殊的完全平方数 226 实例153 求1000以内的完全数 227 实例154 三重回文数 228 实例155 亲密数 229 实例156 自守数 230 实例157 满足abcd=(ab+cd)2的数 231 实例158 神奇的数字6174 232 实例159 一数三平方 233 5.3 数学问题求解 234 实例160 求等差数列 234 实例161 求整数的绝对值 235 实例162 正弦、余弦、正切值 236 实例163 自然对数的底e的计算 237 实例164 最大公约及最小公倍数 238 实例165 求解二元一次不定方程 239 实例166 二分法求解方程 241 实例167 牛顿迭代法解方程的根 242 5.4 矩阵 243 实例168 打印特殊方阵 243 实例169 求3×3矩阵对角元素之和 244 实例170 矩阵的加法运算 245 实例171 矩阵的乘法运算 246 实例172 打印n阶螺旋方阵 247 5.5 生活中的数学 249 实例173 求车运行速度 249 实例174 卖西瓜 250 实例175 打渔晒网问题 251 实例176 水池注水问题 252 实例177 捕鱼和分鱼问题 253 实例178 递归解分鱼问题 254 实例179 巧分苹果 255 第6章 文件操作 257 6.1 文件读写操作 258 实例180 读取磁盘文件 258 实例181 将数据写入磁盘文件 259 实例182 格式化读写文件 260 实例183 成块读写操作 262 实例184 随机读写文件 263 实例185 以行为单位读写文件 265 6.2 文件内容操作 266 实例186 复制文件内容到另一文件 267 实例187 错误处理 268 实例188 合并两个文件信息 270 实例189 统计文件内容 271 6.3 文件的创建、查找及删除 272 实例190 创建文件 273 实例191 创建临时文件 274 实例192 查找文件 275 实例193 重命名文件 275 实例194 删除文件 276 实例195 删除文件中的记录 277 6.4 文件相关操作 279 实例196 关闭打开的所有文件 279 实例197 同时显示两个文件的内容 281 实例198 显示目录内同类型文件 282 实例199 文件分割 284 实例200 文件加密 286 第7章 库函数调用 289 7.1 时间转换和操作函数 290 实例201 固定格式输出当前时间 290 实例202 当前时间转换 291 实例203 显示程序运行时间 292 实例204 获取DOS系统时间 293 实例205 设置DOS系统日期 293 实例206 设置DOS系统时间 294 实例207 读取并设置bios的时钟 295 7.2 数学函数 296 实例208 求相对的最小整数 296 实例209 求直角三角形斜边 297 实例210 小数分离 298 实例211 求任意数n次幂 299 7.3 字符串、字符函数 300 实例212 函数实现字符匹配 300 实例213 任意大写字母转小写 301 实例214 字符串复制到指定空间 302 实例215 查找位置信息 303 7.4 其他函数 304 实例216 复制当前目录 304 实例217 产生惟一文件 305 实例218 不同亮度显示 306 实例219 字母检测 307 实例220 建立目录 308 实例221 删除目录 309 实例222 数字检测 310 实例223 快速分类 311 实例224 访问系统temp中的文件 313 实例225 设置组合键 314 第8章 图形图像 317 8.1 基本图形 318 实例226 绘制直线 318 实例227 绘制表格 319 实例228 绘制矩形 321 实例229 绘制椭圆 322 实例230 绘制圆弧线 323 实例231 绘制扇区 324 实例232 绘制空心圆 325 实例233 画一个箭头 326 实例234 绘制正弦曲线 327 实例235 绘制彩带 329 8.2 色彩填充及使用 330 实例236 黄色网格填充的椭圆 330 实例237 红色间隔点填充多变形 332 实例238 绘制五角星 333 实例239 颜色变换 334 实例240 彩色扇形 335 实例241 输出不同字体 336 8.3 屏幕操作 338 实例242 相同图案的输出 338 实例243 设置文本及背景颜色 340 实例244 简单的键盘画图程序 342 实例245 鼠标绘图 344 实例246 艺术清屏 346 8.4 图形动画 349 实例247 图形时钟 349 实例248 火箭发射 351 实例249 运动的问候语 352 实例250 正方形下落 353 实例251 跳动的小球 354 实例252 旋转的五角星 356 实例253 变化的同心圆 358 实例254 小球碰撞 359 8.5 图形综合实例 361 实例255 圆形精美图案 361 实例256 直线精美图案 362 实例257 心形图案 363 实例258 钻石图案 365 实例259 雪花 366 实例260 直线、正方形综合 368 第9章 系统相关 371 9.1 时间和日期 372 实例261 获取当前日期与时间 372 实例262 获取当地日期与时间 373 实例263 格林尼治平时 373 实例264 设置系统日期 374 9.2 BIOS操作 376 实例265 获取BIOS常规内存容量 376 实例266 读/写BIOS计时器 377 实例267 获取CMOS密码 377 9.3 硬件、软件中断 379 实例268 获取Ctrl+Break键消息 379 实例269 鼠标中断 380 实例270 设置文本显示模式 382 9.4 磁盘相关 385 实例271 获取当前磁盘空间信息 385 实例272 备份/恢复硬盘分区表 387 实例273 硬盘逻辑锁 390 9.5 信息获取 392 实例274 显卡类型测试 392 实例275 获取系统配置信息 393 实例276 获取环境变量 395 实例277 获取寄存器信息 396 9.6 其他 397 实例278 恢复内存文本 397 实例279 绘制立体窗口 399 实例280 控制扬声器声音 401 实例281 获取Caps Lock键状态 402 实例282 删除多级目录 403 第10章 加解密与安全性 407 10.1 程序保护 408 实例283 自毁程序 408 实例284 明码序列号保护 409 实例285 非明码序列号保护 410 10.2 加密解密 412 实例286 MD5加密 412 实例287 RSA加密 419 实例288 DES加密 420 实例289 RC4加密 424 实例290 SHA1加密 427 实例291 恺撒加密 432 第11章 游戏 435 实例292 猜数字游戏 436 实例293 24点游戏 438 实例294 贪吃蛇游戏 440 实例295 五子棋游戏 444 实例296 弹力球游戏 450 第12章 综合应用 457 实例297 学生管理系统 458 实例298 火车订票系统 465 实例299 通信录管理系统 472 实例300 图书管理系统 476 技术要点对应实例位置 487
CruiseYoung提供的带有详细书签的电子书籍目录 http://blog.csdn.net/fksec/article/details/7888251 该资料是《Oracle SQL高级编程》的源代码 对应的书籍资料见: Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐) 基本信息 原书名: Pro Oracle SQL 原出版社: Apress 作者: (美)Karen Morton    Kerry Osborne    Robyn Sands    Riyaj Shamsudeen    Jared Still    译者: 朱浩波 丛书名: 图灵程序设计丛书 出版社:人民邮电出版社 ISBN:9787115266149 上架时间:2011-11-9 出版日期:2011 年11月 开本:16开 页码:502 版次:1-1 主编推荐     资深Oracle专家力作,OakTable团队推荐     全面、独到、翔实,题材丰富     Oracle开发人员和DBA必备 内容简介     Oracle 数据库中的SQL是当今市场上功能最强大的SQL实现之一,而本书全面展示了这一工具的威力。如何才能让更多人有效地学习和掌握SQL呢?Karen Morton及其团队在本书中提供了专业的方案:先掌握语言特性,再学习Oracle为提升语言效率而加入的支持特性,进而将两者综合考虑并在工作中加以应用。作者通过总结各自多年的软件开发和教学培训经验,与大家分享了掌握Oracle SQL所独有的丰富功能的技巧所在,内容涵盖SQL执行、联结、集合、分析函数、子句、事务处理等多个方面。读者可以学习到以下几个方面的技巧:     掌握Oracle数据库中独有的SQL强大特征;     读取并理解SQL执行计划;     快速分析并改进表现欠佳的SQL;     通过提示及配置文件等来控制执行计划;     在程序中优化查询而无需改动代码。     作为Oracle SQL经典著作之一,本书为SQL开发人员指明了前行的方向,赋予了他们不断开拓的动力。 作者简介     KAREN MORTON 研究人员、教育家及顾问,Fidelity信息服务公司的资深数据库管理员和性能调优专家。她从20世纪90年代初就开始使用Oracle,从事 Oracle的教学工作也已经超过10年的时间。她是Oracle ACE,也是OakTable(Oracle社区中著名的“Oracle科学家”的非正式组织)的成员,经常在技术会议上演讲。她的著作还包括 Expert Oracle Practices和Beginning Oracle SQL,博客主页是karenmorton.blogspot.com。     KERRY OSBORNE  专注于Oracle咨询的Enkitec公司的创始人之一。从1982年开始使用Oracle(第2版)。他当过开发人员,也做过DBA,目前是 Oracle ACE总监和OakTable成员。最近几年,他专注于研究Oracle内部原理以及解决性能问题。他的博客主页是 kerryosborne.oracle-guy.com。     ROBYN SANDS 思科公司的软件工程师,为思科的客户设计开发嵌入式Oracle数据库产品。从1996年开始使用Oracle,在应用开发、大型系统实现以及性能评估方面具有丰富的经验。她是OakTable的成员,同时是Expert Oracle Practices (2010年 Apress出版)一书的合著者。     RIYAJ SHAMSUDEEN 专注于性能/数据恢复/电子商务的咨询公司OraInternals的首席数据库管理员和董事长。有近20年使用Oracle技术产品以及Oracle数据库管理员/Oracle数据库应用管理员的经验,是真正应用集群、性能调优以及数据库内部属性方面的专家。同时是一位演讲家及Oracle ACE。     JARED STILL 从1994年就开始使用Oracle。他认为对于SQL的学习是永无止境的,相信每一个查询Oracle数据库的人都需要精通SQL语言,才能写出高效的查询。他参与本书的编写就是为了帮助别人实现这一目标。 目录 封面 -11 封底 -10 扉页 -9 版权 -8 版权声明 -7 致谢 -6 目录 -5 第1章 SQL核心 1 1.1 SQL语言 1 1.2 数据库的接口 2 1.3 SQL*Plus 回顾 3 1.3.1 连接到数据库 3 1.3.2 配置SQL*Plus环境 4 1.3.3 执行命令 6 1.4 5 个核心的SQL语句 8 1.5 SELECT语句 8 1.5.1 FROM子句 9 1.5.2 WHERE子句 11 1.5.3 GROUP BY子句 11 1.5.4 HAVING子句 12 1.5.5 SELECT列表 12 1.5.6 ORDERBY子句 13 1.6 INSERT语句 14 1.6.1 单表插入 14 1.6.2 多表插入 15 1.7 UPDATE语句 17 1.8 DELETE语句 20 1.9 MERGE语句 22 1.10 小结 24 第2章 SQL执行 25 2.1 Oracle架构基础 25 2.2 SGA-共享池 27 2.3 库高速缓存 28 2.4 完全相同的语句 29 2.5 SGA-缓冲区缓存 32 2.6 查询转换 35 2.7 视图合并 36 2.8 子查询解嵌套 39 2.9 谓语前推 42 2.10 使用物化视图进行查询重写 44 2.11 确定执行计划 46 2.12 执行计划并取得数据行 50 2.13 SQL执行——总览 52 2.14 小结 53 第3章 访问和联结方法 55 3.1 全扫描访问方法 55 3.1.1 如何选择全扫描操作 56 3.1.2 全扫描与舍弃 59 3.1.3 全扫描与多块读取 60 3.1.4 全扫描与高水位线 60 3.2 索引扫描访问方法 65 3.2.1 索引结构 66 3.2.2 索引扫描类型 68 3.2.3 索引唯一扫描 71 3.2.4 索引范围扫描 72 3.2.5 索引全扫描 74 3.2.6 索引跳跃扫描 77 3.2.7 索引快速全扫描 79 3.3 联结方法 80 3.3.1 嵌套循环联结 81 3.3.2 排序-合并联结 83 3.3.3 散列联结 84 3.3.4 笛卡儿联结 87 3.3.5 外联结 88 3.4 小结 94 第4章 SQL是关于集合的 95 4.1 以面向集合的思维方式来思考 95 4.1.1 从面向过程转变为基于集合的思维方式 96 4.1.2 面向过程vs.基于集合的思维方式:一个例子 100 4.2 集合运算 102 4.2.1 UNION和UNION ALL 103 4.2.2 MINUS 106 4.2.3 INTERSECT 107 4.3 集合与空值 108 4.3.1 空值与非直观结果 108 4.3.2 集合运算中的空值行为 110 4.3.3 空值与GROUP BY和ORDER BY 112 4.3.4 空值与聚合函数 114 4.4 小结 114 第5章 关于问题 116 5.1 问出好的问题 116 5.2 提问的目的 117 5.3 问题的种类 117 5.4 关于问题的问题 119 5.5 关于数据的问题 121 5.6 建立逻辑表达式 126 5.7 小结 136 第6章 SQL执行计划 137 6.1 解释计划 137 6.1.1 使用解释计划 137 6.1.2 理解解释计划可能达不到目的的方式 143 6.1.3 阅读计划 146 6.2 执行计划 148 6.2.1 查看最近生成的SQL语句 149 6.2.2 查看相关执行计划 149 6.2.3 收集执行计划统计信息 151 6.2.4 标识SQL语句以便以后取回计划 153 6.2.5 深入理解DBMS_XPLAN的细节 156 6.2.6 使用计划信息来解决问题 161 6.3 小结 169 第7章 高级分组 170 7.1 基本的GROUP BY用法 171 7.2 HAVING子句 174 7.3 GROUP BY的“新”功能 175 7.4 GROUP BY的CUBE扩展 175 7.5 CUBE的实际应用 179 7.6 通过GROUPING()函数排除空值 185 7.7 用GROUPING()来扩展报告 186 7.8 使用GROUPING_ID()来扩展报告 187 7.9 GROUPING SETS与ROLLUP() 191 7.10 GROUP BY局限性 193 7.11 小结 196 第8章 分析函数 197 8.1 示例数据 197 8.2 分析函数剖析 198 8.3 函数列表 199 8.4 聚合函数 200 8.4.1 跨越整个分区的聚合函数 201 8.4.2 细粒度窗口声明 201 8.4.3 默认窗口声明 202 8.5 Lead和Lag 202 8.5.1 语法和排序 202 8.5.2 例1:从前一行中返回一个值 203 8.5.3 理解数据行的位移 204 8.5.4 例2:从下一行中返回一个值 204 8.6 First_value和Last_value 205 8.6.1 例子:使用First_value来计算最大值 206 8.6.2 例子:使用Last_value来计算最小值 207 8.7 其他分析函数 207 8.7.1 Nth_value(11gR2) 207 8.7.2 Rank 209 8.7.3 Dense_rank 210 8.7.4 Row_number 211 8.7.5 Ratio_to_report 211 8.7.6 Percent_rank 212 8.7.7 Percentile_cont 213 8.7.8 Percentile_disc 215 8.7.9 NTILE 215 8.7.10 Stddev 216 8.7.11 Listagg 217 8.8 性能调优 218 8.8.1 执行计划 218 8.8.2 谓语 219 8.8.3 索引 220 8.9 高级话题 221 8.9.1 动态SQL 221 8.9.2 嵌套分析函数 222 8.9.3 并行 223 8.9.4 PGA大小 224 8.10 组织行为 224 8.11 小结 224 第9章 Model子句 225 9.1 电子表格 225 9.2 通过Model子句进行跨行引用 226 9.2.1 示例数据 226 9.2.2 剖析Model子句 227 9.2.3 规则 228 9.3 位置和符号引用 229 9.3.1 位置标记 229 9.3.2 符号标记 230 9.3.3 FOR循环 231 9.4 返回更新后的行 232 9.5 求解顺序 233 9.5.1 行求解顺序 233 9.5.2 规则求解顺序 235 9.6 聚合 237 9.7 迭代 237 9.7.1 一个例子 238 9.7.2 PRESENTV与空值 239 9.8 查找表 240 9.9 空值 242 9.10 使用Model子句进行性能调优 243 9.10.1 执行计划 243 9.10.2 谓语前推 246 9.10.3 物化视图 247 9.10.4 并行 249 9.10.5 Model子句执行中的分区 250 9.10.6 索引 251 9.11 子查询因子化 252 9.12 小结 253 第10章 子查询因子化 254 10.1 标准用法 254 10.2 SQL优化 257 10.2.1 测试执行计划 257 10.2.2 跨多个执行的测试 260 10.2.3 测试查询改变的影响 263 10.2.4 寻找其他优化机会 266 10.2.5 将子查询因子化应用到PL/SQL中 270 10.3 递归子查询 273 10.3.1 一个CONNECT BY的例子 274 10.3.2 使用RSF的例子 275 10.3.3 RSF的限制条件 276 10.3.4 与CONNECT BY的不同点 276 10.4 复制CONNECT BY的功能 277 10.4.1 LEVEL伪列 278 10.4.2 SYS_CONNECT_BY_PATH函数 279 10.4.3 CONNECT_BY_ROOT运算符 281 10.4.4 CONNECT_BY_ISCYCLE伪列和NOCYCLE参数 284 10.4.5 CONNECT_BY_ISLEAF伪列 287 10.5 小结 291 第11章 半联结和反联结 292 11.1 半联结 292 11.2 半联结执行计划 300 11.3 控制半联结执行计划 305 11.3.1 使用提示控制半联结执行计划 305 11.3.2 在实例级控制半联结执行计划 308 11.4 半联结限制条件 310 11.5 半联结必要条件 312 11.6 反联结 312 11.7 反联结执行计划 317 11.8 控制反联结执行计划 326 11.8.1 使用提示控制反联结执行计划 326 11.8.2 在实例级控制反联结执行计划 327 11.9 反联结限制条件 330 11.10 反联结必要条件 333 11.11 小结 333 第12章 索引 334 12.1 理解索引 335 12.1.1 什么时候使用索引 335 12.1.2 列的选择 337 12.1.3 空值问题 338 12.2 索引结构类型 339 12.2.1 B-树索引 339 12.2.2 位图索引 340 12.2.3 索引组织表 341 12.3 分区索引 343 12.3.1 局部索引 343 12.3.2 全局索引 345 12.3.3 散列分区与范围分区 346 12.4 与应用特点相匹配的解决方案 348 12.4.1 压缩索引 348 12.4.2 基于函数的索引 350 12.4.3 反转键索引 353 12.4.4 降序索引 354 12.5 管理问题的解决方案 355 12.5.1 不可见索引 355 12.5.2 虚拟索引 356 12.5.3 位图联结索引 357 12.6 小结 359 第13章 SELECT以外的内容 360 13.1 INSERT 360 13.1.1 直接路径插入 360 13.1.2 多表插入 363 13.1.3 条件插入 364 13.1.4 DML错误日志 364 13.2 UPDATE 371 13.3 DELETE 376 13.4 MERGE 380 13.4.1 语法和用法 380 13.4.2 性能比较 383 13.5 小结 385 第14章 事务处理 386 14.1 什么是事务 386 14.2 事务的ACID属性 387 14.3 事务隔离级别 388 14.4 多版本读一致性 390 14.5 事务控制语句 391 14.5.1 Commit(提交) 391 14.5.2 Savepoint(保存点) 391 14.5.3 Rollback(回滚) 391 14.5.4 Set Transaction(设置事务) 391 14.5.5 Set Constraints(设置约束) 392 14.6 将运算分组为事务 392 14.7 订单录入模式 393 14.8 活动事务 399 14.9 使用保存点 400 14.10 序列化事务 403 14.11 隔离事务 406 14.12 自治事务 409 14.13 小结 413 第15章 测试与质量保证 415 15.1 测试用例 416 15.2 测试方法 417 15.3 单元测试 418 15.4 回归测试 422 15.5 模式修改 422 15.6 重复单元测试 425 15.7 执行计划比较 426 15.8 性能测量 432 15.9 在代码中加入性能测量 432 15.10 性能测试 436 15.11 破坏性测试 437 15.12 通过性能测量进行系统检修 439 15.13 小结 442 第16章 计划稳定性与控制 443 16.1 计划不稳定性:理解这个问题 443 16.1.1 统计信息的变化 444 16.1.2 运行环境的改变 446 16.1.3 SQL语句的改变 447 16.1.4 绑定变量窥视 448 16.2 识别执行计划的不稳定性 450 16.2.1 抓取当前所运行查询的数据 451 16.2.2 查看一条语句的性能历史 452 16.2.3 按照执行计划聚合统计信息 454 16.2.4 寻找执行计划的统计方差 454 16.2.5 在一个时间点附近检查偏差 456 16.3 执行计划控制:解决问题 458 16.3.1 调整查询结构 459 16.3.2 适当使用常量 459 16.3.3 给优化器一些提示 459 16.4 执行计划控制:不能直接访问代码 466 16.4.1 选项1:改变统计信息 467 16.4.2 选项2:改变数据库参数 469 16.4.3 选项3:增加或移除访问路径 469 16.4.4 选项4:应用基于提示的执行计划控制机制 470 16.4.5 大纲 470 16.4.6 SQL概要文件 481 16.4.7 SQL执行计划基线 496 16.4.8 基于提示的执行计划控制机制总结 502 16.5 结论 502 媒体评论     本书作者全部是OakTable的成员,且具有15~29年丰富的Oracle开发经验。在研究一些被其他专门讨论Oracle SQL语言的参考书直接忽略的问题时,这种对Oracle数据库的长期钻研无疑是一个巨大的优势。     ——亚马逊读者评论 精彩内容     SQL核心     凯伦?莫顿(Karen Morton)     不管你是刚开始写SQL语句还是已经写过很多年了,学会写出“好的”SQL这个过程都需要具有很扎实的SQL核心语法和概念基础知识。本章对SQL语言的核心概念及其性能做了回顾,同时还描述了一些你应该已经很熟悉的常用SQL命令。对于那些以前曾经使用过SQL并且基础知识相当牢靠的读者来说,本章就是一个简要的复习,让你为后面更详细的SQL论述做好准备。如果你是一位SQL新人,你可能想要先阅读Beginning Oracle SQL这本书以确保掌握SQL的基础。不管是哪种情况,第1章的目的就是通过对5个核心SQL语句的快速浏览来衡量一下你的SQL水平,同时还概述了我们用来执行SQL语句的工具:SQL*Plus。     1.1  SQL语言     SQL语言最早是IBM公司于20世纪70年代开发出来的,称为结构化英文查询语言,简称为SEQUEL。该语言是基于E.F.Codd在1969年提出的关系型数据库管理系统(RDBMS)的。后来因为商标的纠纷,其简称又进一步缩写为SQL。1986年和1987年,ANSI(美国国家标准化组织)和ISO(国际标准化组织)先后将SQL语言采纳为标准语言。而人们并不熟悉的是,ANSI官方曾将SQL语言的读音确定为“S-Q-L”。绝大多数人,包括我本人,都还在使用“sequel”的读音,只是因为这样读起来更顺口一些。     SQL的目的就是简单地提供一个到数据库的接口,在本书指的是Oracle数据库。每一条SQL语句对于数据库来说就是一条命令或指令。SQL与其他编程语言(如C或Java)的区别就在于它是要处理数据集合而不是一行一行的数据。语言本身也不需要你提供如何导航到数据的指令——这是在后台透明地进行的。但你将在后面的章节中看到,如果想在Oracle中写出高效的SQL语句,了解数据及其在数据库中的存储方式与存储位置是很重要的。     由于不同的供应商(例如甲骨文、IBM和微软)实现SQL核心功能的机制相差无几,所以基于某一种数据库所学的技巧同样可以应用到其他类型的数据库上。你基本上可以利用同样的SQL语句来进行数据的查询、插入、更新和删除,以及创建、修改和删除对象,而不必管数据库的供应商是哪家。     尽管SQL是各种关系型数据库管理系统的标准语言,但实际上它并不一定是关系型的。在本书后面我将就这一点稍作扩展。如果想要了解更多的细节,我推荐大家阅读C.J.Date的SQL and Relational Theory一书。需要铭记于心的一点是SQL语言并不总是严格遵守关系模型的——它根本就没有实现关系模型的某些要素,同时还不恰当地实现了一些要素。事实上,既然SQL是基于关系模型的,那么要想写出尽可能正确高效的SQL语句,你不仅必须要理解SQL语言,还要理解关系模型。     1.2  数据库的接口     多年以来人们开发出多种途径来传递SQL语句到数据库并获得结果。Oracle数据库的本地接口界面是Oracle调用界面(OCI)。OCI将由Oracle内核传送而来的查询语句发送到数据库。当使用某种Oracle工具如SQL*Plus或者SQL Developer时,你都在使用OCI。其他的Oracle工具如SQL*Loader、数据泵(Data Pump)以及Real Application Testing (RAT)既使用OCI,也可以使用语言特定的接口,如Oracle JDBC-OCI、ODP.Net、Oracle预编译器、Oracle ODBC以及Oracle C++调用接口(OCCI)驱动器。     当使用编程语言(如COBOL或C语言)时,你所写的语句被称为嵌入式的SQL语句并且在应用程序编译之前会由SQL预处理器进行预处理。代码清单1-1是一段可以在C/C++程序块中使用的SQL语句的例子。     代码清单1-1  C/C++程序块中所嵌入的SQL语句     其他工具,例如SQL*Plus和SQL Developer,都是交互式的工具。你输入并执行命令,然后获得相应的输出。交互式工具并不需要在运行代码前先精确编译,你只需要输入想要执行的命令即可。代码清单1-2是一段使用SQL*Plus执行语句的例子。     代码清单1-2  使用SQL*Plus执行SQL语句     在本书中,为了保持一致性我们所用的示例代码清单都使用SQL*Plus工具,但需要记住的是,不管你是用什么方法或工具来输入和执行SQL语句,所有的事情最后都要通过OCI来传递到数据库。这里的主旨就是不管你所使用的是什么工具,其本地接口都是一样的。     1.3  SQL*Plus回顾     SQL*Plus是一个不管采用哪个安装平台(Windows或Unix)都会提供的命令行工具。它是一个用来输入和执行SQL语句并显示输出结果的纯文本环境。用该工具可以直接输入、编辑命令,可以一条条地保存和执行命令或者通过脚本文件来进行,然后将输出结果以很精美格式的报表输出。要启动SQL*Plus你只需要在主机的命令提示符后敲入sqlplus即可。     1.3.1  连接到数据库     有多种方法可以通过SQL*Plus连接数据库。然而在连接之前,你还需要在$ORACLE_HOME/ network/admin/tnsnames.ora这个文件中登记想要连接的数据库。有两种通常使用的方法,或者如代码清单1-3所示那样在启动SQL*Plus时提供连接信息,或者如代码清单1-4所示那样在启动SQL*Plus以后使用connect命令。     代码清单1-3  通过窗口命令提示符连接到SQL*Plus     如果想要启动SQL*Plus而又不显示登录到数据库后的提示,可以在启动SQL*Plus时使用/nolog选项。     代码清单1-4  通过SQL>提示符连接SQL*Plus并登录到数据库     1.3.2  配置SQL*Plus环境     SQL*Plus有很多的命令可以让你来定制工作环境和显示选项。代码清单1-5所示是在SQL>提示符下输入help index命令后显示出来的可用的命令。     代码清单1-5  SQL*Plus命令列表     set命令是用来定制工作环境的最基本的命令。代码清单1-6为set命令的帮助文本。     代码清单1-6  SQL*Plus的SET命令     有了上面这些可用命令,你就能够很轻松地定制最适合你的运行环境了。但有一点要铭记于心的就是当你退出或关闭SQL*Plus的时候,这些设置命令就不再被保留了。为了避免每次使用SQL*Plus时都重新敲入一遍这些设置命令,你可以创建一个login.sql文件。事实上每次启动SQL*Plus的时候它都会默认去读两个文件。第一个是$ORACLE_HOME/sqlplus/admin目录下的glogin.sql文件。如果找到了这个文件,它就会被读进来,文件中的命令语句也会被执行。这样就可以把那些定制你的会话体验的SQL*Plus命令和SQL语句保存起来。     在读取glogin.sql文件以后,SQL*Plus会进一步寻找login.sql文件。这个文件必须在SQL*Plus的启动文件夹中或者包含在环境变量SQLPATH所指向的文件夹路径中。在login.sql文件中的所有命令优先级都比glogin.sql文件中的命令高。从10g开始,Oracle在每次你启动SQL*Plus或者从SQL*Plus里执行connect命令的时候都会同时去读取glogin.sql和login.sql这两个文件。在Oracle 10g之前,login.sql脚本文件只有在SQL*Plus启动的时候才会被执行。代码清单1-7是一个常见的login.sql文件内容。     代码清单1-7  一个常见的login.sql文件     注意这里在SET SQLPROMPT中使用的变量_user和_connect_identifier。它们是预定义变量的两个示例。你可以在login.sql文件中或者任何你创建的脚本文件中使用下面这些预定义变量:     ·_connect_identifier     ·_date     ·_editor(这个变量指定了当你使用edit命令的时候启动哪个编辑器)     ·_o_version     ·_o_release     ·_privilege     ·_sqlplus_release     ·_user     1.3.3  执行命令     有两种命令可以在SQL*Plus中执行:SQL语句和SQL*Plus命令。代码清单1-5和代码清单1-6中所列出的SQL*Plus命令对于SQL*Plus来说是特有的命令,可以用来定制运行环境并且可以运行SQL*Plus特有的命令,例如DESCRIBE和CONNECT。要想执行一个SQL*Plus命令,你只需在命令提示符后输入该命令然后敲回车,命令会自动被执行。另一方面,如果要执行SQL语句,就必须使用一个特定字符来表明你想要执行输入的语句,分号(;)或者斜线(/)都可以。使用分号的话可以直接放在输入命令的后面或者放在接下来的空行中,而斜线则必须放在接下来的空行中才可以被识别。代码清单1-8展示了如何使用这两种符号。     代码清单1-8  执行字符的用法     注意第5个在语句最后面加了一个斜线(/)的例子。光标移动到了下一行而不是立即执行语句命令。接下来,如果你再按一下回车键,语句就会被放入SQL*Plus的缓冲器中,但是也不执行。如果想要查看SQL*Plus缓冲器中的内容,可以使用list命令(也可以简写为l)。接下来如果你想在缓冲器中通过使用斜线(/)来执行语句[尽管斜线(/)命令本来就是这样来用的]在这里也将会返回一个错误。这是因为你最初在SQL语句的结尾敲入了一个斜线(/),而斜线(/)并不是一个有效的SQL命令,从而在语句想要执行的时候报错。     另外一种执行命令的方法是把命令放到一个文件中。你可以在SQL*Plus之外直接用文本编辑器生成这些文件,也可以在SQL*Plus中使用EDIT命令来直接调用编辑器。如果已经有了一个文件,EDIT命令可以打开这个文件,如果没有的话就会创建新的文件。文件必须放在默认文件夹中,否则你必须指定文件的全路径。想要设定所选择的编辑器,你只需要利用命令define_ editor='//myeditor.exe'来设置预定义变量_editor。具有.sql扩展名的文件在执行的时候不必敲入扩展名,通过@或START命令都可以执行。代码清单1-9中列出了这两个命令的用法。     代码清单1-9  执行.sql脚本文件     SQL*Plus具有很多特性和选项,以致于多得在这里不能一一列举。就本书需要而言,这种概述就已经足够了。但是,Oracle文档对SQL*Plus的用法给出了指导,而且很多的书,比如Beginning Oracle SQL,都对SQL*Plus作了更为深入的阐述,如果感兴趣你可以参考。     1.4  5个核心的SQL语句     SQL语言有很多不同的语句,但在整个职业生涯中,你可能只会用到其中很少的一部分。不过你所使用的几乎其他任何产品不也是这样的吗?据说有一个统计结果是,绝大多数人都仅使用了他们常用的软件产品或编程语言所有功能的20%甚至更少。我不知道这个统计真实与否,但以我的经验来看,这似乎是很准确的。我发现同样的基本SQL语句格式在大多数应用中使用了将近20年了。极少数的人使用过SQL提供的所有功能——即使对于那些他们确实经常使用的功能也常常用得不是很恰当。显而易见,我们不可能覆盖SQL语言的所有语句以及它们的选项。本书的目的在于让你能够深入理解那些最常用的SQL语句并帮助你更高效地使用它们。     在本书中,我们将重点讨论5个最常用的SQL语句,它们分别为SELECT、INSERT、UPDATE、DELETE以及MERGE。尽管这些核心语句都将逐个讲解,但重中之重还是SELECT语句。将这5个语句用好了将会为你在日常工作中用好SQL语言打下坚实的基础。     1.5  SELECT语句     SELECT语句用来从一个或多个表中或者其他数据库对象中提取数据。你应该已经很熟悉SELECT语句的基础知识了,所以我将不再从一个初学者的角度来介绍SELECT语句,而是首先回顾一下SELECT语句的执行逻辑。对于如何来写一个基本的SELECT语句你应该已经学习过了,但为了培养基本的思维模式,你要一直写出符合语法规则的高效SQL语句,你需要理解SQL语句是如何执行的。     一个查询语句在逻辑上的处理方式可能会与实际物理处理过程大相径庭。Oracle基于查询成本的优化器(cost-based optimizer , CBO)用来产生实际的执行计划。我们在后面的章节中将会讲解优化器是干什么的,如何来实现其功能的以及为什么要进行优化。目前,我们需要关心的是优化器将会决定如何访问表、按照什么样的顺序来处理它们,以及如何将多个表联结起来及如何使用筛选器。查询的处理在逻辑上是按照特定的顺序进行的,但是,优化器所选择的物理执行计划可能会按照完全不同的顺序来实际执行这些步骤。代码清单1-10是一段包含SELECT语句的主要子句的查询片段,在其中标出了每一个子句的逻辑处理顺序。     代码清单1-10  查询语句的逻辑处理顺序     你应该立刻注意到SQL有别于其他编程语言的一点在于首先处理的并不是写在第一行的语句(SELECT语句),而是FROM子句。注意在这个代码清单中我给出了两个不同的FROM子句。标记为1.1的那个FROM子句表示的是当使用ANSI语法时的不同。我们可以把处理过程中的每一个步骤想象为生成一个临时的数据集。随着每个处理步骤的进行,这个数据集被不断地操作直到生成最终的处理结果。查询返回给调用者的就是这个最终结果数据集。     为了更详细地了解SELECT语句的每个部分,你可以参考代码清单1-11所示的查询语句,该语句返回的结果集为下订单超过4次的女顾客的列表。     代码清单1-11  下订单超过4次的女顾客查询语句     1.5.1  FROM子句     FROM子句列出了所查询数据的源对象。这个子句可以包含表、视图、物化视图、分区或子分区,或者你可以建立一个子查询来生成子对象。如果使用了多个源对象,其逻辑处理阶段也将会应用到每一个联结类型以及谓词ON(如步骤1.1所示)。在本书后面的章节中你将会进一步了解联结类型的更多细节,但注意在处理联结语句的时候是按照下面的顺序来进行的:     (1) 交叉联结,也称为笛卡儿乘积;     (2) 内联结;     (3) 外联结。     在代码清单1-11所示的查询例子中,FROM子句列出了两张表:customers和orders,通过customer_id列来联结。因此,当处理这一信息时,FROM子句所生成的初始数据集将会包含这两张表中customer_id相匹配的行。在本例中结果集将会包含105行。为了验证这一点,只要执行例子中的前4行,如代码清单1-12所示。     代码清单1-12  仅通过FROM子句的部分查询语句的执行     注意 为了使之很好地适应页面我手工调整了输出结果,实际输出结果在页面上超过105行。     1.5.2  WHERE子句     WHERE子句提供了一种方法,可以按照条件来限制查询最终返回结果集的行数。每个条件或者谓语都是以两个值或表达式相比较的形式出现的。比较的结果要么是匹配(值为TRUE)要么是不匹配(值为FALSE)。如果比较的结果是FALSE,那么相应的行不会被包含在最终结果集中。     这里我需要稍微偏离一下主题,来谈一谈与这一步相关的SQL中的一个重要方面。事实上,SQL中逻辑比较的可能结果是TRUE、FALSE以及未知。当其中包含空值(null)的时候比较的结果就会是未知。空值与任何值比较或者用在表达式中都会得到空值,或者是未知。一个空值代表一个相应值的缺失,并且可能因为SQL语言中的不同部分对空值的处理不同而令人费解。关于空值是如何影响SQL语句执行的话题将会贯穿本书,但在这里我不得不先提及一下这个话题。我之前所说的还是基本正确的,一个比较的返回值将会是TRUE或者FALSE。你会发现当进行筛选的比较条件中包含空值的时候,将作为FALSE来对待。     在我们的例子中,只有一个将结果限定为下了订单的女性消费者的谓语。如果你查看FROM子句执行之后的中间结果(见代码清单1-12),你会发现105行中仅有31行是由女性消费者所下的订单(gender = 'F')。因此,在应用了WHERE子句以后,中间结果集将从105行减少到31行。     应用WHERE子句以后得到了更精确的结果集。注意,在这里使用的是“精确的结果集”。我的意思是说现在已经得到了能够满足你查询需求的数据行。其他子句(GROUP BY, HAVING)也许可以用来聚合并且进一步限制调用程序会接收到的最终的结果集,但需要注意的很重要的一点是,目前已经得到了查询计算最终结果所需的所有数据。     WHERE子句的目的是限制或者减小结果集。你所使用的限制条件越少,最终返回的结果集中包含的数据就会越多。你需要返回的数据越多,执行查询的时间也就越长。     1.5.3  GROUP BY子句     GROUP BY子句将执行FROM和WHERE子句后得到的经过筛选后的结果集进行聚合。查询出来的结果按照GROUP BY子句中列出的表达式进行分组,来为每一个分组得出一行汇总结果。你可以按照FROM子句中所列出对象的任意字段进行分组,即使你并不想在输出结果列表中显示该列。相反,Select列表中的任何非聚合字段都必须包括在GROUP BY表达式中。     GROUP BY子句中还可以包含两个附加的运算:ROLLUP 和CUBE。ROLLUP运算用来产生部分求和值,CUBE运算用来求得交互分类值。当你使用这两种运算中任意一个的时候,你将会得到不止一行的汇总信息。在第7章中将会对这两个运算进行更详细的讨论。     在示例查询中,需要按照customer_id来进行分组。这就意味着对于每一个唯一的customer_id只会返回一行值。在WHERE子句执行后所得到的代表下订单的女性消费者的31行订单中,有11个独特的customer_id值,如代码清单1-13所示。     代码清单1-13  截至GROUP BY子句的部分查询执行     你会发现查询的结果是经过分组的,但并没有排序。表面上看结果好像是按照order_ct字段排序的,但这仅仅是个巧合而不是确定的行为。需要记住的很重要的一点是:GROUP BY子句并不确定结果数据的排序。如果你需要结果按照特定的顺序排列,则必须指定一个order by子句。     1.5.4  HAVING子句     HAVING子句将分组汇总后的查询结果限定为只有该子句中的条件为真的数据行。除非你使用HAVING子句,否则将返回所有的汇总行。事实上,GROUP BY子句和HAVING子句的位置是可以互换的,谁先谁后都无关紧要。但是,似乎在编码中将GROUP BY子句放在前面更有意义一些,因为GROUP BY子句在逻辑上是先执行的。从本质上来说,HAVING子句是在GROUP BY子句执行后用来筛选汇总值的第二个WHERE子句。     在我们的查询例子中,HAVING子句HAVING COUNT(o.order_id) > 4,将分组数据从11行减少到2行。这一点你可以通过查看GROUP BY子句应用后返回的结果行来确认,如代码清单1-13所示。注意仅有146和147号消费者所下的订单数超过4次。这样就产生了组成最终结果集的两行数据。     1.5.5  SELECT列表     SELECT列表列出查询的返回最终结果集中需要显示哪些列。这些列可以是数据表中一个实际的列、一个表达式,或者甚至是一个SELECT语句的结果,如代码清单1-14所示。     代码清单1-14  展现SELECT列表各种可能情况的查询实例     SQL> select.customer_id, c.cust_first_name||''||c.cust_last_name,     .     当使用另外一个SELECT语句来产生结果中的一列的值的时候,这个查询必须只能返回一行一列的值。这种类型的子查询被称为标量子查询。尽管这可能是一个非常有用的语法,但需要牢记于心的是标量查询在结果集中的每一行结果产生时都要执行一遍。在某些情况下可以进行优化以减少标量子查询的重复执行,但更糟糕的场景是每一行都需要标量子查询执行。你可以想象如果你的结果集中有几千行甚至上百万行数据的时候所需要付出的查询代价!在后面的章节中我们还将回顾标量子查询并讨论如何更好地来使用它们。     在SELECT列表中你还有可能用到的一个选项是DISTINCT子句。在例子中并没有使用它,但我想要简要地提及一下。DISTINCT子句用来在其他子句执行完毕以后从结果集中去除重复的行。     SELECT列表执行完以后,你就得到了最终的查询结果集。所剩的唯一需要做的事情,如果包含了的话,就是将查询结果集按照所需的顺序排序。     1.5.6  ORDER BY子句     ORDER BY子句用来对查询最终返回的结果集进行排序。在本例中,需要按照orders_ct和customer_id进行排序。orders_ct这一列是通过GROUP BY子句中的COUNT聚合函数计算得到的值。如代码清单1-13中所示,有两个消费者的订单超过4个。由于这两个消费者的订单数都是5份,orders_ct这一列的值是相同的,所以要由第二个排序列来确定最终结果的显示顺序。如代码清单1-15中所示,该查询的最终经过排序的输出结果是按照customer_id排序的两行数据集。     代码清单1-15  示例查询的最终输出     当输出结果需要排序的时候,Oracle必须在其他所有子句都执行完之后按照指定的顺序对最终结果集进行排序。需要排序的数据量大小是非常重要的。我这里所说的大小是指结果集中所包含的总字节数。你可以通过用行数乘以每一行的字节数来估计数据集的大小。每行所包含的字节数通过将选择列表中包含的每一列的平均长度相加来确定。     上面的查询实例在选择列表中仅需要列出customer_id 和orders_ct两列的值。我们可以估算每一行输出值的字节数为10。在第6章中我将阐述从哪里能找到优化器所估计的值。因此,如果我们在结果集中只有两行数据,排序的大小实际上是很小的,大约20字节。请记住这仅仅是估算,但这样的估算也是很重要的。     较小的排序会完全在内存中来实现,而较大的排序将不得不使用临时磁盘空间来完成。如你可能推断的那样,在内存中完成的排序比必须使用磁盘的排序要快。因此,当优化器估算排序数据的影响时,它必须要考虑排序数据集的大小,以此来调整如何能够以最有效的方法来获得查询的结果。一般来说,排序是查询过程中开销相当大的一个处理步骤,尤其是当返回结果集很大的时候。     1.6  INSERT语句     INSERT语句用来向表、分区或视图中添加行。可以向单表或者多个表方法中添加数据行。单表插入将会向一个表中插入一行数据,这行数据可以显式地列出插入值也可以通过一个子查询来获取。多表插入将会向一个或多个表中插入行,并且会通过子查询获取值来计算所插入行的值。     1.6.1  单表插入     代码清单1-16中的第一个例子阐明了使用values子句实现的单表插入。每一列的值都显式地输入。如果你要插入表中所定义的所有列的值,那么列的列表是可选的。但是,如果你只想提供部分列的值,则必须在列的列表中指明所需的列名。好的做法是不管是不是需要插入所有列的值,都把所有列的列表列出来。这样做就像该语句的自述文件一样,并且也可以减少将来别人要插入一个新列到表中的时候可能出现的错误。     代码清单1-16  单表插入     第二个例子阐述了通过子查询来实现插入。这是插入数据行的一个非常灵活的选项。所写的子查询可以返回一行或多行数据。返回的每一行都会用来生成需要插入的新行的列值。根据你的需要这个子查询可以很简单也可以很复杂。在本例中,我们使用子查询实现了在现有薪水的基础上为每一位员工发放10%奖金的计算。事实上奖金表包含4列,但在这个插入中我们只列出了3个字段。comm这一列在子查询中并没有占据一列并且我们也没有将它包括在列表中。因为我们没有包含这一列,它的值将会是null。注意如果comm列具有非空约束,那么可能已返回一个约束错误,语句的执行也已失败。     1.6.2  多表插入     代码清单1-17所示的多表插入的例子阐明了一个子查询返回的数据行是如何被用来插入多个表中的。我们从3个表开始:small_customers、medium_customers以及large_customers。我们想要按照每位消费者所下订单的总金额来将数据分别插入这些表。子查询将每一位消费者的order_total列求和来确定该消费者的消费金额是小(所有订单的累加金额小于10 000美元)、中等(介于10 000美元与99 999.99美元之间)还是大(大于等于100 000美元),然后按照条件将这些行插入对应的表中。     代码清单1-17  多表插入     注意INSERT关键字后面ALL子句的使用。当指定了ALL子句的时候,这个语句就会执行无条件的多表插入。也就意味着每一个WHEN子句按照子查询所返回的每一行来确定值而不管前一个条件的输出结果是什么。因此,你需要注意如何来指定每个条件。例如,如果我使用WHEN sum_orders < 100 000这个条件而不是像上面一样列出范围,插入medium_customers表中的行有可能也会插入small_customers表中。     你需要指明FIRST选项来实现每一个WHEN子句按照其出现在语句中的顺序进行评估,并且对于一个给定的子查询行跳过接下来的WHEN子句评估。关键在于要记住哪一个选项能够更好地满足你的需要,ALL还是FIRST,然后使用最适合的选项。     1.7  UPDATE语句     UPDATE语句的作用是改变表中原有行的列值。这个语句的语法由3部分组成:UPDATE、SET和WHERE。UPDATE子句用来指定要更新的表,SET子句用来指明哪些列改变了以及调整的值,WHERE子句用来按条件筛选需要更新的行。WHERE子句是可选的,如果忽略了这个子句的话,更新操作将针对指定表中的所有行进行。     代码清单1-18列出了几种UPDATE语句的不同写法。首先,我建立了一个employees表的副本,名称为employees2,然后我将执行几个完成基本相同任务的不同更新操作:将90部门的员工工资增加10%。在例5中,commission_pct这一列也进行了更新。下面就是采用的不同方法。     例1:使用表达式更新一个单列的值。     例2:通过子查询更新一个单列的值。     例3:通过在WHERE子句中使用子查询确定要更新的数据行来更新单列的值。     例4:通过使用SELECT语句定义表及列的值来更新表。     例5:通过子查询更新多列。     代码清单1-18  UPDATE语句的例子     1.8  DELETE语句     DELETE语句用来从表中移除数据行。该语句的语法结构由3部分组成:DELETE、FROM和WHERE。DELETE关键字是单独列出的。除非你决定使用我们后面将会讨论到的提示(hint),没有其他选项与DELETE关键字相结合。FROM子句用来指定要从哪个表中删除数据行。如代码清单1-19中的例子所示,这个表可以直接指定也可以通过子查询来确定。WHERE子句提供筛选条件有助于确定哪些行是要删除的。如果忽略了WHERE子句,删除操作将删除指定表中的所有数据行。     代码清单1-19展示出了DELETE语句的几种不同写法。注意,在这些例子中我使用了代码清单1-18中创建的employees2表。下面你将看到的就是这些不同的删除方法。     例1:使用WHERE子句中的筛选条件来从指定表中删除行。     例2:使用FROM子句中的子查询来删除行。     例3:使用WHERE子句中的子查询来从指定表中删除行。     代码清单1-19  DELETE语句的例子     1.9  MERGE语句     MERGE语句具有按条件获取要更新或插入到表中的数据行,然后从1个或多个源头对表进行更新或者向表中插入行两方面的能力。它最经常被用在数据仓库中来移动大量的数据,但它的应用不仅限于数据仓库环境下。这个语句提供的一个很大的附加值在于你可以很方便地把多个操作结合成一个。这就使你可以避免使用多个INSERT、UPDATE以及DELETE语句。并且,在本书后面的内容中你将看到,如果你避免去做那些不是必须做的事情,响应时间可能得到相应的改善。     MERGE语句的语法是:     为了说明MERGE语句的用法,代码清单1-20展示出了如何建立一个测试表,然后恰当地利用MERGE条件来向表中插入或更新行。     代码清单1-20  MERGE语句例子     MERGE语句完成了下面这些事情。     ·插入了两行(员工id 106和107)。     ·更新了一行(员工id 105)。     ·删除了一行(员工id 103)。     ·一行保持不变(员工id 104)。     如果没有MERGE语句,你必须最少写3条不同的语句来完成同样的事情。     1.10  小结     正如你可以从到目前为止的例子中看出的,SQL语言提供了很多不同的选择来得到同样的结果集。你可能还注意到了一点就是这5个核心的SQL语句都可以使用类似的构造,例如子查询。关键是需要搞清楚在各种不同的使用场景下哪种构造是最高效的。我们将在本书后面的内容中阐述如何做到这一点。     如果你对本章的例子的理解有任何困难,请一定花点时间复习Beginning Oracle SQL或者Oracle文档中的SQL Reference Guide。在本书中接下来的部分我们假设你已经很好地理解了5个核心SQL语句的基本构造:SELECT、INSERT、UPDATE、DELETE和MERGE。

64,639

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧