脚本编程和对拍

常用linux和windows命令

  • 分类 Linux命令 Windows命令
  • 文件列表 ls dir
  • 改变/创建/删除目录 cd/mkdir/rmdir cd/md/rd
  • 显示文件内容 cat/more type/more
  • 比较文件内容 diff fc
  • 修改文件属性 chmod attrib
  • 复制文件 cp copy/xcopy
  • 删除文件 rm del
  • 文件改名 mv ren
  • 回显 echo echo
  • 关闭命令行 exit exit
  • 在文件中查找字符串 grep find
  • 查看/修改环境变量 set set
  • 帮助 man <命令> help <命令>

脚本

windows脚本

@echo off
:loop
	gen > t.in
	a < t.in > a.out
	b < t.in > b.out
	fc a.out b.out
if not errorlevel 1 goto loop
pause

linux脚本

#!/bin/bash
while true; do
	./gen > input   #生成随机数据
	./a < input > a.out
	./b < input > b.out
	diff output a.out b.out          #文件比较
	if [ $? -ne 0 ] ; then break; fi #判断返回值
done

保存为test.sh后,再执行chmod +x tesh.sh, 即可用./test.sh来执行它。

对拍

在平常或比赛时,常常需要验证程序的正确性或找出bug。采用对拍可以极大地提高程序的正确率。一般写一个暴力的程序(不考虑时间、只确保正确性)来和要验证的程序对比。此外还需要一个数据生成器,随机生成数据。利用脚本的批处理来对比程序不一样的结果。

  • 暴力程序
  • 待测试程序
  • 随机数据生成
  • 脚本执行

随机数

利用系统自带的随机数发生 器:在Windows下是环境变量%random%,而在bash中是$RANDOM。它们都是0~32767之间 的随机整数。

#include<bits/stdc++.h>

using namespace std;
typedef long long LL;

#define random(a,b) ((a)+rand()%((b)-(a)+1))
const LL N = 1e16 + 10;

stringstream ss;

LL randll(){//处理成ll形随机数
	LL t = 0;
	for(int i= 0; i<4; i++){
		t *= (LL)1<<15;
		t += rand();
	}
	return t;
}

int main( int argc, int argv[] ) //在脚本中传入%random%随机数
{ 
    srand(argv[0]);
    
    printf("%lld %lld\n", randll(), randll());
    return 0;
}

脚本

@echo off
:loop
	gen %random% > t.in ;生成随机输入
	a < t.in > a.out
	b < t.in > b.out
	fc a.out b.out      ;比较两个文件
if not errorlevel 1 goto loop ;相同继续循环
pause

c实现

#include <stdio.h>
#include <stdlib.h>

int main() {
  // For Windows
  // 对拍时不开文件输入输出
  // 当然,这段程序也可以改写成批处理的形式
  while (true) {
    system("gen > test.txt");  // 数据生成器将生成数据写入输入文件
    system("test1.exe < test.txt > 1.txt");  // 获取程序1输出
    system("test2.exe < test.txt > 2.txt");  // 获取程序2输出
    if (system("fc 1.txt 2.txt")) {
      // 该行语句比对输入输出
      // fc返回0时表示输出一致,否则表示有不同处
      system("pause");  // 方便查看不同处
      return 0;
      // 该输入数据已经存放在test.in文件中,可以直接利用进行调试
    }
  }
}

windows下运行脚本结果

两程序结果无差异

在这里插入图片描述

有差异就会显示并暂停

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木灬U6770

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值