diff options
| author | Richard Qin <richard.qin.x@gmail.com> | 2025-10-14 12:57:38 +0000 |
|---|---|---|
| committer | Richard Qin <richard.qin.x@gmail.com> | 2025-10-14 12:57:38 +0000 |
| commit | 275e2ca033a880fe959e7eb4e83268a70318ba57 (patch) | |
| tree | 312cad2e9d0dbeb608fdd300061b854e4cfa891b /README.md | |
| download | datalab2026-275e2ca033a880fe959e7eb4e83268a70318ba57.tar.gz datalab2026-275e2ca033a880fe959e7eb4e83268a70318ba57.tar.xz | |
Initial commit
Diffstat (limited to 'README.md')
| -rw-r--r-- | README.md | 212 |
1 files changed, 212 insertions, 0 deletions
diff --git a/README.md b/README.md new file mode 100644 index 0000000..be9b4e2 --- /dev/null +++ b/README.md @@ -0,0 +1,212 @@ +# DataLab + +``` + ________ ________ _________ ________ ___ ________ ________ +|\ ___ \|\ __ \|\___ ___\\ __ \|\ \ |\ __ \|\ __ \ +\ \ \_|\ \ \ \|\ \|___ \ \_\ \ \|\ \ \ \ \ \ \|\ \ \ \|\ /_ + \ \ \ \\ \ \ __ \ \ \ \ \ \ __ \ \ \ \ \ __ \ \ __ \ + \ \ \_\\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \____\ \ \ \ \ \ \|\ \ + \ \_______\ \__\ \__\ \ \__\ \ \__\ \__\ \_______\ \__\ \__\ \_______\ + \|_______|\|__|\|__| \|__| \|__|\|__|\|_______|\|__|\|__|\|_______| +``` + +模板仓库:[RUC Datalab-2025Fall](https://github.com/RUCICS/Datalab-2025Fall) + +## 项目编译与环境指南 + +C 语言编译环境 + +```bash +sudo apt-get update +sudo apt-get install build-essential +sudo apt-get install gcc-multilib +``` + +如果有 C 语言环境问题,你可以选择删除 `gcc` 和 `g++` 然后重新执行上述指令。 + +```bash +sudo apt-get remove gcc g++ +``` + +如果仍有问题,可以联系李甘助教获取服务器登陆信息,在服务器上完成本实验。 + +如果你想获得 VSCode 的最佳代码提示体验,请指定 `cStandard` 为 `gnu99`: + +```json +{ + "C_Cpp.default.cStandard": "gnu99" +} +``` + +> 面向高级用户,我们还提供了 devcontainer 的支持。有需要的同学可以自行使用。 + +### 如何编译 + +```bash +make +``` + +> 如果你不懂什么是 `make`,请询问 AI 生成工具 “什么是 make,我应该在什么时候执行 make,make 的原理是什么” + +### Quick Start + +```bash +# 在我们的服务器上,不需要执行这一行 +sudo apt-get update && sudo apt-get install build-essential gcc-multilib + +# 其中 annaFJM 改成你的用户名 +git clone git@github.com:RUCICS/datalab2025fall-annaFJM.git + +cd datalab2025fall-annaFJM + +make +python3 test.py +# 然后你应该看到最后一行输出 Total Points:0 的字样 +``` + +## 实验简述 + +本实验考察对数的二进制表示和位运算的认识。具体来说,本实验会给出多个函数要求实现,比如求两个数的异或,但你只能用限制范围内的位运算操作符(有时候允许更多)。 + +我们的题目和你们要完成的函数都在 [`bits.c`](./bits.c) 文件中。 + +### 一个例子 + +```c +/* + * bitAnd - x & y using only ~ and | + * Example: bitXor(4, 5) = 1 + * Legal ops: ~ | + * Max ops: 7 + * Difficulty: 1 + */ +int bitAnd(int x, int y) { + return ~(~x | ~y); +} +``` + +如在 `bitAnd` 题目中,你需要修改代码,使得: + +1. 保证函数的返回值符合要求 +2. 保证只使用了 `Legal ops` 中给出的符号 +3. 符号数的总数不能超过 `Max ops` + +### 具体要求 + +你被允许: + +- 对于整型题目,即 `float_i2f` 之前的题目,你被允许定义 `int` 变量,即不能定义 `unsigned`,除非题目允许 +- 对于浮点数题目,即 `float_i2f` 及之后的题目,你被允许定义 `int` 和 `unsigned` 的变量 + +你被禁止: + +- 禁止使用控制流语句,比如 `if`, `else`, `for`, `while`,除非题目允许 +- 禁止使用非位运算符号,比如 `&&`, `||`, `-`, `?:`,`!`, `>`, `==` 除非题目允许 +- 禁止使用其他不在 `Legal ops` 中的操作符 +- 特别说明,例如 `<<=`, `++` 这类 `x = x ? 1` 的 `?=` 符号,我们视作 `?` 符号,换句话说,只要 `?` 在 `Legal ops` 里,则 `?=` 也在。 +- 禁止超过 `Max ops` 个符号数 +- 禁止使用函数,或调用任何函数 +- 禁止使用宏 +- 禁止定义其他类型的变量,比如 `float`,`char`,结构体,数组,联合体等 +- 禁止使用类型转换: + - 我们绝对禁止显式类型转换,如 `(float)x` 和 `(int)(1.0f)` + - 对于隐式类型转换,如果你感觉你的解法利用了隐式类型转换,那你应该尽量避免;如果你的解法不依赖于该隐式类型转换,则无所谓。如有符号数和无符号数计算时,有符号数会被隐式类型转换为无符号数 +- 禁止使用任何浮点常量,比如 `1.0f`,当然你可以使用它的二进制形式代表的整数,注意不要违反上一条规则 +- 禁止使用 Undefined Behavior,比如对一个 32 位数逻辑右移超过 31 位,你应该假设我们的机器会在这时候返回不确定的结果,不得利用 Undefined Behavior,以免我们跨平台编译的时候结果不一致 +- 我们要求你的编译不能有任何警告,在迫不得已的情况下,请尽量用一些代码内编译器指令来消除警告,比如 `__attribute__((unused))` +- 禁止修改除了 `bits.c` 以外的文件 +- 禁止给 `bits.c` 文件添加任何头文件,这会导致测试错误。这不影响你使用 `printf` 函数, +但使用 `printf` 函数会与 `test.py` 脚本冲突,你可以使用下文的 `btest` 脚本来调试正确性, +正确性通过后再删除 `printf` 使用 `test.py` 脚本来测试合规性 + +其他事项: + +- 符号数计数不包括赋值等号 `=` 和控制流语句如 `if`, `for` 这种关键字,但例如条件表达式内的符号还是会被计算 + +### 如何评测 + +```bash +python3 test.py +python3 test.py -V # 显示更多信息 +``` + +我们提供了一个 `test.py` 脚本,它完成以下判断: + +- 尝试编译你的代码 +- 测试正确性,即是否能返回函数正确的结果 +- 测试合规性,即是否满足题目对符号数等的要求 + +该脚本要求你的代码不能包含输出到 stdout 的调试输出,如果你需要调试,请用下文的 `btest` 脚本。 +通常情况下,你可以只用 `btest` 测试,直到所有函数都能返回正确结果,再回到 `test.py` 测试。 + +输出示例: + +```bash +bitAnd 1/1: PASS detail: Pass using 4 operations including {'|', '~'} and {'int'}. +bitXor 0/1: FAIL error1: Test bitXor(-2147483648[0x80000000],-2147483648[0x80000000]) failed. Gives 2[0x2]. Should be 0[0x0] +... +Total points: 1/37 +``` + +> 该输出展示了一份正确第一个函数的作业。 + +> `-V` 参数会显示通过的函数所用操作符数量,但可能导致你的报错不明显,默认我们只显示 FAIL 的信息。 + +### 如何使用我们提供的工具 + +#### btest + +`btest` 是正确性检验工具,是 `test.py` 脚本的一部分,你可以根据需要单独使用它以方便调试。 + +执行正确性测试 + +```bash +make +./btest +``` + +以指定参数调用某个函数测试: + +```bash +make +./btest -1 1 -2 2 -f bitXor # bitXor(1, 2) +./btest -h # 查看 btest 的其他功能 +``` + +#### ishow + +```bash +./ishow 0x27 +Hex = 0x00000027, Signed = 39, Unsigned = 39 +``` + +#### fshow + +```bash +./fshow 0x15213243 +Floating point value 3.255334057e-26 +Bit Representation 0x15213243, sign = 0, exponent = 0x2a, fraction = 0x213243 +Normalized. +1.2593463659 X 2^(-85) +``` + +### 最终得分 + +DataLab 本次设置为通过性实验,即测试点通过则为满分。 + +### 实验报告 + +作为本学期的第一个实验,我们在此说明我们每个实验的报告提交要求。 + +首先,所有实验都遵循相同的通用要求,具体见 [`report/README.md`](report/README.md)。 + +每个实验又会提供专用的实验模板,其中包含了具体助教想要你们填写的内容,具体见 [`report/DataLab.md`](report/report.md)。 + +### 提交 + +将仓库 push 到上游 Github 仓库里即可完成提交。 + +## 注意事项 + +1. 不允许抄袭,助教会将每个人代码同网上代码和其他同学代码进行查重 +2. 报告需要写清楚做题思路,否则会酌情扣分 +3. 慎用代码格式化工具,如果一定要使用,请用 [`.clang-format`](./.clang-format) 文件,如果因格式化工具导致 `bits.c` 外的文件被修改,可能会被视为作弊 |
