信息学竞赛中可能用到的C++语法
冯文科
    虽然我们总是习惯写“C/C++”,其实大家都知道C与C++是两种不同的语言:C++是C的“超集”——它“几乎”完全兼容C的语法,同时也提供非常多特有的语法与概念。
    本文并不想全面介绍C++的语法与概念——那足够写一本一寸多厚的专业书籍——只是将信息学竞赛中可能要用到的C++语法做个简要介绍,它们的加入将使您原有的C程序更简洁、清晰,书写更方便。
    首先要说明的一点是:C++程序源文件的扩展名是“cpp”,而不是C程序的“c”,这也是多数编译器识别一个源程序是C++程序还是C程序的标准。由于C++是C的“超集”,因此您可以在“*.cpp”文件中原样书写C程序而且“几乎”不会遇到什么问题。特别强调:本文中介绍的语法,都是只能在“*.cpp”文件中使用的C++语法,C语言的编译器不会编译通过。(本文中所有源程序都在Dev-C++中编译通过。)
一、输入输出流。
    C++中对输入输出部分做了很大的修改,C语言中使用scanf、fscanf、printf、fprintf进行的输入输出工作都由对“流(stream)”的操作代替了。您可以向一个输出流中用“<<”符号“插入”一些内容——相当于输出,也可以用“>>”符号从一个输入流中“提取”一些内容——相当于输入。
[例1](从键盘读入及向屏幕输出)从键盘读入两个整数,由小到大排序后输出,用空格分开。
[源程序]
#include <iostream> //要使用输入输出流必须的头文件,注意没有“.h
using namespace std; //要使用cincout必须包括的命名空间
int main(int argc, char *argv[])
{
  int a, b;
  cin>>a>>b; //cin是标准输入流,此语句从键盘输入两个整数,依次存入ab
  if(a<b)
    cout<<a<<' '<<b<<endl;//cout是标准输出流,输出到屏幕
  else
    cout<<b<<' '<<a<<endl;//依次将“<<”连接的各项输出,endl表示换行
  return EXIT_SUCCESS;
}
    若从键盘输入:
4 3
    则输出
3 4
通过上面的例子,相信您已经对输入输出流的使用有了一个大概的了解。下面一个例子演示如何利用输入输出流对文本文件进行读写操作,您也将从这个例子开始逐渐看到C++语法的方便之处。
[例2](文件的输入输出)从文件in.txt中输入两个整数,由小到大排序后输出到中,用空格分开。
[源程序]
#include <fstream> //要使用文件输入输出流必须的头文件
using namespace std; //要使用ifstreamofstream必须的命名空间
ifstream inf("in.txt"); //定义文件输入流inf,并关联到in.txt
ofstream ouf(""); //定义文件输出流ouf,并关联到
int main(int argc, char *argv[])
{
  int a, b;
  inf>>a>>b; //inf中输入两个整数
  if(a<b)
    ouf<<a<<' '<<b<<endl; //ouf输出结果。
  else
    ouf<<b<<' '<<a<<endl; 
  return EXIT_SUCCESS;
}
    如果in.txt的内容为:
4 3
    则的内容为:
3 4
由例2可以看出,对文本文件的输入输出与标准输入输出从格式上讲是一致的,只是需要定义一下文件输入输出流,且定义时只需说明文件名即可,文件的打开与关闭动作是C++自动完成的,用户不必处理,这样就不会出现忘记关闭文件而丢失数据的情况了。
二、“//”开始的单行注释。
    上面的两个例子中其实已经使用这个语法了,一个语句行中从“//”开始后面的文字都是注释——换行后就不是了,因此这是“单行注释”,与常用的“/*”、“*/”不同。
三、有了bool类型。
    C++也有“真正”的布尔类型了,就是“bool”,布尔型的变量可以有两个值true和false。其中“bool”、“true”和“false”都成为了C++的关键字。
