Not Only an Archive

0%

Pascal 转 C++ 急救帖

用来急救,不多废话。

C++ 快速安装与环境配置

注意:这里假设使用的系统是 Windows。

方式一:使用 IDE

以下 IDE 选择一个即可:

方式二:使用 代码编辑器 + 编译器 + 调试器

如果愿意折腾的话就去配吧,这里不说了,就注意一下配置环境变量。

C++ 语法快速提要

首先第一点,C++ 程序都是从 main 这个部分开始运行的。

大括号表示块语句的开始与结束: { 就相当于 Pascal 里面的 begin} 就相当于 end

注意,和 Pascal 一样,C++ 每句话结束要加分号 ;,不过大括号结尾不需要有分号,而且程序结束末尾不用打句号 .

// 表示行内注释,/* */ 表示块注释。

按照惯例,看看 Hello World 吧。

Hello World:第一个 C++ 程序

1
2
3
4
5
6
7
8
#include <iostream> // 导入 iostream 库

int main(int argc, char const *argv[])
{
std::cout << "Hello World!" << std::endl;

return 0;
}

然后编译运行一下,看看结果。

简要解释

第一行,#include <iostream> 的意思是,导入 iostream 这个库。1

看到第二行的 main 了吗?然后,程序从 main 这个里面开始执行。

剩下最重要的一句话是

1
std::cout << "Hello World!" << std::endl;

std::cout 就是输出(cout 就是 C-out)的命令。你可能看过有些 C++ 程序中直接写的是 cout2

std::endl 是输出换行(endl 就是 end-line)的命令,这就像 Pascal 里面的 writewriteln,不过 C++ 里面可没有 coutln 这种东西。

<< 应该很形象的表示了流动,其实就是表示输出怎么「流动」的。这句代码的意思就是,"Hello World!" 会先被推到输出流里面,后面的 std::endl 后被推到输出流里面。

在这里需要注意,在这里 "Hello World!" 是字符串,Pascal 中字符串都是单引号 ' 包围的而双引号是错的,这是一个坑,还需注意的是,在 C++ 中单引号包围的字符是有别的含义的,后面会再提及的。

好了,到这里 Hello World 应该解释的差不多了。

可能有同学会问,后面那个 return 0 是什么意思?那个 int main(int argc, char const *argv[]) 是啥意思?先别管它,一开始写程序的时候先把它当作模板来写吧。

简单练习

  1. 试着换个字符串输出。
  2. 试着了解转义字符。

A+B Problem:第二个 C++ 程序

经典的 A+B Problem 来一下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>

int main(int argc, char const *argv[])
{
int a, b, c;

std::cin >> a >> b;

c = a + b;

std::cout << c << std::endl;

return 0;
}

注:本人的习惯空行较多,如果不习惯,可以去掉空行,没有关系。

简要解释

std::cin 是读入(cin 也就是 C-in),>> 也与输出语法的类似。

这里多出来的语句中最重要的是两个,一个是变量声明语句

1
int a, b, c;

你可能习惯于 Pascal 里面的声明变量

1
2
var
a, b, c: integer;

C++ 里面的声明是直接以数据类型名开头的,在这里就是 int 开头表示接下来要声明变量。

后面一个最重要的语句,赋值语句

1
c = a + b;

这是 Pascal 与 C++ 语法较大的不同,要注意这是个坑,Pascal 里面是 := 而 C++ 里面直接是 =,那么判断是否相等用什么呢?后面会提到。

简单练习

  1. 重写一遍代码,提交到 OJ 上,并且 AC。
  2. 更多的输入输出语法参考这节内容

结束语

好了,到现在为止,你已经掌握了一些最基本的东西了,剩下的就是找 Pascal 和 C++ 里面对应的东西和一些不同的东西了。

重要的不同地方

变量作用域:全局变量与局部变量

C++ 几乎可以在任何地方声明变量。

以下对于 C++ 的变量作用域的介绍摘自 变量作用域 - OI Wiki

作用域是变量可以发挥作用的代码块。

