当前位置:   article > 正文

c++对拍程序 Windows+Linux_windows对拍

windows对拍

对拍的作用

对拍,将两份代码的结果进行文件比较,从而找出一组hack数据,然后你就可以开开心心的对自己的错误代码进行debug了。而在CSP和NOIP考试中,用到的是Linux系统,所以两者的对拍程序稍微有一些区别。

对拍之前的准备

首先,你要有东西可以拿来作比较。所以,你要有一份你需要hack的代码 sol.cpp;

然后你自己写一个暴力程序,或者在平时的话可以借用他人的AC代码,得到 bf.cpp;

要让程序运行,肯定需要数据输入才可以,那么就再写一个random.cpp,进行数据生成;

值得注意的是,要留意你的暴力程序的时间复杂度,适当调整一下随机数据的范围。数据较小的情况下虽然出错的概率很低,但是在脚本批量生成的情况下,总可以找出问题所在。

那么,在Windows系统下,我们分别运行三个程序再加上freopen,就可以得到三个exe文件和三个txt文件(具体见代码)。这时候就差不多了,再运行对拍程序,就可以进行数据生成和比较文件了。

对拍Code(Windows系统)

以最简单的 A+B problem 为例子,我们就可以得到以下四个程序

  1. // sol.cpp
  2. #include<bits/stdc++.h>
  3. using namespace std;
  4. int main(){
  5. freopen("random.txt","r",stdin);
  6. freopen("sol.txt","w",stdout);
  7. int a,b;
  8. scanf("%d%d",&a,&b);
  9. printf("%d\n",a+b);
  10. return 0;
  11. }
  1. // bf.cpp
  2. #include<bits/stdc++.h>
  3. using namespace std;
  4. int main(){
  5. freopen("random.txt","r",stdin);
  6. freopen("bf.txt","w",stdout);
  7. int a,b;
  8. scanf("%d%d",&a,&b);
  9. while (b) ++a,--b;
  10. printf("%d\n",a);
  11. return 0;
  12. }
  1. // random.cpp
  2. #include<bits/stdc++.h>
  3. using namespace std;
  4. int main(){
  5. freopen("random.txt","w",stdout);
  6. srand(time(0));//初始化种子,使得每次数据随机
  7. int a,b;
  8. a=rand();b=rand();
  9. printf("%d %d\n",a,b);
  10. return 0;
  11. }
  1. //对拍程序
  2. #include<bits/stdc++.h>
  3. using namespace std;
  4. double st,ed;
  5. int main(){
  6. while (1) {
  7. system("random.exe");
  8. //先运行生成数据的代码,得到一组随机数据
  9. st=clock();
  10. //利用clock函数进行时间计算,此时st记录的是运行程序之前的时间
  11. system("sol.exe");
  12. ed=clock();
  13. //同理,ed记录运行程序之后的时间,ed-st即可以得出程序运行所需要的时间
  14. system("bf.exe");
  15. //运行暴力程序,得到正解
  16. if (system("fc sol.txt bf.txt")) { //利用fc进行文件比较
  17. // fc比较文件时如果有不同的地方则会返回true,如果没有不同,即答案正确的时候就会返回false
  18. printf("WA!\n");
  19. return 0;
  20. //此时的random.txt中的数据则为出错的随机数据,即hack数据
  21. }
  22. else printf("AC time:%lf ms\n",ed-st);
  23. //如果此时答案正确,则输出时间
  24. //当然,也可以这么写
  25. /*
  26. if (system("fc sol.txt bf.txt)){
  27. printf("WA!\n");
  28. return 0;
  29. }
  30. else if (ed-st>limited) {
  31. printf("TLE!\n");
  32. return 0;
  33. }
  34. else printf("AC time:%lf ms\n",ed-st);
  35. */
  36. //其中limited由自己在while(1)之前进行定义,或直接用数值代替
  37. }
  38. return 0;
  39. }

 对拍Code(Linux系统)

其实大体上和Windows系统相差不大,稍微注意一下就OK了,(但是不说明细节就是千古罪人),干脆就将Windows系统下的代码复制一遍,再将不同之处标出来就OK了。(绝对不是在水字数)

  1. // sol.cpp
  2. #include<bits/stdc++.h>
  3. using namespace std;
  4. int main(){
  5. freopen("random.out","r",stdin);
  6. freopen("sol.out","w",stdout);
  7. //注意freopen,Linux系统下用的是 .in 和 .out
  8. int a,b;
  9. scanf("%d%d",&a,&b);
  10. printf("%d\n",a+b);
  11. return 0;
  12. }
  1. // bf.cpp
  2. #include<bits/stdc++.h>
  3. using namespace std;
  4. int main(){
  5. freopen("random.out","r",stdin);
  6. freopen("bf.out","w",stdout);
  7. //和sol是一样的
  8. int a,b;
  9. scanf("%d%d",&a,&b);
  10. while (b) ++a,--b;
  11. printf("%d\n",a);
  12. return 0;
  13. }
  1. // random.cpp
  2. #include<bits/stdc++.h>
  3. using namespace std;
  4. int main(){
  5. freopen("random.out","w",stdout);
  6. //同上
  7. srand(time(0));//初始化种子,使得每次数据随机
  8. int a,b;
  9. a=rand();b=rand();
  10. printf("%d %d\n",a,b);
  11. return 0;
  12. }
  1. //对拍程序
  2. #include<bits/stdc++.h>
  3. using namespace std;
  4. double st,ed;
  5. int main(){
  6. while (1) {
  7. system("g++ random.cpp");
  8. system("./a.out");
  9. system("g++ sol.cpp");
  10. st=clock();
  11. system("./a.out");
  12. ed=clock();
  13. system("g++ bf.cpp");
  14. system("./a.out");
  15. if (system("diff sol.out bf.out")) {
  16. printf("WA!\n");
  17. return 0;
  18. }
  19. else printf("AC time:%lf ms\n",ed-st);
  20. /*
  21. if (system("diff sol.txt bf.txt)){
  22. printf("WA!\n");
  23. return 0;
  24. }
  25. else if (ed-st>limited) {
  26. printf("TLE!\n");
  27. return 0;
  28. }
  29. else printf("AC time:%lf ms\n",ed-st);
  30. */
  31. }
  32. return 0;
  33. }

需要注意的是,Linux和Windows差别较大的就是freopen和system里面的东西了,运用的时候需要注意一下。

补充+注意事项

其实对拍听上去很高级,东西也就这么一点点。但是要注意的是,freopen和system里面的名称一定要和程序以及输入输出文件相对应。

然后再稍微注意一下,Windows比较文件用的是 fc,但是Linux比较文件用的是 diff ,其他就没有太大的问题了。然后,你就可以愉快的去对拍了(bushi)。

完结完结。溜了溜了。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/72626
推荐阅读
相关标签
  

闽ICP备14008679号