Skip to content
Open

Main #25

Show file tree
Hide file tree
Changes from all commits
Commits
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
4 changes: 2 additions & 2 deletions 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;
}
}
9 changes: 5 additions & 4 deletions exercises/01_variable&add/main.cpp
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
#include "../exercise.h"

// READ: 运算符 <https://zh.cppreference.com/w/cpp/language/expressions#.E8.BF.90.E7.AE.97.E7.AC.A6>
// READ: std streams <https://zh.cppreference.com/w/cpp/io/c/std_streams>
// READ: 流修饰符 <https://zh.cppreference.com/w/cpp/io/manip>
// READ: format in cxx20 <https://zh.cppreference.com/w/cpp/utility/format/format>

int main(int argc, char **argv) {
// TODO: 补全变量定义并打印加法运算
// x ?
std::cout << x << " + " << x << " = " << x + x << std::endl;
// TODO: 在控制台输出 "Hello, InfiniTensor!" 并换行
std::cout << "Hello, InfiniTensor!" << std::endl;
return 0;
}
3 changes: 2 additions & 1 deletion 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 @@ -15,5 +16,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;
}
11 changes: 6 additions & 5 deletions exercises/04_static/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,11 @@ 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;
}

19 changes: 11 additions & 8 deletions exercises/05_constexpr/main.cpp
Original file line number Diff line number Diff line change
@@ -1,14 +1,17 @@
#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);
if (i <= 0) return 0;
if (i == 1) return 1;

unsigned long long a = 0;
unsigned long long b = 1;
for (int k = 2; k <= i; ++k) {
unsigned long long c = a + b;
a = b;
b = c;
}
return b;
}

