[已失效]Csdn免积分下载器

作者:bystander 转载请注明来源:http://leaver.me 原理很简单,目前好像还没有大规模传开,我就不透露了,大家低调使用.为了方便,我写了个客户端,下载地址在文章末尾 使用方法直接把你想下载的地址复制过去,点击下载就会调用ie来下载了. 文章太短了,发两个可乐的吧: 第一个是: "网上发言,请不要随便自称笔者,毕竟有没有在用笔在写一目了然。这个词汇已经要汇入历史长河了,虽然曾经的那么疯狂存在过,但至少在互联网上该消失了。" "那以后自称什么?" "键人。" ---------------------------------------------------------------------------------------------------------- 第二个: ---光棍君:五一快到了,你还是一个人吗? ---你MB,难道我会变成狗吗? ---------------------------------------------------------------------------------------------------------- 第一个冷笑话,第二个是热笑话,冷暖自知。一个成语瞬间提升了整篇文章的境界。 下载地址:[Csdn下载器](http://pan.baidu.com/share/link?shareid=468747&uk=1493685990)

2013-05-01 · 1 min · bystander

一道笔试指针题目详解

看到本题是在搜狗某年的笔试题上,看也没人给出非常详细的讲解,直接给出了答案,我来尝试写一写, 貌似本题来源自<**The C Puzzle Book> ,**搜狗也只是换了一下字符串,直接看题吧 #include <stdio.h> char *c[]={"ENTNG", "NST","AMAZI","FIRBE"}; char** cp[]={c+3, c+2, c+1, c}; char ***cpp= cp; int main() { printf("%s",**++cpp); printf("%s ",*--*++cpp+3); printf("%s",*cpp[-2]+3); printf("%s",cpp[-1][-1]+1); } <span style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; font-size: 13px; line-height: 19px;">请写出程序的执行结果....</span> 首先从左到右看: char *c[]= { "ENTNG", "NST", "AMAZI", "FIRBE" }; *c[] 是一个字符,因此,c[]是指向该字符,c就是一个数组(数组的内容为指向字符的指针),c已经被初始化了. char** cp[]={c+3, c+2, c+1, c}; 再看第二行,**cp[]是一个字符,*cp[]就是一个指针,指向该字符,cp[]就是一个指针,指向该指针,而cp就成为了指针数组,内容是指向字符的指针的指针。并且通过c的元素进行了初始化 char ***cpp= cp; 第三行,***cpp是一个字符,**cpp指向该字符,*cpp指向该指针,cpp就指向该字符的指针的指针. 然后我画一张图表示初始的情况看看 然后对于下面的输出语句,通过操作符优先级使用括号来区分一下: *(*(++cpp)); 这个嘛,就是把cpp后移(注意cpp已经改变了)然后就指向了cp[1],然后两次取其值即可得到AMAZI 推导过程如下: ++cpp -> cp[1] // cp[1] -> c+2 ++cpp = &cp[1] // &(c+2) *++cpp = *(&c+2) // c[2] **++cpp = *&c[2] 然后看第二个 (*(--(*(++cpp))))+3; 加括号后如上,cpp再加一,就指向了cp[2],取一次值(也就是*号)就变成了c[1],然后--c[1]就指向了c[0],取值就成了c[0]的地址,然后地址+3,就是NG了 (*(cpp[-2]))+3; 上面,cpp指向cp[2]了,然后呢,cpp[-2] 相当于*(cpp-2),间接引用cp[2],这样cpp[-2]就指向了cp[0]了,然后,就是FIRBE了,加3就是BE了 最后 (cpp[-1][-1])+1; cpp还是之前的cp[2],cpp[-1][-1]相当于*(*(cpp-1)-1),先减1指向了cp[1],取一次值就是c[2]了,然后c[2]-1就成为c[1]了,然后+1之后就是ST了. 所以,最后输出就是 AMAZINGBEST 错误之处还望指正.

2013-04-17 · 1 min · bystander

模板优先级队列及堆排序(C++实现)

