九、选择变量表达式

本文介绍了Java中选择变量表达式,它以”*“开头,用于在指定对象中获取属性值,需与th:object配置使用,常用于表单数据显示。还给出示例,提醒若th:object值为null会抛异常,使用前需判断,可创建新对象。

        选择变量表达式用于在指定的对象中获取属性值,以”*“开头,语法为

*{属性名}

        此表达式必须与th:object配置使用,th:object用于保存一个对象,在它的子元素上可以使用*{}来获取他的属性值,常用于表单数据的显示

示例

<form action="/users" th:action="@{/users}" method="POST" th:object="${user}">  
 用户ID:<input type="text" name="id" th:value="*{userId}"><br/> 
 用户姓名:<input type="text" name="id" th:value="*{name}"><br/>
</form>

        这里id就用了选择表达式,在此处*{userId}与${user.id}效果一样。需要注意的是,如果th:object的值为null时,会抛出异常,因此建议在使用之前做判断,如果为null,则要先创建一个新对象

 文章来源于哔站《九、选择变量表达式

更多学习视频和专栏文章请到哔站个人空间: 布道师学院的个人空间-布道师学院个人主页-哔哩哔哩视频

更多资源和项目下载请到:”开源吧(找实战项目和毕设项目的好网站)“ ​ :开源吧

### 四则变量表达式的数据结构课程设计实现方法 四则变量表达式的求值问题可以通过数据结构中的栈(Stack)来实现。该问题的核心在于如何将中缀表达式转化为后缀表达式(逆波兰表达式),并利用栈完成求值过程。以下是关于四则变量表达式数据结构课程设计的实现方法及相关资料[^1]。 #### 1. 数据结构的选择 在四则变量表达式的求值过程中,主要使用两种栈: - **运算符栈**:用于存储运算符和括号。 - **操作数栈**:用于存储操作数或中间结果。 此外,为了支持变量的输入与替换,可以引入一个线性表(如数组或链表)来存储变量名及其对应的值。例如,引用[3]中定义了一个`sqlist`结构体来存储单字符变量名及其数值[^3]。 #### 2. 表达式的处理流程 表达式的处理通常分为以下几个部分: - **变量初始化**:输入一组单字符变量名及其对应数值,并将其存入线性表中。 - **表达式解析**:读取完整的字符串形式的表达式,将其转换为后缀表达式。 - **后缀表达式求值**:通过栈对后缀表达式进行求值。 ##### 2.1 变量初始化 在变量初始化阶段,需要将用户输入的变量名及其数值存入线性表中。例如,引用[3]中的代码示例展示了如何通过结构体`sqlist`存储变量信息[^3]。 ```c typedef struct { char elem; // 单字符变量名 int data; // 对应数值 } sqlist; sqlist arr[Size]; // 定义线性表 ``` ##### 2.2 表达式解析 表达式解析的主要任务是将中缀表达式转换为后缀表达式。这一过程需要遵循运算符优先级规则,并使用栈来管理运算符和括号。以下是一个简单的伪代码示例: ```python def infix_to_postfix(expression): operator_stack = [] # 运算符栈 output_queue = [] # 输出队列(后缀表达式) for token in expression: if is_operand(token): # 如果是操作数 output_queue.append(token) elif is_operator(token): # 如果是运算符 while (operator_stack and precedence(operator_stack[-1]) >= precedence(token)): output_queue.append(operator_stack.pop()) operator_stack.append(token) elif token == '(': # 左括号直接入栈 operator_stack.append(token) elif token == ')': # 右括号弹出直到遇到左括号 while operator_stack and operator_stack[-1] != '(': output_queue.append(operator_stack.pop()) operator_stack.pop() # 弹出左括号 while operator_stack: # 将剩余的运算符弹出 output_queue.append(operator_stack.pop()) return output_queue ``` ##### 2.3 后缀表达式求值 后缀表达式的求值通过操作数栈完成。遍历后缀表达式中的每个元素,如果是操作数则压入栈中;如果是运算符,则从栈中弹出两个操作数进行计算,并将结果重新压入栈中。 ```python def evaluate_postfix(postfix_expression): operand_stack = [] for token in postfix_expression: if is_operand(token): # 操作数入栈 operand_stack.append(token) elif is_operator(token): # 运算符处理 b = operand_stack.pop() a = operand_stack.pop() result = apply_operator(a, b, token) operand_stack.append(result) return operand_stack[0] ``` #### 3. 支持函数计算的功能扩展 如果需要支持额外的函数计算(如`abs()`、`sqr()`等),可以在解析阶段将这些函数名称视为特殊的运算符,并在求值阶段调用相应的函数。例如,引用[3]提到的思考题中涉及了如何处理带有函数的表达式[^3]。 #### 4. 示例代码 以下是一个简单的C语言实现示例,展示如何通过栈实现四则变量表达式的求值: ```c #include <stdio.h> #include <string.h> #define Size 30 #define OK 1 #define ERROR 0 typedef struct { char elem; int data; } sqlist; sqlist arr[Size]; int count = 0; // 查找变量值 int find_value(char var) { for (int i = 0; i < count; i++) { if (arr[i].elem == var) { return arr[i].data; } } return ERROR; } // 主函数 int main() { char var; int value; printf("请输入变量名和值(如A=3,B=6):"); while (scanf("%c=%d,", &var, &value) == 2) { arr[count].elem = var; arr[count].data = value; count++; } printf("已输入的变量信息:"); for (int i = 0; i < count; i++) { printf("%c=%d ", arr[i].elem, arr[i].data); } printf("\n"); char expression[100]; printf("请输入表达式(如(A+B)*3):"); scanf("%s", expression); // 替换变量为数值 for (int i = 0; i < strlen(expression); i++) { if (expression[i] >= 'A' && expression[i] <= 'Z') { int val = find_value(expression[i]); if (val != ERROR) { expression[i] = '0' + val % 10; // 简化为单个数字 } } } printf("表达式计算结果:%d\n", evaluate_expression(expression)); // 假设已有求值函数 return 0; } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱分享的代码君

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值