变量分为全局变量和局部变量。 在所有函数外部声明的变量,称为全局变量。 在函数或一个代码块内部声明的变量,称为局部变量。

全局变量的作用域是整个文件,全局变量一旦声明,在整个程序中都是可用的。

局部变量的作用域是声明语句所在的代码块,局部变量只能被函数内部或者代码块内部的语句使用。

由一对大括号括起来的若干语句构成一个代码块。

1
2
3
4
5
6
int g = 20;  // 声明全局变量
int main() {
int g = 10; // 声明局部变量
printf("%d\n", g); // 输出 g
return 0;
}
在一个代码块中,局部变量会覆盖掉同名的全局变量,比如上面的代码输出的 g 就是 10 而不是 20。为了防止出现意料之外的错误,请尽量避免局部变量与全局变量重名的情况。

在 Pascal 里写过程/函数的时候,极易忘记声明局部变量 i 或者 j,而一般主程序里都会有循环,于是大部分情况下 ij 都是全局变量,于是,在这种情况下,在过程/函数中对 i 操作极易出错。关键是,在 Pascal 里面如果忘记声明这种局部变量,编译器编译不报错,程序可以运行。

所以,最重要的一点是,在声明变量,比如循环里面的 i 时,不要用全局变量,能用局部变量就用局部变量。

如果这么做了,就不用担心在函数里的取变量名(比如 i)冲突了。在写 Pascal 时,这是个极易犯错的点,而 C++ 如果遵守原则,就可以轻松避免这个问题。

额外注

Pascal 也可以避免这个问题,仿照 C++ 的方法,主程序里面只有调用过程/函数,不声明 i j 这种极易名称冲突的全局变量,如果需要循环,另外写一个过程进行调用。

C++ 没有过程但有 void,没有函数值变量但有 return

示例对比:

1
2
3
4
5
6
7
8
9
10
11
function abs(x:integer):integer;
begin
if x < 0 then
begin
abs := -x;
end
else
begin
abs := x;
end;
end;
1
2
3
4
5
6
7
int abs(int x){
if (x < 0){
return -x;
} else {
return x;
}
}

如果不想有返回值(也就是 Pascal 里的「过程」),那么就用 voidvoid 就是「空」的意思,什么都不返回。

1
2
3
4
5
6
7
8
9
10
11
var ans: integer;

procedure printAns(ans:integer);
begin
writeln(ans);
end;

begin
ans := 10;
printAns(ans);
end.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>

void printAns(int ans)
{
std::cout << ans << std::endl;
}

int main(int argc, char const *argv[])
{
int ans = 10;
printAns(ans);

return 0;
}

C++ 把函数和过程统统视作函数,连主程序 main 都不放过,比如写 int main,C++ 视 main 为一个整型的函数,这里返回值是 0。它是一种习惯约定,返回 0 代表程序正常退出。

在函数中传递参数

C++ 中没有 Pascal 的 var 关键字可以改变传递的参数,于是 C++ 必须得这么干

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var a, b: integer;

procedure swap(var x,y:integer);
var temp:integer;
begin
temp := x;
x := y;
y := temp;
end;

begin
a := 10; b:= 20;
swap(a, b);
writeln(a, ' ', b);
end.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>

void swap(int* x, int* y)
{
int temp;
temp = *x;
*x = *y;
*y = temp;
}

int main(int argc, char const *argv[])
{
int a = 10, b = 20;
swap(&a, &b);
std::cout << a << " " << b;

return 0;
}

注意,上面的 C++ 代码涉及指针问题。指针问题还是很麻烦的,建议去阅读相关资料。

……还有什么?

暂时没有想到……

那些对应的语法

条件

if 语句

1
2
3
4
5
6
7
8
if (a = b) and (a > 0) and (b > 0) then
begin
b := a;
end
else
begin
a := b;
end;
1
2
3
4
5
if (a == b && a > 0 && b > 0){
b = a;
} else {
a = b;
}

