zoukankan      html  css  js  c++  java
  • [ACM] Codeblocks区分本地环境和评测机环境

    做到烦人的模拟题的时候,经常是修复了这个bug,又产生了那个bug,所以要经常调试。

    普通做法:

      修改源代码->编译运行->粘贴输入数据->查看结果->若有bug,回到修改源代码

    经常粘贴输入数据很麻烦(写代码的时候可能复制别的,又要重新复制输入数据)。使用freopen重定向输入,从文件中获取输入数据,减少粘贴输入数据的环节。

    重定向做法:

      在源代码文件夹里新建in.txt文件->把输入数据粘贴到in.txt->保存

      修改源代码->编译运行->查看结果->若有bug,回到修改源代码

    样例代码:(输入字符串后直接输出)

    #include <stdio.h>
    
    char a[1010];
    
    void solve(){
        while(gets(a)){
            /// 处理a
            printf("%s
    ", a);
        }
    }
    
    int main()
    {
        freopen("in.txt", "r", stdin); //从和源代码相同目录下的in.txt中读取文本,作为输入数据
        solve();
        return 0;
    }
    重定向样例

    使用重定向交代码的时候需要把freopen注释掉,否则在评测机环境下找不到in.txt,会没有了输入,WA掉。相信刚开始使用freopen的ACMer都因此WA过吧……

    (正文终于开始了)

    我们可以利用宏来区分本地环境和评测机环境。

    在Codeblock编译器下,操作顺序如图:

    在这里输入完 ACM_LOCAL 后,点下面的OK保存。

    源代码写成:

    #include <stdio.h>
    
    char a[1010];
    
    void solve(){
        while(gets(a)){
            /// 处理a
            printf("%s
    ", a);
        }
    }
    
    int main()
    {
    #ifdef ACM_LOCAL //判断有ACM_LOCAL才执行endif里面的代码
        freopen("in.txt", "r", stdin);
    #endif
        solve();
        return 0;
    }

    本地运行时:

    把源代码交到评测机上结果(使用牛客的调试功能):

    最终我的版本:

    #ifdef ACM_LOCAL 
        // 本地环境,重定向
        freopen("t.txt","r",stdin);
    #else
        // 评测姬环境,关同步(加速cin、cout)
        ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    #endif

    注:

    我是在 https://ac.nowcoder.com/acm/contest/6885/A 试的代码

    顺便说一嘴牛客的编译器:用C++14时,使用gets不能通过编译,改为gets_s也不能通过编译……如果想自己去试试,记得编译器别选C++14,其他的C++11和C都可以用gets

    PS:

    没想到首篇文章是这个。果然懒是第二生产力啊(第一生产力是DDL),大家都来懒吧,嘿嘿~~

  • 相关阅读:
    登陆界面
    信号和槽
    线程同步
    java script简介
    css粘性定位sticky的使用
    vue中使用qrcodejs2生成二维码
    webpack基本使用
    总结一些h5出现的问题及解决方案
    srcset属性配合w宽度描述符配合sizes属性
    vw实现页面布局
  • 原文地址:https://www.cnblogs.com/dazee/p/13516898.html
Copyright © 2011-2022 走看看