Skip to content
Open
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
Binary file added exercises/00_hello_world/main
Binary file not shown.
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;
}
Binary file added exercises/01_variable&add/main
Binary file not shown.
1 change: 1 addition & 0 deletions exercises/01_variable&add/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
int main(int argc, char **argv) {
// TODO: 补全变量定义并打印加法运算
// x ?
int x = 1;
std::cout << x << " + " << x << " = " << x + x << std::endl;
return 0;
}
Binary file added exercises/02_function/main
Binary file not shown.
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;
}
Binary file added exercises/03_argument&parameter/main
Binary file not shown.
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 ?");
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;
}
Binary file added exercises/04_static/main
Binary file not shown.
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;
}
Binary file added exercises/05_constexpr/main
Binary file not shown.
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 = 90; // 编译时必须计算出结果,const只要求值不可变,运行时也可
const auto ANS = fibonacci(ANS_N);
std::cout << "fibonacci(" << ANS_N << ") = " << ANS << std::endl;

return 0;
Expand Down
Binary file added exercises/06_array/main
Binary file not shown.
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] ? 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) == 90 * sizeof(unsigned long long) , "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
Binary file added exercises/07_loop/main
Binary file not shown.
4 changes: 2 additions & 2 deletions exercises/07_loop/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@
// 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}, cached = 2;
// TODO: 设置正确的循环条件
for (; false; ++cached) {
for (; cached < 96; ++cached) {
cache[cached] = cache[cached - 1] + cache[cached - 2];
}
return cache[i];
Expand Down
Binary file added exercises/08_pointer/main
Binary file not shown.
11 changes: 11 additions & 0 deletions exercises/08_pointer/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,17 @@ 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++) { // len表示元素个数,不是边界
int a = ptr[i * stride];
int b = ptr[(i + 1) * stride];
int c = ptr[(i + 2) * stride];

if (c != a + b) {
return false;
}
}

return true;
}

Expand Down
Binary file added exercises/09_enum&union/main
Binary file not shown.
9 changes: 6 additions & 3 deletions exercises/09_enum&union/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
// 在 `enum` 中定义标识符等价于定义 constexpr 常量,
// 这些标识符不需要前缀,可以直接引用。
// 因此 `enum` 定义会污染命名空间。
enum ColorEnum : unsigned char {
enum ColorEnum : unsigned char {
COLOR_RED = 31,
COLOR_GREEN,
COLOR_YELLOW,
Expand All @@ -16,7 +16,7 @@ enum ColorEnum : unsigned char {
// 有作用域枚举型是 C++ 引入的类型安全枚举。
// 其内部标识符需要带前缀引用,如 `Color::Red`。
// 作用域枚举型可以避免命名空间污染,并提供类型安全保证。
enum class Color : int {
enum class Color : int { // 如同int /float一样知识取值,31,可以选red,green,yellow,blue
Red = COLOR_RED,
Green,
Yellow,
Expand All @@ -26,7 +26,7 @@ enum class Color : int {
ColorEnum convert_by_pun(Color c) {
// READ: <https://zh.cppreference.com/w/cpp/language/union>
// `union` 表示在同一内存位置存储的不同类型的值。
// 其常见用法是实现类型双关转换,即将一种类型的值转换为另一种无关类型的值。
// 其常见用法是实现类型双关转换,即将一种类型的值转换为另一种无关类型的值。
// 但这种写法实际上仅在 C 语言良定义,在 C++ 中是未定义行为。
// 这是比较少见的 C++ 不与 C 保持兼容的特性。
// READ: 类型双关 <https://tttapa.github.io/Pages/Programming/Cpp/Practices/type-punning.html>
Expand All @@ -37,6 +37,7 @@ ColorEnum convert_by_pun(Color c) {

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

return pun.e;
}
Expand All @@ -48,3 +49,5 @@ int main(int argc, char **argv) {
ASSERT(convert_by_pun(Color::Blue) == COLOR_BLUE, "Type punning conversion");
return 0;
}


Binary file added exercises/10_trivial/main
Binary file not shown.
25 changes: 22 additions & 3 deletions exercises/10_trivial/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,27 @@ struct FibonacciCache {

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

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

int main(int argc, char **argv) {
// TODO: 初始化缓存结构体,使计算正确
Fibonacci fib;
Fibonacci fib={};
ASSERT(fib.get(10) == 55, "fibonacci(10) should be 55");
std::cout << "fibonacci(10) = " << fib.get(10) << std::endl;
return 0;
Expand Down
Binary file added exercises/12_method_const/main
Binary file not shown.
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{ // const 成员函数:不修改对象,可在 const 对象上调用
return numbers[i];
}
};

Expand Down
Binary file added exercises/13_class/main
Binary file not shown.
21 changes: 19 additions & 2 deletions exercises/13_class/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,28 @@ class Fibonacci {
public:
// TODO: 实现构造器
// Fibonacci()
Fibonacci():cache{},cached{0} {}

// TODO: 实现正确的缓存优化斐波那契计算
size_t get(int i) {
for (; false; ++cached) {
cache[cached] = cache[cached - 1] + cache[cached - 2];
if(i < cached)
{
return cache[i];
}
for (int n = cached; n <= i;++n)
{
if(n==0)
{
cache[n] = 0;
}
else if (n==1)
{
cache[n] = 1;
}
else{
cache[n] = cache[n - 1] + cache[n - 2];
}
cached = n;
}
return cache[i];
}
Expand Down
Binary file added exercises/14_class_destruct/main
Binary file not shown.
27 changes: 23 additions & 4 deletions exercises/14_class_destruct/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,15 +11,34 @@ class DynFibonacci {

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

// TODO: 实现析构器,释放缓存空间
~DynFibonacci();
~DynFibonacci()
{
delete[] cache; // 释放单个对象的内存还是对象数组的内存
}

// TODO: 实现正确的缓存优化斐波那契计算
size_t get(int i) {
for (; false; ++cached) {
cache[cached] = cache[cached - 1] + cache[cached - 2];
if(i < cached)
{
return cache[i];
}
for (int n = cached; n <= i;++n)
{
if(n==0)
{
cache[n] = 0;
}
else if (n==1)
{
cache[n] = 1;
}
else{
cache[n] = cache[n - 1] + cache[n - 2];
}
cached = n;
}
return cache[i];
}
Expand Down
Binary file added exercises/15_class_clone/main
Binary file not shown.
43 changes: 38 additions & 5 deletions exercises/15_class_clone/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,22 +7,54 @@
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]()), cached(0) {
this->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 <= other.cached; ++i)
{
cache[i] = other.cache[i];
}
}

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

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

}
cached = i;
return cache[i];
}

Expand All @@ -42,6 +74,7 @@ int main(int argc, char **argv) {
DynFibonacci fib(12);
ASSERT(fib.get(10) == 55, "fibonacci(10) should be 55");
DynFibonacci const fib_ = fib;
std::cout << fib_.get(10);
ASSERT(fib_.get(10) == fib.get(10), "Object cloned");
return 0;
}
Binary file added exercises/16_class_move/main
Binary file not shown.
Loading