如何在GAMS循环中使用IF/ELSE IF并按指定格式输出结果?
GAMS循环改进方案
你的现有代码在数值计算逻辑上是正确的,但没法实现带*的输出需求——因为CUTI是数值型参数,无法存储带符号的字符串。要满足你的输出要求,需要新增一个字符串类型的参数来存储格式化后的结果,具体改进如下:
改进后的完整代码
set k /1*20/; parameter CUTI(k)/1 6, 2 2, 3 8, 4 5, 5 1, 6 3, 7 7, 8 8, 9 6, 10 8,11 1, 12 2, 13 4, 14 7, 15 5, 16 2, 17 8, 18 9, 19 2, 20 10/; * 新增字符串参数,用于存储带格式的输出结果 string CUTI_OUT(k); loop(k, * 先计算临时值,避免重复计算 temp = CUTI(k) - 4; if(temp > 0, * 结果大于0,直接转字符串存储 CUTI_OUT(k) = str(temp); else * 结果小于0,计算后转字符串并添加* CUTI_OUT(k) = str(temp + 12) + '*'; ); ); * 输出格式化后的结果 display CUTI_OUT;
关键改进点说明
- 新增
string类型的CUTI_OUT(k):解决数值参数无法存储带符号字符串的问题 - 引入临时变量
temp:避免重复计算CUTI(k)-4,让代码更简洁 - 用
str()函数:将数值转换为字符串,方便拼接*符号
验证逻辑示例
以部分k值为例:
- k=2时,CUTI(k)=2,temp=2-4=-2,执行else分支:-2+12=10,结果为
10* - k=1时,CUTI(k)=6,temp=6-4=2>0,结果为
2 - k=5时,CUTI(k)=1,temp=1-4=-3,执行else分支:-3+12=9,结果为
9*
内容的提问来源于stack exchange,提问作者Starwinwin
相关产品推荐
相关产品推荐

