清华大学ACM集训队培训资料(内部使用)一、C++基础基本知识所有的C++程序都是有函数组成的,函数又叫做子程序,且每个C++程序必须包含一个main函数,编译器(能够把源代码转换成目标代码的程序)把翻译后的目标代码和一些启动代码组合起来,生成可执行文件,main函数就是可执行文件的入口,所以,每个C++程序有且只有一个main函数。
下面我们看一个最简单C++程序。
(程序1.1)程序1.1int main(){return 0;}在这个程序中,如果缺少任何一个字符,编译器就无法将其翻译成机器代码。
此外,C++是对大小写敏感的,这就意味着,如果我将mian()函数拼为Main(),哪么,编译器在编译这段程序的时候就会出错。
编辑源文件能够提共管理程序开发的所有步骤,包括编辑的程序成为集成开发环境(integrated development evironments, IDE)。
在windows系统下,使用较为广泛的有Microsoft Visual C++、Dev-Cpp等,在UNIX系统下,有Vim、emacs、eclipes等。
这些程序都能提供一个较好的开发平台,使我们能够方便的开发一个程序,接下我们所要了解的都是标准C++,所有源代码都在Dev-cpp下编写,能够编译通过。
如果我们修改程序1.1中的main()函数的名称,将其改为Main(),那么,IDE就会给出错误信息,比如“ [Linker error] undefined reference to `WinMain@16'”,因为编译器没有找到main函数。
接下来,我们来看一个经典的C++例子(程序1.2)程序1.2#include<iostream>using namespace std;int main(void){cout<<"Hello Wrold!"<<endl;return 0;}运行结果Hello World!程序说明第一行“#include<iostream>”,是一句预处理命令,相当于把“iostream”这个文件的所有内容复制到当前位置,替换该行。
因为在输出操作中需要做很多事,C++编译器就提供了很多已经写好的函数(成为C++标准库),我们做的只是拿来用就可以了。
第二行的“using namespace std;”是使用标准命名空间,因为我们在程序中用到了在标准命名空间里的函数和对象。
目前可以不了解其具体如何实现,在以后的程序设计中可以再对其进行了解。
在明函数中“cout<<”Hello World!”<<endl;”是在屏幕上打印“Hello World!”,“endl”表明打印完这句话之后需要换行。
如果我们替换引号内的内容,程序的输出就会相应改变。
另外一个C++程序例子// ourfunc.cpp -- defining your own function#include <iostream>void simon(int); // function prototype for simon()int main(){using namespace std;simon(3); // call the simon() functioncout << "Pick an integer: ";int count;cin >> count;simon(count); // call it againcout << "Done!" << endl;return 0;}void simon(int n) // define the simon() function{using namespace std;cout << "Simon says touch your toes " << n << " times." << endl;} // void functions don't need return statements下面试运行情况:Simon says touch your toes 3 times.Pick an integer: 512Simon says touch your toes 512 times.Done!程序中包含了cin语句来从键盘上获取数据。
该程序中包含了除main函数以外的另一个函数simon(),他和main函数定义的格式相同,函数的统一格式如下:type functionname (argumentlist){statements}注意,定义simon()的代码在main()函数的后面,C++中不允许将函数定义在另一个函数内。
每个函数的定义都是独立的,所有的函数的创建都是平等的。
simon()函数的函数头定义如下:void simon(int n)以void 开头表明simon()没有返回值,因此我们不能类是这样的使用它。
simple = simon(3);有返回值的函数如下// convert.cpp -- converts stone to pounds#include <iostream>int stonetolb(int); // function prototypeint main(){using namespace std;int stone;cout << "Enter the weight in stone: ";cin >> stone;int pounds = stonetolb(stone);cout << stone << " stone = ";cout << pounds << " pounds." << endl;return 0;}int stonetolb(int sts){return 14 * sts;}下面是运行情况:Enter the weight in sone: 1414 stone = 196 pounds.程序通过cin语句给stone提供一个值,然后在main函数中,把这个值传递给stonetolb()函数,这个植被赋给sts之后,stonetolb()用return 将 14*sts返回给main()。
函数头中的int表明stonetolb()将返回一个整数。
除了int类型之外,C++的内置数据类型还有:unsigned long、long、unsigned int、unsigned short、short、char、unsigned char、signed char、bool、float、double、long double。
对于数据的输入和输出有几道练习题/showproblem.php?pid=1089至/showproblem.php?pid=1096二、算法基础1. 什么是算法算法是完成特定任务的有限指令集。
所有的算法必须满足下面的标准:a. 输入。
由外部题共零个或多个输入量。
b. 输出。
至少产生一个输出量。
c. 明确性。
每条指令必须清楚,不具模糊性。
d. 有限性。
如果跟踪算法的指令,那么对于所有的情况,算法经过有限步以后终止。
e. 有效性。
每条指令必须非常基础,原则上使用笔和纸就可以实现例 选择排序void SelectionSort(Type a[], int n)//Sort the arrat a[1:n] into nondecreasing order. {for (int i=1; i<=n; i++) {int j=1;for (int k=i+1; k<=n; k++) if (a[k] < a[j]) j = k; Type t = a[i]; a[i] = a[j]; a[j] = t; } }使用该函数时,应将Type 替换为C++中的数据类型3.性能分析程序P 所用时间定义为T(P), T(P)是编译时间和运行时间之和。
下面我们计算一下选择排序运行时所要花费的时间SelectionSort costtimesfor (int i=1; i<=n; i++) c 1 n {int j=1;c 2 nfor (int k=i+1; k<=n; k++)c 3)(1∑=-ni i nif (a[k] < a[j]) c 4)(1∑=-ni i nj = k;c 5 i t Type t = a[i]; a[i] = a[j]; a[j]= t; c 6 n}那么该算法运行的时间()n c t c i n c i n c n c n c n T i ni n i 65141321)()(++-+-++=∑∑==那么,在最坏的条件下,i t 的值应该是)(1∑=-ni i n所以,算法的运行时间为()25435434621)(21)212121(n c c c n c c c c c c n T +++---++=4.渐进符号定义: [大O ]函数))(()(n g O n f =,念做)(n f 是)(n g 的大”oh ”,当且仅当存在正常数c 和0n ,使得对于所有的)(0n n n ≥,有)()(n g c n f ⨯≤。
例 对于所有2≥n 有n n 423≤+,所以)(23n O n =+。
对于所有6≥n 有n n 1016100≤+,所以)(6100n O n =+对于所有100≥n 有22100161001000n n n ≤-+,所以)(6100100022n O n n =-+当然对于所有2≥n 有421024100n n n ≤++,所以)(241042n O n n =++定义: [Ω]函数))(()(n g n f Ω=,念做)(n f 是)(n g 的”omega ”,当且仅当存在正常数c 和0n ,使得对于所有的)(0n n n ≥,有)()(n g c n f ⨯≥。
例对于所有1≥n 有nn n 2262≥+⨯,所以)2(262nnn Ω=+⨯。
当然)(262n n nΩ=+⨯,但是)2()(nn Ω≠Ω。
现然无论是O 还是Ω,都不能精确的描述一个函数定义: [Θ]函数))(()(n g n f Θ=,念做)(n f 是)(n g 的”theta ”,当且仅当存在正常数21,c c 和0n ,使得对于所有的)(0n n n ≥,有)()()(21n g c n f n g c ≤≤。