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

C++实现一个简单java对拍程序

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

C++实现一个简单java对拍程序

C++实现一个简单java对拍程序

电梯月官方给的测试数据实在是太水了,多亏了dalao的评测机我才能够发现自己的bug。

对于电梯而言,因为其为多线程,且不限制调度防止,导致了其最终结果的多样。因此需要写一个程序专门来进程正确性的判断。
对于一般的串行程序,其结果唯一,因此并不需要专门写一个正确性判断程序,只需要多找几个人的程序进行对拍就好了,省时又高效。

在此简述如何使用cpp实现一个对拍程序。

总体设计

对拍器主要要做3步:

  1. 数据生成
  2. 运行程序
  3. 比较结果

最后的文件结构

tester
	|- generator			
    	|- generator.cpp		// 随机数据生成器
    	|- special_generator.cpp
    |- input					// 存放输入数据
    	|- in.txt				// 随机数据生成器生成的输入,每次都会刷新
    |- output1
    	|- out.txt				// Mycode.jar的输出
    |- output2
    	|- out.txt				// HisCode.jar的输出
    |- tester.cpp				// 对拍程序
    |- MyCode.jar
    |- HisCode.jar
对拍器

其需要调用相应的程序以实现以上的三个步骤:

在此处借助system()函数,通过命令行调用来操作。(需要#include )

第一步:数据生成

system(".\data_generator\generator.exe");其会运行generator.exe,新生成一组数据并存到.\input\in.txt中。

第二步:运行程序

我选择先在IDEA中将程序打包成jar包,然后进行测试,这样有至少以下的2个好处

  1. 运行起来的命令很简单
  2. 向同学要代码时,不需一整个项目的文件,只要jar包即可

只需要使用system("java -jar MyCode.jar")就可以运行jar包,在cmd输入相应命令,就可以在键盘中输入同时在终端中看到结果。现在需要将其改成文件输入和文件输出。

可以:使用< file.txt将file.txt作为输入。可以写成:system("java -jar MyCode.jar < .\input\in.txt > .\output\out.txt")。这样就实现了文件读入和文件输出。

第三步:比较结果

使用命令fc file1.txt file2.txt来比较两个文件,其相同时返回0,否则返回一个非0值。所以可以采用如下写法

 if (system("fc .\output\out.txt .\zgy_output\out.txt")) {
    printf("发现错误!!!n");
    return 0;
} else {
    printf("通过第%d组随机数据n", i);
}

通过简单润色修改,最后的对拍程序如下:

// tester.cpp

#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;

int main() {
    int random_test_time = 800;  // 测试800组随机数据
    double start_time1, end_time1;
    double start_time2, end_time2;

    for (int i = 1; i <= random_test_time; i++) {
        printf("===================================================n");

        system(".\data_generator\generator.exe"); // 生成随机数据

        start_time1 = clock();	// 记录程序开始的时间
        system("java -jar MyCode.jar < .\input\in.txt > .\output1\out.txt");
        end_time1 = clock();	// 记录程序结束的时间,最后相减就是运行的时间

        start_time2 = clock();
        system("java -jar HisCode.jar < .\input\in.txt > .\output2\out.txt");
        end_time2 = clock();

        if (system("fc .\output1\out.txt .\output2\out.txt")) {
            printf("发现错误!!!n");
            printf("your code's run time : %.1lf sn", (end_time1 - start_time1) / 1000);
            printf("test code's run time : %.1lf sn", (end_time2 - start_time2) / 1000);
            return 0;
        } else {
            printf("通过第%d组随机数据n", i);
            printf("your code's run time : %.1lf sn", (end_time1 - start_time1) / 1000);
            printf("test code's run time : %.1lf sn", (end_time2 - start_time2) / 1000);
        }

        printf("===================================================nnnn");
        Sleep(1000);	// 停顿一下,让数据生成程序取到不同的时间种子
    }
    return 0;
}

运行结果如图所示:

数据生成器

一般包括2种:随机大数据,特征数据。

此处介绍随机大数据生成一个模板。其会随机生成3000个随机数,一行一个。

#include 
#include 
#include 
using namespace std;

int main() {
    static int Total_Request_Num = 3000;
    FILE *out;
    out = fopen(".\input\in.txt", "w");	// 尤其注意此处,当tester.cpp调用此程序时,"."是tester.cpp所在的位置,不是当前的generator.cpp
    //out = fopen("..\input\in.txt", "w");
    srand(time(0));

  	for (int i = 0; i < Total_Request_Num; i++){
		fprintf(out, "%dn", rand() % 1001);
	}
    fclose(out);
    return 0;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/866447.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

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

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