以下有几点需要注意:

  1. Pascal 中的 and 与 C++ 中的 && 的优先级是不同的,C++ 不需要给判断条件加括号了。
  2. Pascal 中判断是否相等是 =,赋值是 :=,C++ 中判断是否相等是 ==,赋值是 =
  3. 如果在 if 语句的括号内写了 a = b 而不是 a == b,程序是不会报错的,而且会把 b 赋值给 a,这个语句 a = b 的返回结果是 true
  4. C++ 就不需要思考到底要不要在 end 后面加分号了。

caseswitch

这个用到的不是很多,就不详细写了。

需要注意的是 C++ 没有 1..n 这种东西,也没有连续不等式(比如 1 < x < 2)这种东西。

循环

for 循环

C++ 里的 for 语句很不一样。

1
2
3
4
5
6
7
8
var i: integer;

begin
for i:= 1 to 10 do
begin
write(i, ' ');
end;
end.
1
2
3
for (int i = 1; i <= 10; i++){
std::cout << i << " ";
}

while 循环

while 还是差不多的。

1
2
3
4
5
6
7
8
9
10
var i: integer;

begin
i := 1;
while i <= 10 do
begin
write(i,' ');
inc(i); // 或者 i := i + 1;
end;
end.
1
2
3
4
5
int i = 1;
while (i <= 10){
std::cout << i << " ";
i++;
}

repeat untildo while 循环

注意,repeat unitldo while 是不同的。

1
2
3
4
5
6
7
8
9
var i: integer;

begin
i := 1;
repeat
write(i, ' ');
inc(i);
until i = 11;
end.
1
2
3
4
5
6
int i = 1;
do
{
std::cout << i << " ";
i++;
} while (i <= 10);

变量

数据类型

请参考:

常量声明

1
const double PI = 3.1415926;

运算符

请参考

已经写得足够简洁了。

数组、字符串、指针……去哪里了?

请看下节内容。

C++ 标准库与参考资料

千万不要重复造轮子(除非为了练习),在想自己动手写一个功能出来之前,先去看看有没有这个函数或者数据结构。

C++ 标准库

C++ 标准库里 <algorithm> 有很多有用的函数比如快排、二分查找等,可以直接调用(再也不用手写快排了)。请参考这个页面:STL 算法 - OI Wiki

里面还有 STL 容器,比如数组、向量(可变大小的数组)、队列、栈等(再也不用手写队列堆栈了),附带有很多标准操作。请参考这个页面:STL 容器简介 - OI Wiki

如果要找关于字符串操作的函数见

C 语言的指针是很灵活的东西,如果想要搞清楚这个东西,建议找本书或者参考手册仔细阅读。

C++ 语言资料

后记

写到这里,很多同学会觉得这一点都不急救啊,有很多东西没有提到啊。那也是没办法的事情。3

虽然这是为了急救,但很多东西像怎么把字符串转化为数字,怎么搜索字符串中的字符,这些东西也不适合一篇精悍短小的急救帖,如果把这些都写出来,那就是一本 C++ 入门教材了。

所以,请充分利用参考手册与搜索引擎。

然后,需要指出的一点是,上面说 C++ 的语法,其实有很多是从 C 语言来的,这个标题应该这么写比较好——《Pascal 转 C/C++ 急救帖》。

Pascal 在上个世纪后半叶是门很流行的语言,它早于 C 语言,不过现在 Pascal 已经成为历史了。Pascal 后期的发展也是有的,比如 Free Pascal 这个开源编译器项目,增加面向对象的特性(Delphi 语言)。Pascal 目前的用处除了在信息竞赛外,有一个特点是其他语言没有的——编译支持非常非常多老旧机器,比如 Gameboy 这种上个世纪的任天堂游戏机。

最后,Pascal 的圈子其实很小,C/C++ 的圈子很大,帮助手册与教程很多很全,一定要掌握好英语。世界上还有很多很多编程语言,而计算机这门学科与技术不光是信息竞赛和编程语言。


  1. Pascal 其实是有库文件的,只不过,很多同学从来都没有用过……↩︎

  2. 有关这个问题,请见 这节底下的注释「什么是 std?」。↩︎

  3. 实质上是太懒不想写。↩︎