一、流程图:用 ATM 取款流程示例
流程图用于描述算法或业务的执行步骤和分支逻辑,我们以 ATM 取款流程为例,结合代码逻辑来画流程图。
代码逻辑(简化版)
// ATM取款流程伪代码
bool withdrawMoney(double amount) {
// 1. 验证银行卡
if (!validateCard()) {
showMessage("卡片无效");
return false;
}
// 2. 验证密码
if (!validatePin()) {
showMessage("密码错误");
return false;
}
// 3. 检查余额
if (getBalance() < amount) {
showMessage("余额不足");
return false;
}
// 4. 检查取款金额是否符合规定
if (amount > MAX_WITHDRAW || amount % 100 != 0) {
showMessage("金额不符合要求");
return false;
}
// 5. 执行取款操作
deductBalance(amount);
dispenseCash(amount);
printReceipt();
showMessage("取款成功");
return true;
}
对应的流程图
流程图绘制要点
- 从左到右或从上到下布局,保持流程清晰
- 用箭头明确指示流程走向,避免交叉
- 判断节点(菱形)必须有两个或以上出口
- 每个流程都应有明确的开始和结束点
- 复杂流程可拆分多个子流程
二、类图:用 C++ 图书管理系统类为例
类图用于描述类的结构和类之间的关系,我们以一个简单的图书管理系统为例,根据 C++ 类代码来绘制类图。
C++ 类代码
#include <string>
#include <vector>
// 图书类
class Book {
private:
std::string isbn; // 图书ISBN
std::string title; // 书名
std::string author; // 作者
int publishYear; // 出版年份
bool isBorrowed; // 是否被借出
public:
Book(std::string isbn, std::string title, std::string author, int year);
std::string getISBN() const;
std::string getTitle() const;
bool borrowBook(); // 借阅图书
bool returnBook(); // 归还图书
bool isAvailable() const; // 检查是否可借
};
// 读者类
class Reader {
private:
std::string readerId; // 读者ID
std::string name; // 姓名
std::vector<std::string> borrowedBooks; // 已借图书ISBN列表
public:
Reader(std::string id, std::string name);
std::string getReaderId() const;
bool borrowBook(Book& book); // 借阅图书
bool returnBook(Book& book); // 归还图书
int getBorrowedCount() const; // 获取已借数量
};
// 图书馆类
class Library {
private:
std::vector<Book> books; // 馆藏图书
std::vector<Reader> readers; // 读者列表
public:
bool addBook(const Book& book); // 添加图书
bool removeBook(const std::string& isbn); // 移除图书
Book* findBook(const std::string& isbn); // 查找图书
bool registerReader(const Reader& reader); // 注册读者
Reader* findReader(const std::string& id); // 查找读者
};
对应的类图
类图绘制要点
- 类名、属性和方法分三行展示
- 访问修饰符表示:
+
public,-
private,#
protected - 明确标注类之间的关系类型:
- 关联(实线):表示对象之间的联系
- 聚合 / 组合:表示整体与部分的关系
- 继承(空心三角箭头):表示类的继承关系
- 在关系线上标注 multiplicity(数量关系):
1
、*
(多个)、0..1
(0 或 1 个)等
三、E-R 图:用电商订单系统为例
E-R 图用于数据库设计,描述实体、属性及实体间关系。我们以电商订单系统为例,结合数据库表结构来绘制 E-R 图。
数据库表结构(简化版)
-- 用户表
CREATE TABLE users (
user_id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) UNIQUE NOT NULL,
password VARCHAR(100) NOT NULL,
email VARCHAR(100) UNIQUE NOT NULL,
phone VARCHAR(20),
register_time DATETIME NOT NULL
);
-- 商品表
CREATE TABLE products (
product_id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
price DECIMAL(10,2) NOT NULL,
stock INT NOT NULL,
category VARCHAR(50),
description TEXT
);
-- 订单表
CREATE TABLE orders (
order_id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT NOT NULL,
order_time DATETIME NOT NULL,
total_amount DECIMAL(10,2) NOT NULL,
status VARCHAR(20) NOT NULL,
address VARCHAR(200) NOT NULL,
FOREIGN KEY (user_id) REFERENCES users(user_id)
);
-- 订单项表
CREATE TABLE order_items (
item_id INT PRIMARY KEY AUTO_INCREMENT,
order_id INT NOT NULL,
product_id INT NOT NULL,
quantity INT NOT NULL,
unit_price DECIMAL(10,2) NOT NULL,
FOREIGN KEY (order_id) REFERENCES orders(order_id),
FOREIGN KEY (product_id) REFERENCES products(product_id)
);
对应的 E-R 图
E-R 图绘制要点
- 实体用矩形表示,属性用椭圆表示
- 主键(PK)用下划线标注,外键(FK)标注清楚
- 关系用菱形表示,并用动词描述关系
- 明确标注关系的基数:
1:1
表示一对一1:N
表示一对多N:M
表示多对多(通常需要中间表)
- 对于复杂属性可以进一步细分,如用户的地址可以拆分为省、市、街道等