Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
49aa315
Exercise 00: Hello World
daimuguawang Aug 10, 2026
d1d58de
Exercise 01: Variables and addition
daimuguawang Aug 10, 2026
3ef3a66
Exercise 02: Function declaration and definition
daimuguawang Aug 10, 2026
d5fd0c3
Exercise 03: Arguments and parameters
daimuguawang Aug 10, 2026
42dce5e
Exercise 04: Static keyword
daimuguawang Aug 10, 2026
d9ef82c
Exercise 05: Constexpr constants
daimuguawang Aug 10, 2026
e4d933d
Exercise 06: Array with Fibonacci cache
daimuguawang Aug 10, 2026
7d9a172
Exercise 07: Loop with cached Fibonacci
daimuguawang Aug 10, 2026
617a202
Exercise 08: Pointer and stride
daimuguawang Aug 10, 2026
88601ad
Exercise 09: Enum and union type punning
daimuguawang Aug 10, 2026
7ae5327
Exercise 10: Trivial type
daimuguawang Aug 10, 2026
3c1e6c8
Exercise 11: Class method
daimuguawang Aug 10, 2026
0ba4764
Exercise 12: Const method
daimuguawang Aug 10, 2026
1c6c854
Exercise 13: Class with constructor
daimuguawang Aug 10, 2026
5892c61
Exercise 14: Destructor and RAII
daimuguawang Aug 10, 2026
e761946
Exercise 15: Copy constructor
daimuguawang Aug 10, 2026
55381e6
Exercise 16: Move semantics
daimuguawang Aug 10, 2026
7f50f30
Exercise 17: Class derivation
daimuguawang Aug 10, 2026
853bea3
Exercise 18: Virtual functions
daimuguawang Aug 10, 2026
4f54438
Exercise 19: Virtual destructor
daimuguawang Aug 10, 2026
a77f9ec
Exercise 20: Function template
daimuguawang Aug 10, 2026
694b6be
Exercise 21: Runtime datatype (tagged union)
daimuguawang Aug 10, 2026
507fb89
Exercise 22: Class template with broadcast
daimuguawang Aug 10, 2026
396bd23
Exercise 23: Template non-type parameter
daimuguawang Aug 10, 2026
7284932
Exercise 24: std::array
daimuguawang Aug 10, 2026
a614f5f
Exercise 25: std::vector
daimuguawang Aug 10, 2026
b06b66b
Exercise 26: std::vector<bool>
daimuguawang Aug 10, 2026
7516084
Exercise 27: Strides calculation
daimuguawang Aug 10, 2026
00d61b6
Exercise 28: std::string
daimuguawang Aug 10, 2026
8014387
Exercise 29: std::map
daimuguawang Aug 10, 2026
dfd155f
Exercise 30: std::unique_ptr lifecycle
daimuguawang Aug 10, 2026
2ce9379
Exercise 31: std::shared_ptr reference counting
daimuguawang Aug 10, 2026
153a5e6
Exercise 32: std::transform
daimuguawang Aug 10, 2026
04f5f3b
Exercise 33: std::accumulate
daimuguawang Aug 10, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion exercises/00_hello_world/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,6 @@

int main(int argc, char **argv) {
// TODO: 在控制台输出 "Hello, InfiniTensor!" 并换行
std::cout : "Hello, InfiniTensor!" + std::endl;
std::cout << "Hello, InfiniTensor!" << std::endl;
return 0;
}
2 changes: 1 addition & 1 deletion exercises/01_variable&add/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

int main(int argc, char **argv) {
// TODO: 补全变量定义并打印加法运算
// x ?
int x = 1;
std::cout << x << " + " << x << " = " << x + x << std::endl;
return 0;
}
4 changes: 2 additions & 2 deletions exercises/02_function/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
// NOTICE: cppreference 中的示例中指出了复杂声明的解读法,建议认真阅读。
// NOTICE: 补充由内而外读法的机翻解释 <https://learn.microsoft.com/zh-cn/cpp/c-language/interpreting-more-complex-declarators?view=msvc-170>

// TODO: 在这里声明函数
int add(int a, int b);

