近日,国家发布双减政策,并规范了面向中小学生的全国性竞赛活动。
“双减”之下,还有哪些学科竞赛值得参加呢?人邮君认为由中国计算机学会创办的“全国中学生信息学奥林匹克竞赛”就是一个不错的选择。
信息学竞赛要求参赛选手不仅具有深厚的计算机算法功底、快速并准确编程的能力以及创造性的思维,而且要有团队合作精神和抗压能力,因此编程竞赛在高校、IT公司和其他社会各界中获得越来越多的认同和重视,编程竞赛的优胜者更是互联网大厂们的青睐对象!
在此,人邮君推荐一本《编程竞赛宝典:C++语言和算法入门》,帮助大家循序渐进地掌握C++语言、算法知识,并正确地入门算法竞赛。
- 知识点全面,入门C++与算法:包括数据类型、输入/输出、基本结构、函数、数组、结构体、指针、位运算与进制、STL编程等。
- 设计结构合理,快速熟悉竞赛:循序渐进、由浅入深地讲解C++语言和算法知识,并编排了竞赛模拟、阶段检测等内容,使读者能及时评估自己的学习效果。
- 题目经典,讲解细致:本书根据难易程度和知识体系进行设计和安排,对C++中容易忽略的知识点都有详尽解释,穿插多个小提示,指出常见误区和错误。
- 252个讲解视频:即使学习者自学也可以比较轻松地掌握书中内容,可以通过反复观看视频掌握书中内容。
编程竞赛宝典 C++语言和算法入门
本书作者张新华,毕业于浙江大学和厦门大学。中学高级教师,信息学资深教练,开发了三维图形化C++编程工具Dev-C++ 智能开发平台和Python可视化界面设计软件Visual Python。
张新华老师长期从事中小学信息学竞赛辅导工作,无论是在信息学还是在教学上都有着数十年的深厚积淀,获得过2009年普通高中信息技术现场优质课比赛全国一等奖。培养的学生更多次获得全国青少年信息学奥林匹克联赛国家一等奖及亚洲与太平洋地区信息学奥林匹克竞赛奖牌。
下面,人邮君就来给大家展示一下本书中的竞赛模拟板块,看看如何使用《编程竞赛宝典》一书来备战信息学竞赛吧~
信息学竞赛模拟——制作测试数据上回说到,信息学竞赛中要求选手编写的代码必须能自行读取指定文件中的测试数据进行处理,并将输出答案写入指定的文件中。
但并不是只要通过题目的测试样例就能保证代码是正确的,一般要自制多组不同的测试数据自测。自制的测试数据文件应与可执行文件保存在于同一目录下,如下图所示。
例如某道题为求两数之和,文件名为sum,则可做多组测试数据http://sum1.in,http://sum2.in,http://sum3.in…,再做与之相对应的答案文件sum1.ans,sum2.ans,sum3.ans…。必须保证答案文件是正确的,例如http://sum1.in和sum1.ans的内容可能与下图所示的相似。
写好的sum.cpp的代码内容可能如下所示:
//求两数和
#include <bits/stdc++.h>
using namespace std;
int main()
{
freopen("sum.in","r",stdin); //注意读入文件名为sum.in
freopen("sum.out","w",stdout); //注意输出文件名为sum.out
int a,b;
cin>>a>>b;
cout<<a+b<<endl;
return 0;
}
程序中输入输出语句格式必须严格匹配题目要求的输入输出文件格式,同理,自制的若干组测试数据文件和答案文件,其数据格式也必须严格匹配题目的要求,否则程序无法正确评测。
在平时的训练中,有现成的各类测试软件如Arbiter,Cena等,可以批量测试程序是否正确。但是在正式比赛环境中,不可能给选手提供测试软件和正式测试数据,因此需要选手现场编写测试程序来自测所有的自制测试数据。例如有源程序名为sum.cpp,编译生成名为sum.exe的可执行文件。自制了五组测试数据,输入数据文件分别为http://sum1.in,http://sum2.in,…,http://sum5.in,输出答案文件分别为sum1.ans,sum2.ans,…,sum5.ans,则可写测试代码Check.cpp如下所示。
//测试程序
#include <bits/stdc++.h>
using namespace std;
int main()
{
for (int i=1; i<=5; i++) //5组测试数据,所以循环5次
{
string F="sum";
F+=char(i+48); //整数i转为字符i,'0'的ASCII值为48
//s保存拷贝命令,例如i=1时,为"copy sum1.in sum.in"
string s="copy "+ F+".in sum.in"; //①注意“copy”后有一个空格
system(s.c_str()); //②执行拷贝命令
int time1=clock(); //③获取当前运行时钟数
system("sum.exe"); //④运行由源代码事先编译好的sum.exe文件
int time2=clock(); //程序运行结束后的时钟数
//比较文件命令,例如i=1时,为"fc sum.out sum1.ans";
string Cmd="fc sum.out "+F+".ans"; //⑤
if (!system(Cmd.c_str())) //⑥执行比较文件命令
cout<<" 测试点"<<i<<"通过,用时"<<time2-time1<<"毫秒nn"; //⑦
}
return 0;
}
注释①处将外部指令保存在string中,它会将输入数据文件依次拷贝为http://sum.in文件。例如当循环变量i为1时,将文件http://sum1.in拷贝为http://sum.in,即“copy http://sum1.in sum.in”。
注释②处的system函数用于调用Windows平台上的指令,例如system("cls")可以实现清屏操作;system("pause")可以冻结屏幕,便于观察程序的执行结果等(调试程序时,经常使用该命令暂停程序运行,以观察程序的执行结果)。因为该函数的形参为字符数组,所以需要使用c_str()函数将string类型数据转换为字符数组类型后再使用。
注释③处的clock()函数获得程序从开始运行到这个函数出现时所运行的时钟数,单位为毫秒(1000毫秒=1秒)。
注释④处通过system函数运行之前已编译好的sum.exe文件,sum.exe运行时,将读取http://sum.in文件的数据进行处理,最后将运行结果输出到sum.out文件里。
注释⑤处字符串Cmd中的字符串是用来比较两个类似文件的不同之处的外部指令,具体来说,就是当i=1时,比较sum.out和sum1.ans两文件的异同,当i=2时,比较sum.out和sum2.ans两文件的异同……
注释⑥和⑦处表示若两个文件的内容无差异,则输出测试结果及运行时间。
写好后编译该源代码,例如设文件名为Check.cpp,则编译好的可执行文件为Check.exe。注意所有文件都应保存在同一目录下,如下图所示。
双击运行Check.exe,程序将运行并测试比较每一组测试数据,如下图所示。
正式比赛中,只允许选手提交源文件,不允许提交自制的测试数据及可执行文件,且每个源文件分别保存在一个单独文件中。例如有选手考号为zj_123,所提交三道题的程序名分别为proble1、proble2、proble3,则一般提交的格式如下图所示。
怎么样,看到这么详细的C++竞赛讲解你一定心动了吧!还不抓紧购买学习~
最新评论