报恩计划
kflnig
感谢我的信息老师,是他带我快速进入计算机的大门。我想现在我的技术还算过得去了。所以我想我得报恩。我要把更多的人带入计算机的殿堂。希望我的文章可以让你喜欢。我希望你可以懂点C++知识,不至于我的代码你看不懂。本系列文章主要关于:《全国信息学奥林匹克联赛,培训教程》,但我基本上都是用c++来编程了的。而且我用的是borland c++ 6.0可能会和VC等有些不同。
首先是前置知识:
未知循环层数的代码框架该怎么写。
#include <iostream.h>
int k=0;
void dg(int n)
{
if (n==0) exit;
else {++k;dg(--n);}
}
int main(int argc, char* argv[])
{
dg(10);
cout<<k;
getchar();//getchar()的作用是不让cmd自动关闭。没什么作用,只是为了方便我自己。
return 0;
}
我想上面是一个很好的例子。也就是说,我们可以通过递归来控制循环层数。
再谈谈《全国信息学奥林匹克联赛,培训教程》中几点比较难懂的地方。
for n1=1 to 1000 do
for n2=1 to 2 do
begin
……
end;
这种写法不如
for n2=1 to 2 do
for n1=1 to 1000 do
begin
……
end;
开始我不了解,但是从汇编的角度,一看就知道了。
我们可以看看假如用汇编翻译一下,就是
xor eax,eax
l2:
inc eax
xor ecx,ecx
l1:
inc ecx
……
cmp ecx,2
jnz l1
cmp eax,1000
jnz l2
看到了吗?大量的cmp指令会大量执行,在外层循环中,就是这句:cmp eax,1000。所以如果按照较优的写法。
xor eax,eax
l2:
inc eax
xor ecx,ecx
l1:
inc ecx
……
cmp ecx,1000
jnz l1
cmp eax,2
jnz l2
那么cmp指令就执行的比较少了。
指针:
struct node
{
int val;
struct node *next;
}
当年我看到这里我十分不明白。我想这样鸡生蛋,蛋生鸡,没完没了。现在懂了些汇编,才知道缘由。struct node *next;这一句,实际上,指针在32bit机器中,只分配一个DWORD。所以这句话实际上是告诉编译器,要分配一个指针(大小为32bit)。
struct node只是为了理论上的服从。说明这个指针将指向的是一个node结构体变量。
递归,我已经写过一篇关于递归的文章了。你最好自己在看雪论坛上找找。递归是一定得懂的。
我并不要求你看懂我这一系列中所有的文章,对不太懂数据结构的小鸟来说,可能这个有点难。我希望你可以从我的文档中找到一些,可以提高你自己的知识。
如果看得懂那么你可能比我厉害多了。因为我自己写代码风格不好。我厉害到什么程度呢?就是去年奥林匹克竞赛连初赛都没有进。