最近从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++的跨越的更多相关文章

  1. 【Detection】物体识别-制作PASCAL VOC数据集

    PASCAL VOC数据集 PASCAL VOC为图像识别和分类提供了一整套标准化的优秀的数据集,从2005年到2012年每年都会举行一场图像识别challenge 默认为20类物体 1 数据集结构 ...

  2. 凭吊一下ASP.NET 5,然后跨平台,越跨越开心

    ASP.NET 5 is dead ASP.NET 5在今年早些时候被宣判死刑了.但是这并不影响我们之前在ASP.NET 5乃至ASP.NET MVC平台上的经验累积--没错,微软改名部门又立功了!他 ...

  3. 跨越语言的障碍:C++/CLI 调用 C#

    首先我想投诉一下博客园首页右边栏的广告..最近总是出现很恐怖的整容脸的广告.真的是吓坏了.=.=大家有同感吗? 博客园前一阵子掀起了语言的广泛讨论,事实上语言的争执在整个程序员圈子也没有停止过.以我个 ...

  4. Python黑帽编程 3.4 跨越VLAN

    Python黑帽编程 3.4 跨域VLAN VLAN(Virtual Local Area Network),是基于以太网交互技术构建的虚拟网络,既可以将同一物理网络划分成多个VALN,也可以跨越物理 ...

  5. [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, ...

  6. [LeetCode] Pascal's Triangle 杨辉三角

    Given numRows, generate the first numRows of Pascal's triangle. For example, given numRows = 5,Retur ...

  7. 【leetcode】Pascal's Triangle II

    题目简述: Given an index k, return the kth row of the Pascal's triangle. For example, given k = 3, Retur ...

  8. 【leetcode】Pascal's Triangle

    题目简述: Given numRows, generate the first numRows of Pascal's triangle. For example, given numRows = 5 ...

  9. Pascal 语言中的关键字及保留字

    absolute //指令(变量) abstract //指令(方法) and //运算符(布尔) array //类型 as //运算符(RTTI) asm //语句 assembler //向后兼 ...

随机推荐

  1. Hadoop 架构初探

    对流行Hadoop做了一些最基本的了解,暂时没太大感觉,恩先记点笔记吧. = = Hadoop 基本命令及环境安装 一.下载虚拟机镜像 目前比较流行的有以下三个: (CHD) http://www.c ...

  2. Jsp连接Mysql数据库取数方法

    我将Jsp连接Mysql数据库方法整理如下,供大家学习交流! 1.首先在myslq数据库中新建mldn数据库,并新建emp表.(方法不展开介绍) 插入数据如下: create table `emp` ...

  3. T4模板之菜菜鸟篇

    一.废话 T4(Text Template Transformation Toolkit)是微软官方在VisualStudio 2008中开始使用的代码生成引擎.在 Visual Studio 中,“ ...

  4. [置顶] ZK高级特性:Style定制与客户端集成

    1.ZK与传统MVC框架的集成 由于ZK应用本质上也是基于标准Web技术Servlet框架,因此与其它MVC框架的集成没有什么特别的, 以一个典型场景为例——为一个现有的Web项目(前端采用WebWo ...

  5. 5_Navigation Bar

    5 // // ViewController.swift // Navigation Bar // // Created by ZC on 16/1/9. // Copyright © 2016年 Z ...

  6. DINOR闪存知识

    闪速存储器(Flash Memory)是一类非易失性存储器NVM(Non-Volatile Memory)即使在供电电源关闭后仍能保持片内信息:而诸如DRAM.SRAM这类易失性存储器,当供电电源关闭 ...

  7. poj 3269 Building A New Barn

    #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> ...

  8. WebRTC学习笔记_Demo收集

    1.     WebRTC学习 1.1   WebRTC现状 本人最早接触WebRTC是在2011年底,那时Google已经在Android源代码中增加了webrtc源代码,放在/external/w ...

  9. BaseAdapter使listview设置不同背景图片并添加selector

    前段时间为了实现根据item不同的内容实现不同的背景色google了好久只找到了个隔行换色,通过自定义SimpleAdapter终于实现了此功能,但是定义了selector并没有触发点击效果.今天重新 ...

  10. uva 11137 Ingenuous Cubrency(完全背包)

    题目连接:11137 - Ingenuous Cubrency 题目大意:由21种规模的立方体(r 1~21),现在给出一个体积, 要求计算可以用多少种方式组成. 解题思路:完全背包, 和uva674 ...