模板优先级队列,数组实现,再熟悉一下常用算法,同时简单的堆排序应用 写了一个是队列自增长,另一个为了演示我还添加了一个叫做FillPq的方法,这个方法可以使用一个数组直接填充到优先级队列里,此时,优先级队列并不优先,然后进行下滤调整,之后建堆完成,输出即可 #include "stdafx.h" template< class T> class PriorityQueue { private: T *pq; int N; int capacity; public: PriorityQueue(void); ~PriorityQueue(void); void Insert(T x); T DelTop(); void Swim(int k); void Sink(int k); bool Less(int i,int j); void Swap(int i,int j); bool Resize(); void FillPq(T arr[],int size); }; template< class T> void PriorityQueue<T>::FillPq( T arr[],int size ) { N=size; capacity=2*size; for (int i=0;i<size;i++) { pq[i+1]=arr[i]; } } template< class T> PriorityQueue<T>::PriorityQueue(void) { pq=new T[10]; N=0; capacity=10; } template< class T> void PriorityQueue<T>::Insert( T x ) { if (N==capacity) { Resize(); } pq[++N]=x; Swim(N); } template< class T> T PriorityQueue<T>::DelTop() { T max=pq[1]; Swap(1,N--); Sink(1); pq[N+1]=NULL; return max; } //下滤 template< class T> void PriorityQueue<T>::Sink( int k ) { while (2*k<=N) { int j=2*k; if (j<N && Less(j,j+1)) { j++; } if (!Less(k,j)) { break; } Swap(k,j); k=j; } } //上浮 template< class T> void PriorityQueue<T>::Swim( int k ) { while (k>1 && Less(k/2,k)) { Swap(k,k/2); } } template< class T> void PriorityQueue<T>::Swap( int i,int j ) { T temp=pq[i]; pq[i]=pq[j]; pq[j]=temp; } template< class T> bool PriorityQueue<T>::Less( int i,int j ) { return pq[i]<pq[j]; } template< class T> bool PriorityQueue<T>::Resize() { T *newPq=new T[capacity*2]; capacity=capacity*2; for (int i=1;i<=N;i++) { newPq[i]=pq[i]; } pq=newPq; return true; } template< class T> PriorityQueue<T>::~PriorityQueue(void) { } 然后是堆排序 ...

2013-04-16 · 2 min · bystander

模板栈以及中缀表达式求值(C++实现)

栈直接用链表实现,这个比较简单,不多说,不过C++写程序,IDE的错误检测不是很给力。 至于给定一个中缀表达式,如何不转换成后缀表达式,直接求值,方法就是使用两个栈,一个操作符栈,一个操作数栈,然后从左到右扫描表达式,我这里中缀表达式计算实现的很简单,不完整,大家可以扩展。栈的实现是我想写的,思路如下: 1.如何是操作数,压入操作数栈 2.如果是操作符,压入操作符栈 3.如果是左括号,直接忽略 4.如果是有括号,弹出操作符栈栈顶元素,然后弹出操作数栈两个元素,进行操作以后结果压入操作数栈 看个图就好了 最后给出栈顶实现代码 #include "stdafx.h" #pragma region Node定义 template <class T> class Node { template<class T> friend class Stack; private: T m_data; Node *pNextNode; public: Node(); Node(T d); }; template <class T> Node<T>::Node() { m_data=default(T); pNextNode=NULL; } template <class T> Node<T>::Node(T d) { m_data=d; pNextNode=NULL; } #pragma endregion #pragma region Stack定义 template <class T> class Stack { private: Node<T> *m_pTopNode; int m_nNodeCount; public: Stack(); ~Stack(); bool IsEmpty(); bool Push(T e); T Pop(); int Size(); }; template <class T> Stack<T>::Stack() : m_pTopNode(NULL),m_nNodeCount(0) { } template <class T> Stack<T>::~Stack() { while (!IsEmpty()) { Node<T> *pTempNode = m_pTopNode; m_pTopNode = m_pTopNode->pNextNode; delete (pTempNode); pTempNode = NULL; } m_nNodeCount = 0; m_pTopNode = NULL; } template <class T> bool Stack<T>::IsEmpty() { return (m_pTopNode == NULL); } template <class T> bool Stack<T>::Push(T e ) { Node<T> *pNewNode = new Node<T>(e); if (NULL == pNewNode) { return false; } if(! IsEmpty()) { pNewNode->pNextNode = m_pTopNode; } m_pTopNode = pNewNode; m_nNodeCount ++; return true; } template <class T> T Stack<T>::Pop() { if(IsEmpty()) { return T(-1); } T e; e = m_pTopNode->m_data; Node<T> *pNode = m_pTopNode; m_pTopNode = m_pTopNode->pNextNode; delete (pNode); m_nNodeCount--; return e; } template <class T> int Stack<T>::Size() { return m_nNodeCount; } #pragma endregion 然后是main函数代码 ...

