联合编译及函数式交互
联合编译的本质是这样的:先将每个 .cpp 编译成 .o 文件,再将 .o 拼成一个 exe 文件。
平时的函数式交互,其实就是在进行联合编译,首先我们有两个 .cpp 文件:code.cpp 和 grader.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
这样就可以得到结果。

浙公网安备 33010602011771号