aboutsummaryrefslogtreecommitdiff

DataLab

 ________  ________  _________  ________  ___       ________  ________     
|\   ___ \|\   __  \|\___   ___\\   __  \|\  \     |\   __  \|\   __  \    
\ \  \_|\ \ \  \|\  \|___ \  \_\ \  \|\  \ \  \    \ \  \|\  \ \  \|\ /_   
 \ \  \ \\ \ \   __  \   \ \  \ \ \   __  \ \  \    \ \   __  \ \   __  \  
  \ \  \_\\ \ \  \ \  \   \ \  \ \ \  \ \  \ \  \____\ \  \ \  \ \  \|\  \ 
   \ \_______\ \__\ \__\   \ \__\ \ \__\ \__\ \_______\ \__\ \__\ \_______\
    \|_______|\|__|\|__|    \|__|  \|__|\|__|\|_______|\|__|\|__|\|_______|

模板仓库:RUC Datalab-2025Fall

项目编译与环境指南

C 语言编译环境

sudo apt-get update
sudo apt-get install build-essential
sudo apt-get install gcc-multilib

如果有 C 语言环境问题,你可以选择删除 gcc 和 g++ 然后重新执行上述指令。

sudo apt-get remove gcc g++

如果仍有问题,可以联系林瞻涵助教获取服务器登陆信息,在服务器上完成本实验。

如果你想获得 VSCode 的最佳代码提示体验,请指定 cStandard 为 gnu99:

{
    "C_Cpp.default.cStandard": "gnu99"
}

面向高级用户,我们还提供了 devcontainer 的支持。有需要的同学可以自行使用。

如何编译

make

如果你不懂什么是 make,请询问 AI 生成工具 “什么是 make,我应该在什么时候执行 make,make 的原理是什么”

Quick Start

# 在我们的服务器上,不需要执行这一行
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 文件中。

一个例子

/* 
 * 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 这种关键字,但例如条件表达式内的符号还是会被计算

如何评测

python3 test.py
python3 test.py -V # 显示更多信息

我们提供了一个 test.py 脚本,它完成以下判断:

  • 尝试编译你的代码
  • 测试正确性,即是否能返回函数正确的结果
  • 测试合规性,即是否满足题目对符号数等的要求

该脚本要求你的代码不能包含输出到 stdout 的调试输出,如果你需要调试,请用下文的 btest 脚本。 通常情况下,你可以只用 btest 测试,直到所有函数都能返回正确结果,再回到 test.py 测试。

输出示例:

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 脚本的一部分,你可以根据需要单独使用它以方便调试。

执行正确性测试

make
./btest

以指定参数调用某个函数测试:

make
./btest -1 1 -2 2 -f bitXor # bitXor(1, 2)
./btest -h # 查看 btest 的其他功能

ishow

./ishow 0x27
Hex = 0x00000027,   Signed = 39,    Unsigned = 39

fshow

./fshow 0x15213243
Floating point value 3.255334057e-26
Bit Representation 0x15213243, sign = 0, exponent = 0x2a, fraction = 0x213243
Normalized.  +1.2593463659 X 2^(-85)

最终得分

DataLab 本次设置为通过性实验,即测试点通过则为满分。

提交

提交方式为在obe上填写你fork的仓库地址,且之后助教会组织答辩验收

注意事项

  1. 不允许抄袭,助教会将每个人代码同网上代码和其他同学代码进行查重
  2. 报告需要写清楚做题思路,否则会酌情扣分
  3. 慎用代码格式化工具,如果一定要使用,请用 .clang-format 文件,如果因格式化工具导致 bits.c 外的文件被修改,可能会被视为作弊