2013-04-11 · 2 min · bystander

并查集(C++实现)

并查集这个很有意思,并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题。昨天看书看到了,然后用C++简单实现了下。在Dijkstra算法中,用来判断两个顶点是否在同一个集合里。 里面定义了两个类,都是并查集,一个是QuickFind,查找很快,一个是QuickUnion,合并较快。写了一些注释,有一些优化的提示.看代码吧,有什么问题指出来吧。 QuickFind的实现 #include "QuickFind.h" QuickFind::QuickFind(int N) { size=N; id=new int[N]; for(int i=0;i<N;i++) { id[i]=i; } } bool QuickFind::Find(int p,int q) { return id[p]==id[q]; } void QuickFind::Unite(int p,int q) { int pid=id[p]; for(int i=0;i<size;i++) if(id[i]==pid) id[i]=id[q]; } QuickFind::~QuickFind(void) { delete []id; } QuickUnion的实现 #include "QuickUnion.h" QuickUnion::QuickUnion(int N) { size=N; id=new int[N]; for(int i=0;i<N;i++) { id[i]=i; } } int QuickUnion::root(int i) { while (i!=id[i]) { //id[i]=id[id[i]]; 若添加这句话则为压缩路径 i=id[i]; } return i; } bool QuickUnion::Find(int p,int q) { return root(p)==root(q); } void QuickUnion::Unite(int p,int q) { //将p的根挂在q的根上, //这样会导此数变高,若需要优化,需要设置另一个 //数组sz[],sz[i]表示所以根为i的节点的数目,然后将 //小树靠在大树上 /* int i=root(p); int j=root(q); if(sz[i]<sz[j]) { id[i]=j;sz[j]+=sz[i]; } else { id[j]=i;sz[i]+=sz[j]; }*/ int rootp=root(p); int rootq=root(q); id[rootp]=rootq; } QuickUnion::~QuickUnion(void) { delete []id; } 参考文档(英文):UnionFind.pdf 工程代码下载:并查集Demo

2013-04-11 · 1 min · bystander

和 浅析

这两个转义字符最初学习C++的时候看到了,当时没多想,后来某一天突然想起来,回车不就是换行吗?这不是多此一举吗?今天又看到,索性查了下相关资料,整理一下,留作记录. 关于“回车”(carriage return)和“换行”(line feed)这两个概念的来历和区别。 在计算机还没有出现之前,有一种叫做电传打字机(Teletype Model 33)的玩意,每秒钟可以打10个字符。但是它有一个问题,就是打完一行换行的时候,要用去0.2秒,正好可以打两个字符。要是在这0.2秒里面,又有新的字符传过来,那么这个字符将丢失。 于是,研制人员想了个办法解决这个问题,就是在每行后面加两个表示结束的字符。一个叫做“回车”,告诉打字机把打印头定位在左边界;另一个叫做“换行”,告诉打字机把纸向下移一行(这句的意思是把纸向上拉,然后打印头就定位到了下一行),可以想象一下,这个打印头只能在一个固定的水平线上左右移动,而不能上下移动,我们通过移动纸来完成打印下一行。 不明白的我在youtube上找到一个这种打字机的演示视频,为了方便读者观看,我提供一个下载地址。 后来,计算机发明了,这两个概念也就被般到了计算机上。那时,存储器很贵,一些科学家认为在每行结尾加两个字符太浪费了,加一个就可以。于是,就出现了分歧。 Unix系统里,每行结尾只有"<换行>",即"\n"; Windows系统里面,每行结尾是"<换行><回车>",即"\n\r"; Mac系统里,每行结尾是"<回车>",不过mac基于unix,所以换行也应该是可以的。 一个直接后果是,Unix/Mac系统下的文件在Windows里打开的话,所有文字会变成一行;而Windows里的文件在Unix/Mac下打开的话,在每行的结尾可能会多出一个^M符号。这个如果你在windows下使用vim也会发现这个情况 用C++来说明 如: int main() { cout << "leaver.me" << "\r" << "bystander" ; return 0; } 最后只显示 bystander 而 leaver.me 背覆盖了 \n 是换行,系统会将其替换成回车+换行 把光标 先移到 行首 然后换到下一行 也就是 下一行的行首拉 int main() { cout << "leaver.me" << "\n" << "bystander" ; return 0; } 则 显示 leaver.me bystander 一句话,这看起来是一个历史遗留问题……

2013-04-05 · 1 min · bystander

详细讲解双查询注入