int main(int argc, char **argv) {
Expand All @@ -19,7 +22,7 @@ int main(int argc, char **argv) {
// TODO: 观察错误信息,修改一处,使代码编译运行
// PS: 编译运行,但是不一定能算出结果……
constexpr auto ANS_N = 90;
constexpr auto ANS = fibonacci(ANS_N);
const auto ANS = fibonacci(ANS_N);
std::cout << "fibonacci(" << ANS_N << ") = " << ANS << std::endl;

return 0;
Expand Down
5 changes: 2 additions & 3 deletions exercises/06_array/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,13 @@ unsigned long long fibonacci(int i) {
case 1:
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) == sizeof(unsigned long long) * 90, "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
35 changes: 16 additions & 19 deletions exercises/07_loop/main.cpp
Original file line number Diff line number Diff line change
@@ -1,28 +1,25 @@
#include "../exercise.h"

// TODO: 改正函数实现,实现正确的缓存优化斐波那契计算
// 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) {
cache[cached] = cache[cached - 1] + cache[cached - 2];
// READ: 数组 <https://zh.cppreference.com/w/cpp/language/array>

unsigned long long arr[90]{0, 1};
unsigned long long fibonacci(int i) {
switch (i) {
case 0:
return 0;
case 1:
return 1;
default:
return arr[i] != 0 ? arr[i] : (arr[i] = fibonacci(i - 1) + fibonacci(i - 2));
}
return cache[i];
}

// ---- 不要修改以下代码 ----
int main(int argc, char **argv) {
ASSERT(fibonacci(0) == 0, "fibonacci(0) should be 0");
ASSERT(fibonacci(1) == 1, "fibonacci(1) should be 1");
// TODO: 为此 ASSERT 填写正确的值
ASSERT(sizeof(arr) == sizeof(unsigned long long) * 90, "sizeof array is size of all its elements");
// ---- 不要修改以下代码 ----
ASSERT(fibonacci(2) == 1, "fibonacci(2) should be 1");
ASSERT(fibonacci(3) == 2, "fibonacci(3) should be 2");
ASSERT(fibonacci(10) == 55, "fibonacci(10) should be 55");

auto fib90 = fibonacci(90);
std::cout << "fibonacci(90) = " << fib90 << std::endl;
ASSERT(fib90 == 2880067194370816120, "fibonacci(90) should be 2880067194370816120");
ASSERT(fibonacci(20) == 6765, "fibonacci(20) should be 6765");
ASSERT(fibonacci(80) == 23416728348467685, "fibonacci(80) should be 23416728348467685");
return 0;
}
7 changes: 5 additions & 2 deletions exercises/08_pointer/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,11 @@
// 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 + 2 * stride < len * stride; i += stride) {
if (ptr[i + 2 * stride] != ptr[i] + ptr[i + 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
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
13 changes: 10 additions & 3 deletions exercises/11_method/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,18 +4,25 @@ struct Fibonacci {
unsigned long long cache[128];
int cached;

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

int main(int argc, char **argv) {
// TODO: 初始化缓存结构体,使计算正确
// 初始化缓存结构体,使计算正确
Fibonacci fib;
fib.cache[0] = 0;
fib.cache[1] = 1;
fib.cached = 2;

ASSERT(fib.get(10) == 55, "fibonacci(10) should be 55");
std::cout << "fibonacci(10) = " << fib.get(10) << std::endl;
return 0;
Expand Down
7 changes: 4 additions & 3 deletions exercises/12_method_const/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,9 @@

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

Expand All @@ -14,4 +15,4 @@ int main(int argc, char **argv) {
ASSERT(FIB.get(10) == 55, "fibonacci(10) should be 55");
std::cout << "fibonacci(10) = " << FIB.get(10) << std::endl;
return 0;
}
}
17 changes: 13 additions & 4 deletions exercises/13_class/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,21 @@ class Fibonacci {
int cached;

public:
// TODO: 实现构造器
// Fibonacci()
// 实现构造器
Fibonacci() : cached(2) {
cache[0] = 0;
cache[1] = 1;
for (int i = 2; i < 16; ++i) {
cache[i] = 0; // 初始化缓存数组
}
}

// TODO: 实现正确的缓存优化斐波那契计算
// 实现正确的缓存优化斐波那契计算
size_t get(int i) {
for (; false; ++cached) {
if (i < cached) {
return cache[i];
}
for (; cached <= i; ++cached) {
cache[cached] = cache[cached - 1] + cache[cached - 2];
}
return cache[i];
Expand Down
18 changes: 12 additions & 6 deletions exercises/14_class_destruct/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,16 +10,22 @@ 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) {
while (cached <= i) {
cache[cached] = cache[cached - 1] + cache[cached - 2];
++cached;
}
return cache[i];
}
Expand Down
51 changes: 41 additions & 10 deletions exercises/15_class_clone/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,22 +6,53 @@

class DynFibonacci {
size_t *cache;
int cached;
int capacity;
int cached; // 已经初始化/计算好的元素个数(即下一个要算的位置)

public:
// TODO: 实现动态设置容量的构造器
DynFibonacci(int capacity): cache(new ?), cached(?) {}
// 实现动态设置容量的构造器
DynFibonacci(int capacity_)
: cache(nullptr), capacity(capacity_), cached(0) {
ASSERT(capacity > 0, "capacity must be positive");

// TODO: 实现复制构造器
DynFibonacci(DynFibonacci const &) = delete;
cache = new size_t[capacity]();

// TODO: 实现析构器,释放缓存空间
~DynFibonacci();
// 初始化 F0
cache[0] = 0;
cached = 1;

// TODO: 实现正确的缓存优化斐波那契计算
// 初始化 F1(如果有空间)
if (capacity > 1) {
cache[1] = 1;
cached = 2;
}
}

// 修改为启用复制构造器
DynFibonacci(DynFibonacci const &other)
: cache(new size_t[other.capacity]()),
capacity(other.capacity),
cached(other.cached) {
for (int i = 0; i < cached; ++i) {
cache[i] = other.cache[i];
}
}

// 禁用赋值运算符
DynFibonacci &operator=(DynFibonacci const &) = delete;

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

// 实现正确的缓存优化斐波那契计算
size_t get(int i) {
for (; false; ++cached) {
ASSERT(i >= 0 && i < capacity, "i out of range");

while (cached <= i) {
cache[cached] = cache[cached - 1] + cache[cached - 2];
++cached;
}
return cache[i];
}
Expand All @@ -31,7 +62,7 @@ class DynFibonacci {
// 本质上,方法是隐藏了 this 参数的函数
// const 修饰作用在 this 上,因此它们实际上参数不同
size_t get(int i) const {
if (i <= cached) {
if (i < cached) {
return cache[i];
}
ASSERT(false, "i out of range");
Expand Down
Loading