Skip to content
This repository has been archived by the owner on Sep 15, 2024. It is now read-only.

Commit

Permalink
update: dslings + ebook
Browse files Browse the repository at this point in the history
1. add range-base for
2. update dslings
3. add Resources.md

Signed-off-by: SPeak <[email protected]>
  • Loading branch information
Sunrisepeak committed Apr 4, 2024
1 parent 9d95095 commit 324877d
Show file tree
Hide file tree
Showing 17 changed files with 584 additions and 70 deletions.
4 changes: 2 additions & 2 deletions common/common.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,15 +16,15 @@
if (!(expr)) { \
HONLY_LOGW("❌ | %s", #expr); \
} else { \
HONLY_LOGI("✅ | %s", #expr); \
HONLY_LOGI_P("✅ | %s", #expr); \
}

#define d2ds_assert_eq(a, b) \
if (a != b) {\
HONLY_LOGW("❌ | %s == %s (%s == %s)", \
#a, #b, std::to_string(a).c_str(), std::to_string(b).c_str()); \
} else {\
HONLY_LOGI("✅ | %s == %s (%s == %s)", \
HONLY_LOGI_P("✅ | %s == %s (%s == %s)", \
#a, #b, std::to_string(a).c_str(), std::to_string(b).c_str()); \
}

Expand Down
1 change: 1 addition & 0 deletions common/honly_logger.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@

#define LOG_ENABLE true
#define _HONLY_LOG(fd, ...) if (LOG_ENABLE) fprintf (fd, __VA_ARGS__); fprintf (fd, "\033[0m\n")
#define HONLY_LOGI_P(...) fprintf (stdout, "\033[32m[%s LOGI]: - ", HONLY_LOGGER_TAG); _HONLY_LOG(stdout, __VA_ARGS__)
#define HONLY_LOGI(...) fprintf (stdout, "\033[32m[%s LOGI]: \t%s: %s:%d - ", HONLY_LOGGER_TAG, __func__, __FILE__, __LINE__); _HONLY_LOG(stdout, __VA_ARGS__)
#define HONLY_LOGD(...) fprintf (stdout, "\033[37m[%s LOGD]: \t%s: %s:%d - ", HONLY_LOGGER_TAG, __func__, __FILE__, __LINE__); _HONLY_LOG(stdout, __VA_ARGS__)
#define HONLY_LOGW(...) fprintf (stdout, "\033[33m[%s LOGW]: \t%s: %s:%d - ", HONLY_LOGGER_TAG, __func__, __FILE__, __LINE__); _HONLY_LOG(stdout, __VA_ARGS__)
Expand Down
3 changes: 2 additions & 1 deletion exercises/dslings.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ namespace d2ds {




/*
class MaxValue {
public:
MaxValue(int val) {
Expand All @@ -27,6 +27,7 @@ class MaxValue {
private:
int __mMaxVal;
};
*/

}

Expand Down
30 changes: 0 additions & 30 deletions exercises/other/cpp-base/RangeFor.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,37 +6,7 @@
namespace d2ds {
// show your code

class py_range {
public:
py_range(int start, int end) : py_range(start, 1, end) { }

py_range(int start, int step, int end) {

__mLen = (end - start) / step;

d2ds_assert(start < end);
d2ds_assert(step > 0);
d2ds_assert(__mLen <= 100);

for (int i = 0; i < __mLen; i++) {
__mArr[i] = start;
start = start + step;
}
}

public:
const int * begin() const {
return __mArr;
}

const int * end() const {
return __mArr + __mLen;
}

private:
int __mLen;
int __mArr[100];
};

}

Expand Down
5 changes: 5 additions & 0 deletions exercises/other/cpp-base/Template.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,11 @@
namespace d2ds {
// show your code

int max(int a, int b) {
return a > b ? a : b;
}


}

#endif
92 changes: 84 additions & 8 deletions src/Instroduction.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,27 @@
**预览**

---

- 基本介绍
- 章节结构
- 数据结构接口使用 | 代码演示
- dslings - 测试代码
- dslings - 检测结果
- 代码接口介绍
- 数据结构接口实现 | 类型定义
- 数据结构接口实现 | 接口实现
- 数据结构接口实现 | 完整代码
- 代码练习dslings
- 代码下载
- 安装xmake
- dslings自动检测
- 错误提示
- 代码通过提示
- D2DS_WAIT - dslings等待标志
- 总结

---

# 导读

动手写数据结构(d2ds)是一本强调动手实践的开源电子书, 每一章节都会介绍一个数据结构的基本用法和对应的具体实现。本书使用C++作为数据结构的开发语言, 并使用"编译器驱动开发模式"面向接口编程的形式, 来介绍常见数据结构的主体功能和实现。同时, 在[d2ds仓库](https://github.com/Sunrisepeak/d2ds)中也为每章节配有对应的练习代码和dslings检测程序, 真正让读者感受到"动手写"的感觉。下面我们就来详细的介绍一下 章节结构 和 dslings的使用。
Expand All @@ -11,8 +35,24 @@

### 数据结构接口使用

#### 代码示例
**dslings - MaxValue代码示例**

```cpp
// dslings.2.cpp - readonly
//
// 描述:
// 通过实现一个MaxVal类型(保存最大值), 来介绍dslings的"编译器驱动开发"
// 即根据编译器的错误提示来完成这个训练流程的演示Demo, 并且通常为了降低难度会把一个'数据结构'的实现分成多个检测模块.
// 如: dslings.0.cpp dslings.1.cpp dslings.2.cpp
//
// 目标/要求:
// - 不修改该代码检测文件
// - 在exercises/dslings.hpp中完成你的代码设计
// - 通过所有编译器检测 和 断言
//

#include <dstruct.hpp>

#include "common/common.hpp"
#include "exercises/dslings.hpp"

Expand Down Expand Up @@ -43,27 +83,53 @@ int main() {

d2ds_assert_eq(mVal.get(), maxVal);

D2DS_WAIT

return 0;
}
```

#### 代码介绍/描述
**dslings - 检测结果**

```bash
🌏Progress: [==>----------] 2/12

[Target: 0.dslings-2]

✅ Successfully ran tests/dslings.2.cpp!

🎉 The code is compiling! 🎉

Output:
====================
[D2DS LOGI]: - ✅ | mVal.get() == 2 (2 == 2)
[D2DS LOGI]: - ✅ | mVal.get() == 2 (2 == 2)
[D2DS LOGI]: - ✅ | mVal.get() == 100 (100 == 100)
[D2DS LOGI]: - ✅ | mVal.get() == maxVal (191 == 191)
[D2DS LOGW]: main: tests/dslings.2.cpp:46 - Delete the D2DS_WAIT to continue...

====================

Book: https://sunrisepeak.github.io/d2ds
```

**代码接口介绍**

MaxValue一个数据最大值检查器

**MaxValue构造函数设置默认值**
MaxValue构造函数设置默认值

```cpp
d2ds::MaxValue mVal(2);
```
**get函数获取当前最大值**
get函数获取当前最大值
```cpp
d2ds_assert_eq(mVal.get(), 2);
```

**set函数设置一个值**
set函数设置一个值

> 如果当前最大值小于这个值则需要进行替换
Expand All @@ -75,7 +141,7 @@ MaxValue一个数据最大值检查器
d2ds_assert_eq(mVal.get(), 100);
```
**MaxVal的应用测试 - 获取最大数组中最大值**
MaxVal的应用测试 - 获取最大数组中最大值
```cpp
// random test
Expand Down Expand Up @@ -178,7 +244,7 @@ xmake dslings
> - 强烈建议使用vscode作为代码练习的编辑器, 这样dslings在控制台给出的练习代码路径, 只需要用**ctrl+鼠标左键**点击就可以自动转跳到目标位置
>

### 错误提示
**错误提示**

```text
🌏Progress: [>-----] 0/5
Expand Down Expand Up @@ -242,7 +308,7 @@ int main() {

根据对应的练习代码中给的描述和要求完成该练习, 过程中可以结合dslings在控制台的提示来进行相关数据结构练习的代码设计。当正确完成代码后, dslings就会更新控制的输出给出对应的提示。

### 代码通过提示
**代码通过提示**

```text
🌏Progress: [=>----] 1/5
Expand All @@ -262,6 +328,16 @@ Book: https://sunrisepeak.github.io/d2ds
```

**D2DS_WAIT - dslings等待标志**

当完整完成一个小节的练习的时候, dslings检测程序会进入等待状态, 并且打印出类似如下的提示消息

```bash
[D2DS LOGW]: main: tests/dslings.2.cpp:46 - Delete the D2DS_WAIT to continue...
```

按照消息中给出的文件地址, 选择注释掉(或删除)程序中的`D2DS_WAIT`标志, dslings就会进入下一个练习并开启自动检测

## 总结

好的, 到这里你应该已经了解了本书的叙述逻辑和结构 - **[数据结构使用 + 数据结构实现 + 对应代码练习]**。但该项目现任处于持续构建中(WIP), 依然存在相当多的问题。如果你在这个过程中你发现了一些项目的问题或自己遇到了一些问题, 欢迎到[d2ds讨论区](https://github.com/Sunrisepeak/d2ds-courses/discussions)反馈和交流。那么下面可以开始你的**动手写数据结构**之旅了...
53 changes: 53 additions & 0 deletions src/Resources.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
# 资源

开源电子书 + 代码练习 + 公开课 + 论坛讨论

#### 开源电子书

---

[在线阅读](https://sunrisepeak.github.io/d2ds/)

[书籍原始文件](https://github.com/Sunrisepeak/d2ds/tree/main/src)



#### 代码练习

---

[d2ds数据结构代码练习目录](https://github.com/Sunrisepeak/d2ds/tree/main/exercises)

[d2ds数据结构代码检测项目录](https://github.com/Sunrisepeak/d2ds/tree/main/tests)



#### 公开课

---

[课程主页](https://sunrisepeak.github.io/d2ds-courses/)

[B站 - 视频列表](https://space.bilibili.com/65858958/channel/seriesdetail?sid=4040405)

[YouTube - Playlist](https://www.youtube.com/playlist?list=PL7uow6t1QjF1MtrsJdhkJXsCKwwnVZApH)



#### 论坛

---

[d2ds书籍 | dslings](https://github.com/Sunrisepeak/d2ds/discussions)

[d2ds课程内容讨论](https://github.com/Sunrisepeak/d2ds-courses/discussions)



#### 参与贡献

---

[d2ds - issues | task](https://github.com/Sunrisepeak/d2ds/issues)

[d2ds-courses - issues | task](https://github.com/Sunrisepeak/d2ds-courses/issues)
3 changes: 2 additions & 1 deletion src/SUMMARY.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

# 阅读准备
- [导读](./Instroduction.md)
- [资源](./Resources.md)

# 常用数据结构
- [数组]()
Expand Down Expand Up @@ -35,7 +36,7 @@
- [数据结构基本概念](other/0_ds_base.md)
- [C++基础](other/1_cpp_base.md)
- [范型编程](other/1_cpp_base.template.md)
- [范围for循环语法糖](other/2_cpp_base.rangefor.md)
- [语法糖 | 范围for循环](other/2_cpp_base.rangefor.md)
- [内存管理]()
- [设计模式]()
- [迭代器设计模式]()
Expand Down
4 changes: 4 additions & 0 deletions src/other/1_cpp_base.md
Original file line number Diff line number Diff line change
@@ -1,2 +1,6 @@
# C++ 基础

本章节将会介绍在实现d2ds中练习对应的数据结构时会遇到的一些C++相关的基础知识

- [范型编程](other/1_cpp_base.template.md)
- [语法糖 | 范围for循环](other/2_cpp_base.rangefor.md)
Loading

0 comments on commit 324877d

Please sign in to comment.