资源预览内容
第1页 / 共14页
第2页 / 共14页
第3页 / 共14页
第4页 / 共14页
第5页 / 共14页
第6页 / 共14页
第7页 / 共14页
第8页 / 共14页
第9页 / 共14页
第10页 / 共14页
亲,该文档总共14页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
信息学竞赛中可能用到的信息学竞赛中可能用到的 C+C+语法语法信息学竞赛中可能用到的 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 /要使用输入输出流必须的头文件,注意没有“.h“using namespace std; /要使用 cin 与 cout 必须包括的命名空间int main(int argc, char *argv)int a, b;cinab; /cin 是标准输入流,此语句从键盘输入两个整数,依次存入 a、b 中if(a /要使用文件输入输出流必须的头文件using namespace std; /要使用 ifstream 与 ofstream 必须的命名空间ifstream inf(“in.txt“); /定义文件输入流 inf,并关联到in.txtofstream ouf(“out.txt“); /定义文件输出流 ouf,并关联到out.txtint main(int argc, char *argv)int a, b;infab; /从 inf 中输入两个整数if(ausing namespace std;#define N 10ifstream inf(“in.txt“);ofstream ouf(“out.txt“);struct stu /定义结构体 stuchar name20;int score;int main(int argc, char *argv)int i;stu data10; /结构体名称“stu“可以直接用于定义变量for(i=0;idatai.namedatai.score;int j; /在使用前定义变量for(i=0;ii;j-)if(dataj.scoredataj-1.score)stu t;t=dataj;dataj=dataj-1;dataj-1=t;for(i=0;iusing namespace std;int main(int argc, char *argv)int *p;p=new int; /为指针 p 申请一个整数的空间,new 后的类型必须与*p 的类型一致*p=3;coutusing namespace std;ifstream inf(“in.txt“);ofstream ouf(“out.txt“);struct stuchar name20;int score;int main(int argc, char *argv)int i, n;stu *data; /定义一个 stu 的指针,用于分配数组infn;data=new stun; /分配 n 个 stu 的空间,由 data 指向for(i=0;idatai.namedatai.score; /使用时与静态数组没区别int j;for(i=0;ii;j-)if(dataj.scoredataj-1.score)stu t;t=dataj;dataj=dataj-1;dataj-1=t;for(i=0;iusing namespace std;void swap(int t=a; /交换变量的值a=b;b=t;int main(int argc, char *argv)int a, b;cinab;cout=10000)个整数,然后查找 m(m=5000)个整数是否在其中,并将结果输出到 out.txt 中。in.txt 的结构:首行两个整数,分别表示 n 和 m,其后是 n+m 行,每行一个整数。前 n 行是原始整数,后 m 行是待查整数。out.txt 中输出 m 行,每行一个整数,表示待查的整数,空格后是“IN“或“OUT“,表示该数是否在原始集合中,输出时请保持输入时 m 个数的前后次序。算法分析由于原始集合较大,采用顺序查找明显是不行的。因此决定使用二叉搜索树(BST,当然也可以考虑快速排序后的二分或用哈希表) 。源程序#include using namespace std;struct node /二叉树结点结构体int data;node *left, *right;node() /构造函数,使初始化工作自动完成,函数名与结构体名相同left=NULL;right=NULL;node() /析构函数,使清理工作自动完成,函数名为结构体名前加“left=NULL;right=NULL;node *root=NULL; /BST 的根int n, m;ifstream inf(“in.txt“);ofstream ouf(“out.txt“);void build() /构造 BSTint i, d;infd;root=new node; /先读入一个,建个“最小的树“root-data=d;for(i=0;id;node *temp;temp=root;while(true)if(dtemp-data)/向右枝查找if(temp-right!=NULL)temp=temp-right;elsetemp-right=new node; /插入temp=temp-right;temp-data=d; /只处理 data 即可,left 与 right/已经在 new 时通过构造函数自动设置为 NULL 了。break;else if(ddata) /向左枝查找if(temp-left!=NULL)temp=temp-left;elsetemp-left=new node; /插入temp=temp-left;temp-data=d;break;else /出现相同整数,则不再处理break;bool search(int d) /查找 BSTnode *temp;temp=root;while(temp!=NULL)if(d=temp-data)/找到break;else if(dtemp-data)/向右枝查找temp=temp-right;else/向左枝查找temp=temp-left;if(temp=NULL)return false;elsereturn true;void clear(node *clear(root-left);clear(root-right);delete root;/归还空间,自动执行析构函数int main(int argc, char *argv)infnm;build();int i, d;for(i=0;id;if(search(d)oufd “IN“endl;elseoufd “OUT“endl;clear(root);return EXIT_SUCCESS;以上是在编写 OI 程序时可能会用到的 C+语法,虽然并不复杂,却可以使编写过程更加方便,减少出错的概率。2005 年 9 月 7 日1
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号