一造垛、介紹
在做題或者正式比賽過程中顺囊,有時候因為樣例有坑所以直接過了樣例斯入,然后拿去評測結果發(fā)現全WA砂碉。那如何在這種情況下檢查自己程序或算法的正確性呢?對拍是一個簡便省事的方案刻两。
所謂“對拍”增蹭,顧名思義,就是讓兩者相互比對磅摹。所謂“兩者”滋迈,一是你要測試的程序,二是一個答案在該程序在一定范圍(時間/空間)內結果必定正確的程序(一般是用暴力求解的程序)户誓。
兩個程序準備好編譯好了以后饼灿,就可以開始準備測試用的輸入樣例了。但是輸入樣例要是人為準備起來的話肯定浪費時間還費腦帝美,更別提在正式比賽的時候了碍彭。人腦靠不住,那就靠電腦。
為了讓測試的樣例更全面硕旗,我們可以用偽隨機數的方法。我們需要用到這幾個的頭文件:
#include <ctime>
#include <cstdlib>
首先利用srand()函數在隨機數表中找一個點女责,作為取隨機數的起始點漆枚。但是如何做到每次選不同的起始點來取數呢?時間是一直在變化的抵知,所以用time(0)取系統(tǒng)時間放入srand()函數中去墙基,每次取的起始點都不一樣。如果用固定值的話刷喜,每次取得的隨機數都會是一樣的残制。
接下來,就按照輸入格式用rand() 函數將輸入樣例的每個變量賦隨機值掖疮〕醪瑁考慮到輸入數據的范圍問題,若在0~n的范圍內浊闪,rand()%n就可以使隨機數范圍控制在[0, n)內了;若是在[1, n)內恼布,因為隨機數下限為0,所以rand()%(n-1)+1就把隨機數控制在了該范圍內搁宾。以此類推折汞,若在[m, n)范圍內,生成隨機數的公式就為rand()%(n-m)+m盖腿。
最后將變量嚴格按輸入格式輸出就好了爽待,后續(xù)步驟可以把輸出的數據添加到 .in文件里。
有了相比對的程序翩腐,有了隨機數生成器鸟款,現在就差一個“發(fā)動機”兼“處理機”了。
為了進行多次對拍以及處理對拍程序輸出的異同茂卦,我們需要一個程序可以進行給定次數下的對拍欠雌,并且在有結果不同時停止。寫這個程序時需要用到這個頭文件:
#include <windows.h>
首先我們要人為規(guī)定進行對拍的次數,在這里咱們可以規(guī)定 cnt = 100,即進行100次對拍疙筹。然后在一層while(cnt--)的循環(huán)里進行對拍富俄。在循環(huán)里層,我們需要把隨機數生成器生成的數據通過代碼寫入 .in文件里而咆,然后將 .in文件分別通過兩個程序運行霍比,最后比對兩個程序 .out文件的內容,若相同暴备,則繼續(xù)下一次對拍悠瞬,若不同,則停止對拍。注意要把所有.cpp文件放在同一個文件夾中浅妆,運行對拍程序即可望迎。
二、程序舉例
1 add.cpp
#include <stdio.h>
int main()
{
int a,b;
scanf("%d %d", &a, &b);
printf("%d\n", a+b);
return 0;
}
2 add2.cpp對照程序
#include <stdio.h>
int main()
{
int a,b;
scanf("%d %d",&a, &b);
while(b--)
{
a++;
}
printf("%d\n", a);
return 0;
}
注意凌外,假如a + b = c辩尊,則b自減1和a自加1后,仍有a + b = c康辑。所以這個程序可以用來檢驗上一個加法程序是否正確摄欲。
3 data.cpp生成隨機數據
#include <stdio.h>
#include <ctime>
#include <cstdlib>
using namespace std;
int main()
{
srand(time(0));
int a,b;
a=rand();
b=rand();
printf("%d %d",a,b);
return 0;
}
4 對拍程序
#include <stdio.h>
#include <windows.h>
using namespace std;
int main()
{
system("g++ data.cpp -o data"); // compile to generate data.exe
system("g++ add.cpp -o add");
system("g++ add2.cpp -o add2");
int cnt = 100;
while(cnt--)
{
system("data > a+b.in"); // run data.exe to generate data, and write the data to a+b.in
system("add < a+b.in > add.out"); // force.exe read data from a+b.in, then write the result to force.out
system("add2 < a+b.in > add2.out");
if(system("fc add.out add2.out")) // file compare
{
break;
}
}
system("pause");
return 0;
}
運行duipai.cpp后,所得結果為
少兒編程疮薇、信息學競賽咨詢請加微信307591841或QQ群581357582