上一篇文章中,http://leaver.me/archives/2726.html 我说双查询很难讲清楚,这次就试着讲一下。读了一些原理性的东西。然后尽量通俗的给大家讲清楚。。 在此之前,我们理解一下子查询,查询的关键字是select,这个大家都知道。子查询可以简单的理解在一个select语句里还有一个select。里面的这个select语句就是子查询。 看一个简单的例子: Select concat((select database())); 真正执行的时候,先从子查询进行。因此执行select database() 这个语句就会把当前的数据库查出来,然后把结果传入到concat函数。这个函数是用来连接的。比如 concat(‘a’,’b’)那结果就是ab了。 原理: 双注入查询需要理解四个函数/语句 1. Rand() //随机函数 2. Floor() //取整函数 3. Count() //汇总函数 4. Group by clause //分组语句 简单的一句话原理就是有研究人员发现,当在一个聚合函数,比如count函数后面如果使用分组语句就会把查询的一部分以错误的形式显示出来。 以本地一个名为Security的数据库为例 首先在bt5下的命令行下输入 mysql -u root –p toor 就会连接上数据库了。 然后通过use security; 就可以切换到security数据库了。因为一个服务器上可能有多个数据库嘛。 然后我们执行一下前面那个简单的子查询的例子 SELECT concat((select database())); 就能显示security,也就是显示了当前数据库的名字了。 然后我们测试一下concat的用法。输入 SELECT concat('string1','string2'); 显然结果就是string1string2了 然后我们测试一下rand()这个随机函数是干嘛的 Select rand(); 我们多执行几次 可以看到,这个函数就是返回大于0,小于1之间的数 然后看看取整函数 Select floor(1.1123456); 这个函数就是返回小于等于你输入的数的整数。 然后我们看看双注入查询中的一个简单组合。大家从我的上一篇文章中应该也看到了有一个子查询是 SELECT floor(rand()*2); 我们从里向外看。rand() 返回大于0小于1的小数,乘以2之后就成了小于0小于2了。然后对结果进行取证。就只能是0或1了。也就是这个查询的结果不是1,就是0 我们稍微加大一点难度。看这个查询 SELECT CONCAT((SELECT database()), FLOOR(RAND()*2)); 不要怕。先看最里面的SELECT database() 这个就返回数据库名,这里就是security了。然后FLOOR(RAND()*2)这个上面说过了。不是0,就是1.然后把这两个的结果进行concat连接,那么结果不是security0就是security1了。 如果我们把这条语句后面加上from 一个表名。那么一般会返回security0或security1的一个集合。数目是由表本身有几条结果决定的。比如一个管理表里有5个管理员。这个就会返回五条记录,这里users表里有13个用户,所以返回了13条 如果是从information_schema.schemata里,这个表里包含了mysql的所有数据库名。这里本机有三个数据库。所以会返回三个结果 现在我们准备加上Group By 语句了。 我们使用information_schema.tables 或 information_schema.columns者两个表来查询。因为表里面一般数据很多。容易生成很多的随机值,不至于全部是security0,这样就不能查询出结果了。 select concat((select database()), floor(rand()*2))as a from information_schema.tables group by a; 这里我先解释一下。我们把concat((select database()), floor(rand()*2)) 这个结果取了一个别名 a ,然后使用他进行分组。这样相同的security0分到一组,security1分到一组。就剩下两个结果了。 注意。这里的database()可以替换成任何你想查的函数,比如version(), user(), datadir()或者其他的查询。比如查表啊。查列啊。原理都是一样的。 最后的亮点来了。。 我们输入这条:注意多了一个聚合函数count(*) select count(*), concat((select database()), floor(rand()*2))as a from information_schema.tables group by a; 报错了 ERROR 1062 (23000): Duplicate entry 'security1' for key ‘group_key’ 重复的键值 可以看到security就是我们的查询结果了 想要查询版本就这样: ...

2013-03-03 · 1 min · bystander

C#中的Debug类

位于命名空间System.Diagnostics中 1.Debug.Print方法 Debug.Print("Today: {0}", DateTime.Today); 2.Debug.WriteLine方法 Debug.WriteLine("Have a nice day"); 3.TraceListener类 DelimitedListTraceListener创建的时候指定一个文件名,当Flush调用的时候,就被覆写到文件里。 TraceListener listener = new DelimitedListTraceListener(@"C:\debugfile.txt"); // Add listener. Debug.Listeners.Add(listener); // Write and flush. Debug.WriteLine("Welcome"); Debug.Flush(); 4.Debug.Write和WriteIf以及WriteLineIf方法 Debug.WriteLineIf(IsThursday(), "Thursday"); 第一个参数一个bool值,为真则输出。 5.Debug.Assert方法 Debug.Assert(value != -1, "Value must never be -1."); 如果表达式为false,则输出。

