-
使用 1~25 的数字依序填充矩阵;
-
从第一行第一列开始填充,沿着列的方向进行。如果是奇数列,从上往下填;如果是偶数列,则从下往上填;
-
第一列填满就到第二列,再到第三列,直到把矩阵都填满。
这个需求比前两篇的复杂度高,主要在于我们没法一下子看出每行数据出现的规律。
没思路?没关系,继续往下看就是了。
第一步,生成 1~25 的数(不管怎么样,这一步总是要做的)。
WITH recursive t_seq (num) AS
(SELECT
1 AS num
UNION ALL
SELECT
num + 1 AS num
t_seq
WHERE num < 25)
SELECT * FROM t_seq
第二步,计算出每个数对应的列号。
从表上就可以看出,每个数字除于 5,再对结果向上取整就是该数字所在的列。
x0 AS
(SELECT
CEIL(num / 5) AS col_no
t_seq)
SELECT * FROM X0
第三步,对偶数列做降序排序。
到现在我们仍旧没有找到每一行数字出现的规律。不过,我们可以试着把每列中的数字按照我们看到的顺序排好序。
比如,第一列是“1,2,3,4,5”,第二列是“10,9,8,7,6”,第三列是“11,12,13,14,15”。
x1 AS
(SELECT
IF(col_no % 2 = 0, - 1 * num, num) AS ordered,
row_number () over () AS seq
ORDER BY col_no,
ordered)
SELECT * FROM X1
上面的 SQL 执行的结果(部分) >>>
num col_no ordered seq
------ ------ ------- --------
1 1 1 1
2 1 2 2
3 1 3 3
4 1 4 4
5 1 5 5
10 2 -10 6
9 2 -9 7
8 2 -8 8
7 2 -7 9
6 2 -6 10
在这个结果里面,我们发现了数字字段 num 和序号字段 seq 之间存在某种联系:seq % 5
得到的结果一致的 num 处在同一行上。
第四步,行转列。
既然已找到了分组的依据,剩下要做的就是行转列。
x2 AS
(SELECT
(seq % 5) AS row_no,
MAX(IF(col_no = 1, num, NULL)) AS A,
MAX(IF(col_no = 2, num, NULL)) AS B,
MAX(IF(col_no = 3, num, NULL)) AS C,
MAX(IF(col_no = 4, num, NULL)) AS D,
MAX(IF(col_no = 5, num, NULL)) AS E
GROUP BY (seq % 5))
SELECT
A ,B ,C ,D ,E
ORDER BY 1
最终输出结果 >>>
A B C D E
------ ------ ------ ------ --------
1 10 11 20 21
2 9 12 19 22
3 8 13 18 23
4 7 14 17 24
5 6 15 16 25
包括如下功能:
点是否在直线上。
假定点在直线上,点到直线起点的有向距离。如果点在直线上,点到直线距离为n。如果n>=0,则点在射线上;如果(n>=0)&&(n <= 线段长度) ,则点在线段上。
两直线是否平行或重合。
两直线是否重合。
两直线是否垂直。
两直线交点。
两非平行直线距离。
求垂足。
通过过平面一点和方向(单位矢量)表示平面。包括如下功能:
点到平面的有向距离。通过平面标准法向量和距离,可以求垂足;通过点到平面的距离的正负,可以看出多个点是否在同侧;如果点到平面的距离为0,则点在平面上,否则不在平面上。
直线是否在平面上
平面和直线的交点
通过调用其他功能可以实现的功能:
平面的法向量平行于直线,则平面和直线垂直
平面的法向量垂直于直线,则平面和直线平行
平面的法向量平行(垂直)则平面平行(垂直)
平行平面的距离等于平面任意一点到另一平面的距离
包括以下功能:
初始化为单位矩阵。
为向x,y,z方向缩放建立矩阵。
为任意方向缩放建立矩阵。投影平面,可以通过向平面法线方向缩放0实现。平面镜像,可以通过向平面法线方向缩放-1实现。
为对一个点镜像建立矩阵。
为对一条直线镜像建立矩阵。
为对一条对称轴旋转建立矩阵。
求对应行列式的值。
求逆矩阵。
求转置矩阵。
左乘。
求对应行列式的代数余子式。
常见运算符。
4.2 SN
封装了许多基础的功能。
读写锁。
二 避免依赖其它类库
有些类经常用于库间接口,所以需要避免依赖其它类库。
字符串类、函数,比如:宽字符、多字符间的转换。
时间类。
数组的封装。
将错误信息记录到全局变量中,应用场景:构造函数和析构函数中throw会引起不可预料的问题。
安全缓存,额外开辟若干个字节的空间,并初始化为一个特定值,如果不越界,这些值不会改变。
智能指针,为了将关联降为依赖。CAutoPtr<C> m_pC代替C m_c,头文件中不需要引用C类的头文件。只需要声明C类,在源文件中引用C类的头文件。
MD5。
RSA。
SHA。
考虑溢出的加减法。比如:int型的10亿加20亿,-10亿减20亿。
通过表名、列名、某些列的值生成sql语句。
安全指针和防野指针类。防野指针类:在构造函数中将状态初始为已初始化,在析构函数中将状态设置为已释放。安全指针在使用时之前判断 防野指针类释放是“已初始化”,否则抛出异常。
将有参数的函数统一成没参数返回值类型void的仿函数。
遍历文件夹的文件和子文件夹。
随机数和排列组合。
系列化和反系列化。将对象和变量转化成二进制,并将二进制转回变量和对象。
拆分,如字符串。
4.3 SNMFC
一 网络功能
网络基本功能:如获取本机IP,通过域名获取IP,IE版本。
HTML对话框的封装类。
用于服务端的,带“回调类”的绑定监听类,利用IO完成端口。
用于客户端的,带“回调类”连接类,利用select模式完成,可以指定是否开启新线程。连接时,可以指定超时时间,默认5秒。如果直接调用系统的connect,超时时间是75秒。
能够自动处理“粘包”、“拆包”的二进制解析类。
安全套接字的辅助类,如:设置发送、连接超时。
比较服务端的某个文件夹和客户端的某个文件夹,并更新那些md5不同的文件。
二 多线程
用临界区实现的线程锁,和线程读写锁。
窗口辅助类。
开启一个线程并调用一个函数。
开启一个线程并循环调用一个函数。
支持多线程的日志。
启动一个线程,等待若干秒后,Post或Send一个消息后,结束线程。
三态树控件。
列表框扩展类和函数。
树控件的扩展。
组合框的扩展。
关于窗口功能的封装。比如:从左到右依次排列子窗口,排不下则下一行。可以指定行间距。页眉和页脚是行间距的一半。
位图的加载和显示。
Ini文件。
数组封装类。
获取硬件信息,如网卡。
文件或文件夹的常用功能。
注册表的扩展。
4.4 SNSTL
数组(向量)扩展。
用于多线程的向量。
JSON解析。
集合的扩展。
映射的扩展。
指针向量,可以存派生类。
指针映射,可以存派生类。
4.5 其它库
UnitTest,本机单元测试项目,对整个库的重要功能进行单元测试。
SNBCG,著名界面库的扩展,几乎没使用。
SNPicture,图形图像的处理(如转换bmp格式),几乎没使用。
SNMath,数学及数据结构库,几乎没使用。
1 使用数学函数RAND()生成3个10以内的随机整数。
RAND()函数生成的随机数在0~1之间,要生成0~10之间的随机数,RAND()需要乘以10,如果要求是整数,则还必须舍去结果的小数部分,在这里使用ROUND()函数,执行过程如下:
mysql> SELECT ROUND(RAND()...
很久没怀疑过自己的智商了,直到遇见这 3 道题。你也来试试!这 3 道巨难的题目,来自 itpub 的 SQL 数据库编程大赛。说起 itpub 就不得不说它与 Oracle 的渊源,多少大师都在这里诞生。想成为 SQL 大师,有个最快的方法,就是刷题。如果能刷遍这里的题,Oracle 工作,十拿九稳。当年支付宝首席数据库架构师冯大-冯春培,就是典范。好了,闲话不说,上题!1,5X5方格棋盘难题在...
我们在上一篇文章中介绍了怎么用 SQL 打印 5 x 5 的矩阵,今天的内容仍旧围绕这个主题,只不过规则稍有点不同。先来看看要实现的效果。和前面一篇文章中的表格不同之处在于:偶数行的排序不再是从左到右是递增的,而是递减,或者说是从右到左递增。完整的规则:有一张 5 x 5 的表格,我们要往这张表格中填充 1~25 的数字;如果是奇数行,则从左到右填充数字;如果是偶数行,就需要按从右到左的顺序填入数...
要在MySQL中生成一定范围的数字,可以使用存储过程。首先,我们需要创建一个表。之后,我们将创建一个存储过程,该过程将生成一个从10到1的数字范围。以下是创建表的查询-mysql>createtableGeneratingNumbersDemo−>(−>Numberint−>);现在,您可以创建一个存储过程,在表中存储一系列数字。以下是创建存储过程的查询-my...
while(@i<=23)
begin
set @sql =isnull(@sql+' union select ','select ')+cast(@i As nvarchar);
set @i=@i+1;
exec(@sql)
--方法2
SELECT number FROM MASTER
二、导入数据库样例
导入外部的.sql文件:这里指的是《MySQL必知必会》这本书中的样例,首先下载下来两个文件,放在E盘的根目录下,名字如下:
然后在mysql的命令行中,选择一个自己建的数据表或者选定已有的:
CREATE DATABASE midi;
USE mid...
这里有一种方法可以实现基于集的无循环。这也可以成为一个可重用的视图。这个例子显示了从0到999之间的序列的生成,但是当然,它可能会被修改以适应。INSERTINTOmyTable(nr)SELECTSEQ.SeqValueFROM(SELECT(HUNDREDS.SeqValue+TENS.SeqValue+ONES.SeqValue)SeqValueFROM(SELE...
排名函数是SQL SERVER2005新增的函数。排名函数总共有四种,分别是:row_number、rank、 dense_rank 、ntile。row_number:顺序生成序号。rank:相同的序值序号相同,但序号会跳号。dense_rank :相同的序值序号相同,序号顺序递增。ntile:装桶,把记录分成指的桶数,编序号。下面分别介绍一下这四个排名函数的功能及用法。