Skip to content
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 ?
auto x{10};
std::cout << x << " + " << x << " = " << x + x << std::endl;
return 0;
}
2 changes: 2 additions & 0 deletions exercises/02_function/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
// 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 @@ -16,4 +17,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;
}
12 changes: 6 additions & 6 deletions exercises/04_static/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,16 @@
// THINK: 这个函数的两个 `static` 各自的作用是什么?
static int func(int param) {
static int static_ = param;
// std::cout << "static_ = " << static_ << std::endl;
//std::cout << "static_ = " << static_ << std::endl;
return static_++;
}

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;
}
24 changes: 22 additions & 2 deletions exercises/05_constexpr/main.cpp
Original file line number Diff line number Diff line change
@@ -1,14 +1,34 @@
#include "../exercise.h"

// constexpr unsigned long long fibonacci(int i) {
// switch (i) {
// case 0:
// return 0;
// case 1:
// return 1;
// default:
// return fibonacci(i - 1) + fibonacci(i - 2);
// }
// }

constexpr unsigned long long fibonacci(int i) {
switch (i) {
case 0:
return 0;
case 1:
return 1;
default:
return fibonacci(i - 1) + fibonacci(i - 2);
}

unsigned long long fib_1 = 0;
unsigned long long fib_2 = 1;
unsigned long long fib_i = 0;
for (int j = 2; j <= i; ++j) {
fib_i = fib_1 + fib_2;
fib_1 = fib_2;
fib_2 = fib_i;
}
return fib_i;

}

int main(int argc, char **argv) {
Expand Down
4 changes: 2 additions & 2 deletions exercises/06_array/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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] != 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");
Expand Down
5 changes: 3 additions & 2 deletions exercises/07_loop/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,10 @@
// 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;
static unsigned long long cache[96] {0, 1};
static unsigned long long cached{2};
// TODO: 设置正确的循环条件
for (; false; ++cached) {
for (; cached <= i ; ++cached) {
cache[cached] = cache[cached - 1] + cache[cached - 2];
}
return cache[i];
Expand Down
11 changes: 11 additions & 0 deletions exercises/08_pointer/main.cpp
Original file line number Diff line number Diff line change
@@ -1,11 +1,22 @@
#include "../exercise.h"
#include <array>

// 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]
int* arr = new int[len];
for(int i = 0; i < len; i++) {
arr[i] = *(ptr + (i * stride));
}
//for(int i = 0; i < len; i++) { std::cout << arr[i] <<", "; }
//std::cout << "----------------" << std::endl;
for(int i = 2; i < len; i++) {
if(arr[i] != arr[i - 1] + arr[i -2]) { return false; }
}
return true;
delete[] arr;
}

// ---- 不要修改以下代码 ----
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 @@ -37,7 +37,7 @@ ColorEnum convert_by_pun(Color c) {

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

pun.c = c;
return pun.e;
}

Expand Down
6 changes: 3 additions & 3 deletions exercises/10_trivial/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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];
}
Expand All @@ -19,7 +19,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
4 changes: 2 additions & 2 deletions exercises/11_method/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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];
Expand All @@ -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;
Expand Down
3 changes: 2 additions & 1 deletion exercises/12_method_const/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@
struct Fibonacci {
int numbers[11];
// TODO: 修改方法签名和实现,使测试通过
int get(int i) {
int get(int i) const {
return numbers[i];
}
};

Expand Down
4 changes: 2 additions & 2 deletions exercises/13_class/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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];
Expand Down
11 changes: 8 additions & 3 deletions exercises/14_class_destruct/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,19 @@ 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()
{
if (cache != nullptr) {
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
18 changes: 14 additions & 4 deletions exercises/15_class_clone/main.cpp
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#include "../exercise.h"
#include <cstring>

// READ: 复制构造函数 <https://zh.cppreference.com/w/cpp/language/copy_constructor>
// READ: 函数定义(显式弃置)<https://zh.cppreference.com/w/cpp/language/function>
Expand All @@ -10,17 +11,26 @@ 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 const &) = delete;
DynFibonacci(DynFibonacci const & other): cache{new size_t[other.cached * sizeof(size_t)]}
{
cached = other.cached;
memcpy(cache, other.cache, other.cached * sizeof(size_t));
}

// TODO: 实现析构器,释放缓存空间
~DynFibonacci();
~DynFibonacci()
{
if (cache != nullptr) {
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
28 changes: 23 additions & 5 deletions exercises/16_class_move/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

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

// TODO: 实现析构器,释放缓存空间
~DynFibonacci();
~DynFibonacci()
{
if (cache != nullptr) {
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
Loading