2013-03-01 · 1 min · bystander

消费者行为学

 今天一直在自习。。中午遇到了初中同桌。。5年没见了吧。聊了一会。被各种叮嘱“一定不要找太娇生惯养的,太粘人的,太无理取闹的。要听我的话,不然受苦的可是你。”哈哈。当时笑喷了。谢谢同桌。好好工作吧。 这本书是寒假在家看的一本书。一点点笔记。 选择喜爱的网站在很大程度上是一种生活方式的声明,它说明了一个人的兴趣和他想成为哪一类型的人,人们选择一种产品。通常是因为他们喜欢他的个性,觉得和自己比较温和。甚至有些人认为,使用产品后,他所拥有的令人渴望的品质会转移到自己身上。 每一年,人们都会购买大量几乎没有任何味道,没有任何营养的食品,这说明现代消费者行为学领域的一个基本前提是,人们购买产品往往并非因为他们能做什么,而是因为他们意味着什么。在其相同的情况下,人们会选择那些具有与其潜在需求一致的形象/个性的品牌。 营销者与消费者共处于一种复杂的双向关系中,往往很难判断营销活动是在哪里结束,而“真实世界”又在哪里开始,这种界限的模糊带来一个结果,那就是我们不再确定(或者也不在意)区分虚构世界和现实的界限究竟在哪里。有时候,我们呢愉快地加入到这个幻想中。 商业道德是引导市场行为的原则。包括诚实,可信赖,公平,尊重,正义。消费者认为行为道德的公司制造的产品评价较高。 品牌是在消费者头脑中设立的账户,也许巨额投入的营销策略只可以提高一个品牌的小小美誉度,而一次不大的产品质量危机则可能会一夜之间让该品牌资产荡然无存。 需求是一种基本的生物动机,欲望是社会教给我们的可用以满意需求的一种方式,比如口渴是生物意义上的,而我们被教会用可口可乐而不是(比如)羊奶来满足解渴的需要,因此,需求是本来就已经存在的。营销者只是推荐满足他的方法。营销的一个基本目标就是引起人们认识到需要的存在,而不是创造需求。 广告人对于人们的了解还远远未达到操纵他们的程度,新产品的失败率从40-80%,尽管人们认为神奇手段和科学技术在操纵他们,而事实上。只有设法销售优秀产品时才会成功。 绿色营销越来越普遍。强迫性消费是指反复的而且常是过度的购物行为,他被当作压力/焦虑/沮丧/无聊的宣泄渠道。和毒品类似。女性观有强迫购物失常的概率是男性的4倍,女性被服装和化妆品吸引,男性则被小配件,工具,枪支等吸引。

2013-02-26 · 1 min · bystander

C#反射实现简单的插件系统

如果用过一些优秀的开源或是非开源的应用软件,就会发现这些软件的一个很大的优势就是其开放性,任何有能力的人都可以为其开发不同的插件来增强其的功能。比如著名的foobar2000,Vim和TotalCommander等等。 C#的反射可以用来实现一个简单的插件系统。思路很简单,我们创建一个解决方案,包含三个工程,一个为我们的软件MyApplication,一个为插件接口IPlugin,一个为具体的插件MyPlugin。插件系统的基本思路是我们用一个接口类库,来定义我们软件可以使用的插件必须实现的方法签名。然后我们的软件MyApplication通过引用该IPlugin dll来动态调用,而具体的实现插件MyPlugin则引用该接口来实现具体的方法。这样我们的应用程序就能在不知道具体插件的情况下调用插件了。。 结构图如下: 关键代码也就是通过对程序集载入。搜索到对应接口的实现类。然后调用即可。 Assembly a = Assembly.LoadFrom(AssemblyName); foreach (Type t in a.GetTypes()) { if (t.GetInterface("IMyFunction") != null) { try { IMyFunction pluginclass = Activator.CreateInstance(t) as IMyFunction; pluginclass.doSomething(); } catch (Exception ex) { MessageBox.Show(ex.ToString()); } } } 运行结果: 源码下载:PluginSystem.zip

2013-02-21 · 1 min · bystander