Pascal向C++的跨越
最近从pas转向了C++,觉得需要在语言上总结对比一下,以及记录一些注意点,关于STL,还需要之后好好地学习。同时,希望这篇文章对从pas转C++的同学有所帮助。
基本类型
首先是基本类型的比较:
Pascal ——> C++
Integer ——> short int
Longint ——> int(long int)
Dword ——> unsigned int
Char ——> char
Real ——> float
Extended ——> double
Boolean ——> bool
定义
C++的定义法和Pas略有不同,就从整形的定义来窥见一斑:
Pascal var i:longint;
C++ int i;
然后是数组的定义,也比pas简单了许多:
Pascal var a:array[0..10000] of longint;
C++ int a[10000];
需要注意的是C数组定义是从0开始的,而且没有负数下标,所以,如果需要用负数下标的话,需要用映射的方法来解决。
I/O
C++的输入输出有很多方式,介绍一下几种简单的方法:
流
// 输入
Pascal read(a);
C++ cin>>a;
// 换行输入
Pascal readln(a);
C++ cin>>a>>endl;
// 输出
Pascal write(a);
C++ cout<<a;
// 换行输出
Pascal writeln(a);
C++ cout<<a<<endl;
流的用法要加上表头#include <iostream>
C标准I/O
// 输入
Pascal read(a);
C++ scanf(“%d”,&a);
// 换行输入
Pascal readln(a);
C++ scanf(“%d\n”,&a);
// 输出
Pascal write(a);
C++ printf(“%d”,a);
// 换行输出
Pascal writeln(a);
C++ printf(“%d\n”,a);
标准库用法要加上表头 #include <cstdio>
字符串优化读入
这里暂时贴出一些比较复杂的语法,读者可以慢慢在后面的叙述中体会:
int INT()
{
int res;
char ch;
while (ch = getchar(), !isdigit(ch));
for (res = ch - ''; ch = getchar(), isdigit(ch);)
res = res * + ch - '';
return res;
}
运算符
// 单目表达式:
Pascal inc(i) dec(i) inc(i,j) dec(i,j)
C++ i++ i-- i+=j i-=j
这里注意一下i++与++i的区别,因为单目表达式在C中可以套用在双目表达式中,那么两者就有大区别了,比如k=i++表示先将i赋值给k,之后再加1,而k=++i则直接先使i增量,再赋值给k。
// 双目表达式:
Pascal k:=a+b;
C++ k=a+b;
似乎没什么大的区别,加减乘除都是如此,不过div变为 / 罢了,至于同余的符号则是%。
// 三目表达式:
这个是C++独有的语法,相当于pascal中的if语句,且看一个例子:
Max=a>b? a:b;
结果就是a和b的最大值,想必你也从中明白了?的用法,然后简单的也可以写出三个数的最大值:
Max=(a>b)and(a>c) a:b>c b:c
判断语句
基本同pascal一致:
Pascal if x>y then max:=x else max:=y;
C++ if (x>y) max=x else max=y;
需要注意的几点是C++的判断相等语句要用两个等号,否则会自己变成赋值语句:
比如 if (x==y) x*2;
若写成 if(x=y) x*2;意思就是不加判断,直接将y的值赋给x,之后将x乘2,至于不等于,则是!=而不是<>。
还有布尔型的特殊用法若x是正整数,则x的值为true,所以我们可以简化if(x>0)为if(x);
循环
终于要到了最熟悉也是最常用的部分:
// for语句
Pascal for i:=1 to n do inc(ans)
C++ for(i=1,i<=n,i++) ans++
// while语句
Pascal while i<=100 do i:=i+7;
C++ while i<=100 i+7;
// repeat语句
Pascal
Repeat
int(i);
until i>a;
C++
Do
{
I++
}
While(i<=a);
之前忘了说了,Pascal中的begin和end到C++中就变成了{和},方便了许多。
这里有一个神奇的地方,C++的循环式可以跳步数的,比如for循环里面可以将i++改为i+=3或者其他,最有用的就是树状数组中的i+=lowbit(i)了。
函数与过程
这个相当简单,直接上代码:
首先是过程,用大家都熟悉的快排的比较:
Pascal
procedure qsort(l,r:longint);
var
i,j,mid,t:longint;
begin
i:=l; j:=r;
mid:=b[l+random(r-l+)];
repeat
while b[i]<mid do inc(i);
while b[j]>mid do dec(j);
if i<=j then begin
t:=b[i];
b[i]:=b[j];
b[j]:=t;
inc(i); dec(j);
end;
until i>j;
if i<r then qsort(i,r);
if l<j then qsort(l,j);
end;
C++
void qsort(int l,int r)
{
int i,j,t,mid;
mid = b[(l+r)>>];
i = l; j = r;
do {
while (b[i]<mid) i++;
while (b[j]>mid) j--;
if (i<=j)
{
t = b[i];
b[i] = b[j];
b[j] = t;
i++; j--;
}
}
while (i<=j);
if (i<r) qsort(i,r);
if (l<j) qsort(l,j);
}
然后是函数:
Pascal
Function max(a,b:longint):longint; Begin If a>b then exit(a) else exit(b); End;
C++
Int max(int a,int b)
{
a> b? return(a):return(b);
}
一切应该是很了然了。
字符串
一般的类型中C++是没有字符串的(不过可以开string库),所以用字符数组替代:
Char a[100];
这句话就定义了一个字符数组,关于字符数组的函数百度一下或者查看参考书目即可得到,就不多做介绍了(注:用字符数组函数的话要开#include <cstring>),现在看一下之前那个读入的字符串优化:
int INT()
{
int res;
char ch;
while (ch = getchar(), !isdigit(ch));
for (res = ch - ''; ch = getchar(), isdigit(ch);)
res = res * + ch - '';
return res;
}
Isdigit的意思是判断该字符串是否为数字,是则读入,那么这段话的意思就是先略去非数字部分,即空格,然后再读入数字,按位转化。
那么字符数组一定要getchar一个一个读入吗?其实对于一行的字符串,可以用gets函数直接读取。
然后接下来看看string库所提供的字符串:
表头 #include <string>
定义: string s;
同样,关于字符串函数,就不多做介绍了,还是那句话,百度可解决一切问题。
结构体与共用体
Pascal中,我们有一种叫做自定义类别的东西叫type,可以满足同变量附带多属性的需求,那么在C++中,有没有这样的东西呢?答案是肯定的,就是结构体:
Struct student
{
Char name[];
Int mark;
Float win;
}
至于共用体,又是c的一种独特的东西,就是说,许多的类型共用同一块储存空间,内存以最大的记,但是同时只能使用一个,使用另一个时前一个数据丢失:
Union student
{
Char name[];
Int mark;
Float win;
}
宏定义
这个解释起来比较麻烦,确切的说就是你可以自己创建一种语法,将这种语法映射到已有语法中:
#define lowbit(x) x&(-x);
比如以上语句,lowbit(x)就直接等同于x&(-x),当然有一些奇葩的做法比如定义一个宏
#include rep(x,y) for(i=x,i<=y,i++);
那么,for循环的语句在程序中就可以打成rep语句了。
STL
STL实在是覆盖面太广而且太深奥了,只能说,我要在今后不断的积累中掌握它真正的精华,下面用一个小例子来见证STL容器的奇妙:
我们都知道字符串作下标时要用hash来完成,就是链表hash也需要很长的代码,但是在C++中,用map可以轻松解决这一问题,首先,表头#include <map>,之后定义法 map <string,int> x定义一个映射容器,看一段小程序:
#include <string>
#include <map>
#include <iostream>
Int main
{
String name;
Map <string,int> x;
Int mark ,I,n,q;
Cin>>n;
For (i=,i<=n,i++)
{
Cin>>name>>mark;
X[name]=mark;
}
Cin>>q;
For(i=,i<=q,i++)
{
Cin>>name;
Cout<<x[name]<<endl;
}
Return ;
}
这个程序段是读入姓名和分数,在知道姓名的情况下直接知道分数。不过,这只是STL的冰山一角,其更神奇的用途还需要好好学习。
总之,这就是我一个星期天上午所掌握的全部内容,希望对初学者有所帮助。
Pascal向C++的跨越的更多相关文章
- 【Detection】物体识别-制作PASCAL VOC数据集
PASCAL VOC数据集 PASCAL VOC为图像识别和分类提供了一整套标准化的优秀的数据集,从2005年到2012年每年都会举行一场图像识别challenge 默认为20类物体 1 数据集结构 ...
- 凭吊一下ASP.NET 5,然后跨平台,越跨越开心
ASP.NET 5 is dead ASP.NET 5在今年早些时候被宣判死刑了.但是这并不影响我们之前在ASP.NET 5乃至ASP.NET MVC平台上的经验累积--没错,微软改名部门又立功了!他 ...
- 跨越语言的障碍:C++/CLI 调用 C#
首先我想投诉一下博客园首页右边栏的广告..最近总是出现很恐怖的整容脸的广告.真的是吓坏了.=.=大家有同感吗? 博客园前一阵子掀起了语言的广泛讨论,事实上语言的争执在整个程序员圈子也没有停止过.以我个 ...
- Python黑帽编程 3.4 跨越VLAN
Python黑帽编程 3.4 跨域VLAN VLAN(Virtual Local Area Network),是基于以太网交互技术构建的虚拟网络,既可以将同一物理网络划分成多个VALN,也可以跨越物理 ...
- [LeetCode] Pascal's Triangle II 杨辉三角之二
Given an index k, return the kth row of the Pascal's triangle. For example, given k = 3,Return [1,3, ...
- [LeetCode] Pascal's Triangle 杨辉三角
Given numRows, generate the first numRows of Pascal's triangle. For example, given numRows = 5,Retur ...
- 【leetcode】Pascal's Triangle II
题目简述: Given an index k, return the kth row of the Pascal's triangle. For example, given k = 3, Retur ...
- 【leetcode】Pascal's Triangle
题目简述: Given numRows, generate the first numRows of Pascal's triangle. For example, given numRows = 5 ...
- Pascal 语言中的关键字及保留字
absolute //指令(变量) abstract //指令(方法) and //运算符(布尔) array //类型 as //运算符(RTTI) asm //语句 assembler //向后兼 ...
随机推荐
- sql两表联合查询
SELECT yt_fault_componentId FROM yt_fault_component a join yt_fault_assembly b on a.yt_fault_assembl ...
- WCF遇到Oracle问题
解决 选中下图中对网站和项目使用IIS….64位版
- BZOJ 2716: [Violet 3]天使玩偶( CDQ分治 + 树状数组 )
先cdq分治, 然后要处理点对答案的贡献, 可以以询问点为中心分成4个区域, 然后去掉绝对值(4种情况讨论), 用BIT维护就行了. --------------------------------- ...
- Spring学习之优缺点
Spring 1.Spring工作机制及为什么要用? Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的.Spring既是一个AOP框架,也是一IOC容器. SpringFrame ...
- AOP 切面编程
简介 如果你很熟悉面向方面编程(AOP),你就会知道给代码增加“切面”可以使代码更清晰并且具有可维护性.但是AOP通常都依赖于第三方类库或者硬编码的.net特性来工作.虽然这些实现方式的好处大于它们的 ...
- ImageView 各种工具类
package imageUtil; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOut ...
- 【LeetCode题意分析&解答】35. Search Insert Position
Given a sorted array and a target value, return the index if the target is found. If not, return the ...
- 计算BMI指数的小程序
小明身高1.75,体重80.5kg.请根据BMI公式(体重除以身高的平方)帮小明计算他的BMI指数,并根据BMI指数: 低于18.5:过轻 18.5-25:正常 25-28:过重 28-32:肥胖 高 ...
- Python3.5创建虚拟环境
为每个程序单独创建虚拟环境可以保证程序只能访问虚拟环境中的包,保持全局解释器的干净整洁,使其只作为创建(更多)虚拟环境的源. windows下创建虚拟环境 Python3.5自带venv,只需执行py ...
- 【原创】Libjpeg 库使用心得(一) JPEG图像DCT系数的获取和访问
[原创]继续我的项目研究,现在采用Libjpeg库函数来进行处理,看了库函数之后发现C语言被这些人用的太牛了,五体投地啊...废话不多说,下面就进入正题. Libjpeg库在网上下载还是挺方便的,这里 ...