联合编译及函数式交互

联合编译的本质是这样的:先将每个 .cpp 编译成 .o 文件,再将 .o 拼成一个 exe 文件。

平时的函数式交互,其实就是在进行联合编译,首先我们有两个 .cpp 文件:code.cppgrader.cpp,其中 code.cpp 用于解答,grader.cpp 用于回答信息,实现 main 函数。那么如何把两个文件拼在一起编译呢,我们考虑在两个文件的开头加入 #include"lib.h",意思是引入 lib.h 的内容,而 lib.h 用于声明交互函数,这样两个 .cpp 文件都可以直接用到。

比如猜 \(1\sim 100\) 中数字(不妨设答案为 \(35\)),一种可能的实现如下:
lib.h

int ask(int x);
void answer(int x);
void solve();

grader.cpp

#include <bits/stdc++.h>
#include "lib.h"
using namespace std;
int res = 35, cnt = 0;
int ask(int x) {
    if (x < 1 || x > 100) {
        cout << "Error: ask(" << x << ") is out of range [1, 100]\n";
        exit(1);
    }
    cnt++;
    if (x < res) return 1;
    if (x > res) return -1;
    return 0;
}
void answer(int x) {
    if (x == res) { cout << "Accepted in " << cnt << " queries\n"; }
    else cout << "Wrong Answer\n";
}
int main() {
    solve();
    return 0;
}

code.cpp

#include <bits/stdc++.h>
#include "lib.h"
using namespace std;

void solve() {
    int l = 1, r = 100;
    while (l <= r) {
        int mid = (l + r) >> 1;
        int res = ask(mid);
        if (res == 0) {
            answer(mid);
            return;
        } else if (res == 1) {
            l = mid + 1;
        } else {
            r = mid - 1;
        }
    }
}

然后编译:
g++ grader.cpp code.cpp -o code
运行:
./code
这样就可以得到结果。

posted @ 2026-04-10 20:37  循环一号  阅读(6)  评论(0)    收藏  举报