栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

Mac Os下编写对拍程序

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Mac Os下编写对拍程序

简述:

对于信息学竞赛来说,对拍是一个极其重要的技巧,他可以利用一个效率低下但正确率可以保证的程序,利用庞大的随机生成数据来验证我们的高级算法程序。

简单点来说,在比赛过程中,相信大家都经历过写的程序莫名其妙wa了,但是自己手模小数据都没问题的情况,甚至可能自闭到认为是评测姬的问题,这个时候就可以利用对拍来让自己认清wa了的现实,我们可以通过写一个复杂度巨高但绝对正确的暴力,再根据题目代码需求写一个数据生成程序,让暴力代码和wa了的代码同时跑,再写一个运行与结果比较的脚本,实现“简易的评测姬”。如果出现差异就证明你就是wa了,那这个时候就可以拿着数据愉快的debug了

当然,如果拍不出来,也不要怀疑评测姬,绝对是你读错题了

Windows的对拍的方法已经遍地都是,但是针对Mac Os用户却没什么好的博客介绍,所以我今天主要介绍MAC用户如何实现程序对拍

前置准备 Sublime Text

简单介绍一下Sublime Text,他是一个轻量级的文本编辑器,以界面简洁优美闻名

下载的话直接去官网下载即可

简单配置一下Sublime Text

  • 点击Tools->Build System->Build New System

  • 然后输入一下配置:(直接全粘贴过去就行

    {
        "cmd": ["bash", "-c", "g++ '${file}' -std=c++11 -stdlib=libc++ -o '${file_path}/${file_base_name}'"],
        "file_regex": "^(..{FNXX==XXFN}*):([0-9]+):?([0-9]+)?:? (.*)$",
        "working_dir": "${file_path}",
        "selector": "source.c, source.c++",
        "variants":
        [
            {
            "name": "Run",
            "cmd": ["bash", "-c", "g++ '${file}' -std=c++11 -stdlib=libc++ -o '${file_path}/${file_base_name}' && open -a Terminal.app '${file_path}/${file_base_name}'"]
            }
        ]
    }
    
    
    
  • 然后按然后按Command+S保存,命名为C/C++.sublime-build,名字C/C++你随便起,但是后缀名和保存路径不要改,默认就行

    该配置文件会保存在/Users/用户名/Library/Application Support/Sublime Text 3/Packages/User下

  • 然后现在可以写c/c++的代码了,写完之后,点击Tools->Build System->C:C++

    注意,因为我刚刚保存的时候文件名是C/C++,其中的/被自动替换成:了,所有C:C++也就是我刚刚保存的配置文件

  • 选择完编译器之后,按Command+B, 然后选择C:C++ - Run即可运行,下次直接按Command+B就可以运行了

模拟评测姬

举个例子:

给定一个自然数n (n<=100000),求解1+2+3+…+n的和

test1.cpp 需要检验正确性的程序

test2.cpp 暴力程序

data.cpp 数据生成程序

compare.cpp 比较程序

这个题,我们暴力写的程序test2.cpp就是暴力跑1到n的和,用longlong计算

需要检验的程序test1.cpp就写n * (n + 1) / 2,但是用的是int的变量

可以看出n稍大一些的时候就会爆int

在桌面建一个文件夹,写出下面四个程序,都放在该文件夹里面

test1.cpp
#include
using namespace std;
typedef long long ll;
//不开longlong见祖宗!

int main(){
    freopen("test.in","r",stdin);
    freopen("test1.out","w",stdout);
		int n;
    cin>>n;
    cout< 

需要注意的是这里面freopen写的是对应的test1的in和out,别写差批了

test2.cpp
#include
using namespace std;
typedef long long ll;
//不开longlong见祖宗!

int main(){
    freopen("test.in","r",stdin);
    freopen("test2.out","w",stdout);
		int n;
    ll sum = 0;
    cin>>n;
	  for(int i = 1; i <= n; ++i)sum += i;
  	cout< 
compare.cpp 
#include
#include
#include

int main()
{
    int tmp=0;
    for(int i=1;i<=10000;i++)
    {
        system("./data");
        system("./test1");
        system("./test2");

        // if(i/100>tmp) {printf("-- %d --n",i);tmp=i/100;}
        if(system("diff test1.out test2.out"))
        {
            printf("wrong in --> %d n",i);
            break;
        }
        printf("process %d is correctn",i);
    }
    return 0;
}


data.cpp
#include
using namespace std;

int main()
{
    freopen("test.in","w",stdout);
    srand(time(0));
    int a = rand() % 100000;
    cout< 

每个程序写完了以后都需要进行编译,生成一个可执行文件,Sublime Text会直接生成在原程序的旁边

搞完以后就是这样的(后面的三个是对拍过一次后才会出现的数据储存的

现在还需要我们使用MAC自带的终端,command + 空格直接唤出即可

#简单了解一点可能会用到的linux命令
pwd #表示当前在哪个目录下,也就是路径
cd ... #表示进入...的目录
./compare #运行compare程序
control + c # 停止运行

我们打开终端以后需要进入到对拍的文件夹下,第一个方法就是打开文件夹,把文件夹的名字拖到终端去,就能显示文件夹的路径,使用cd命令就能进入,或者就是下载一个超级右键的app,右键文件夹就可以有一个“进入终端”的命令,点击就送

输入./compare后就会开始对拍,找到错误后就会像下面一样

如果一直跑不出来想停下来的话就用control + c

运行后的数据会放在test.cpp中,可以直接看的

大体上就是这样,详细的步骤我可能会抽时间录一下放B站上,暂时先咕了

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/648600.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号