iCAx开思网

标题: 龙版字符题目——做法分享 [打印本页]

作者: liangyuantop    时间: 2008-10-26 08:13
标题: 龙版字符题目——做法分享
为了避免破衣帮变成寺庙,替龙版终结这个题目,先把做法出了再说。

题目链接:https://www.icax.org/439902p1p1
2种方法,一种笨办法,一种通用的简单办法。
先说笨办法吧。

方法一
该方法仅对小数点后保留2位有效,位数多了不适用
首先,旋转,这个没有什么说的
其次,投影草绘
本题需要在草绘中插入参数,要求水平和垂直方向居中(看图1),并要求字体高度跟半径保持一定的比例关系(看图3)。


[ 本帖最后由 liangyuantop 于 2008-10-26 08:30 编辑 ]
作者: liangyuantop    时间: 2008-10-26 08:14
第三,拼凑关系
在看下边的关系前先看几个函数:
ceil()

不小于其值的最小整数

floor()

不超过其值的最大整数

itos(int)

将整数转换为字符串。其中,int
可以是一个数字或表达式。对非整数进行四舍五入。



下边的程序,遍历了可能的几种情况分别处理。其中TYPE是字符串函数,就是我们最后插入到草绘中的参数。
有兴趣的看看,没有兴趣的就算了



[ 本帖最后由 liangyuantop 于 2008-10-26 08:28 编辑 ]
作者: liangyuantop    时间: 2008-10-26 08:16
第四,添加注释。这个就不说了吧。

  PART

[ 本帖最后由 liangyuantop 于 2008-10-26 08:23 编辑 ]
作者: liangyuantop    时间: 2008-10-26 08:19
方法二
    该方法应该算一个通用解法了,对多位小数通杀。
    建模方法是一样的,就是里边的关系不同。
    看关系前,先熟悉2个函数

  
string_length()
返回参数中字符的个数

extract(string, position, length)

提取一个子串




基本的思路是这样的:
        假如球半径d1=256.78961,要求保留m=2位有效值即256.79
首先,d1*10^m=256.78961*100=25678.961,利用函数itos()四舍五入得到字符串25679


其次,利用string_length()函数取得上边字符串长度,以25679为例,是5

第三步,利用extract函数分别提取整数部分extract2567915-m=256和小数部分extract256795-m+1m=79
第四步,拼凑结果

注意要加上小数点“.



补加条件语句:
IF DI<05
C2="0"
else

C2=ITOS(D1-0.5)
endif
来自zhangax88、wangxbjing二位兄弟


[ 本帖最后由 liangyuantop 于 2008-10-30 08:57 编辑 ]
作者: liangyuantop    时间: 2008-10-26 08:19
TYPE="SR"+整数部分+"."+小数部分
具体可以看下图


[ 本帖最后由 liangyuantop 于 2008-10-26 08:25 编辑 ]
作者: liangyuantop    时间: 2008-10-26 08:20
上part,收工.....
晕怎么不能収大米

[ 本帖最后由 liangyuantop 于 2008-10-26 08:26 编辑 ]
作者: RRRQQQ    时间: 2008-10-26 08:30
支持几下
作者: zhangax88    时间: 2008-10-26 08:31
这方法我都试过,好比说,球径为0.3是,得不到正确的结果.
作者: liangyuantop    时间: 2008-10-26 08:37
原帖由 zhangax88 于 2008-10-26 08:31 发表
这方法我都试过,好比说,球径为0.3是,得不到正确的结果.


刚试了下,确实如此,需要加个条件语句
作者: wangxbjing    时间: 2008-10-26 08:37
半径少于1,小数点前的0显示不了吧?要增加多一个条件关系。
思路都差不多。
作者: wangxbjing    时间: 2008-10-26 08:39
IF DI<0
C2="0"
ELSE
C2=ITOS(D1-0.5)
作者: RRRQQQ    时间: 2008-10-26 08:42
其实之所以要这样多关系就是因为对于实数型参数婆姨读出来的数据依然是6位小数,如果可以将实数型参数转换成字符型参数~~~~~,(省略若干字),我还不是很熟悉这些,工作用不到,有了解的详细解说一下。
作者: wangxbjing    时间: 2008-10-26 08:54
开始对题目理解错误,认为字符高度是实体字符的高度 把字符转换成实体用了大半天时间。最后也没搞成,字符太多,无法自动。
中间想用第2种方法,有一小错,认为ITOS是简单取整,感觉太麻烦,做了一半就放弃了。
然后,用改CONFIG方法,保留2位,估计有几人用了这方法。
被说不是正解,就回头搞第2种方法。
作者: huanghelong    时间: 2008-10-26 08:55
第一种可谓掉头发的做法,第二种才是此题本意。
第一种做法之关键是四舍五入,其实很简单只要用floor(sd+0.005,2),好多人在这里翻跟斗。(附上关系式)
第二种,一点小疵,就是itos(0)=无,当然去掉很容易。
v=floor(sd0+0.005,2)
s=floor(v,0)
if s==0
   k1="0"
else
   k1=itos(s)
endif
k2=itos((v-s)*100)
if v-s<0.1
   if v-s==0
      sr="SR"+k1+"."+"00"
   else
      sr="SR"+k1+"."+"0"+k2
   endif
else
sr="SR"+k1+"."+k2
endif
作者: wangxbjing    时间: 2008-10-26 09:02
总的思路是都差不多,如何取数大同小小异.
作者: 任我游nemo    时间: 2008-10-26 09:07
感謝樓主分享
作者: liangyuantop    时间: 2008-10-26 10:08
原帖由 huanghelong 于 2008-10-26 08:55 发表
第一种可谓掉头发的做法,第二种才是此题材本意。
第一种做法之关键是四舍五入,其实很简单只要用floor(sd+0.005),好多人在这里翻跟斗。(附上关系式)
第二种,一点小痴,就是itos(0)=无,当然去掉很容易。
v=flo ...


强人
建议给龙版加分。。。。。
作者: RRRQQQ    时间: 2008-10-26 10:59
原帖由 liangyuantop 于 2008-10-26 10:08 发表


强人
建议给龙版加分。。。。。


加了
作者: chenhuaxia    时间: 2008-10-26 11:27
   我只用了一个关系a=floor(d1+0.005,2)
连条件判断都没用上。。再加上设了三个选项:
default_dec_places 3
sketcher_dec_places 3
param_dec_places 2
作者: wangxbjing    时间: 2008-10-26 11:50
我也用过LS的方法, 1分.
作者: xiamen_guo    时间: 2008-10-26 13:03
强人呀!收藏了
作者: MDH668    时间: 2008-10-26 15:19
这2分难啊,感谢版主们分享!
作者: 05feng    时间: 2008-10-26 15:54

作者: 05feng    时间: 2008-10-26 15:54
感谢版主们分享!
作者: oosimao    时间: 2008-10-27 08:30
晕晕呼呼关系式
作者: yongshengguo    时间: 2008-11-5 08:12
可惜错过了这么好的题
作者: WARRIOR    时间: 2008-11-5 10:25
向强人努力学习ING
作者: 天蓝心    时间: 2008-11-5 10:48
:) :)
作者: zhp023    时间: 2008-11-5 12:23
不错,谢谢!




欢迎光临 iCAx开思网 (https://www.icax.org/) Powered by Discuz! X3.3