int main(int argc, char **argv) {
ASSERT(add(123, 456) == 123 + 456, "add(123, 456) should be 123 + 456");
Expand All @@ -15,5 +15,5 @@ int main(int argc, char **argv) {
}

int add(int a, int b) {
// TODO: 补全函数定义,但不要移动代码行
return a + b;
}
8 changes: 4 additions & 4 deletions exercises/03_argument&parameter/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,19 +8,19 @@ void func(int);
// TODO: 为下列 ASSERT 填写正确的值
int main(int argc, char **argv) {
auto arg = 99;
ASSERT(arg == ?, "arg should be ?");
ASSERT(arg == 99, "arg should be 99");
std::cout << "befor func call: " << arg << std::endl;
func(arg);
ASSERT(arg == ?, "arg should be ?");
ASSERT(arg == 99, "arg should be 99");
std::cout << "after func call: " << arg << std::endl;
return 0;
}

// TODO: 为下列 ASSERT 填写正确的值
void func(int param) {
ASSERT(param == ?, "param should be ?");
ASSERT(param == 99, "param should be 99");
std::cout << "befor add: " << param << std::endl;
param += 1;
ASSERT(param == ?, "param should be ?");
ASSERT(param == 100, "param should be 100");
std::cout << "after add: " << param << std::endl;
}
10 changes: 5 additions & 5 deletions exercises/04_static/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,10 @@ static int func(int param) {

int main(int argc, char **argv) {
// TODO: 将下列 `?` 替换为正确的数字
ASSERT(func(5) == ?, "static variable value incorrect");
ASSERT(func(4) == ?, "static variable value incorrect");
ASSERT(func(3) == ?, "static variable value incorrect");
ASSERT(func(2) == ?, "static variable value incorrect");
ASSERT(func(1) == ?, "static variable value incorrect");
ASSERT(func(5) == 5, "static variable value incorrect");
ASSERT(func(4) == 6, "static variable value incorrect");
ASSERT(func(3) == 7, "static variable value incorrect");
ASSERT(func(2) == 8, "static variable value incorrect");
ASSERT(func(1) == 9, "static variable value incorrect");
return 0;
}
4 changes: 2 additions & 2 deletions exercises/05_constexpr/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,8 @@ int main(int argc, char **argv) {

// TODO: 观察错误信息,修改一处,使代码编译运行
// PS: 编译运行,但是不一定能算出结果……
constexpr auto ANS_N = 90;
constexpr auto ANS = fibonacci(ANS_N);
constexpr auto ANS_N = 20;
const auto ANS = fibonacci(ANS_N);
std::cout << "fibonacci(" << ANS_N << ") = " << ANS << std::endl;

return 0;
Expand Down
6 changes: 3 additions & 3 deletions exercises/06_array/main.cpp
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
#include "../exercise.h"
#include "../exercise.h"

// READ: 数组 <https://zh.cppreference.com/w/cpp/language/array>

Expand All @@ -11,13 +11,13 @@ unsigned long long fibonacci(int i) {
return 1;
default:
// TODO: 补全三目表达式缺失的部分
return <condition> ? <cache> : (arr[i] = fibonacci(i - 1) + fibonacci(i - 2));
return arr[i] ? arr[i] : (arr[i] = fibonacci(i - 1) + fibonacci(i - 2));
}
}

int main(int argc, char **argv) {
// TODO: 为此 ASSERT 填写正确的值
ASSERT(sizeof(arr) == ?, "sizeof array is size of all its elements");
ASSERT(sizeof(arr) == 720, "sizeof array is size of all its elements");
// ---- 不要修改以下代码 ----
ASSERT(fibonacci(2) == 1, "fibonacci(2) should be 1");
ASSERT(fibonacci(20) == 6765, "fibonacci(20) should be 6765");
Expand Down
7 changes: 3 additions & 4 deletions exercises/07_loop/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,9 @@
// THINk: 这个函数是一个纯函数(pure function)吗?
// READ: 纯函数 <https://zh.wikipedia.org/wiki/%E7%BA%AF%E5%87%BD%E6%95%B0>
static unsigned long long fibonacci(int i) {
// TODO: 为缓存设置正确的初始值
static unsigned long long cache[96], cached;
// TODO: 设置正确的循环条件
for (; false; ++cached) {
static unsigned long long cache[96]{0, 1};
static int cached = 2;
for (; cached <= i; ++cached) {
cache[cached] = cache[cached - 1] + cache[cached - 2];
}
return cache[i];
Expand Down
8 changes: 5 additions & 3 deletions exercises/08_pointer/main.cpp
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
#include "../exercise.h"
#include "../exercise.h"

// READ: 数组向指针退化 <https://zh.cppreference.com/w/cpp/language/array#%E6%95%B0%E7%BB%84%E5%88%B0%E6%8C%87%E9%92%88%E7%9A%84%E9%80%80%E5%8C%96>
bool is_fibonacci(int *ptr, int len, int stride) {
ASSERT(len >= 3, "`len` should be at least 3");
// TODO: 编写代码判断从 ptr 开始,每 stride 个元素取 1 个元素,组成长度为 n 的数列是否满足
// arr[i + 2] = arr[i] + arr[i + 1]
for (int i = 0; i < len - 2; ++i) {
if (ptr[i * stride] + ptr[(i + 1) * stride] != ptr[(i + 2) * stride])
return false;
}
return true;
}

Expand Down
2 changes: 1 addition & 1 deletion exercises/09_enum&union/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ ColorEnum convert_by_pun(Color c) {
};

TypePun pun;
// TODO: 补全类型双关转换
pun.c = c;

return pun.e;
}
Expand Down
7 changes: 3 additions & 4 deletions exercises/10_trivial/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,9 @@ struct FibonacciCache {
int cached;
};

// TODO: 实现正确的缓存优化斐波那契计算
static unsigned long long fibonacci(FibonacciCache &cache, int i) {
for (; false; ++cached) {
cache[cached] = cache[cached - 1] + cache[cached - 2];
for (; cache.cached <= i; ++cache.cached) {
cache.cache[cache.cached] = cache.cache[cache.cached - 1] + cache.cache[cache.cached - 2];
}
return cache.cache[i];
}
Expand All @@ -19,7 +18,7 @@ int main(int argc, char **argv) {
// TODO: 初始化缓存结构体,使计算正确
// NOTICE: C/C++ 中,读取未初始化的变量(包括结构体变量)是未定义行为
// READ: 初始化的各种写法 <https://zh.cppreference.com/w/cpp/language/initialization>
FibonacciCache fib;
FibonacciCache fib{{0, 1}, 2};
ASSERT(fibonacci(fib, 10) == 55, "fibonacci(10) should be 55");
std::cout << "fibonacci(10) = " << fibonacci(fib, 10) << std::endl;
return 0;
Expand Down
5 changes: 2 additions & 3 deletions exercises/11_method/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,8 @@ struct Fibonacci {
unsigned long long cache[128];
int cached;

// TODO: 实现正确的缓存优化斐波那契计算
unsigned long long get(int i) {
for (; false; ++cached) {
for (; cached <= i; ++cached) {
cache[cached] = cache[cached - 1] + cache[cached - 2];
}
return cache[i];
Expand All @@ -15,7 +14,7 @@ struct Fibonacci {

int main(int argc, char **argv) {
// TODO: 初始化缓存结构体,使计算正确
Fibonacci fib;
Fibonacci fib{{0, 1}, 2};
ASSERT(fib.get(10) == 55, "fibonacci(10) should be 55");
std::cout << "fibonacci(10) = " << fib.get(10) << std::endl;
return 0;
Expand Down
4 changes: 2 additions & 2 deletions exercises/12_method_const/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@

struct Fibonacci {
int numbers[11];
// TODO: 修改方法签名和实现,使测试通过
int get(int i) {
int get(int i) const {
return numbers[i];
}
};

Expand Down
6 changes: 2 additions & 4 deletions exercises/13_class/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,10 @@ class Fibonacci {
int cached;

public:
// TODO: 实现构造器
// Fibonacci()
Fibonacci() : cache{0, 1}, cached(2) {}

// TODO: 实现正确的缓存优化斐波那契计算
size_t get(int i) {
for (; false; ++cached) {
for (; cached <= i; ++cached) {
cache[cached] = cache[cached - 1] + cache[cached - 2];
}
return cache[i];
Expand Down
14 changes: 8 additions & 6 deletions exercises/14_class_destruct/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,17 @@ class DynFibonacci {
int cached;

public:
// TODO: 实现动态设置容量的构造器
DynFibonacci(int capacity): cache(new ?), cached(?) {}
DynFibonacci(int capacity): cache(new size_t[capacity]), cached(2) {
cache[0] = 0;
cache[1] = 1;
}

// TODO: 实现析构器,释放缓存空间
~DynFibonacci();
~DynFibonacci() {
delete[] cache;
}

// TODO: 实现正确的缓存优化斐波那契计算
size_t get(int i) {
for (; false; ++cached) {
for (; cached <= i; ++cached) {
cache[cached] = cache[cached - 1] + cache[cached - 2];
}
return cache[i];
Expand Down
19 changes: 11 additions & 8 deletions exercises/15_class_clone/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,18 +9,21 @@ class DynFibonacci {
int cached;

public:
// TODO: 实现动态设置容量的构造器
DynFibonacci(int capacity): cache(new ?), cached(?) {}
DynFibonacci(int capacity): cache(new size_t[capacity]), cached(2) {
cache[0] = 0;
cache[1] = 1;
}

// TODO: 实现复制构造器
DynFibonacci(DynFibonacci const &) = delete;
DynFibonacci(DynFibonacci const &other) : cache(new size_t[other.cached]), cached(other.cached) {
for (int i = 0; i < cached; ++i) cache[i] = other.cache[i];
}

// TODO: 实现析构器,释放缓存空间
~DynFibonacci();
~DynFibonacci() {
delete[] cache;
}

// TODO: 实现正确的缓存优化斐波那契计算
size_t get(int i) {
for (; false; ++cached) {
for (; cached <= i; ++cached) {
cache[cached] = cache[cached - 1] + cache[cached - 2];
}
return cache[i];
Expand Down
31 changes: 20 additions & 11 deletions exercises/16_class_move/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,22 +14,31 @@ class DynFibonacci {
int cached;

public:
// TODO: 实现动态设置容量的构造器
DynFibonacci(int capacity): cache(new ?), cached(?) {}
DynFibonacci(int capacity): cache(new size_t[capacity]), cached(2) {
cache[0] = 0;
cache[1] = 1;
}

// TODO: 实现移动构造器
DynFibonacci(DynFibonacci &&) noexcept = delete;
DynFibonacci(DynFibonacci &&other) noexcept : cache(other.cache), cached(other.cached) {
other.cache = nullptr;
}

// TODO: 实现移动赋值
// NOTICE: ⚠ 注意移动到自身问题 ⚠
DynFibonacci &operator=(DynFibonacci &&) noexcept = delete;
DynFibonacci &operator=(DynFibonacci &&other) noexcept {
if (this != &other) {
delete[] cache;
cache = other.cache;
cached = other.cached;
other.cache = nullptr;
}
return *this;
}

// TODO: 实现析构器,释放缓存空间
~DynFibonacci();
~DynFibonacci() {
delete[] cache;
}

// TODO: 实现正确的缓存优化斐波那契计算
size_t operator[](int i) {
for (; false; ++cached) {
for (; cached <= i; ++cached) {
cache[cached] = cache[cached - 1] + cache[cached - 2];
}
return cache[i];
Expand Down
6 changes: 3 additions & 3 deletions exercises/17_class_derive/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -50,9 +50,9 @@ int main(int argc, char **argv) {
B b = B(3);

// TODO: 补全三个类型的大小
static_assert(sizeof(X) == ?, "There is an int in X");
static_assert(sizeof(A) == ?, "There is an int in A");
static_assert(sizeof(B) == ?, "B is an A with an X");
static_assert(sizeof(X) == 4, "There is an int in X");
static_assert(sizeof(A) == 4, "There is an int in A");
static_assert(sizeof(B) == 8, "B is an A with an X");

i = 0;
std::cout << std::endl
Expand Down
40 changes: 20 additions & 20 deletions exercises/18_class_virtual/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -42,38 +42,38 @@ int main(int argc, char **argv) {
C c;
D d;

ASSERT(a.virtual_name() == '?', MSG);
ASSERT(b.virtual_name() == '?', MSG);
ASSERT(c.virtual_name() == '?', MSG);
ASSERT(d.virtual_name() == '?', MSG);
ASSERT(a.direct_name() == '?', MSG);
ASSERT(b.direct_name() == '?', MSG);
ASSERT(c.direct_name() == '?', MSG);
ASSERT(d.direct_name() == '?', MSG);
ASSERT(a.virtual_name() == 'A', MSG);
ASSERT(b.virtual_name() == 'B', MSG);
ASSERT(c.virtual_name() == 'C', MSG);
ASSERT(d.virtual_name() == 'C', MSG);
ASSERT(a.direct_name() == 'A', MSG);
ASSERT(b.direct_name() == 'B', MSG);
ASSERT(c.direct_name() == 'C', MSG);
ASSERT(d.direct_name() == 'D', MSG);

A &rab = b;
B &rbc = c;
C &rcd = d;

ASSERT(rab.virtual_name() == '?', MSG);
ASSERT(rbc.virtual_name() == '?', MSG);
ASSERT(rcd.virtual_name() == '?', MSG);
ASSERT(rab.direct_name() == '?', MSG);
ASSERT(rbc.direct_name() == '?', MSG);
ASSERT(rcd.direct_name() == '?', MSG);
ASSERT(rab.virtual_name() == 'B', MSG);
ASSERT(rbc.virtual_name() == 'C', MSG);
ASSERT(rcd.virtual_name() == 'C', MSG);
ASSERT(rab.direct_name() == 'A', MSG);
ASSERT(rbc.direct_name() == 'B', MSG);
ASSERT(rcd.direct_name() == 'C', MSG);

A &rac = c;
B &rbd = d;

ASSERT(rac.virtual_name() == '?', MSG);
ASSERT(rbd.virtual_name() == '?', MSG);
ASSERT(rac.direct_name() == '?', MSG);
ASSERT(rbd.direct_name() == '?', MSG);
ASSERT(rac.virtual_name() == 'C', MSG);
ASSERT(rbd.virtual_name() == 'C', MSG);
ASSERT(rac.direct_name() == 'A', MSG);
ASSERT(rbd.direct_name() == 'B', MSG);

A &rad = d;

ASSERT(rad.virtual_name() == '?', MSG);
ASSERT(rad.direct_name() == '?', MSG);
ASSERT(rad.virtual_name() == 'C', MSG);
ASSERT(rad.direct_name() == 'A', MSG);

return 0;
}
Expand Down
Loading