CBsitumonn

数字のピラミッド ヒントをください。

2021/08/21 (Sat) 23:58:19
初めてこの掲示板に書き込むものです。よろしくお願いします。
fx5800-Pでプログラムを作成してみたのですが、
1
22
333
4444
55555
のように表示できませんでした。(電卓上では、1の表示位置は55555の右端の5の真上になる。)2重ループとlocateを使えば、1から4444まではできました。次に、ループのなかで22と横ならべて表示しようと、変数:変数出力命令などを試してみたのですがエラーが返されました。どなたか同じ数字を横に並べて表示する方法(ループのなかで、locate 変数,1,2 以外)を教えてください。お願いします。
Pass :
やす (Krtyski)

Re:数字のピラミッド ヒントをください。

2021/08/22 (Sun) 18:54:15
CBsitumonn様

管理人の やす です。

以下のような表示にしたいということでしょうか?
1   55555
22  666666
333  7777777
4444 88888888

これを前提にして話を進めます。

先ず最初に、左詰で数字を表示するためには、Locate を使うしかありません。
数値をそのまま出力する場合は、Casio Basic では右詰になる仕様です。

一桁の数 C を C個だけ並べて表示する場合は、
C × 111...11 (C桁) の計算をして、その結果を Locate で表示するのが簡単でしょう。
この C 桁並んだ 111...111 を計算して変数 N に入れておきます。
そして、Locate で N×C の結果を出力します。
※ あとで述べる理由で NCではなくて N(C+1) とします。C を1から始めるのではなくて、0 から始める方が都合が良いからです。

次に考えるのは、Locate で表示する際の表示位置の座標 X と Y をどうやって決めるのか?

X は、4行目までは 1桁目に固定,5行目から8行目は横にずらして 6桁目に固定。
Y は、1~4行目までは1~4行目、5~8行目は、また1~4行に戻す必要があります。

1から4行目までは、X = 1、Y = 行数 で Locate X,Y,NC (最終的には N(C+1) です)
5から8行目までは、X = 6、(行数-1)を4で割った余りに1を加えた値 Mod(行数-1, 4) + 1

さて、Yを求めるとき、余りの数 Mod を求めたいのですが、fx-5800P にはこの関数がありません。そこで Mod(C, 4) の代わりに C-4Int(C÷4) で計算できます。
https://egadget.blog.fc2.com/blog-entry-209.html

この計算を行う際、Cは 0 から始まる数で無いとうまくゆきません。
そこで、Cを0から始めるためにチョット変更が必要です。

コードは以下のようにすると、とりあえず動きました。

1: 0→C
2:
3: Do
4:
5: 1→N
6: For 1→I To C
7: 10N+1→N
8: Next
9:
10: 1→X:C>3⇒6→X
11: C-4Int(C÷4)+1→Y
12:
13: Locate X,Y,N(C+1)
14: Inz C
15:
16: LpWhile C≦7

とりあえずのサンプルプログラムです。
コードを見やすくするために、敢えて空行 (改行だけの行) が沢山あります。実際は不要です。

Cを0から始めるので、その関係がチョットややこしくなっているのですが、基本的な考え方は上記の通りです。実は私も最初は C を 1 から始めるコードを書きました。

最後の行の C≦7 を C≦ 4 に変えてみると、最初の1列目の動作が判りやすいと思います。

チョット頭の体操ができて、楽しかったです。

3~16 行が do / Lpwhile のループです。

その中に、111..111 を計算して 変数 N に格納する 3行だけの単純な For ループがあります。この For ループの直前で N を必ず 1 にしておく必要があります。

10行目と11行目は、Locate の X と Y を決めるところです。
1→X:C>3⇒6→X は、とりあえず X を 1 にしておき、C が3を超えるときは、X を 6 にします。
C-4Int(C÷4)+1→Y は、C を4で割ったときの余りを求めて、それに1を足し算しています。この計算のために、Cを0から初めて、1つづつ増やしています。
なので、Locate で出力する数値は NC ではなくて N(C+1) としています。

ここまで準備して、Locate X,Y,N(C+1) で出力します。

なお、Cを1つ増やすために、Inz C を使っています。C+1→C でも同じです。

Cは0から始まるので、LpWhile C≦ 7 として、全部で8行分の出力をしたら、Do ループを抜けてプログラムを終了します。

最後に、Locate コマンドは比較的時間がかかる処理です。従って Locate を使う回数を少なくしないと、出力にとても時間がかかります。今回はループ1回あたり Locate を1回使うコードにしています。そのため、出力する数を予め計算しておいてから出力するような方針にしています。

一気にコードまで紹介してしまいましたが、私も実際に動かしてみないと不安なので...

ではでは、
Pass :
CBsitumonn

Re:数字のピラミッド ヒントをください。

2021/08/22 (Sun) 21:01:37
さっそくのお返事ありがとうございます。プログラム例と解説を、時間をかけて理解しようとおもいます。
Pass :
Name
Mail
URL
icon
99
Pass
*編集・削除用(任意:英数字4~8文字)
Subject
絵文字
画像添付
[ e:349][ e:442][ e:446][ e:454][ e:456][ e:786][ e:451][ s:472D][ s:472E][ s:4731]
[ e:731][ e:732][ s:4740][ s:4741][ e:51][ e:265][ e:266][ e:262][ s:4F4F][ s:453D]
[ s:4F34][ s:4532][ s:4F32][ e:45][ e:219][ s:4F62][ s:4540][ s:4763][ s:4766][ s:4767]
[ s:476A][ s:4769][ s:476B][ s:4768] [ s:476C][ s:476D][ s:4538][ s:504E][ s:473E][ s:473D]
[ s:4F2D][ s:512B][ s:5151][ s:4526][ s:4528][ s:452B][ s:4775][ s:453C][ s:453A][ s:453B]