四、可以按需要随时定义变量。
    在C语言中,变量只能定义在所有可执行语句之前,这样,每当我们需要定义一个新变量时,都要向前翻。在C++中就不用,您可以“随时随地”地定义变量,当然,同一作用域中的变量仍然是不准重名的。这在下面的例子中可以看到。
五、结构体(struct)的名称、共用体(union)的名称及枚举(enum)的名称都可以直接用做类型名而定义变量。
直接用一个例子来说明即可。
[例3](结构体语法)从文件in.txt中读入十个学生的姓名与成绩,将学生信息按成绩由大到小排序后输出到中,每个学生一行。
[源程序]
#include <fstream>
using namespace std;
#define N 10
ifstream inf("in.txt");
ofstream ouf("");
struct stu //定义结构体stu
{
  char name[20];
  int score;
};
int main(int argc, char *argv[])
{
  int i;
  stu data[10]; //结构体名称“stu”可以直接用于定义变量
  for(i=0;i<N;i++) //输入
    inf>>data[i].name>>data[i].score;
  int j; //在使用前定义变量
  for(i=0;i<N-1;i++) //score为键值的大数上浮的冒泡排序
    for(j=N-1;j>i;j--)
      if(data[j].score>data[j-1].score)
      {
        stu t;
        t=data[j];
        data[j]=data[j-1];
        data[j-1]=t;
      }
  for(i=0;i<N;i++) //输出
    ouf<<data[i].name<<' '<<data[i].score<<endl;
  return EXIT_SUCCESS;
}
    如果in.txt的内容为:
zhang 80
wang 74
li 95
zhao 96
chen 90
xiao 100
qian 80
sun 66
liu 75
dong 80
    则的内容为:
xiao 100
zhao 96
li 95
chen 90
zhang 80
qian 80
dong 80
liu 75
wang 74
sun 66
六、new与delete。
    new与delete都是C++的关键字,用于动态申请与归还内存,比C语言中原有的malloc与free函数要方便。
[例4](new与delete)new与delete的练习。
[源程序]
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
  int *p;
  p=new int; //为指针p申请一个整数的空间,new后的类型必须与*p的类型一致
  *p=3;
  cout<<*p<<endl;
  delete p; //归还空间,不必指出归还多少
  return EXIT_SUCCESS;
}
    程序最终输出:
3
    new与delete的另一个用途就是动态数组——即事先无法确定大小的数组,使用时按需分配空间,这里要用到C语言的一个概念:一维数组名实际是指针变量。
[例5](动态数组)文件in.txt中有n个学生的姓名和成绩,请将学生信息按成绩由大到小排序后输出到文件中。每个学生一行。in.txt文件的结构为:首行一个整数,表示学
生个数n,以下n行每行一个姓名与成绩,用空格分开。
[源程序]
#include <fstream>
using namespace std;
ifstream inf("in.txt");
fprintf作用ofstream ouf("");
struct stu
{
  char name[20];
  int score;
};
int main(int argc, char *argv[])
{
  int i, n;
  stu *data; //定义一个stu的指针,用于分配数组
  inf>>n;
  data=new stu[n]; //分配nstu的空间,由data指向
  for(i=0;i<n;i++)
    inf>>data[i].name>>data[i].score; //使用时与静态数组没区别
  int j;
  for(i=0;i<n-1;i++)
    for(j=n-1;j>i;j--)
      if(data[j].score>data[j-1].score)
      {
        stu t;
        t=data[j];
        data[j]=data[j-1];
        data[j-1]=t;
      }
  for(i=0;i<n;i++)
    ouf<<data[i].name<<' '<<data[i].score<<endl;
  delete [] data; //回收空间,注意回收数组空间要用[],不必指定归还大小
  return EXIT_SUCCESS;
}
七、引用变量
    在C语言中,函数的参数可以用数值变量或指针来传递。在C++中,函数的参数有了第三种传递方法——引用传递。效果上等同于PASCAL中的var变量,可以在函数中修改变量的实际参数的值。比如下面的例子就使用了引用参数。
[例6](引用参数)写一个函数,交换两个变量的值。
[源程序]
#include <iostream>

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。