• 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 ”,&a);

      // 输出

      Pascal  write(a);

      C++  printf(“%d”,a);

      // 换行输出

      Pascal  writeln(a);

      C++  printf(“%d ”,a);

      标准库用法要加上表头 #include <cstdio>

    字符串优化读入

      这里暂时贴出一些比较复杂的语法,读者可以慢慢在后面的叙述中体会:

    int INT()
    
    {
    
      int res;
    
      char ch;
    
      while (ch = getchar(), !isdigit(ch));
    
      for (res = ch - '0'; ch = getchar(), isdigit(ch);)
    
      res = res * 10 + ch - '0';
    
      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+1)];
    
      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)>>1];
    
      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 - '0'; ch = getchar(), isdigit(ch);)
    
      res = res * 10 + ch - '0';
    
      return res;
    
    }

      Isdigit的意思是判断该字符串是否为数字,是则读入,那么这段话的意思就是先略去非数字部分,即空格,然后再读入数字,按位转化。

    那么字符数组一定要getchar一个一个读入吗?其实对于一行的字符串,可以用gets函数直接读取。

      然后接下来看看string库所提供的字符串:

      表头 #include <string>

      定义: string s;

      同样,关于字符串函数,就不多做介绍了,还是那句话,百度可解决一切问题。

    结构体与共用体

      Pascal中,我们有一种叫做自定义类别的东西叫type,可以满足同变量附带多属性的需求,那么在C++中,有没有这样的东西呢?答案是肯定的,就是结构体:

    Struct student
    
    {
    
      Char name[5];
    
      Int mark;
    
      Float win;
    
    }

          至于共用体,又是c的一种独特的东西,就是说,许多的类型共用同一块储存空间,内存以最大的记,但是同时只能使用一个,使用另一个时前一个数据丢失:

    Union student
    
    {
    
      Char name[5];
    
      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=1,i<=n,i++)
    
      {
    
        Cin>>name>>mark;
    
        X[name]=mark;
    
      }
    
      Cin>>q;
    
      For(i=1,i<=q,i++)
    
      {
    
        Cin>>name;
    
        Cout<<x[name]<<endl;
    
      }
    
    Return 0;
    
    }

      这个程序段是读入姓名和分数,在知道姓名的情况下直接知道分数。不过,这只是STL的冰山一角,其更神奇的用途还需要好好学习。

     

      总之,这就是我一个星期天上午所掌握的全部内容,希望对初学者有所帮助。

                                              

    愿你出走半生,归来仍是少年

  • 相关阅读:
    【刷题】HDU 6183 Color it
    【刷题】HDU 3435 A new Graph Game
    【刷题】HDU 1853 Cyclic Tour
    【刷题】BZOJ 5418 [Noi2018]屠龙勇士
    【刷题】BZOJ 5415 [Noi2018]归程
    【刷题】BZOJ 4636 蒟蒻的数列
    【刷题】BZOJ 4443 [Scoi2015]小凸玩矩阵
    vue_过滤器: 对要显示的数据进行特定格式化后再显示
    vue_过渡_动画
    vue_实例_组件的生命周期
  • 原文地址:https://www.cnblogs.com/forever97/p/3452708.html
Copyright © 2020-2023  润新知