CGI-BBS > アクセスカウンタ > SSI式カウンタ > 十進数で無い事。


カレッヂ
カレッヂ


質問者 mama  投稿日 10/16(火) 14:20:22

 はじめまして、普通のカウンターって十進数ですよね。
これを、画像付きカウンターで0〜13までカウントして14の時に0になる。
この様な事が出来ますでしょうか?

宜しくお願いします。

質問者 mama  [削除]  投稿日 10/16(火) 15:38:13

 自己レスです。
0→a、1→b、2→c、3→d、4→e、5→f、6→g、7→h、8→i、9→j、10→k、11→l、12→m、13→z、とすると、zになると次はaaになりました。画像ファイルもこれと同じようにアルファベットを振って・・・これを利用して、

$count++;
if ($count eq "n") { $count eq "z"; }    #nの時z(13)
if ($count eq "aa") { $count eq "ba"; }  #aaの時(繰り上がりの時)ba

としました。
しかしこれだと14になるたびにこの様な文を書かないといけないので
桁が多くなればなるほど膨大になってしまいます。
何か良い方法は無いでしょうか?
回答者 鉄Cello  [削除]  投稿日 10/16(火) 16:41:09
はずしていたらごめんなさい。

要するに14進法で表示をしたいのだから、カウントそのものは10進法の数値
そのままで持っておいて、必要なところで(表示する画像ファイル名を作る時に)
10進ー>14進の変換を行えばよいのでは?

変換方法には色々あると思いますが、学校で最初に習ったのは剰余を利用する物で、

2853を14進数にするには

 14)_2853     (2853を14で割ると、商は203、あまり11の意)
 14)_ 203 ・・・ 11 -> l
 14)_  14 ・・・  7 -> h
 14)_   1 ・・・  0 -> a
 14)_   0 ・・・  1 -> b
から、2853(十)= bahl(十四)

と求めたと思います。いかがでしょうか?
回答者 あけび  [削除]  投稿日 10/16(火) 16:44:01
$count=&t2ft($count);

sub t2ft {
local($c)=@_;
local(@s)=('0'..'9','a'..'d');
local($s)=$s[$c%14];
while($c>13){$c=int($c/14);$s.=$s[$c%14];}
scalar(reverse($s));
}

こんな感じで、
0〜9はそのまま0〜9、10〜13はa〜dとした14進数に変換できます。

JavaScriptだったら、toString(14) で一発なんですけどね。
回答者 しあわせのツボ  [削除]  投稿日 10/16(火) 16:57:55
カウント自体は10進でとってあり、その値が$countに入っているとします。
@table = (a..n);
for ($i=0; $i<6; $i++) { $count14[$i] = $table[int($count / 14**$i)]; }
のようにすれば、とりあえず@count14にaからnの14進値が得られます。
あとは上の桁から順にimgタグに加工して出力していけば。
回答者 しあわせのツボ  [削除]  投稿日 10/16(火) 17:07:07
自己レス。
@table = (a..n);

@table = ('a'..'n');
とすべきでした。

書いているうちに先回りされてました。
あけびさんの方がまっとうな方法ですね。
質問者 mama  [削除]  投稿日 10/16(火) 17:26:17
鉄Celloさん、あけびさん、しあわせのツボさんありがとうございます。
あけびさんのそのままやらして頂きました。
しかし位が上がるときまた0になってしまいます。何故でしょう?

宜しくお願いします。
回答者 あけび  [削除]  投稿日 10/16(火) 20:02:27
私の書いたものは14進数でカウントアップさせるものではなく
受け取った10進数を14進数に変換して返すもので、
受け取った値に0〜9以外の文字が含まれていたら0しか返りません。
カウント処理は普通に10進数で行なっておき、
表示などで14進数が必要になったらその都度変換して表示するようにしてください。
質問者 mama  [削除]  投稿日 10/18(木) 11:19:15

 ありがとうございます。
色々やってみたのですがどうもうまくいきませんでした。
それでもう一度じっくり返事を頂いたのを読んだのですが、

> 受け取った値に0〜9以外の文字が含まれていたら0しか返りません。

カウントを取っているファイルを一回一回確認したのですが・・・
0〜9までは普通に数字が入っていて9の次がaになりました。
aの次はbではなく0になってしまいます。
私は何か間違ったのでしょうか?
宜しくお願い致します。
回答者 あけび  [削除]  投稿日 10/18(木) 11:45:59
> カウントを取っているファイルを一回一回確認したのですが・・・
> 0〜9までは普通に数字が入っていて9の次がaになりました。
ということは、14進数に変換されたものをファイルに記録しているわけですよね。
そうではなく、あくまでファイルには10進数で保存し、
必要に応じて14進数に変換して使ってください、ということです。

サブルーチンの呼び方の一例として
> $count=&t2ft($count);
と、変数 $count 自身を変更する形で書いたのが紛らわしかったんでしょうか。
質問者 ありがとうございました。  [削除]  投稿日 10/18(木) 13:29:47

 どうもありがとうございました。
> ということは、14進数に変換されたものをファイルに記録しているわけですよね。
> そうではなく、あくまでファイルには10進数で保存し、
> 必要に応じて14進数に変換して使ってください、ということです。

そう言う事だったのですか、申しわけありません理解不足でした。
お蔭様で、出来るようになりました。
大変ありがとうございました。
又何かありましたら宜しくお願い致します。



このページは終了したので返信(回答)は書きこめません

Web裏技