From 83a2763a75618d9a98aa90e97deea5324ca6456c Mon Sep 17 00:00:00 2001 From: wangrui <18203537680@163.com> Date: Mon, 27 Jul 2026 18:08:49 +0800 Subject: [PATCH 1/6] =?UTF-8?q?=E5=89=8D8=E9=81=93=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- exercises/00_hello_world/main.cpp | 4 ++-- exercises/01_variable&add/main.cpp | 2 +- exercises/02_function/main.cpp | 2 ++ exercises/03_argument¶meter/main.cpp | 8 ++++---- exercises/04_static/main.cpp | 10 +++++----- exercises/05_constexpr/main.cpp | 4 ++-- exercises/06_array/main.cpp | 4 ++-- exercises/07_loop/main.cpp | 5 +++-- exercises/08_pointer/main.cpp | 10 ++++++++++ 9 files changed, 31 insertions(+), 18 deletions(-) diff --git a/exercises/00_hello_world/main.cpp b/exercises/00_hello_world/main.cpp index 8866f3c15..1a002c4d0 100644 --- a/exercises/00_hello_world/main.cpp +++ b/exercises/00_hello_world/main.cpp @@ -6,6 +6,6 @@ int main(int argc, char **argv) { // TODO: 在控制台输出 "Hello, InfiniTensor!" 并换行 - std::cout : "Hello, InfiniTensor!" + std::endl; + std::cout << "Hello, InfiniTensor!\n"; return 0; -} +} \ No newline at end of file diff --git a/exercises/01_variable&add/main.cpp b/exercises/01_variable&add/main.cpp index 5014863fd..4baef5a22 100644 --- a/exercises/01_variable&add/main.cpp +++ b/exercises/01_variable&add/main.cpp @@ -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; } diff --git a/exercises/02_function/main.cpp b/exercises/02_function/main.cpp index b5eef7f28..603a9ec04 100644 --- a/exercises/02_function/main.cpp +++ b/exercises/02_function/main.cpp @@ -5,6 +5,7 @@ // NOTICE: 补充由内而外读法的机翻解释 // 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"); @@ -16,4 +17,5 @@ int main(int argc, char **argv) { int add(int a, int b) { // TODO: 补全函数定义,但不要移动代码行 + return a+b; } diff --git a/exercises/03_argument¶meter/main.cpp b/exercises/03_argument¶meter/main.cpp index 7fb5d3c2f..76136eae6 100644 --- a/exercises/03_argument¶meter/main.cpp +++ b/exercises/03_argument¶meter/main.cpp @@ -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 ?"); std::cout << "befor func call: " << arg << std::endl; func(arg); - ASSERT(arg == ?, "arg should be ?"); + ASSERT(arg == 99, "arg should be ?"); 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 ?"); std::cout << "befor add: " << param << std::endl; param += 1; - ASSERT(param == ?, "param should be ?"); + ASSERT(param == 100, "param should be ?"); std::cout << "after add: " << param << std::endl; } diff --git a/exercises/04_static/main.cpp b/exercises/04_static/main.cpp index f107762fa..64f417694 100644 --- a/exercises/04_static/main.cpp +++ b/exercises/04_static/main.cpp @@ -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; } diff --git a/exercises/05_constexpr/main.cpp b/exercises/05_constexpr/main.cpp index d1db6c9d8..f4b4ece1b 100644 --- a/exercises/05_constexpr/main.cpp +++ b/exercises/05_constexpr/main.cpp @@ -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 = 40; + auto ANS = fibonacci(ANS_N); std::cout << "fibonacci(" << ANS_N << ") = " << ANS << std::endl; return 0; diff --git a/exercises/06_array/main.cpp b/exercises/06_array/main.cpp index 61ed99ec0..e3ec45fb2 100644 --- a/exercises/06_array/main.cpp +++ b/exercises/06_array/main.cpp @@ -11,13 +11,13 @@ unsigned long long fibonacci(int i) { return 1; default: // TODO: 补全三目表达式缺失的部分 - return ? : (arr[i] = fibonacci(i - 1) + fibonacci(i - 2)); + return arr[i] != 0 ? 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"); diff --git a/exercises/07_loop/main.cpp b/exercises/07_loop/main.cpp index 44fd835cd..29dfe2702 100644 --- a/exercises/07_loop/main.cpp +++ b/exercises/07_loop/main.cpp @@ -5,9 +5,10 @@ // READ: 纯函数 static unsigned long long fibonacci(int i) { // TODO: 为缓存设置正确的初始值 - static unsigned long long cache[96], cached; + static unsigned long long cache[96]{0, 1}; + static int cached = 2; // TODO: 设置正确的循环条件 - for (; false; ++cached) { + for (; cached <= i; ++cached) { cache[cached] = cache[cached - 1] + cache[cached - 2]; } return cache[i]; diff --git a/exercises/08_pointer/main.cpp b/exercises/08_pointer/main.cpp index ba37173f5..1178147a9 100644 --- a/exercises/08_pointer/main.cpp +++ b/exercises/08_pointer/main.cpp @@ -5,6 +5,16 @@ 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 + 2 < len; ++i) { + auto first = ptr[i * stride]; + auto second = ptr[(i + 1) * stride]; + auto third = ptr[(i + 2) * stride]; + + if (third != first + second) { + return false; + } + } return true; } From 4695c2ce16ea77e52eeb6738b0361b5023a7c340 Mon Sep 17 00:00:00 2001 From: wangrui <18203537680@163.com> Date: Tue, 28 Jul 2026 14:47:32 +0800 Subject: [PATCH 2/6] =?UTF-8?q?=E5=AE=8C=E6=88=90=E5=89=8D17=E9=81=93?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- exercises/09_enum&union/main.cpp | 1 + exercises/10_trivial/main.cpp | 7 ++++--- exercises/11_method/main.cpp | 4 ++-- exercises/12_method_const/main.cpp | 3 ++- exercises/13_class/main.cpp | 4 ++-- exercises/14_class_destruct/main.cpp | 8 +++++--- exercises/15_class_clone/main.cpp | 15 +++++++++++---- exercises/16_class_move/main.cpp | 28 +++++++++++++++++++++++----- exercises/17_class_derive/main.cpp | 6 +++--- 9 files changed, 53 insertions(+), 23 deletions(-) diff --git a/exercises/09_enum&union/main.cpp b/exercises/09_enum&union/main.cpp index 3f2cec768..5779dd314 100644 --- a/exercises/09_enum&union/main.cpp +++ b/exercises/09_enum&union/main.cpp @@ -37,6 +37,7 @@ ColorEnum convert_by_pun(Color c) { TypePun pun; // TODO: 补全类型双关转换 + pun.c = c; return pun.e; } diff --git a/exercises/10_trivial/main.cpp b/exercises/10_trivial/main.cpp index 6ba23e48e..a0efc274a 100644 --- a/exercises/10_trivial/main.cpp +++ b/exercises/10_trivial/main.cpp @@ -9,8 +9,8 @@ struct FibonacciCache { // 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]; } @@ -19,7 +19,8 @@ int main(int argc, char **argv) { // TODO: 初始化缓存结构体,使计算正确 // NOTICE: C/C++ 中,读取未初始化的变量(包括结构体变量)是未定义行为 // READ: 初始化的各种写法 - 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; diff --git a/exercises/11_method/main.cpp b/exercises/11_method/main.cpp index 0e08e0a36..eab225933 100644 --- a/exercises/11_method/main.cpp +++ b/exercises/11_method/main.cpp @@ -6,7 +6,7 @@ struct Fibonacci { // 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]; @@ -15,7 +15,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; diff --git a/exercises/12_method_const/main.cpp b/exercises/12_method_const/main.cpp index 5521be4da..65c079be1 100644 --- a/exercises/12_method_const/main.cpp +++ b/exercises/12_method_const/main.cpp @@ -5,7 +5,8 @@ struct Fibonacci { int numbers[11]; // TODO: 修改方法签名和实现,使测试通过 - int get(int i) { + int get(int i) const { + return numbers[i]; } }; diff --git a/exercises/13_class/main.cpp b/exercises/13_class/main.cpp index 9afa98c5b..0a5166d5e 100644 --- a/exercises/13_class/main.cpp +++ b/exercises/13_class/main.cpp @@ -14,11 +14,11 @@ class Fibonacci { 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]; diff --git a/exercises/14_class_destruct/main.cpp b/exercises/14_class_destruct/main.cpp index 42150e8ca..644700384 100644 --- a/exercises/14_class_destruct/main.cpp +++ b/exercises/14_class_destruct/main.cpp @@ -11,14 +11,16 @@ class DynFibonacci { public: // TODO: 实现动态设置容量的构造器 - DynFibonacci(int capacity): cache(new ?), cached(?) {} + DynFibonacci(int capacity): cache(new size_t[capacity]{0, 1}), cached(2) {} // 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]; diff --git a/exercises/15_class_clone/main.cpp b/exercises/15_class_clone/main.cpp index f74b70391..311b866d4 100644 --- a/exercises/15_class_clone/main.cpp +++ b/exercises/15_class_clone/main.cpp @@ -7,20 +7,27 @@ class DynFibonacci { size_t *cache; int cached; + int capacity; public: // TODO: 实现动态设置容量的构造器 - DynFibonacci(int capacity): cache(new ?), cached(?) {} + DynFibonacci(int capacity): cache(new size_t[capacity]{0, 1}), cached(2), capacity(capacity) {} // TODO: 实现复制构造器 - DynFibonacci(DynFibonacci const &) = delete; + DynFibonacci(DynFibonacci const &other) : cache{new size_t[other.capacity]}, cached(other.cached), capacity(other.capacity) { + for (int i = 0; i < capacity; ++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]; diff --git a/exercises/16_class_move/main.cpp b/exercises/16_class_move/main.cpp index 8d2c421da..7e98ab85a 100644 --- a/exercises/16_class_move/main.cpp +++ b/exercises/16_class_move/main.cpp @@ -15,21 +15,39 @@ class DynFibonacci { public: // TODO: 实现动态设置容量的构造器 - DynFibonacci(int capacity): cache(new ?), cached(?) {} + DynFibonacci(int capacity): cache(new size_t[capacity]{0, 1}), cached(2) {} // TODO: 实现移动构造器 - DynFibonacci(DynFibonacci &&) noexcept = delete; + DynFibonacci(DynFibonacci &&other) noexcept : cache(other.cache), cached(other.cached) { + other.cache = nullptr; + other.cached = 0; + } // TODO: 实现移动赋值 // NOTICE: ⚠ 注意移动到自身问题 ⚠ - DynFibonacci &operator=(DynFibonacci &&) noexcept = delete; + DynFibonacci &operator=(DynFibonacci &&other) noexcept { + // this和&other指向同一个对象。如果不检查,就会先删除自己的数组,然后继续操作已经失效的资源。 + if (this != &other) { + delete[] cache; + + cache = other.cache; + cached = other.cached; + + other.cache = nullptr; + other.cached = 0; + } + + 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]; diff --git a/exercises/17_class_derive/main.cpp b/exercises/17_class_derive/main.cpp index 819ae72fc..0c245df4f 100644 --- a/exercises/17_class_derive/main.cpp +++ b/exercises/17_class_derive/main.cpp @@ -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 From 836f71cf4b95d4c4cfd35f09a464fb4572425075 Mon Sep 17 00:00:00 2001 From: wangrui <18203537680@163.com> Date: Tue, 28 Jul 2026 18:40:52 +0800 Subject: [PATCH 3/6] =?UTF-8?q?=E5=AE=8C=E6=88=90=E5=89=8D21=E9=81=93?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- exercises/18_class_virtual/main.cpp | 40 ++++++++++---------- exercises/19_class_virtual_destruct/main.cpp | 26 ++++++------- exercises/20_function_template/main.cpp | 6 ++- exercises/21_runtime_datatype/main.cpp | 12 +++++- exercises/22_class_template/main.cpp | 5 +++ 5 files changed, 53 insertions(+), 36 deletions(-) diff --git a/exercises/18_class_virtual/main.cpp b/exercises/18_class_virtual/main.cpp index ac6382413..344709e4c 100644 --- a/exercises/18_class_virtual/main.cpp +++ b/exercises/18_class_virtual/main.cpp @@ -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; } diff --git a/exercises/19_class_virtual_destruct/main.cpp b/exercises/19_class_virtual_destruct/main.cpp index cdd54f74f..41f28117c 100644 --- a/exercises/19_class_virtual_destruct/main.cpp +++ b/exercises/19_class_virtual_destruct/main.cpp @@ -5,12 +5,12 @@ struct A { // TODO: 正确初始化静态字段 - static int num_a = 0; + inline static int num_a = 0; A() { ++num_a; } - ~A() { + virtual ~A() { --num_a; } @@ -20,12 +20,12 @@ struct A { }; struct B final : public A { // TODO: 正确初始化静态字段 - static int num_b = 0; + inline static int num_b = 0; B() { ++num_b; } - ~B() { + ~B() override { --num_b; } @@ -37,10 +37,10 @@ struct B final : public A { int main(int argc, char **argv) { auto a = new A; auto b = new B; - ASSERT(A::num_a == ?, "Fill in the correct value for A::num_a"); - ASSERT(B::num_b == ?, "Fill in the correct value for B::num_b"); - ASSERT(a->name() == '?', "Fill in the correct value for a->name()"); - ASSERT(b->name() == '?', "Fill in the correct value for b->name()"); + ASSERT(A::num_a == 2, "Fill in the correct value for A::num_a"); + ASSERT(B::num_b == 1, "Fill in the correct value for B::num_b"); + ASSERT(a->name() == 'A', "Fill in the correct value for a->name()"); + ASSERT(b->name() == 'B', "Fill in the correct value for b->name()"); delete a; delete b; @@ -48,13 +48,13 @@ int main(int argc, char **argv) { ASSERT(B::num_b == 0, "Every B was destroyed"); A *ab = new B;// 派生类指针可以随意转换为基类指针 - ASSERT(A::num_a == ?, "Fill in the correct value for A::num_a"); - ASSERT(B::num_b == ?, "Fill in the correct value for B::num_b"); - ASSERT(ab->name() == '?', "Fill in the correct value for ab->name()"); + ASSERT(A::num_a == 1, "Fill in the correct value for A::num_a"); + ASSERT(B::num_b == 1, "Fill in the correct value for B::num_b"); + ASSERT(ab->name() == 'B', "Fill in the correct value for ab->name()"); // TODO: 基类指针无法随意转换为派生类指针,补全正确的转换语句 - B &bb = *ab; - ASSERT(bb.name() == '?', "Fill in the correct value for bb->name()"); + B &bb = dynamic_cast(*ab); + ASSERT(bb.name() == 'B', "Fill in the correct value for bb->name()"); // TODO: ---- 以下代码不要修改,通过改正类定义解决编译问题 ---- delete ab;// 通过指针可以删除指向的对象,即使是多态对象 diff --git a/exercises/20_function_template/main.cpp b/exercises/20_function_template/main.cpp index cb6d978d3..9708dfd57 100644 --- a/exercises/20_function_template/main.cpp +++ b/exercises/20_function_template/main.cpp @@ -2,7 +2,9 @@ // READ: 函数模板 // TODO: 将这个函数模板化 -int plus(int a, int b) { + +template +T plus(T a, T b) { return a + b; } @@ -14,7 +16,7 @@ int main(int argc, char **argv) { ASSERT(plus(1.25f, 2.5f) == 3.75f, "Plus two float"); ASSERT(plus(1.25, 2.5) == 3.75, "Plus two double"); // TODO: 修改判断条件使测试通过 - ASSERT(plus(0.1, 0.2) == 0.3, "How to make this pass?"); + ASSERT(std::abs(plus(0.1, 0.2) - 0.3) < 1e-12, "How to make this pass?"); return 0; } diff --git a/exercises/21_runtime_datatype/main.cpp b/exercises/21_runtime_datatype/main.cpp index 9c4bf376a..a0faea0e5 100644 --- a/exercises/21_runtime_datatype/main.cpp +++ b/exercises/21_runtime_datatype/main.cpp @@ -18,13 +18,23 @@ struct TaggedUnion { }; // TODO: 将这个函数模板化用于 sigmoid_dyn -float sigmoid(float x) { +template +T sigmoid(T x) { return 1 / (1 + std::exp(-x)); } TaggedUnion sigmoid_dyn(TaggedUnion x) { TaggedUnion ans{x.type}; // TODO: 根据 type 调用 sigmoid + switch (x.type) { + case DataType::Float: + ans.f = sigmoid(x.f); + break; + case DataType::Double: + ans.d = sigmoid(x.d); + break; + } + return ans; } diff --git a/exercises/22_class_template/main.cpp b/exercises/22_class_template/main.cpp index d4985d904..259525568 100644 --- a/exercises/22_class_template/main.cpp +++ b/exercises/22_class_template/main.cpp @@ -10,6 +10,11 @@ struct Tensor4D { Tensor4D(unsigned int const shape_[4], T const *data_) { unsigned int size = 1; // TODO: 填入正确的 shape 并计算 size + for (auto dim = 0u; dim < 4; ++dim) { + shape[dim] = shape_[dim]; + size *= shape[dim]; + } + data = new T[size]; std::memcpy(data, data_, size * sizeof(T)); } From c7c0018d6c5d51a45dc4b279bb82b06ad4856f59 Mon Sep 17 00:00:00 2001 From: wangrui <18203537680@163.com> Date: Wed, 29 Jul 2026 16:09:14 +0800 Subject: [PATCH 4/6] =?UTF-8?q?=E5=AE=8C=E6=88=90=E5=89=8D26=E9=81=93?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- exercises/22_class_template/main | Bin 0 -> 21888 bytes exercises/22_class_template/main.cpp | 27 +++++++++++ exercises/23_template_const/main.cpp | 6 +++ exercises/24_std_array/main.cpp | 16 +++---- exercises/25_std_vector/main.cpp | 66 +++++++++++++------------- exercises/26_std_vector_bool/main.cpp | 16 +++---- 6 files changed, 82 insertions(+), 49 deletions(-) create mode 100755 exercises/22_class_template/main diff --git a/exercises/22_class_template/main b/exercises/22_class_template/main new file mode 100755 index 0000000000000000000000000000000000000000..d693e4208974974a6a005e02a778ecbd4dbbef3f GIT binary patch literal 21888 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 literal 0 HcmV?d00001 diff --git a/exercises/22_class_template/main.cpp b/exercises/22_class_template/main.cpp index 259525568..23a3d1457 100644 --- a/exercises/22_class_template/main.cpp +++ b/exercises/22_class_template/main.cpp @@ -18,6 +18,7 @@ struct Tensor4D { data = new T[size]; std::memcpy(data, data_, size * sizeof(T)); } + ~Tensor4D() { delete[] data; } @@ -33,6 +34,32 @@ struct Tensor4D { // 则 `this` 与 `others` 相加时,3 个形状为 `[1, 2, 1, 4]` 的子张量各自与 `others` 对应项相加。 Tensor4D &operator+=(Tensor4D const &others) { // TODO: 实现单向广播的加法 + for (auto dim = 0u; dim < 4; ++dim) { + ASSERT(others.shape[dim] == shape[dim] || others.shape[dim] == 1, + 'Shapes are not broadcast-compatible'); + } + + for (auto i0 = 0u; i0 < shape[0]; ++i0) { + for (auto i1 = 0u; i1 < shape[1]; ++i1) { + for (auto i2 = 0u; i2 < shape[2]; ++i2) { + for (auto i3 = 0u; i3 < shape[3]; ++i3) { + auto index = ((i0 * shape[1] + i1) * shape[2] + i2) * shape[3] + i3; + + auto o0 = others.shape[0] == 1 ? 0u : i0; + auto o1 = others.shape[1] == 1 ? 0u : i1; + auto o2 = others.shape[2] == 1 ? 0u : i2; + auto o3 = others.shape[3] == 1 ? 0u : i3; + + auto other_index = ((o0 * others.shape[1] + o1) + * others.shape[2] + o2) + * others.shape[3] + o3; + + data[index] += others.data[other_index]; + } + } + } + } + return *this; } }; diff --git a/exercises/23_template_const/main.cpp b/exercises/23_template_const/main.cpp index e0105e168..89b4d42a0 100644 --- a/exercises/23_template_const/main.cpp +++ b/exercises/23_template_const/main.cpp @@ -11,6 +11,11 @@ struct Tensor { Tensor(unsigned int const shape_[N]) { unsigned int size = 1; // TODO: 填入正确的 shape 并计算 size + for (auto i = 0; i < N; ++i) { + shape[i] = shape_[i]; + size *= shape[i]; + } + data = new T[size]; std::memset(data, 0, size * sizeof(T)); } @@ -35,6 +40,7 @@ struct Tensor { for (unsigned int i = 0; i < N; ++i) { ASSERT(indices[i] < shape[i], "Invalid index"); // TODO: 计算 index + index = index * shape[i] + indices[i]; } return index; } diff --git a/exercises/24_std_array/main.cpp b/exercises/24_std_array/main.cpp index c29718d9d..3a2dba21b 100644 --- a/exercises/24_std_array/main.cpp +++ b/exercises/24_std_array/main.cpp @@ -8,21 +8,21 @@ int main(int argc, char **argv) { { std::array arr{{1, 2, 3, 4, 5}}; - ASSERT(arr.size() == ?, "Fill in the correct value."); - ASSERT(sizeof(arr) == ?, "Fill in the correct value."); + ASSERT(arr.size() == 5, "Fill in the correct value."); + ASSERT(sizeof(arr) == 5 * sizeof(int), "Fill in the correct value."); int ans[]{1, 2, 3, 4, 5}; - ASSERT(std::memcmp(arr.?, ans, ?) == 0, "Fill in the correct values."); + ASSERT(std::memcmp(arr.data(), ans, sizeof(ans)) == 0, "Fill in the correct values."); } { std::array arr; - ASSERT(arr.size() == ?, "Fill in the correct value."); - ASSERT(sizeof(arr) == ?, "Fill in the correct value."); + ASSERT(arr.size() == 8, "Fill in the correct value."); + ASSERT(sizeof(arr) == 8 * sizeof(double), "Fill in the correct value."); } { std::array arr{"Hello, InfiniTensor!"}; - ASSERT(arr.size() == ?, "Fill in the correct value."); - ASSERT(sizeof(arr) == ?, "Fill in the correct value."); - ASSERT(std::strcmp(arr.?, "Hello, InfiniTensor!") == 0, "Fill in the correct value."); + ASSERT(arr.size() == 21, "Fill in the correct value."); + ASSERT(sizeof(arr) == 21 * sizeof(char), "Fill in the correct value."); + ASSERT(std::strcmp(arr.data(), "Hello, InfiniTensor!") == 0, "Fill in the correct value."); } return 0; } diff --git a/exercises/25_std_vector/main.cpp b/exercises/25_std_vector/main.cpp index f9e41bb78..805635c37 100644 --- a/exercises/25_std_vector/main.cpp +++ b/exercises/25_std_vector/main.cpp @@ -8,81 +8,81 @@ int main(int argc, char **argv) { { std::vector vec{1, 2, 3, 4, 5}; - ASSERT(vec.size() == ?, "Fill in the correct value."); + ASSERT(vec.size() == 5, "Fill in the correct value."); // THINK: `std::vector` 的大小是什么意思?与什么有关? - ASSERT(sizeof(vec) == ?, "Fill in the correct value."); + ASSERT(sizeof(vec) == 24, "Fill in the correct value."); int ans[]{1, 2, 3, 4, 5}; - ASSERT(std::memcmp(vec.?, ans, sizeof(ans)) == 0, "Fill in the correct values."); + ASSERT(std::memcmp(vec.data(), ans, sizeof(ans)) == 0, "Fill in the correct values."); } { std::vector vec{1, 2, 3, 4, 5}; { - ASSERT(vec.size() == ?, "Fill in the correct value."); - ASSERT(sizeof(vec) == ?, "Fill in the correct value."); + ASSERT(vec.size() == 5, "Fill in the correct value."); + ASSERT(sizeof(vec) == 24, "Fill in the correct value."); double ans[]{1, 2, 3, 4, 5}; - ASSERT(std::memcmp(vec.?, ans, sizeof(ans)) == 0, "Fill in the correct values."); + ASSERT(std::memcmp(vec.data(), ans, sizeof(ans)) == 0, "Fill in the correct values."); } { vec.push_back(6); - ASSERT(vec.size() == ?, "Fill in the correct value."); - ASSERT(sizeof(vec) == ?, "Fill in the correct value."); + ASSERT(vec.size() == 6, "Fill in the correct value."); + ASSERT(sizeof(vec) == 24, "Fill in the correct value."); vec.pop_back(); - ASSERT(vec.size() == ?, "Fill in the correct value."); - ASSERT(sizeof(vec) == ?, "Fill in the correct value."); + ASSERT(vec.size() == 5, "Fill in the correct value."); + ASSERT(sizeof(vec) == 24, "Fill in the correct value."); } { vec[4] = 6; - ASSERT(vec[0] == ?, "Fill in the correct value."); - ASSERT(vec[1] == ?, "Fill in the correct value."); - ASSERT(vec[2] == ?, "Fill in the correct value."); - ASSERT(vec[3] == ?, "Fill in the correct value."); - ASSERT(vec[4] == ?, "Fill in the correct value."); + ASSERT(vec[0] == 1, "Fill in the correct value."); + ASSERT(vec[1] == 2, "Fill in the correct value."); + ASSERT(vec[2] == 3, "Fill in the correct value."); + ASSERT(vec[3] == 4, "Fill in the correct value."); + ASSERT(vec[4] == 6, "Fill in the correct value."); } { // THINK: `std::vector` 插入删除的时间复杂度是什么? - vec.insert(?, 1.5); + vec.insert(vec.begin() + 1, 1.5); ASSERT((vec == std::vector{1, 1.5, 2, 3, 4, 6}), "Make this assertion pass."); - vec.erase(?); + vec.erase(vec.begin() + 3); ASSERT((vec == std::vector{1, 1.5, 2, 4, 6}), "Make this assertion pass."); } { vec.shrink_to_fit(); - ASSERT(vec.capacity() == ?, "Fill in the correct value."); + ASSERT(vec.capacity() == 5, "Fill in the correct value."); vec.clear(); ASSERT(vec.empty(), "`vec` is empty now."); - ASSERT(vec.size() == ?, "Fill in the correct value."); - ASSERT(vec.capacity() == ?, "Fill in the correct value."); + ASSERT(vec.size() == 0, "Fill in the correct value."); + ASSERT(vec.capacity() == 5, "Fill in the correct value."); } } { - std::vector vec(?, ?); // TODO: 调用正确的构造函数 + std::vector vec(48, 'z'); // TODO: 调用正确的构造函数 ASSERT(vec[0] == 'z', "Make this assertion pass."); ASSERT(vec[47] == 'z', "Make this assertion pass."); ASSERT(vec.size() == 48, "Make this assertion pass."); - ASSERT(sizeof(vec) == ?, "Fill in the correct value."); + ASSERT(sizeof(vec) == 24, "Fill in the correct value."); { auto capacity = vec.capacity(); vec.resize(16); - ASSERT(vec.size() == ?, "Fill in the correct value."); - ASSERT(vec.capacity() == ?, "Fill in a correct identifier."); + ASSERT(vec.size() == 16, "Fill in the correct value."); + ASSERT(vec.capacity() == capacity, "Fill in a correct identifier."); } { vec.reserve(256); - ASSERT(vec.size() == ?, "Fill in the correct value."); - ASSERT(vec.capacity() == ?, "Fill in the correct value."); + ASSERT(vec.size() == 16, "Fill in the correct value."); + ASSERT(vec.capacity() == 256, "Fill in the correct value."); } { vec.push_back('a'); vec.push_back('b'); vec.push_back('c'); vec.push_back('d'); - ASSERT(vec.size() == ?, "Fill in the correct value."); - ASSERT(vec.capacity() == ?, "Fill in the correct value."); - ASSERT(vec[15] == ?, "Fill in the correct value."); - ASSERT(vec[?] == 'a', "Fill in the correct value."); - ASSERT(vec[?] == 'b', "Fill in the correct value."); - ASSERT(vec[?] == 'c', "Fill in the correct value."); - ASSERT(vec[?] == 'd', "Fill in the correct value."); + ASSERT(vec.size() == 20, "Fill in the correct value."); + ASSERT(vec.capacity() == 256, "Fill in the correct value."); + ASSERT(vec[15] == 'z', "Fill in the correct value."); + ASSERT(vec[16] == 'a', "Fill in the correct value."); + ASSERT(vec[17] == 'b', "Fill in the correct value."); + ASSERT(vec[18] == 'c', "Fill in the correct value."); + ASSERT(vec[19] == 'd', "Fill in the correct value."); } } diff --git a/exercises/26_std_vector_bool/main.cpp b/exercises/26_std_vector_bool/main.cpp index b4ab4f9c4..15103c20e 100644 --- a/exercises/26_std_vector_bool/main.cpp +++ b/exercises/26_std_vector_bool/main.cpp @@ -6,29 +6,29 @@ // TODO: 将下列 `?` 替换为正确的代码 int main(int argc, char **argv) { - std::vector vec(?, ?);// TODO: 正确调用构造函数 + std::vector vec(100, true);// TODO: 正确调用构造函数 ASSERT(vec[0], "Make this assertion pass."); ASSERT(vec[99], "Make this assertion pass."); ASSERT(vec.size() == 100, "Make this assertion pass."); // NOTICE: 平台相关!注意 CI:Ubuntu 上的值。 std::cout << "sizeof(std::vector) = " << sizeof(std::vector) << std::endl; - ASSERT(sizeof(vec) == ?, "Fill in the correct value."); + ASSERT(sizeof(vec) == 40, "Fill in the correct value."); { vec[20] = false; - ASSERT(?vec[20], "Fill in `vec[20]` or `!vec[20]`."); + ASSERT(!vec[20], "Fill in `vec[20]` or `!vec[20]`."); } { vec.push_back(false); - ASSERT(vec.size() == ?, "Fill in the correct value."); - ASSERT(?vec[100], "Fill in `vec[100]` or `!vec[100]`."); + ASSERT(vec.size() == 101, "Fill in the correct value."); + ASSERT(!vec[100], "Fill in `vec[100]` or `!vec[100]`."); } { auto ref = vec[30]; - ASSERT(?ref, "Fill in `ref` or `!ref`"); + ASSERT(ref, "Fill in `ref` or `!ref`"); ref = false; - ASSERT(?ref, "Fill in `ref` or `!ref`"); + ASSERT(!ref, "Fill in `ref` or `!ref`"); // THINK: WHAT and WHY? - ASSERT(?vec[30], "Fill in `vec[30]` or `!vec[30]`."); + ASSERT(!vec[30], "Fill in `vec[30]` or `!vec[30]`."); } return 0; } From 0af85fff1f644938443692bde289d620eaa8bff6 Mon Sep 17 00:00:00 2001 From: wangrui <18203537680@163.com> Date: Wed, 29 Jul 2026 18:57:46 +0800 Subject: [PATCH 5/6] =?UTF-8?q?=E5=AE=8C=E6=88=90=E5=89=8D28=E9=81=93?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- exercises/27_strides/main.cpp | 9 +++++++++ exercises/28_std_string/main.cpp | 7 ++++--- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/exercises/27_strides/main.cpp b/exercises/27_strides/main.cpp index baceaf2a9..0d1ae8af9 100644 --- a/exercises/27_strides/main.cpp +++ b/exercises/27_strides/main.cpp @@ -18,6 +18,15 @@ std::vector strides(std::vector const &shape) { // TODO: 完成函数体,根据张量形状计算张量连续存储时的步长。 // READ: 逆向迭代器 std::vector::rbegin // 使用逆向迭代器可能可以简化代码 + + udim current_stride = 1; + auto shape_it = shape.rbegin(); + + for (auto stride_it = strides.rbegin(); stride_it != strides.rend(); ++shape_it, ++stride_it) { + *stride_it = current_stride; + current_stride *= *shape_it; + } + return strides; } diff --git a/exercises/28_std_string/main.cpp b/exercises/28_std_string/main.cpp index d8b276274..f440d64e6 100644 --- a/exercises/28_std_string/main.cpp +++ b/exercises/28_std_string/main.cpp @@ -1,5 +1,6 @@ #include "../exercise.h" #include +#include // READ: 字符串 @@ -10,9 +11,9 @@ int main(int argc, char **argv) { auto world = "world"; // READ: `decltype` 表达式 // READ: `std::is_same_v` 元编程判别 - ASSERT((std::is_same_v), "Fill in the missing type."); - ASSERT((std::is_same_v), "Fill in the missing type."); + ASSERT((std::is_same_v), "Fill in the missing type."); + ASSERT((std::is_same_v), "Fill in the missing type."); // TODO: 将 `?` 替换为正确的字符串 - ASSERT(hello + ", " + world + '!' == "?", "Fill in the missing string."); + ASSERT(hello + ", " + world + '!' == "Hello, world!", "Fill in the missing string."); return 0; } From 8cdafcbc6242eab89378da9d25ea981a7c9db542 Mon Sep 17 00:00:00 2001 From: wangrui <18203537680@163.com> Date: Thu, 30 Jul 2026 16:47:46 +0800 Subject: [PATCH 6/6] =?UTF-8?q?=E5=85=A8=E9=83=A8=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- exercises/29_std_map/main | Bin 0 -> 64752 bytes exercises/29_std_map/main.cpp | 2 ++ exercises/30_std_unique_ptr/main.cpp | 4 ++-- exercises/31_std_shared_ptr/main.cpp | 18 +++++++++--------- exercises/32_std_transform/main.cpp | 10 +++++++++- exercises/33_std_accumulate/main.cpp | 8 +++++++- 6 files changed, 29 insertions(+), 13 deletions(-) create mode 100755 exercises/29_std_map/main diff --git a/exercises/29_std_map/main b/exercises/29_std_map/main new file mode 100755 index 0000000000000000000000000000000000000000..40bc0443da98f9416a86fd058bf5707bd66caa89 GIT binary patch literal 64752 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 WWVtdu7&j^Nf66(=*)rIY+W!SJ#|G>G literal 0 HcmV?d00001 diff --git a/exercises/29_std_map/main.cpp b/exercises/29_std_map/main.cpp index fcccca347..68122a5fc 100644 --- a/exercises/29_std_map/main.cpp +++ b/exercises/29_std_map/main.cpp @@ -7,11 +7,13 @@ template bool key_exists(std::map const &map, k const &key) { // TODO: 实现函数 + return map.find(key) != map.end(); } template void set(std::map &map, k key, v value) { // TODO: 实现函数 + map[key] = value; } // ---- 不要修改以下代码 ---- diff --git a/exercises/30_std_unique_ptr/main.cpp b/exercises/30_std_unique_ptr/main.cpp index 9b98b5794..d525f00c7 100644 --- a/exercises/30_std_unique_ptr/main.cpp +++ b/exercises/30_std_unique_ptr/main.cpp @@ -53,8 +53,8 @@ int main(int argc, char **argv) { {"fd"}, // TODO: 分析 problems[1] 中资源的生命周期,将记录填入 `std::vector` // NOTICE: 此题结果依赖对象析构逻辑,平台相关,提交时以 CI 实际运行平台为准 - {"", "", "", "", "", "", "", ""}, - {"", "", "", "", "", "", "", ""}, + {"d", "ffr"}, + {"d", "d", "r"}, }; // ---- 不要修改以下代码 ---- diff --git a/exercises/31_std_shared_ptr/main.cpp b/exercises/31_std_shared_ptr/main.cpp index febbbcc6f..d35134457 100644 --- a/exercises/31_std_shared_ptr/main.cpp +++ b/exercises/31_std_shared_ptr/main.cpp @@ -10,36 +10,36 @@ int main(int argc, char **argv) { std::shared_ptr ptrs[]{shared, shared, shared}; std::weak_ptr observer = shared; - ASSERT(observer.use_count() == ?, ""); + ASSERT(observer.use_count() == 4, ""); ptrs[0].reset(); - ASSERT(observer.use_count() == ?, ""); + ASSERT(observer.use_count() == 3, ""); ptrs[1] = nullptr; - ASSERT(observer.use_count() == ?, ""); + ASSERT(observer.use_count() == 2, ""); ptrs[2] = std::make_shared(*shared); - ASSERT(observer.use_count() == ?, ""); + ASSERT(observer.use_count() == 1, ""); ptrs[0] = shared; ptrs[1] = shared; ptrs[2] = std::move(shared); - ASSERT(observer.use_count() == ?, ""); + ASSERT(observer.use_count() == 3, ""); std::ignore = std::move(ptrs[0]); ptrs[1] = std::move(ptrs[1]); ptrs[1] = std::move(ptrs[2]); - ASSERT(observer.use_count() == ?, ""); + ASSERT(observer.use_count() == 2, ""); shared = observer.lock(); - ASSERT(observer.use_count() == ?, ""); + ASSERT(observer.use_count() == 3, ""); shared = nullptr; for (auto &ptr : ptrs) ptr = nullptr; - ASSERT(observer.use_count() == ?, ""); + ASSERT(observer.use_count() == 0, ""); shared = observer.lock(); - ASSERT(observer.use_count() == ?, ""); + ASSERT(observer.use_count() == 0, ""); return 0; } diff --git a/exercises/32_std_transform/main.cpp b/exercises/32_std_transform/main.cpp index f4dc25a5c..b8cb0cee1 100644 --- a/exercises/32_std_transform/main.cpp +++ b/exercises/32_std_transform/main.cpp @@ -9,7 +9,15 @@ int main(int argc, char **argv) { std::vector val{8, 13, 21, 34, 55}; // TODO: 调用 `std::transform`,将 `v` 中的每个元素乘以 2,并转换为字符串,存入 `ans` - // std::vector ans + std::vector ans(val.size()); + + std::transform(val.begin(), + val.end(), + ans.begin(), + [](int value) { + return std::to_string(value * 2); + }); + ASSERT(ans.size() == val.size(), "ans size should be equal to val size"); ASSERT(ans[0] == "16", "ans[0] should be 16"); ASSERT(ans[1] == "26", "ans[1] should be 26"); diff --git a/exercises/33_std_accumulate/main.cpp b/exercises/33_std_accumulate/main.cpp index 6326929d5..13207fa14 100644 --- a/exercises/33_std_accumulate/main.cpp +++ b/exercises/33_std_accumulate/main.cpp @@ -11,7 +11,13 @@ int main(int argc, char **argv) { // - 形状为 shape; // - 连续存储; // 的张量占用的字节数 - // int size = + int size = std::accumulate(shape, + shape + sizeof(shape) / sizeof(*shape), + static_cast(sizeof(DataType)), + [](int result, int value) { + return result * value; + }); + ASSERT(size == 602112, "4x1x3x224x224 = 602112"); return 0; }