这个代码是把四则运算的函数投影在坐标系上的如yx-1它输出绘制函数: yx-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 x0, y-1 x1, y0 x2, y1 x3, y2 x4, y3 x5, y4 x6, y5 x7, y6 x8, y7 x9, y8 x10, y9 x11, y10 x12, y11 x13, y12 x14, y13 x15, y14 | | | # | # | # | # | # | # | # | # | # | # | # | # - - - - - - - - - - - - - - - - # - - - - - - - - - - - - | # | # # # | # | # | # | # | # | # | # | # | # | # | # |等等这是一个基于控制台的数学函数图像绘制工具它能够接收用户输入的数学表达式包含变量 x在 30×30 的网格上绘制函数 y f(x) 的图像显示坐标轴和网格1. 表达式计算程序实现了中缀表达式转后缀表达式的算法支持四则运算-*/括号( )负数处理变量x的替换工作流程text用户输入: x1 ↓ 替换 x 为具体数值: 51 ↓ 中缀转后缀: 5 1 ↓ 计算后缀表达式: 62. 坐标映射网格大小30×30行×列列x轴1-30对应数学坐标 -15 到 15行y轴1-30对应数学坐标 15 到 -15翻转网格显示说明网格中的符号含义原点 (0,0)-x轴第15行|y轴第15列#函数图像点空格空白区域text示例网格简化| | - - - - - - - - - - - - - - | |代码实现#includebits/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; // 两个栈数字和运算符 vectorint nums; vectorchar 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; }