Pascal转C++教程
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
int类型的常量:2、100等(不需要任何后缀) double类型的常量:0.0、1.5、1e50等 char类型的常量:'a'、'd'等(将字符夹在单引 号间) bool类型的常量:true和false unsigned类型的常量:50u、50U(在非负整数后 加上u或U后缀) long long类型的常量:1000ll、1000LL
假如将A类型的变量或常量赋值给B类型的变量,A 类型就会被隐式地转换为B类型。 两个不同类型进行二元运算时,小类型也会被隐式 转换成大类型以便运算。
int a = 100; long long b = a; // int类型的a被隐式转换为long long类型后赋值给b
double x = 1.5; int y = 10; double z = x * y; // int类型的y被隐式转换为double类型后和x相乘
在对应的带符号整型前面加上unsigned,也就是 unsigned int、unsigned short、unsigned long、unsigned long long。其中unsigned int可以直接写为unsigned。 无符号整型不能存储负数,但存储的最大值可以扩 大一倍,例如unsigned的范围就是0~232-1。
十六进制前加0x前缀,例如0x100f、0x100F(大 写小写均可)。 八进制前加0前缀,例如0144,它表示八进制的 144,十进制的值是100。因此不要随便加多余的零, 防止被当做八进制处理。
定义变量的方式为类型名+变量名:
int x1, y1; char x2, y2; double x3, y3; bool x4, y4;
1字节:char、bool 2字节:short、unsigned short 4字节:int、unsigned、long、unsigned long、float 8字节:long long、unsigned long long、 double 12字节:long double
cstdio:包含读入输出相关函数,可以记为 c+std(standard)+io(input&output)。一般来 说这个头文件必然要包含。 cstring:包含C-style字符串相关的函数。 cmath:包含数学相关的函数。 cstdlib:包括随机函数等。 ctime:获取时间当做随机函数的种子。 STL头文件:后面会详细介绍STL。
定义变量时也可以直接指定初值:
int a = 10; char b = 'p'; double c = 1.2; long long d = 1000LL; bool e = true;
C++语言几乎可以在程序的任何地方定义变量,但 定义的变量只有在定义之后才能使用,如果在定义 处之前就使用会给出编译错误。
{相当于Pascal中的begin,}相当于Pascal中的 end,语句和Pascal语言一样用;分隔,一般一行 写一条语句。
C++中有两种方法使用注释(不编译的内容)。 //后到行尾的内容为注释(和Pascal中的//一 样)。 /*和*/中间的内容为注释,相当于Pascal中的 {和}。
C++中有float、double和long double三种实型, 精度依次递增,一般使用double。 char类型只能存储字符,计算机内部是用ASCII码 表示字符的,实际的范围是0~255。字符常量使用 单引号包围的。 bool型只能为true或false。
某些特殊的字符可以用转义的方法表示。转义字符 以反斜杠(\)开头,例如'\n'。下面是比较常见的 五种转义字符: \n 换行 \\ 反斜杠 \? 问号 \' 单引号 \" 双引号
实型->整型:去除小数部分,仅保留整数部分 整型->实型:无变化,精度可能会损失 整型<->字符型:ASCII码 布尔型->整型:true变成1,false变成0 整型->布尔型:0变成false,其他变成true 注意有些转换可能会溢出,例如unsigned->int, long long->int等 由于有隐式类型转换,将数字字符转换成数字可以直接 写成ch-'0',类似的还有ch-'a',其中ch表示数字字 符或小写字母字符。 假如要从大类型转换为小类型(如long long转换为 int、double转换为int),因为精度可能会损失,建 议使用显式类型转换提示自己。
预处理 指令
主函数
#include <cstdio> #define maxn 1000 using namespace std; int a[maxn]; // maxn被替换为1000 int main() { int n; scanf("%d", &n); for (int i = 0; i < n; i ++) scanf("%d", &a[i]); for (int i = 0; i < n; i ++) printf("%d\n", a[i]); return 0; }
头文件(#include) 宏定义(#define)
头文件分为标准头文件和用户自定义的头文件,例 如你可以自己创建一个myheader.h的文件,然后 在别的程序中include它。include的作用就是将 头文件中的代码复制到include的位置。但由于OI 竞赛中只能提交一个源代码文件,所以这种技术在 OI竞赛中用不到。 OI竞赛中,需要include的都是标准头文件。标准 头文件中包括一些预置的常用函数。 OI竞赛中会用到的标准头文件有两类:继承自C的 头文件和STL头文件。C的头文件一般以c开头,例 如前面的cstdio。
int *a, b, &c = b; // a是指向int的指针类型 // b是普通的int类型 // c是指向int的引用类型
和Pascal中一样,C++里也可以定义常量,适当地 定义常量不仅方便编程,也能够使程序意义更明确。
const double pi = 3.141592653; const int inf = 1000000000; const char space = ' ';
指针是指向特定类型内存地址的类型。C++中的&运 算符可以取出某个变量在内存中的地址,以便赋值 给相应的指针类型。后面讲运算符时还会介绍通过 new的方式给指针赋值。空指针的值为0(也可以用 NULL表示)。
int a = 100; int *b = &a; // b是一个指向int类型的指针 // 并且将它初始化为a变量的地址 *b = *b * 2; // 相当于a变量被乘2了 int *c = 0; // c是一个空指针 *c = *c * 2; // 运行到这条时会错误
宏是一种预处理指令,编译器会在编译期将定义的 宏替换为指定内容。 例如在程序的最前面写了#define maxn 1000,那 么程序中所有的maxn都会被替换为1000。这和定 义常量很类似。 更多关于宏的介绍可以参见后面的ppt
和Pascal中的主程序一样,是程序开始执行的地方。 不同的地方是C++的主函数有返回值,类型为int, 并且正常结束时应该返回0。 在其他函数中,也可以用cstdlib头文件中的函数 exit(0)直接退出整个程序,其中的参数0表示的 就是主函数返回值。
Байду номын сангаас
C++语言是C语言的面向对象升级版,基本的语法和 C语言几乎相同,且几乎兼容C语言的所有功能。相 比于C语言,C++语言提供了STL(标准模板库), 这使得C++语言在OI竞赛中相比Pascal语言和C语 言有了不小的优势。
更加精简、灵活的语法 标准模板库(STL)
CPU在单位时间内能一次处理的二进制数的位数。 当前的CPU基本都支持64位字长,但由于操作系统 是32位的,因此当前绝大多数64位CPU都运行在了 32位字长的模式下。 C++中的int类型就是32位长的,也就是占用4字节 (8个位为一个字节)。它和CPU的字长相同,可以 获得最高的效率,是首选的整数类型。
由于我水平有限,讲课的逻辑不一定整理的很好,有些 细节可能也会忘记。对于不懂的问题,你们可以直接在 ,还有一个参考资料就是C++ Reference(C++参考),里面介绍了各个头文件的内 容和相关用法,如果有的用法忘记了可以用于查询。 最后要说的是,我的讲课以面向OI竞赛为主,关于C++ 语言的用法主要讲竞赛中会用到的内容,如果想要系统 的学习整个C++语言,建议买一本C++ Primer阅读。但 阅读书籍可能会需要很长很长时间,并且不少用法竞赛 中也不会涉及到,所以大家视情况量力而行。
int a = 1000000000; long long b = (long long)a * a;
这里int类型的a被显式转换成long long类型后和int类型 的a相乘,由于相乘的两个类型不同,后面int类型的a会被 隐式转换成long long类型后再与前面的a相乘。这里不进 行显式类型转换的话,由于相乘的两个类型都是int,就会 发生溢出,不过溢出这种错误运行时并不会报错。
常量定义后就不能够再修改,除了直接输入常量的 值,也可以通过常量表达式定义常量。
const double pi = acos(-1); const int inf = 10000 * 10000;
对于某些很长的类型名,可以通过typedef在使用 类型之前取别名,例如: typedef long long LL; 这样LL就可以直接表示long long类型了。 再例如: typedef int* pint; 就可以用pint来表示指向int的指针了。
C++中没有过程的概念,无论是否有返回值,都叫做函 数。(这只是概念上的问题,对编程影响不大) C++中的数组下标一定从0开始。(尽量养成从0开始使 用的习惯) C++中的大小写在任何平台下都是敏感的。 C++中的赋值是=,逻辑相等是==。 C++中的表达式比Pascal更广义。(不太建议活用表达 式的语法,因为可能会使得程序难以被看懂) C++的异常很少,基本只有程序没法继续运行时才会异 常跳出,例如段错误。数组下标越界一般是不会异常的, 整数溢出也不会异常(其实有些算法会利用整数溢出的 特性),甚至被0除都不会异常。
除了隐式类型转换,在需要的时候,我们也可以显式地对变 量的类型进行转换。其实我也比较推荐大家尽量使用显式类 型转换,这样可以避免某些可能的错误。显示转换的方法是 (type)x,其中type是要转换成的类型。假如后面要转换的 是一个表达式,需要加上括号,即(type)(a+b),这是由于 运算符优先级的问题,后面会再次提到。
整型 实型 字符型 布尔型
int、short、long、long long 其中int和long为32位带符号整型(Pascal中的 longint),范围是-231~231-1。 short为16位带符号整型(Pascal中的integer), 范围是-215~215-1。 long long为64位带符号整型(Pascal中的 int64),范围是-263~263-1。 int的最大值约为2.1×109,为首选整型类型。
引用和指针有相似的地方,但更恰当的理解是给变 量取别名。引用在定义时必须被恰当地初始化,并 且之后就不能再修改成其他变量的别名。
int a = 100; int &b = a; // b是一个int的引用类型 // 并且它被初始化指向a b = b * 2; // 相当于a变量被乘2了
引用指针类型指向的地址时,需要在指针变量名前 加*,但引用是和普通变量一样直接使用。 定义指针和引用变量时需注意,每一个指针或引用 变量前都要加*或&。