Hatena::Groupnadesiko

99円のへたれ学習帳

2008-10-27

基数変換

| 23:16

個人的に現在、どう書く?orgの過去ネタ消費週となっておりまして(^ ^ やっと消化率が50%をえました。

で、以下のような基数を変換する問題があったんですが、なでしこって基数変換が標準ではないんですね・・・

数になる13進数 http://ja.doukaku.org/14/

いや、16進だったら

HEX(15)
INT($F)

とかやれば変換できますが、任意のn進数や小数の場合は対応していないので、自前で書いてみました。

まずはn進数→10進数の関数

●十進変換(radixのnを)
	もし、radix>36||radix<1ならば、空で戻る
	もし、n=空ならば、空で戻る
	n=nを大文字変換
	baseとは配列="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"を文字列分解
	dataとは配列=nの"."を""に置換を文字列分解
	tmpとは配列=nを"."で区切る
	startとは整数=tmp[0]の文字数-1
	endとは整数=tmp[1]の文字数*-1
	ansとは実数
	iとは整数
	iでstartからendまで繰り返す
		ans=ans+(baseのdata[回数-1]を配列検索)*radix^i
	ansで戻る

36の"10"を十進変換して表示
8の"1427.654"を十進変換して表示

36進数まで。小数にも対応しています。データを増やせば何進数でも行けます。ひらがなも使ってめざせ100進数え(ぇ

次は10進→n進数

●基数変換(nをradixに)
	もし、radix>36||radix<1ならば、空で戻る
	もし、n=空ならば、空で戻る
	xとは整数=nの整数部分
	yとは実数=nの小数部分
	もし、x=0&&y=0ならば、"0"で戻る
	baseとは配列="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"を文字列分解
	ansとは文字列
	tmpとは実数
	x<>0の間
		ans=base[(x%radix)]&ans
		x=INT(x/radix)
	もし、y=0ならば、ansで戻る
	もし、ans=""ならば、ans="0."
	違えば、ans=ans&"."
	16回
		tmp=y*radix
		ans=ans&base[tmpの整数部分]
		y=tmpの小数部分
		もし、y=0ならば、抜ける
	ansで戻る

35を36に基数変換して表示
0.2を16に基数変換して表示

こちらも小数に対応。小数部は循環することがあるので16で切ってます(もっと増やすことも出来ます)

計算精度の問題か、小数部分がおかしくなることもありますが、気になる方は任意精度の計算機を使うといいかもしれませぬ。

#どっちの関数も宣言がやたら長い(^ ^;

KayceeKaycee2011/11/24 01:28Phenomenal breakdown of the topic, you soluhd write for me too!

agckfydragckfydr2011/11/24 20:353DudAc <a href="http://waleoxtgusut.com/">waleoxtgusut</a>

bgsblvvbgsblvv2011/11/25 01:27Fje2c0 , [url=http://pmoldkrfakhp.com/]pmoldkrfakhp[/url], [link=http://novraujrlfxh.com/]novraujrlfxh[/link], http://bjiqmqwydfzj.com/

vcwrnjdvcwrnjd2011/12/01 04:16qckj3G <a href="http://bflxpzcumjvb.com/">bflxpzcumjvb</a>

rkoiodrkoiod2011/12/05 01:50qwLNB0 , [url=http://dmtchbbzmytl.com/]dmtchbbzmytl[/url], [link=http://ipenhcbyhskn.com/]ipenhcbyhskn[/link], http://uqmlrncmlvnu.com/

2008-10-12

配列命令関連

| 20:44

どう書く?orgで配列ネタ。もっと短くなるかな、と思ったら案外長くなってしまいました。ぬう。

http://ja.doukaku.org/comment/7760/

思ったこと

  • 配列命令は引数が参照渡しだけど、表命令は値渡しの物もある
  • どちらかに統一した方がよいのでは?といっても変えると大変なので、2.0ではなんとか(^ ^;
  • 配列入替はともかく、「表追加」は標準でほしい

日本語的には参照渡しの方が自然なんでしょうか。でも、値で渡って欲しい場合はいちいちぶっ壊されて大変・・・「!」を付けると切り替えられる、とかにするといいかも?(Rubyでしたっけ)

mr-80bmr-80b2008/10/13 23:32「足す」と「直接足す」みたいに、頭に「直接~」をつけるのがなでしこ流かも?

kyuuzyuu9yenkyuuzyuu9yen2008/10/14 18:26いちいち「直接」って書くと、かなりくどくなっちゃうんですよね・・・
「Aと2を足す!」で参照渡しになるとかなら、スマートになるかなあ、と

white-ballwhite-ball2008/10/14 21:04以前にそういう変更(識別子に!を使うことが出来る)が施されたことがありましたが、
「~命令!=」と書いたとき、字句解析の時「!」が「命令」にくっついて、
「!=」と解釈されなくなってしまったので破棄されたのです…

kyuuzyuu9yenkyuuzyuu9yen2008/10/15 17:13確かに1.5001でそうなってますね・・・うーん、2.0ではなんとか(ぇ

so-chaso-cha2009/02/22 09:58「AとBを足す」(値渡し)と、「AにBを足す」(参照渡し)で動作を分ければいいんじゃないですか?

2008-09-20

相対パスを展開

| 19:14

質問掲示板に絶対パス→相対パスの質問がありました。では、逆はどうやればいいのかと思って調べてみたら、APIあるんですね。

http://msdn.microsoft.com/ja-jp/library/bb773571%28en%2dus%2cVS%2e85%29%2easpx

http://nienie.com/~masapico/api_PathCombine.html

MSDNにはなぜか日本語の資料がありません・・・

●PathCombine({参照渡}Dest,{参照渡}Dir,{参照渡}File) =DLL("shlwapi.dll","LPCTSTR PathCombineA(LPTSTR Dest,LPCTSTR Dir,LPCTSTR File)")
●パス結合(DirとFileを)
	Destとは文字列
	Destに2048を確保
	PathCombine(Dest,Dir,File)
	Destで戻る
"c:\aaa\bbb\ccc"と"..\d\e\..\test"をパス結合して表示

例によって「パス結合」はPathCombineのラッパーです。絶対パスと相対パスを与えると、展開された文字列が帰ってきます。

これ、標準命令に入れてくれませんか?

素でないと思ってましたorz

 U D U D 2008/09/20 20:42つまり「相対パス展開」じゃないですかね?

kyuuzyuu9yenkyuuzyuu9yen2008/09/21 13:47なんとなくAPIの名前に合わせましたが、確かにそのほうがわかりやすいですね。命名は難しい・・・