这个代码是把四则运算的函数投影在坐标系上的
如y=x-1
它输出
绘制函数: y=x-1 x的范围: -15 到 15 y的范围: -15 到 15 网格中心 (15,15) 对应坐标 (0,0) x=-15, y=-16 x=-14, y=-15 x=-13, y=-14 x=-12, y=-13 x=-11, y=-12 x=-10, y=-11 x=-9, y=-10 x=-8, y=-9 x=-7, y=-8 x=-6, y=-7 x=-5, y=-6 x=-4, y=-5 x=-3, y=-4 x=-2, y=-3 x=-1, y=-2 x=0, y=-1 x=1, y=0 x=2, y=1 x=3, y=2 x=4, y=3 x=5, y=4 x=6, y=5 x=7, y=6 x=8, y=7 x=9, y=8 x=10, y=9 x=11, y=10 x=12, y=11 x=13, y=12 x=14, y=13 x=15, y=14 | | | # | # | # | # | # | # | # | # | # | # | # | # - - - - - - - - - - - - - - + - - # - - - - - - - - - - - - | # | # # # | # | # | # | # | # | # | # | # | # | # | # |等等
这是一个基于控制台的数学函数图像绘制工具,它能够:
接收用户输入的数学表达式(包含变量 x)
在 30×30 的网格上绘制函数 y = f(x) 的图像
显示坐标轴和网格
1. 表达式计算
程序实现了中缀表达式转后缀表达式的算法,支持:
四则运算:
+-*/括号:
( )负数处理
变量
x的替换
工作流程:
text
用户输入: x+1 ↓ 替换 x 为具体数值: 5+1 ↓ 中缀转后缀: 5 1 + ↓ 计算后缀表达式: 6
2. 坐标映射
网格大小:30×30(行×列)
列(x轴):1-30,对应数学坐标 -15 到 15
行(y轴):1-30,对应数学坐标 15 到 -15(翻转)
网格显示说明
网格中的符号含义:
+:原点 (0,0)-:x轴(第15行)|:y轴(第15列)#:函数图像点空格:空白区域
text
示例网格(简化):
| | - - - - - - - - + - - - - - - | |代码实现
#include<bits/stdc++.h> using namespace std; // 判断字符是否为数字 bool isDigit(char c) { return c >= '0' && c <= '9'; } // 获取运算符优先级 int getPriority(char op) { if(op == '+' || op == '-') return 1; if(op == '*' || op == '/') return 2; return 0; } // 计算两个数的运算 int applyOp(int a, int b, char op) { switch(op) { case '+': return a + b; case '-': return a - b; case '*': return a * b; case '/': return a / b; } return 0; } // 表达式计算器(支持负数) int calculate(string expr) { // 去掉空格 expr.erase(remove(expr.begin(), expr.end(), ' '), expr.end()); // 处理一元负号:在负号前加0 string processed = ""; for(int i = 0; i < expr.size(); i++) { if(expr[i] == '-') { if(i == 0 || expr[i-1] == '(' || expr[i-1] == '+' || expr[i-1] == '-' || expr[i-1] == '*' || expr[i-1] == '/') { // 这是一元负号,前面加0 processed += "0-"; continue; } } processed += expr[i]; } expr = processed; // 两个栈:数字和运算符 vector<int> nums; vector<char> ops; for(int i = 0; i < expr.size(); i++) { char c = expr[i]; if(isDigit(c)) { // 解析数字 int num = 0; while(i < expr.size() && isDigit(expr[i])) { num = num * 10 + (expr[i] - '0'); i++; } i--; nums.push_back(num); } else if(c == '(') { ops.push_back(c); } else if(c == ')') { // 计算括号内的表达式 while(!ops.empty() && ops.back() != '(') { int b = nums.back(); nums.pop_back(); int a = nums.back(); nums.pop_back(); char op = ops.back(); ops.pop_back(); nums.push_back(applyOp(a, b, op)); } if(!ops.empty()) ops.pop_back(); // 弹出 '(' } else if(c == '+' || c == '-' || c == '*' || c == '/') { // 处理运算符优先级 while(!ops.empty() && ops.back() != '(' && getPriority(ops.back()) >= getPriority(c)) { int b = nums.back(); nums.pop_back(); int a = nums.back(); nums.pop_back(); char op = ops.back(); ops.pop_back(); nums.push_back(applyOp(a, b, op)); } ops.push_back(c); } } // 处理剩余的运算符 while(!ops.empty()) { int b = nums.back(); nums.pop_back(); int a = nums.back(); nums.pop_back(); char op = ops.back(); ops.pop_back(); nums.push_back(applyOp(a, b, op)); } return nums.empty() ? 0 : nums.back(); } char ff[35][35]; int main() { string expr; getline(cin, expr); // 去除表达式中的空格 string cleaned_expr = ""; for(char c : expr) { if(c != ' ') cleaned_expr += c; } expr = cleaned_expr; // 如果表达式以 y= 开头,去掉 y= if(expr.find("y=") == 0) { expr = expr.substr(2); } // 初始化网格 for(int i = 1; i <= 30; i++) { for(int j = 1; j <= 30; j++) { if(i == 15 && j == 15) ff[i][j] = '+'; else if(i == 15) ff[i][j] = '-'; else if(j == 15) ff[i][j] = '|'; else ff[i][j] = ' '; } } cout << "绘制函数: y=" << expr << endl; cout << "x的范围: -15 到 15" << endl; cout << "y的范围: -15 到 15" << endl; cout << "网格中心 (15,15) 对应坐标 (0,0)" << endl << endl; for(int x = -15; x <= 15; x++) { string a = expr; string x_str = to_string(x); // 替换表达式中的x为数字 size_t pos = 0; while(true) { pos = a.find('x', pos); if(pos == string::npos) { pos = a.find('X', pos); if(pos == string::npos) break; } a.replace(pos, 1, x_str); pos += x_str.length(); } int y = calculate(a); cout << "x=" << x << ", y=" << y << endl; // 坐标映射到网格 // x: -15->1, 0->15, 15->30 // y: 15->1, 0->15, -15->30 int grid_x = x + 16; // -15->1, 0->16, 15->31 int grid_y = 16 - y; // 15->1, 0->16, -15->31 // 边界检查 if(grid_x >= 1 && grid_x <= 30 && grid_y >= 1 && grid_y <= 30) { ff[grid_y][grid_x] = '#'; } } // 输出网格 for(int i = 1; i <= 30; i++) { for(int j = 1; j <= 30; j++) { cout << ff[i][j] << " "; } cout << endl; } return 0; }