十進BASIC 第2掲示板過去ログ2021


判定式の否定

 投稿者:しばっち  投稿日:2021年 1月 1日(金)18時16分59秒
  唐突ですが問題です。

IF A < 0 AND B = 0 OR C >= 5 THEN

この判定式の否定文、つまり IF NOT(A < 0 AND B = 0 OR C >= 5) THEN と
同等となる判定式はどうなるでしょう?

これは、IF 判定式 THEN 命令1 ELSE 命令2

命令1が不要になった場合等にIF NOT(判定式) THEN 命令2
以外の書き方を求めます。


IF 判定式 THEN ELSE 命令2
という書き方もできるようですが、ここではあくまでこの判定式を
否定した書き方を模索します。

これには、一定の規則性があります。

まず、
IF A = 0 THEN です。

この否定文は
IF NOT(A = 0) THEN ですがこれと同等の判定式は
IF A <> 0 THEN です。

また、IF A <> 0 THEN の否定文は
IF A = 0 THEN です。

次は
IF A < 0 THEN です。

この否定文は
IF NOT(A < 0) THEN ですが
IF A > 0 THEN ではありません。
これではA = 0 の場合が含まれていません。

IF A < 0 THEN の否定文は
IF A >= 0 THEN となります。

また
IF A >= 0 THEN の否定文は
IF A < 0 THEN です。

そして
IF A > 0 THEN の否定文は
IF A <= 0 THEN です。



※ ここまでのまとめ

A = B  の否定は A <> B  (A >< B)
A <> B の否定は A = B
A < B  の否定は A >= B  (A => B)
A > B  の否定は A <= B  (A =< B)
A <= B の否定は A > B
A >= B の否定は A < B


では次の2項の判定式ではどうなるでしょうか?
IF A = 0 AND B = 0 THEN

この否定文は
IF NOT(A = 0 AND B = 0) THEN ですが、先程の例から
IF A <> 0 AND B <> 0 THEN でしょうか?

A=0とB=0 以外の場合ですから
A=1,B=2 の場合はうまくいきそうです。

ですが IF A = 0 AND B = 0 THEN はA = 0でもB = 1では成り立ちません。
A=0 AND B=0の否定文ではA=0,B=1が成り立たなければなりません。

IF A <> 0 AND B <> 0 THEN ではA = 0の時、この A <> 0が成り立たずこの式は真になりません。
ですが

IF A <> 0 OR B <> 0 THEN ではA = 0でもB = 1なら成立するので真になります。
つまりANDをORに変えればうまくいきそうです。

そして
IF A <> 0 OR B <> 0 THEN の否定文 IF NOT(A <> 0 OR B <> 0) THEN は
IF A = 0 AND B = 0 THEN と同等になります。

次の6パターンを試してみると全て一致しているのが分かります。

FOR M=1 TO 6
   FOR D=0 TO 1
      FOR C=0 TO 1
         FOR B=0 TO 1
            FOR A=0 TO 1
               SELECT CASE M
               CASE 1
                  IF NOT(A = B OR C = D) THEN PRINT "NOT(A = B OR C = D) ";A;B;C;D
                  IF A <> B AND C <> D THEN   PRINT "A <> B AND C <> D   ";A;B;C;D
               CASE 2
                  IF NOT(A = B OR C <> D) THEN PRINT "NOT(A = B OR C <> D) ";A;B;C;D
                  IF A <> B AND C = D THEN     PRINT "A <> B AND C = D     ";A;B;C;D
               CASE 3
                  IF NOT(A < B OR C <> D) THEN PRINT "NOT(A < B OR C <> D) ";A;B;C;D
                  IF A >= B AND C = D THEN     PRINT "A >= B AND C = D     ";A;B;C;D
               CASE 4
                  IF NOT(A > B OR C = D) THEN PRINT "NOT(A > B OR C = D) ";A;B;C;D
                  IF A <= B AND C <> D THEN   PRINT "A <= B AND C <> D   ";A;B;C;D
               CASE 5
                  IF NOT(A <= B OR C < D) THEN PRINT "NOT(A <= B OR C < D) ";A;B;C;D
                  IF A > B AND C >= D THEN     PRINT "A > B AND C >= D     ";A;B;C;D
               CASE 6
                  IF NOT(A >= B OR  C<= D) THEN PRINT "NOT( A>= B OR C <= D) ";A;B;C;D
                  IF A < B AND C > D THEN       PRINT "A < B AND C > D       ";A;B;C;D
               END SELECT
            NEXT A
         NEXT B
      NEXT C
   NEXT D
   PRINT
NEXT M
END


否定文になると

AND は OR に
OR は AND に変わります。


では冒頭の問題を見てみましょう。
IF A < 0 AND B = 0 OR C >= 5 THEN

この否定文 IF NOT(A < 0 AND B = 0 OR C >= 5) THEN と同等の式はどうなるでしょうか?

これまでの例から

A < 0 は A >= 0 に
B = 0 は B <> 0 に
C >= 5 は C < 5 に
AND は OR に
OR を AND に変えて

IF A >= 0 OR B <> 0 AND C < 5 THEN と回答された方...
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
残念ながら間違いなのです。これは引っかけ問題なのです。


下記のプログラムを実行してみてください。

LET A=2
LET B=1
LET C=6
IF NOT(A < 0 AND B = 0 OR C >= 5) THEN PRINT "真 1" ELSE PRINT "偽 1"
IF A > =0 OR B <> 0 AND C < 5 THEN PRINT "真 2" ELSE PRINT "偽 2"
END


実は3項以上では注意点があります。










それはANDとORの優先順位です。

IF A < 0 AND B = 0 OR C >= 5 THEN これを正確に書くと
IF (A < 0 AND B = 0) OR C >= 5 THEN です。


よって正解は...
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
↓
IF (A >= 0 OR B <> 0) AND C < 5 THEN
になります。

これを間違えずに答えられた方はかなりのセンスの持ち主なのかもしれません。
チャン、チャン
 

複数のグラフ

 投稿者:大熊 正  投稿日:2021年 1月 5日(火)19時24分13秒
   10進BASICをコロナの影響で自宅で再び再開しました。
 一つのプラグラムで、グラフを何枚も作りたいのですがどのようにするのですか。
 ①電子回路で、1つ目は周波数特性、・・・何かボタンを押す等したら位相特性。
  プログラムは元のままの名前で、エクセルみたいにやりたい。
  一つのグラフで同時に表示は、以前に教わりました。

 ②コロナでロジスチック曲線や重回帰等を知りました。
  10進BASICで参考にすべきプログラムや解析。解説等があれば教えてください。

  そして、多分理解には同時に何枚ものグラフが必要なので①の成果を反映したい。
 

Re: 複数のグラフ

 投稿者:SHIRAISHI Kazuo  投稿日:2021年 1月 6日(水)13時45分59秒
  JIS Full BASIC に Viewportに関する規定があります。
十進BASICのヘルプだと,
https://decimalbasic.ninja-web.net/BASICHelp/html/basi8sc4.htm
が該当します。
通常,Viewportの外への描画は無視されます。
例
100 OPTION ANGLE DEGREES
110 SET VIEWPORT 0.5, 1, 0.5, 1
120 SET WINDOW -4,4,-4,4
130 DRAW GRID
140 FOR x=-4 TO 4 STEP 0.01
150    PLOT LINES:x,x^3-3*x;
160 NEXT x
170 SET VIEWPORT 0,0.5 , 0,0.5
180 SET WINDOW -180,540,-4,4
190 DRAW GRID(90,1)
200 FOR x=-180 TO 540
210    PLOT LINES:x,SIN(x);
220 NEXT x
230 END
 

Re: 複数のグラフ

 投稿者:SHIRAISHI Kazuo  投稿日:2021年 1月 6日(水)20時26分43秒
  > No.4894[元記事へ]

複数のグラフを同時に表示するのでなく,
切り替えて表示したいのであれば,
データを配列に入れておいてMAT PLOT文で描く手もあります。


 

複数のグラフ

 投稿者:大熊 正  投稿日:2021年 1月 7日(木)15時41分19秒
  SHRAISHI Kazuo 様   元記事No4894
お忙しいところ、回答をいただきまして有難うございます。早速やってみました。
私の希望はもともと標準画面が私には小さいので、出来ましたら、同じ大きさで本のページをめくるようにはできないでしょうか。勝手でもうしわけありませんが、MAT PLOT の例で御教授お願いいたします。
    敬具    大熊正
 

Re: 複数のグラフ

 投稿者:SHIRAISHI Kazuo  投稿日:2021年 1月 8日(金)08時00分39秒
  > No.4897[元記事へ]

数字キーの1,2を押すことで表示を切り替えます。
配列の大きさは大きめに確保しておいて,
座標を配列にセットし,
配列と有効な座標の個数を副プログラムdisplayに引き渡し
MAT PLOT LINES, LIMIT文で描画します。

100 OPTION ANGLE DEGREES
110 DIM x1(10000),y1(10000),x2(10000),y2(10000)
120 LET i1=0
130 FOR x=-4 TO 4 STEP 0.01
140    LET i1=i1+1
150    LET x1(i1)=x
160    LET y1(i1)=x^3-3*x
170 NEXT x
180 LET i2=0
190 FOR x=-180 TO 540
200    LET i2=i2+1
210    LET x2(i2)=x
220    LET y2(i2)=SIN(x)
230 NEXT x
240 DO
250    CHARACTER INPUT c$
260    SELECT CASE c$
270    CASE "1"
280       CALL DISPLAY(-4,4,-4,4,x1,y1,i1,1)
290    CASE "2"
300       CALL DISPLAY(-180,540,-4,4,x2,y2,i2,90)
310    CASE ELSE
320       EXIT DO
330    END SELECT
340 LOOP
350 SUB DISPLAY(l,r,b,t,xx(),yy(),i,s)
360    CLEAR
370    SET WINDOW l,r,b,t
380    DRAW grid(s,1)
390    MAT PLOT LINES ,LIMIT i: xx, yy
400 END SUB
410 END

 

複数のグラフ

 投稿者:大熊 正  投稿日:2021年 1月 8日(金)12時48分1秒
  SHIRAISHI Kazuo 様     大熊正 元記事4897

お忙しい所、すぐに御返事いただき本当に有難うございました。
MATでのソフトでやってみた所、これが私の望んでいたものだと分かりました。
10進BASICがかなりのことができる事が分かり、これからも精進いたします。
此の投稿覧にシバッチさんのロジスチック関連の投稿があり、いじっています。
どなたか、重回帰の解説と10進でのソフトがあれば,御教授いただきたく
お願いいたします。   敬具
 

Re: 複数のグラフ

 投稿者:しばっち  投稿日:2021年 1月10日(日)12時33分23秒
  > No.4899[元記事へ]

大熊 正さんへのお返事です。

> どなたか、重回帰の解説と10進でのソフトがあれば,御教授いただきたく
> お願いいたします。   敬具

#1113
#1121

下記のプログラムは任意の(変数にX1,X2を持つ)回帰式が定義できますが
その回帰式を用いてテストデータを生成しているので
実際のデータで運用する場合は注意(初期値設定や収束誤差等)が必要です。


DIM U(3,3),V(3),W(3)
PUBLIC NUMERIC X1(20),X2(20),Y(20),N
RANDOMIZE
LET N=15
LET A0=RND !'テスト係数
LET B0=RND
LET C0=RND
FOR I=1 TO N
   LET X1(I)=I/5
   LET X2(I)=I^2/10
   LET Y(I)=FF(A0,B0,C0,X1(I),X2(I)) !'テストデータ作成
NEXT I
LET A=1 !'初期値
LET B=1
LET C=1
LET EPS=1E-8 !'収束誤差
DO
   LET U(1,1)=DIFF(A,2,B,0,C,0)
   LET U(1,2)=DIFF(A,1,B,1,C,0)
   LET U(1,3)=DIFF(A,1,B,0,C,1)
   LET U(2,1)=DIFF(A,1,B,1,C,0)
   LET U(2,2)=DIFF(A,0,B,2,C,0)
   LET U(2,3)=DIFF(A,0,B,1,C,1)
   LET U(3,1)=DIFF(A,1,B,0,C,1)
   LET U(3,2)=DIFF(A,0,B,1,C,1)
   LET U(3,3)=DIFF(A,0,B,0,C,2)
   LET V(1)=-DIFF(A,1,B,0,C,0)
   LET V(2)=-DIFF(A,0,B,1,C,0)
   LET V(3)=-DIFF(A,0,B,0,C,1)
   MAT U=INV(U)
   MAT W=U*V
   LET A=A+W(1)
   LET B=B+W(2)
   LET C=C+W(3)
   LET L=L+1
   IF W(1)^2+W(2)^2+W(3)^2<EPS THEN EXIT DO
   IF L>100 THEN
      PRINT "収束しません"
      STOP
   END IF
LOOP
PRINT L
PRINT "A0=";A0,"B0=";B0,"C0=";C0
PRINT " A=";A," B=";B," C=";C !'求めた係数
LET P$="####.########"
FOR I=1 TO N
   PRINT "X1=";
   PRINT USING P$:X1(I);
   PRINT "   X2=";
   PRINT USING P$:X2(I);
   PRINT "   Y=";
   PRINT USING P$:Y(I);
   PRINT "   ^Y=";
   PRINT USING P$:FF(A,B,C,X1(I),X2(I))
NEXT I
END

EXTERNAL FUNCTION FF(A,B,C,X1,X2) !'パラメータA,B,Cを持ち変数X1,X2の任意の回帰式(重回帰式)
LET FF=A+B*X1+C*X2
!'LET FF=A*EXP(B*X1)*EXP(C*X2)
!'LET FF=A+B*LOG(X1)+C*LOG(X2)
!'LET FF=A*B^X1*C^X2
!'LET FF=A*X1^B*X2^C
END FUNCTION

EXTERNAL FUNCTION FUNC(A,B,C)
FOR I=1 TO N
   LET S=S+(Y(I)-FF(A,B,C,X1(I),X2(I)))^2 !'差の2乗和(A=A0,B=B0,C=C0なら最小値S=0)
NEXT I
LET FUNC=S
END FUNCTION

EXTERNAL FUNCTION DIFF(X,M,Y,N,Z,O) !'数値偏微分
LET H=1/1024
IF M>0 THEN
   LET DIFF=(-DIFF(X+2*H,M-1,Y,N,Z,O)+8*DIFF(X+H,M-1,Y,N,Z,O)-8*DIFF(X-H,M-1,Y,N,Z,O)+DIFF(X-2*H,M-1,Y,N,Z,O))/(12*H)
   EXIT FUNCTION
END IF
IF N>0 THEN
   LET DIFF=(-DIFF(X,M,Y+2*H,N-1,Z,O)+8*DIFF(X,M,Y+H,N-1,Z,O)-8*DIFF(X,M,Y-H,N-1,Z,O)+DIFF(X,M,Y-2*H,N-1,Z,O))/(12*H)
   EXIT FUNCTION
END IF
IF O>0 THEN
   LET DIFF=(-DIFF(X,M,Y,N,Z+2*H,O-1)+8*DIFF(X,M,Y,N,Z+H,O-1)-8*DIFF(X,M,Y,N,Z-H,O-1)+DIFF(X,M,Y,N,Z-2*H,O-1))/(12*H)
   EXIT FUNCTION
END IF
IF M=0 OR N=0 OR O=0 THEN LET DIFF=FUNC(X,Y,Z)
END FUNCTION
 

重回帰のソフト

 投稿者:大熊 正  投稿日:2021年 1月10日(日)17時51分32秒
  しばっち 様  大熊正 元記事4889

早速御返事を頂き有難うございます。これから、色いろ勉強してゆきます。
グラフについてのSHIRAISHI様はじめ皆さまに感謝いたします。
10進について、急に物知りになった気がして、十分満足しております。
やってみてまた、疑問等が出てきましたら、その時はまたよろしくお願いいたします。

敬具   大熊正
 

ベイズの定理

 投稿者:しばっち  投稿日:2021年 1月27日(水)19時55分22秒
  ベイズの定理

下記のプログラムはわざわざ投稿するほどのものではありませんが
AI(人口知能)や機械学習、ディープラーニングといったことに興味が
ある方は「ベイズの定理」というキーワードは覚えていても損はないかと思います。

これは迷惑メールフィルタ等に利用されているようです。
ベイズの定理は確率を計算するものですが、更新していくことで精度を上げていく
ことができるものです。

https://ja.wikipedia.org/wiki/ベイズの定理
https://qiita.com/maxima/items/eb4035666fbf407872f1


日本人の0.1%が罹患しているある病気について考えます。
この病気の検査方法では、実際に病気に罹患している人が陽性と判定される確率が95%とし
逆に罹患していない人が陽性と判定される確率は3%であるとします。
ある人がこの病気の検査を受けて陽性という判定を受けた時、本当にこの病気に罹患している確率はいくらでしょうか。

病気に罹患している確率:P(B1) 0.1%
病気に罹患していない確率:P(B2) 1-P(B1)
実際に罹患している人が検査で陽性となる確率:P(A|B1) 95%
実際に罹患していない人が検査で陽性となる確率:P(A|B2) 3%


LET P_B1=.1/100
LET P_B2=1-P_B1
LET P_AB1=95/100
LET P_AB2=3/100
FOR I=1 TO 5
   LET P_B1A=P_B1*P_AB1/(P_B1*P_AB1+P_B2*P_AB2)
   PRINT P_B1A*100;"%"
   LET P_B1=P_B1A !'確率の更新
NEXT I
END

    実行結果

3.07244501940492 %
49.3392530960996 %
93.9902894677677 %
96.7525492946574 %
96.8423355652092 %

計算結果、この病気に罹患している確率はわずか3%程ということです。
これは病気に罹患している確率が0.1%から3%に更新されたことになります。
そして再検査後もまた陽性と判定を受けたとき、49%になるということです。
 

誤差逆伝搬法

 投稿者:しばっち  投稿日:2021年 1月27日(水)19時59分16秒
  誤差逆伝搬法による多層パーセプトロン(ニューラルネットワーク)のテスト

https://qiita.com/Ugo-Nama/items/04814a13c9ea84978a4c
https://qiita.com/43x2/items/50b55623c890564f1893

https://qiita.com/tky1117/items/ffc367e52c4a04cffa1d
https://qiita.com/tky1117/items/d2847ac2c84858c7307b
https://qiita.com/tky1117/items/c2c69a5f69d9cf8ca751
https://qiita.com/tky1117/items/7cdebb370e0da7ba6f71
https://qiita.com/tky1117/items/d845040be4a13dd1133f
https://qiita.com/tky1117/items/83403794280e74357660
https://qiita.com/tky1117/items/bbf250bcbd4ddae2d32e
https://qiita.com/tky1117/items/867f311b91fa927cacd2


下記URLからの移植です。残念ながら質問されてもわかりません。
https://qiita.com/ufoo68/items/9e4ca04578ba0f5fa5ff

誤差逆伝搬法はAI(人口知能)や機械学習といった技術に使われています。
下記プログラムでは学習量を30万epochで打ち切っています。2進モードで実行してください。
XOR問題について学習させ解かせています。

OPTION BASE 0
RANDOMIZE
LET NUM_INPUT=2
LET NUM_HIDDEN=20
DIM TRAIN_X(3,NUM_INPUT),D(3)
MAT READ TRAIN_X,D
DATA 0, 0, -1,0, 1, -1,1, 0, -1,1, 1, -1
DATA 0, 1, 1, 0
DIM W(NUM_HIDDEN,NUM_INPUT),V(NUM_HIDDEN),Y(4,NUM_HIDDEN),Z(4)
LET ETA = 0.1
LET EPOCH = 300000
FOR L=0 TO NUM_HIDDEN
   FOR I=0 TO NUM_INPUT
      LET W(L,I) = RND
   NEXT I
NEXT L
FOR I=0 TO NUM_HIDDEN
   LET V(I) = RND
NEXT I
FOR K=0 TO EPOCH
   FOR J=0 TO 3
      FOR L=0 TO NUM_HIDDEN-1
         FOR I=0 TO NUM_INPUT
            LET TMP = TMP+TRAIN_X(J,I) * W(L,I)
         NEXT I
         LET Y(J,L) = SIGMOID(TMP)
         LET TMP = 0
      NEXT L
      LET Y(J,NUM_HIDDEN) = -1
      FOR I=0 TO NUM_HIDDEN
         LET TMP = TMP+Y(J,I) * V(I)
      NEXT I
      LET Z(J) = SIGMOID(TMP)
      LET TMP = 0
      FOR I=0 TO NUM_HIDDEN
         LET V(I) = V(I) - ETA * Y(J,I) * DIFFSIGMOID(Z(J)) * (Z(J) - D(J))
      NEXT I
      FOR L=0 TO NUM_INPUT
         FOR I=0 TO NUM_HIDDEN
            LET W(I,L) = W(I,L) - ETA * TRAIN_X(J,L) * DIFFSIGMOID(Y(J,I)) * DIFFSIGMOID(Z(J)) * (Z(J) - D(J)) * V(I)
         NEXT I
      NEXT L
   NEXT J
   IF MOD(K , 10000) =0 THEN
      PRINT "z=";
      FOR I=0 TO 3
         PRINT Z(I);
      NEXT I
      PRINT "epoch:";K
   END IF
NEXT K
END

EXTERNAL  FUNCTION SIGMOID(X)
LET SIGMOID=1/(1+EXP(-X))
END FUNCTION

EXTERNAL  FUNCTION DIFFSIGMOID(X)
LET A = 0.1
LET DIFFSIGMOID=A*X*(1-X)
END FUNCTION
 

新しい電脳集団

 投稿者:大熊 正  投稿日:2021年 2月20日(土)13時37分56秒
  以前山中さんが電脳集団として10進BASICのソフト集が出されました。大変な労作でしたがどうも目次と内容のつながりとソフトの内容の解析説明がいまいちで初心者には使いにくかった。講談社から「Speakeasy]という「会話式数学ソフト・新村秀一 氏」が出て、これは初心者には逆に内容は分からないが、データさえ間違いなく入れれば、答えが出るというラクチンなものがあります。どなたか、・・・「しばっち」さん・・・「山中さん」・・・もう一度電脳集団を率いて、「Speakeasy]風の「ラクチン10進basic 第2弾」を出していただけませんでしょうか。目標は大学2年生程度の数学の行列や、重回帰、時系列・・・・統計、ポートフォリオ・・・話題として「コロナ.関係に必要な数値計算」・・等等・・。

敬具
 

新しい電脳集団

 投稿者:大熊 正  投稿日:2021年 2月20日(土)13時41分16秒
  以前山中さんが電脳集団として10進BASICのソフト集が出されました。大変な労作でしたがどうも目次と内容のつながりとソフトの内容の解析がいまいちで初心者には使いにくかった。講談社から「Speakeasy]という「会話式数学ソフト・新村秀一 氏」が出て、これは初心者には逆に内容は分からないが、データさえ間違いなく入れれば、答えが出るというラクチンなものがあります。どなたか、・・・「しばっち」さん・・・「山中さん」・・・もう一度電脳集団を率いて、「Speakeasy]風の「ラクチン10進basic 第2弾」を出していただけませんでしょうか。目標は大学2年生程度の数学の行列や、重回帰、時系列・・・・統計、ポートフォリオ・・・話題として「コロナ.関係に必要な数値計算」・・等等・・。

敬具
 

Re: 新しい電脳集団

 投稿者:SHIRAISHI Kazuo  投稿日:2021年 2月20日(土)16時37分13秒
  > No.4913[元記事へ]

スレッドをご利用ください。
スレッド作成のパスワードはスレッド一覧「スレッドが使えます」に書いてあります。

http://hp.vector.co.jp/authors/VA008683/

 

(無題)

 投稿者:匿名希望  投稿日:2021年 4月16日(金)07時34分48秒
  chain文の使い方を教えて下さい。  

Re: (無題)

 投稿者:SHIRAISHI Kazuo  投稿日:2021年 4月16日(金)13時14分43秒
  > No.4915[元記事へ]


https://decimalbasic.ninja-web.net/BASICHelp/html/basi1q9a.htm

を参照して試してみてください。

> chain文の使い方を教えて下さい。
 

exe

 投稿者:T.K.  投稿日:2021年 4月30日(金)08時41分48秒
  BasicAccをつかってexeファイルを作る方法を教えていただけないでしょうか。
よろしくお願いいたします。
 

Re: exe

 投稿者:SHIRAISHI Kazuo  投稿日:2021年 4月30日(金)08時56分38秒
  > No.4917[元記事へ]

outputフォルダーの中にNoName.exeが生成されます。
必要に応じてファイル名を変更してください。

> BasicAccをつかってexeファイルを作る方法を教えていただけないでしょうか。
> よろしくお願いいたします。

http://hp.vector.co.jp/authors/VA008683/

 

(無題)

 投稿者:T.K.  投稿日:2021年 4月30日(金)11時55分48秒
  ありがとうございました。  

Re: 素数判定

 投稿者:たろさ  投稿日:2021年 6月11日(金)18時12分12秒
  > No.3894[元記事へ]

しばっちさんへのお返事です。

> http://mojaie.hatenablog.jp/entry/2011/12/04/001545
> https://ja.wikipedia.org/wiki/ミラー–ラビン素数判定法
>
> !'素数判定 Miller-Rabin法
> OPTION ARITHMETIC RATIONAL
> LET L=100000000000000 !'100兆
> FOR N=L+1 TO L+10001 STEP 2
>    IF ISPRIME(N)=1 THEN
>    !'PRINT N
>       LET COUNT=COUNT+1
>    END IF
> NEXT N
> PRINT COUNT;"個"
> END
>
> EXTERNAL  FUNCTION ISPRIME(N)
> OPTION ARITHMETIC RATIONAL
> IF N = 2 THEN
>    LET ISPRIME=1
>    EXIT FUNCTION
> END IF
> IF N = 1 OR MOD(N , 2) = 0 THEN
>    LET ISPRIME=0
>    EXIT FUNCTION
> END IF
> LET D = (N - 1) / 2
> LET S = 0
> DO WHILE MOD(D , 2) = 0
>    LET D = INT(D / 2)
>    LET S=S+1
> LOOP
> FOR I=1 TO 10
>    LET ISP=0
>    READ A    !' n < 341550071728321 なら a = 2, 3, 5, 7, 11, 13, 17
>    DATA 2,3,5,7,11,13,17,23,29,31
>    LET ISP = 0
>    LET R = POWMOD(A, D, N)
>    IF R = 1 OR R = N - 1 THEN
>       LET ISP = 1
>    END IF
>    LET R = POWMOD(R, 2, N)
>    FOR J = 0 TO S-1
>       IF R = N - 1 THEN
>          LET ISP = 1
>       END IF
>       LET R = POWMOD(R, 2, N)
>    NEXT J
>    IF ISP=0 THEN
>       LET ISPRIME=0
>       EXIT FUNCTION
>    END IF
> NEXT I
> LET ISPRIME=1
> END FUNCTION
>
> EXTERNAL  FUNCTION POWMOD(B,P,M)
> OPTION ARITHMETIC RATIONAL
> LET RESULT = 1
> DO WHILE P > 0
>    IF MOD(P , 2)= 1 THEN
>       LET RESULT = MOD(RESULT * B , M)
>    END IF
>    LET B = MOD(B * B, M)
>    LET P = INT(P / 2)
> LOOP
> LET POWMOD=RESULT
> END FUNCTION
>

素数判定の実験中遭遇しました。
十進BASIC Version 7.8.5.4     計算結果 11
BASIC Accelerator Ver. 2.0.2.0   計算結果 10
BASIC Accelerator Ver. 1.2.0.5   計算結果 10

それぞれ計算結果が違います。

!OPTION ARITHMETIC RATIONAL
PRINT  ISPRIME(94910593) !94910593 素数 (5484840th)
PRINT  ISPRIME(94910639) !94910639 素数 (5484841st)
END

EXTERNAL  FUNCTION ISPRIME(N)
!OPTION ARITHMETIC RATIONAL
IF N = 2 THEN
   LET ISPRIME=1
   EXIT FUNCTION
END IF
IF N = 1 OR MOD(N , 2) = 0 THEN
   LET ISPRIME=0
   EXIT FUNCTION
END IF
LET D = (N - 1) / 2
LET S = 0
DO WHILE MOD(D , 2) = 0
   LET D = INT(D / 2)
   LET S=S+1
LOOP
FOR I=1 TO 10
   LET ISP=0
   READ A    !' n < 341550071728321 なら a = 2, 3, 5, 7, 11, 13, 17
   DATA 2,3,5,7,11,13,17,23,29,31
   LET ISP = 0
   LET R = POWMOD(A, D, N)
   IF R = 1 OR R = N - 1 THEN
      LET ISP = 1
   END IF
   LET R = POWMOD(R, 2, N)
   FOR J = 0 TO S-1
      IF R = N - 1 THEN
         LET ISP = 1
      END IF
      LET R = POWMOD(R, 2, N)
   NEXT J
   IF ISP=0 THEN
      LET ISPRIME=0
      EXIT FUNCTION
   END IF
NEXT I
LET ISPRIME=1
END FUNCTION

EXTERNAL  FUNCTION POWMOD(B,P,M)
!OPTION ARITHMETIC RATIONAL
LET RESULT = 1
DO WHILE P > 0
   IF MOD(P , 2)= 1 THEN
      LET RESULT = MOD(RESULT * B , M)
   END IF
   LET B = MOD(B * B, M)
   LET P = INT(P / 2)
LOOP
LET POWMOD=RESULT
END FUNCTION
 

Re: 素数判定

 投稿者:SHIRAISHI Kazuo  投稿日:2021年 6月12日(土)09時31分17秒
  たろささんへのお返事です。

十進BASIC Version 7.8.5.4     計算結果 11
BASIC Accelerator Ver. 2.0.2.0   計算結果 10
BASIC Accelerator Ver. 1.2.0.5   計算結果 10

計算途中で2^53を超えるのが原因だと思います。

BASICAccも32ビットコードを生成すれば,Ver.7.8.5.4と同じ結果になります。
Windows版のBASICAccは,64ビットを指定すると,Intel CPUのSSE2を利用するコードを生成します。
Windows版で32ビットを指定したときは,Intel CPUのFPUを利用するコードを生成します。
Intel FPUを用いると内部では80ビットの拡張精度数で計算し,仮数部に64ビットの精度があるので,2^53を超えても正確に計算できることがあります。
 

Re: 素数判定

 投稿者:たろさ  投稿日:2021年 6月13日(日)14時08分45秒
  > No.4921[元記事へ]

SHIRAISHI Kazuoさんへのお返事です。

> たろささんへのお返事です。
>
> 十進BASIC Version 7.8.5.4     計算結果 11
> BASIC Accelerator Ver. 2.0.2.0   計算結果 10
> BASIC Accelerator Ver. 1.2.0.5   計算結果 10
>
> 計算途中で2^53を超えるのが原因だと思います。
>
> BASICAccも32ビットコードを生成すれば,Ver.7.8.5.4と同じ結果になります。
> Windows版のBASICAccは,64ビットを指定すると,Intel CPUのSSE2を利用するコードを生成します。
> Windows版で32ビットを指定したときは,Intel CPUのFPUを利用するコードを生成します。
> Intel FPUを用いると内部では80ビットの拡張精度数で計算し,仮数部に64ビットの精度があるので,2^53を超えても正確に計算できることがあります。
>

ありがとうございます。
素数計数関数(英: Prime-counting function)π(x)
6n-1,6n+1の篩
1億までの素数の精度確認の時に遭遇

2^53=9.0072E+15
(1E+8)^2=1E+16

10進から16進また、16進から10進に対応なのか?

計算の仕組みは分かりませんが、6n-1,6n+1の篩の計算
配列 DIM A(n)=1 の処理速度は驚くほど高速。
 

Re: 素数判定

 投稿者:SHIRAISHI Kazuo  投稿日:2021年 6月14日(月)08時49分11秒
  十進BASIC Ver.7, Ver.8 では,
十進モードのとき,数値変数の精度は15桁,数値式の精度は16桁超,
2進モードのとき,数値変数は倍精度(仮数部53ビット),数値式は拡張精度(仮数部64ビット)です。
なので,十進モード,2進モードのいずれでも,変数に代入しなければ,1E8以下の数の平方は正確に計算されます。
Windows版BASICAccが生成する64ビットコードは,途中の計算まで含めてすべて倍精度で処理するので,2^53を超える数値を正確に扱うことができません。
(Win64版以外のBASICAccは,計算の途中結果を拡張精度で計算する可能性があります)

次のプログラムを実行してみると,途中がどうなっているかわかると思います(580行)。

100 PRINT  ISPRIME(94910639) !94910639 素数 (5484841st)
110 END
120 EXTERNAL  FUNCTION ISPRIME(N)
140 IF N = 2 THEN
150    LET ISPRIME=1
160    EXIT FUNCTION
170 END IF
180 IF N = 1 OR MOD(N , 2) = 0 THEN
190    LET ISPRIME=0
200    EXIT FUNCTION
210 END IF
220 LET D = (N - 1) / 2
230 LET S = 0
240 DO WHILE MOD(D , 2) = 0
250    LET D = INT(D / 2)
260    LET S=S+1
270 LOOP
280 FOR I=1 TO 10
290    LET ISP=0
300    READ A    !' n < 341550071728321 なら a = 2, 3, 5, 7, 11, 13, 17
310    DATA 2,3,5,7,11,13,17,23,29,31
320    LET ISP = 0
330    LET R = POWMOD(A, D, N)
340    IF R = 1 OR R = N - 1 THEN
350       LET ISP = 1
360    END IF
370    LET R = POWMOD(R, 2, N)
380    FOR J = 0 TO S-1
390       IF R = N - 1 THEN
400          LET ISP = 1
410       END IF
420       LET R = POWMOD(R, 2, N)
430    NEXT J
440    IF ISP=0 THEN
450       LET ISPRIME=0
460       EXIT FUNCTION
470    END IF
480 NEXT I
490 LET ISPRIME=1
500 END FUNCTION
510 EXTERNAL  FUNCTION POWMOD(B,P,M)
520 !OPTION ARITHMETIC RATIONAL
530 LET RESULT = 1
540 DO WHILE P > 0
550    IF MOD(P , 2)= 1 THEN
560       LET RESULT = MOD(RESULT * B , M)
570    END IF
580    PRINT USING "########    ################": B , B * B
590    LET B = MOD(B * B, M)
600    LET P = INT(P / 2)
610 LOOP
620 LET POWMOD=RESULT
630 END FUNCTION
 

BASICAccのROUND関数バグ報告

 投稿者:nagram  投稿日:2021年 6月18日(金)15時19分59秒
  BASIC Accelerator で ROUND関数を10進モードで実行すると誤った値を返すことがあります。
バージョンは 1.2.0.5

OPTION ARITHMETIC DECIMAL
LET x=12345678.901234
LET a=ROUND(x,3)
PRINT x
PRINT a
PRINT
LET y=34567890123.456
LET b=ROUND(y)
PRINT y
PRINT b
END
 

Re: BASICAccのROUND関数バグ報告

 投稿者:SHIRAISHI Kazuo  投稿日:2021年 6月18日(金)18時40分18秒
  > No.4924[元記事へ]

nagramさんへのお返事です。
ご報告ありがとうございました。
丸めにinteger値をとるmath.floor関数を利用していたのが原因でした。
十進BASIC Ver. 0.5,Ver. 0.7も同様です。
修正します。



> BASIC Accelerator で ROUND関数を10進モードで実行すると誤った値を返すことがあります。
> バージョンは 1.2.0.5
>
> OPTION ARITHMETIC DECIMAL
> LET x=12345678.901234
> LET a=ROUND(x,3)
> PRINT x
> PRINT a
> PRINT
> LET y=34567890123.456
> LET b=ROUND(y)
> PRINT y
> PRINT b
> END
 

表示される数値が?

 投稿者:たろさ  投稿日:2021年 7月14日(水)21時48分41秒
  64-bitの性でしょうか?

Intel Core i5 560M
Windows Version
Microsoft Windows 10 (10.0) Professional 64-bit   (Build 19041)

Paract BASIC Version 2.1.2.4
Paract BASIC Ver. 2.1.2.4 Rev.2   (2021.06.19)

1.523783365462E13
1.524078820997E13
1.524374278355E13
1.524669730951E13

BASIC Accelerator Version 2.0.2.0
昔のままで

100 DATA 15237833654620
110 DATA 15240788209967
120 DATA 15243742783546
130 DATA 15246697309511
140 READ a,b,c,d
150 PRINT a
160 PRINT b
170 PRINT c
180 PRINT d
190 END
 

Re: 表示される数値が?

 投稿者:SHIRAISHI Kazuo  投稿日:2021年 7月16日(金)15時52分15秒
  > No.4926[元記事へ]

Windows版 BASIC Accelerator , Paract BASIC を64ビットで動作させると,
数値を表示するときの桁数が少なくなります。
(Windows版のみです。)



たろささんへのお返事です。

> 64-bitの性でしょうか?
>
> Intel Core i5 560M
> Windows Version
> Microsoft Windows 10 (10.0) Professional 64-bit   (Build 19041)
>
> Paract BASIC Version 2.1.2.4
> Paract BASIC Ver. 2.1.2.4 Rev.2   (2021.06.19)
>
>  1.523783365462E13
>  1.524078820997E13
>  1.524374278355E13
>  1.524669730951E13
>
> BASIC Accelerator Version 2.0.2.0
> 昔のままで
>
> 100 DATA 15237833654620
> 110 DATA 15240788209967
> 120 DATA 15243742783546
> 130 DATA 15246697309511
> 140 READ a,b,c,d
> 150 PRINT a
> 160 PRINT b
> 170 PRINT c
> 180 PRINT d
> 190 END
>
 

クロムブックで使えますか?

 投稿者:10進愛用者  投稿日:2021年 7月31日(土)06時10分16秒
  10進basicは。生徒にも分かりやすくインストールも不要なので、ずっと愛用しています。最近は生徒がクロムブックを持つようにになり、クロムブックでも使えないものかと思っています。クロムブックでも使える方法があればお教え下さい。  

Re: クロムブックで使えますか?

 投稿者:SHIRAISHI Kazuo  投稿日:2021年 7月31日(土)06時35分0秒
  > No.4928[元記事へ]

最新のChromeBookはLinuxのインストールができるようになっています。
https://support.google.com/chromebook/answer/9145439?hl=ja
注意点はCPUがIntelかARMかの別です。
Intelのときは,Linux(Intel版),ARMのときは,Linux ARM64版が必要です。
ARM版は,Intel版と計算精度が異なります。また,有理数モードと十進1000桁モードがありません。
インストールに注意が必要です。詳細は,
https://decimalbasic.ninja-web.net/Linux.htm
を見てください。この注意はARM版でも同じです。
 

CromeBook で動くものはどれ?

 投稿者:`加藤正  投稿日:2021年 8月 6日(金)11時32分17秒
  windows版でいつも愛用させて頂いている中学の数学教師です。インストールにも手数がかからず図形も手軽に利用でき、さらにサンプルも豊富で素晴らしいソフトだと思います。さて、最近ギガスクール構想というので、Cromebookが配られました。これで使えるものを探しています。よろしくお願いします。小さすぎて開発環境はありません。シェルもないようです。  

Re: CromeBook で動くものはどれ?

 投稿者:SHIRAISHI Kazuo  投稿日:2021年 8月 6日(金)14時48分21秒
  > No.4930[元記事へ]

`加藤正さんへのお返事です。
Linuxが使えるかどうかで決まります。
https://support.google.com/chromebook/answer/9145439?hl=ja

Chromebookのスレッドを作成したので,そちらを参照してください。
#t12/l50
 

電話帳プログラム作成プロセスと、プログラムの例

 投稿者:RCカー  投稿日:2021年 8月10日(火)20時32分19秒
   フォームによる、データ入力、削除、更新、検索
 データは、ID番号、氏名、電話番号。
 個人用なので可能だと思う。一覧表示機能。
 ファイルへの、データ保存。
 氏名からの電話番号検索
 電話番号からの氏名検索
 
 

例のプログラム

 投稿者:RCカー  投稿日:2021年 8月10日(火)20時40分22秒
  100
110
130 CONSOLE 0,25,1,1
140 WIDTH 80,25
150 CLS 3
160 MX=200
170 DIM DT$(MX,5)
180 ON ERROR GOTO *ERROR
190 OPEN "TELMEM.DAT" FOR INPUT AS #1
200 INPUT #1,NO
210   FOR I=1 TO NO
220       FOR J=1 TO 5
230           INPUT #,DT$(I,J)
240       NEXT J
250   NEXT I
260 CLOSE
270 ON ERROR GOTO 0
280
290 *MAIN
300
310 CLS:SL=0:Y=0
320 LOCATE 28,0:PRINT "TEL            MEMO"
330 LOCATE 30,2:PRINT "トウロク   :   1"
340 LOCATE 30,3:PRINT "テイセイ       :   2"
350 LOCATE 30,4:PRINT "サクジョ       :   3"
360 LOCATE 30,5:PRINT "ヒョウジ       :   4"
370 LOCATE 30,6:PRINT "ケンサク       :   5"
380 LOCATE 30,7:PRINT "キロク          :   6"
390 LOCATE 30,8:PRINT "シュウリョウ :    7"
400 LOCATE 16,10:INPUT "バンゴウ デ エランデ クダサイ :",SL
410 IF SL<1 OR 7<SL THEN BEEP :GOTO *MAIN
420 CLS
430 LOCATE 1,0  :PRINT"No.     ID                                   ナマエ"
440 LOCATE 34,0:PRINT"  ジタク TEL                     カイシャ TEL       FAX No.  "
450 ON SL GOSUB  *INPT,*CRCT,*DELT,*DSPL,*SRCH,*FILE,*QUIT
460 LOCATE 10,22:INPUT  "ナニカ キー ヲ オスト メニュー 二 モドリマス",KY$
470 GOTO *MAIN
480 *QUIT
490 CLS:LOCATE 20,7:INPUT "シュウリョウ  ( 'Y'es  or  'N'o )    ";ANS$
500 IF ANS$<>"Y"  AND ANS$<>"y"  THEN *MAIN
510 END
530 '
540 *INPT  'データ ニュウリョク
550    NO=NO+1
560    IF MX<NO THEN LOCATE 0,21:PRINT"コレイジョウ  DATA ヲ フヤセマセン":RETURN
570    LOCATE 0,0:PRINT  "DATA バンゴウ ";NO
580    LOCATE 0,3:INPUT  "ID コード        (6 モジ マデ ) :",DT$(NO,1)
590    LOCATE 0,4:INPUT  "シメイ         (22モジ マデ) :",DT$(NO,2)
600    LOCATE 0,5:INPUT  "ジタク      TEL  (16モジ マデ) :",DT$(NO,3)
610    LOCATE 0,6:INPUT  "カイシャ TEL   (16モジ マデ) :",DT$(NO,4)
620    LOCATE 0,7:INPUT  "FAX  No.          (16モジ マデ) :",DT$(NO,5)
630    RETURN
640 *CRCT  'シュウセイ
650     LOCATE 0,21:INPUT  "ナンバン ノ データ ヲ テイセイ シマスカ :  ";SN
660     IF SN<1  OR   NO<SN THEN BEEP:GOTO 690
670     LO=NO:NO=SN-1*CLS:GOSUB *INPT
680     NO=LO
690     RETURN
700  *DELT   'サクジョ
710      LOCATE 0,21:INPUT "ナンバン ノ データ ヲ サクジョ シマスカ  :    ";SN
720      IF  SN<1 OR NO<SN THEN BEEP:GOTO 830
730      FOR I=SN TO NO
740          FOR J=1 TO 5
750              DT$(I,J)=DT$(I+1,J)
760          NEXT J
770      NEXT I
780      NO=NO-1
790      RETURN
800  *DSPL 'サクジョ
810      LOCATE 0,21:PRINT  "ナニカ キー ヲ オスト ツギ ノ ページ ヲ ヒョウジ シマス"
820      FOR I=1 TO NO
830          Y=Y+1
840          IF 20<Y THEN 850 ELSE 880
850             ANS$=INKEY$:IF ANS$="" THEN 850
860             Y=1:CLS
870             LOCATE 0,21:PRINT "ナニカ キー ヲ オスト ツギ ノ ページ ヲ ヒョウジシマス"
880          DN=I:GOSUB *DPRN
890       NEXT I
900       RETURN
910  *SRCH   'ケンサク
920      LOCATE 0,21:INPUT  "ケンサクスル ID コード ハ : ";SR$
930      FOR I=1 TO NO
940          IF INSTR(DT$(I,1),SR$)=0 THEN 1010
950          Y=Y+1
960          IF 20<Y THEN 970 ELSE 1000
970             ANS$=INKY$:IF ANS$="" THEN 970
980             Y=1:CLS
990             LOCATE 0,21:PRINT "ナニカ キー ヲ オスト ツギ ノ ページ ヲ ヒョウジシマス"
1000           DN=1:GOSUB *DPRN
1010     NEXT I
1020     RETURN
1030  *FILE 'キロク
1040      LOCATE 15,10:INPUT "フロッピ― ノ ジュンビ OK ('Y'es or 'N'o)";KY$
1050      IF KY$="Y" THEN 1060 ELSE 1140
1060         OPEN "TELMEM.DAT" FOR OUTPUT AS #!
1070         PRINT #1,DT$(I,J)
1080         FOR I=1 TO NO
1090             FOR J=1 TO 5
1100                 PRINT #1,DT$(I,J)
1110             NEXT J
1120        NEXT I
1130     CLOSE
1140     RETURN
1150  *DPRN  'データ ヒョウジ
1160      LOCATE 0,Y:PRINT DN;
1170      LOCATE 4,Y:PRINT DT$(DN,1);
1180      LOCATE 10,Y:PRINT DT$(DN,2);
1190      LOCATE 32,Y:PRINT DT$(DN,3);
1200      LOCATE 48,Y:PRINT DT$(DN,4);
1210      LOCATE 64,Y:PRINT DT$(DN,5);
1220      RETURN
1230 *ERROR 'エラー ショリ
1240       IF ERL=190 THEN RESUME 260
1250       ON ERROR GOTO 0
 

御助言お願いします

 投稿者:RCカー  投稿日:2021年 8月10日(火)20時44分31秒
  このプログラムの解説をお願いします。
長くても読むのでかまいません。
御返信いただけると嬉しいです。
よろしくお願いします。
 

Re: 御助言お願いします

 投稿者:SHIRAISHI Kazuo  投稿日:2021年 8月11日(水)09時15分42秒
  > No.4935[元記事へ]

RCカーさんへのお返事です。

何を助言したらいいのかわからないのですが,
データを扱うのが目的であれば,
入力や保管はEXCELにまかせて,
EXCELだと難しい処理が必要になったとき,
データをCSV形式で書き出して,
BASICに読み込んで処理するのが合理的です。

http://hp.vector.co.jp/authors/VA008683/

 

Re: 御助言お願いします

 投稿者:RCカー  投稿日:2021年 8月11日(水)11時58分33秒
  SHIRAISHI Kazuoさんへのお返事です。

> RCカーさんへのお返事です。
>
> 何を助言したらいいのかわからないのですが,
> データを扱うのが目的であれば,
> 入力や保管はEXCELにまかせて,
> EXCELだと難しい処理が必要になったとき,
> データをCSV形式で書き出して,
> BASICに読み込んで処理するのが合理的です。
>
早速の御返信ありがとう御座います。
 ちなみに、エクセルだとどうなりますか?
 

Re: 御助言お願いします

 投稿者:SHIRAISHI Kazuo  投稿日:2021年 8月11日(水)14時14分34秒
  > No.4937[元記事へ]

RCカーさんへのお返事です。
十進BASIC FAQ
https://hp.vector.co.jp/authors/VA008683/SpreadSheet.htm
を参考にしてください。
また,十進BASIC独自拡張のRECTYPE CSVも有用です。
https://decimalbasic.ninja-web.net/BASICHelp/html/basi7cis.htm
CSVファイル全体を一回のMAT READ文,MAT RIGHT文で読み書きできます。

> SHIRAISHI Kazuoさんへのお返事です。
>
> > RCカーさんへのお返事です。
> >
> > 何を助言したらいいのかわからないのですが,
> > データを扱うのが目的であれば,
> > 入力や保管はEXCELにまかせて,
> > EXCELだと難しい処理が必要になったとき,
> > データをCSV形式で書き出して,
> > BASICに読み込んで処理するのが合理的です。
> >
> 早速の御返信ありがとう御座います。
>  ちなみに、エクセルだとどうなりますか?
>
 

ありがとう

 投稿者:RCカー  投稿日:2021年 8月11日(水)14時45分17秒
  早速の返信ありがとうございました。
ためになるリンクだと思います。
ただ僕には、まだ早いようです。
 

Re: 電話帳プログラム作成プロセスと、プログラムの例

 投稿者:nagram  投稿日:2021年 8月11日(水)18時28分29秒
  > No.4933[元記事へ]

RCカーさんへのお返事です。

>  フォームによる、データ入力、削除、更新、検索
>  データは、ID番号、氏名、電話番号。
>  個人用なので可能だと思う。一覧表示機能。
>  ファイルへの、データ保存。
>  氏名からの電話番号検索
>  電話番号からの氏名検索
>

作ってみました。
まず実行前に、データの上限を指定する変数MXの値を決定してください。
その他、変更可の変数の値も必要であれば変更してください。
実行するとまず、データファイルを新規作成するか、既存のファイルを読み込むかの選択をします。
データの入力は、ID番号・氏名・電話番号の順です(追加で入力できます)。
電話番号は"09012345678","090-1234-5678","090(1234)5678"いずれの形式でもかまいません。
苗字と名前の間など、入力データに空白があってもかまいませんが、半角カンマ","は使えません。
入力または読み込みが終わるとメインメニューになります。
  1.入力 2.削除 3.更新 4.検索 5.一覧 6.保存 0.終了
から選択です。
[入力][削除][更新]があった場合は、プログラム終了までに必ず[保存]してください。
保存しないデータはプログラム終了で失われます。
保存したファイルはカンマ区切りのCSV形式なのでExcelなどで読み込むことが出来ます。
検索は、苗字だけとか電話番号の一部だけといった部分一致検索に対応してます。

質問や不具合があれば、この掲示板にお願いします。

DECLARE EXTERNAL SUB sort
DECLARE NUMERIC MX,IDmin,IDmax,lenID,lenname,lentel,dmx,f,n,id,li,sa,sr,i,j,j2,wd
DECLARE STRING idrange$,u$,s$,name$,tel$,d$,c$,sa$,t$
OPTION CHARACTER KANJI
LET MX=200      ! data数の上限(変更可)
LET IDmin=1001  ! ID番号の下限(変更可) IDmin>=1
LET IDmax=9999  ! ID番号の上限(変更可)
LET lenID=CEIL(LOG10(IDmax))+1
LET lenNAME=8   ! 氏名の最大文字数(変更可)
LET lenTEL=14   ! 電話番号の最大文字数(変更可)
DIM DT$(MX,3),DTid(MX),DTtel$(MX),sortID(MX)
LET idrange$=STR$(IDmin)&"~"&STR$(IDmax)
LET u$=REPEAT$("#",lenID)&" <"&REPEAT$("#",2*lenNAME-1)&" <"&REPEAT$("#",lenTEL)
LET wd=0.1
SET ECHO "OFF"
LET dmx=0
!
DO
   INPUT PROMPT "【ファイル】1.新規作成 2.読込み (終了は 0)":f
LOOP UNTIL f=INT(f) AND f>=0 AND f<=2
WAIT DELAY wd
IF f=1 THEN
   CALL main(1)
ELSEIF f=2 THEN
   FILE GETOPENNAME s$  ! 電話帳ファイルの読込み
   OPEN #1: NAME s$
   DO
      LET dmx=dmx+1
      INPUT #1, IF MISSING THEN EXIT DO: DT$(dmx,1),DT$(dmx,2),DT$(dmx,3)
      LET DTid(dmx)=VAL(DT$(dmx,1))
      CALL tel(DTtel$(dmx),DT$(dmx,3))
   LOOP
   LET dmx=dmx-1
ELSE
   STOP
END IF
!
DO   ! メインルーチン
   DO
      INPUT PROMPT " 1.入力 2.削除 3.更新 4.検索 5.一覧 6.保存 0.終了" :n
   LOOP UNTIL n=INT(n) AND n>=0 AND n<=6
   WAIT DELAY wd
   CALL main(n)
LOOP UNTIL n=0
!
SUB main(n)
   SELECT CASE n
   CASE 1  ! [入力]
      DO
         IF dmx>=MX THEN
            WAIT DELAY "DATA数が上限 "&STR$(MX)&" に達していて、入力が出来ません"
            WAIT DELAY wd
            EXIT SUB
         END IF
         DO
            INPUT PROMPT " ID番号入力 "&idrange$&" (入力終了は 0)" :id
         LOOP UNTIL id=INT(id) AND id>=IDmin AND id<=IDmax OR id=0
         WAIT DELAY wd
         IF id=0 THEN EXIT DO
         INPUT PROMPT " 氏名を入力 (入力終了は 0)" :name$
         WAIT DELAY wd
         IF name$="0" THEN EXIT DO
         INPUT PROMPT " 電話番号を入力 (入力終了は 0)" :tel$
         WAIT DELAY wd
         IF tel$="0" THEN EXIT DO
         LET c$="このDATAで良いですか? 訂正は [いいえ]"&CHR$(10)&"ID:"
         LET c$=c$&STR$(id)&CHR$(10)&"氏名:"&name$&CHR$(10)&"電話番号:"&tel$
         IF CONFIRM$(c$)="YES" THEN
            LET dmx=dmx+1
            LET DT$(dmx,1)=STR$(id)
            LET DT$(dmx,2)=name$
            LET DT$(dmx,3)=tel$
            LET DTid(dmx)=id
            CALL tel(DTtel$(dmx),DT$(dmx,3))
         END IF
         WAIT DELAY wd
      LOOP
   CASE 2  ! [削除]
      DO
         INPUT PROMPT " 削除するDATAのID番号を入力 (キャンセルは 0)" :id
      LOOP UNTIL id=INT(id) AND id>=IDmin AND id<=IDmax OR id=0
      WAIT DELAY wd
      IF id=0 THEN EXIT SUB
      FOR i=1 TO dmx
         IF DTid(i)=id THEN
            LET d$="下記のDATAを削除しますか?"&CHR$(10)&"ID:"&DT$(i,1)
            LET d$=d$&CHR$(10)&"氏名:"&DT$(i,2)&CHR$(10)&"電話番号:"&DT$(i,3)
            IF CONFIRM$(d$)="YES" THEN
               PRINT "削除したDATA"
               PRINT USING u$: DT$(i,1),DT$(i,2),DT$(i,3)
               FOR j=i+1 TO dmx
                  LET DT$(j-1,1)=DT$(j,1)
                  LET DT$(j-1,2)=DT$(j,2)
                  LET DT$(j-1,3)=DT$(j,3)
                  LET DTid(j-1)=VAL(DT$(j,1))
                  LET DTtel$(j-1)=DTtel$(j)
               NEXT j
               LET DT$(dmx,1),DT$(dmx,2),DT$(dmx,3),DTtel$(dmx)=""
               LET DTid(dmx)=0
               LET dmx=dmx-1
            END IF
            WAIT DELAY wd
            EXIT SUB
         END IF
      NEXT i
      WAIT DELAY "ID番号 "&STR$(id)&" のDATAが見つかりません"
   CASE 3  ! [更新]
      DO
         INPUT PROMPT " 更新するDATAのID番号を入力 (キャンセルは 0)" :id
      LOOP UNTIL id=INT(id) AND id>=IDmin AND id<=IDmax OR id=0
      WAIT DELAY wd
      IF id=0 THEN EXIT SUB
      FOR i=1 TO dmx
         IF DTid(i)=id THEN
            LET d$="下記のDATAを書き換えますか?"&CHR$(10)&"ID:"&DT$(i,1)
            LET d$=d$&CHR$(10)&"氏名:"&DT$(i,2)&CHR$(10)&"電話番号:"&DT$(i,3)
            IF CONFIRM$(d$)="NO" THEN EXIT SUB
            PRINT "更新前のDATA"
            PRINT USING u$: DT$(i,1),DT$(i,2),DT$(i,3)
            DO
               INPUT PROMPT " 氏名を入力 (入力終了は 0)" :name$
               WAIT DELAY wd
               IF name$="0" THEN EXIT SUB
               INPUT PROMPT " 電話番号を入力 (入力終了は 0)" :tel$
               WAIT DELAY wd
               IF tel$="0" THEN EXIT SUB
               LET c$="このDATAで良いですか? 訂正は [いいえ]"&CHR$(10)&"ID:"
               LET c$=c$&STR$(id)&CHR$(10)&"氏名:"&name$&CHR$(10)&"電話番号:"&tel$
               IF CONFIRM$(c$)="YES" THEN
                  LET DT$(i,2)=name$
                  LET DT$(i,3)=tel$
                  CALL tel(DTtel$(i),DT$(i,3))
                  EXIT DO
               END IF
            LOOP
            WAIT DELAY wd
            EXIT SUB
         END IF
      NEXT i
      WAIT DELAY "ID番号 "&STR$(id)&" のDATAが見つかりません"
   CASE 4  ! [検索]
      DO
         INPUT PROMPT " 検索項目  1.氏名  2.電話番号  (キャンセルは 0)": sa
      LOOP UNTIL sa=INT(sa) AND sa>=0 AND sa<=2
      WAIT DELAY wd
      IF sa=0 THEN EXIT SUB
      INPUT PROMPT " 検索文字列 (一部分でも可, キャンセルは 0)": sa$
      WAIT DELAY wd
      IF sa$="0" THEN EXIT SUB
      IF sa=1 THEN LET t$="氏名" ELSE LET t$="電話番号"
      PRINT "検索結果 [";t$;",""";sa$;"""]"
      LET sr=0
      IF sa=1 THEN
         FOR i=1 TO dmx
            IF POS(DT$(i,2),sa$)>0 THEN
               PRINT USING u$: DT$(i,1),DT$(i,2),DT$(i,3)
               LET sr=sr+1
            END IF
         NEXT i
      ELSE  ! sa=2
         FOR j=LEN(sa$) TO 1 STEP -1
            IF sa$(j:j)<"0" OR sa$(j:j)>"9" THEN LET sa$(j:j)=""
         NEXT j
         FOR i=1 TO dmx
            IF POS(DTtel$(i),sa$)>0 THEN
               PRINT USING u$: DT$(i,1),DT$(i,2),DT$(i,3)
               LET sr=sr+1
            END IF
         NEXT i
      END IF
      IF sr=0 THEN PRINT "該当するDATAはありませんでした"
   CASE 5  ! [一覧]
      DO
         INPUT PROMPT " 1.DATA順  2.ID番号順  (キャンセルは 0)" : li
      LOOP UNTIL li=INT(li) AND li>=0 AND li<=2
      IF li=1 THEN
         PRINT "DATA一覧"
         FOR i=1 TO dmx
            PRINT USING u$: DT$(i,1),DT$(i,2),DT$(i,3)
         NEXT i
      ELSEIF li=2 THEN
         MAT sortID=ZER
         CALL sort(DTid,sortID,dmx)
         PRINT "DATA一覧 (ID番号順)"
         FOR i=1 TO dmx
            PRINT USING u$: DT$(sortID(i),1),DT$(sortID(i),2),DT$(sortID(i),3)
         NEXT i
      END IF
   CASE 6  ! [保存]
      CALL save
   CASE 0  ! [終了]
      IF CONFIRM$("プログラムを終了しますか?")="NO" THEN EXIT SUB
      IF CONFIRM$("DATAをファイルに保存しますか?")="YES" THEN CALL save
      CLOSE #1
   END SELECT
   WAIT DELAY wd
END SUB
!
SUB save
   IF f=1 THEN
      FILE GETSAVENAME s$
      OPEN #1: NAME s$
      LET f=f+10
   END IF
   ERASE #1
   FOR i=1 TO dmx
      IF DTid(i)<>0 THEN PRINT#1: DT$(i,1)&","&DT$(i,2)&","&DT$(i,3)
   NEXT i
END SUB
!
SUB tel(t$,d$)
   LET t$=""
   FOR j2=1 TO LEN(d$)
      IF d$(j2:j2)>="0" AND d$(j2:j2)<="9" THEN LET t$=t$&d$(j2:j2)
   NEXT j2
END SUB
!
END
! 十進BASICライブラリ"\Decimal BASIC\BASICw32\Library\SORT2.LIB"
! ixにはmと下限,上限を一致させた空の配列を指定する。
! mは参照されるのみ。
! ixにmの添字を大きさの順に並べて返す。
! つまり,m(ix(1))≦m(ix(2))≦m(ix(3))≦・・・となる。
EXTERNAL SUB sort(m(),ix(),n)  ! ソート
DECLARE EXTERNAL SUB q_sort
DECLARE NUMERIC i
FOR i=1 TO n
   LET ix(i)=i
NEXT i
CALL q_sort(m,ix,1,n)
END SUB
!
EXTERNAL SUB q_sort(m(),a(),l,r)
DECLARE NUMERIC i,j,pv,t
IF r<=l THEN
   EXIT SUB
ELSE
   LET i=l-1
   LET j=r
   LET pv=m(a(r))
   DO
      DO
         LET i=i+1
      LOOP UNTIL pv<=m(a(i))
      DO
         LET j=j-1
      LOOP UNTIL j<=i OR m(a(j))<=pv
      IF j<=i THEN EXIT DO
      LET t=a(i)
      LET a(i)=a(j)
      LET a(j)=t
   LOOP
   LET t=a(i)
   LET a(i)=a(r)
   LET a(r)=t
   CALL q_sort(m,a,l,i-1)
   CALL q_sort(m,a,i+1,r)
END IF
END SUB
 

Re: 電話帳プログラム作成プロセスと、プログラムの例

 投稿者:RCカー  投稿日:2021年 8月11日(水)19時25分41秒
  > No.4940[元記事へ]

nagramさんへのお返事です。

RCカーより、ありがとうございました。

> RCカーさんへのお返事です。
>
> >  フォームによる、データ入力、削除、更新、検索
> >  データは、ID番号、氏名、電話番号。
> >  個人用なので可能だと思う。一覧表示機能。
> >  ファイルへの、データ保存。
> >  氏名からの電話番号検索
> >  電話番号からの氏名検索
> >
>
> 作ってみました。
> まず実行前に、データの上限を指定する変数MXの値を決定してください。
> その他、変更可の変数の値も必要であれば変更してください。
> 実行するとまず、データファイルを新規作成するか、既存のファイルを読み込むかの選択をします。
> データの入力は、ID番号・氏名・電話番号の順です(追加で入力できます)。
> 電話番号は"09012345678","090-1234-5678","090(1234)5678"いずれの形式でもかまいません。
> 苗字と名前の間など、入力データに空白があってもかまいませんが、半角カンマ","は使えません。
> 入力または読み込みが終わるとメインメニューになります。
>   1.入力 2.削除 3.更新 4.検索 5.一覧 6.保存 0.終了
> から選択です。
> [入力][削除][更新]があった場合は、プログラム終了までに必ず[保存]してください。
> 保存しないデータはプログラム終了で失われます。
> 保存したファイルはカンマ区切りのCSV形式なのでExcelなどで読み込むことが出来ます。
> 検索は、苗字だけとか電話番号の一部だけといった部分一致検索に対応してます。
>
> 質問や不具合があれば、この掲示板にお願いします。
>
> DECLARE EXTERNAL SUB sort
> DECLARE NUMERIC MX,IDmin,IDmax,lenID,lenname,lentel,dmx,f,n,id,li,sa,sr,i,j,j2,wd
> DECLARE STRING idrange$,u$,s$,name$,tel$,d$,c$,sa$,t$
> OPTION CHARACTER KANJI
> LET MX=200      ! data数の上限(変更可)
> LET IDmin=1001  ! ID番号の下限(変更可) IDmin>=1
> LET IDmax=9999  ! ID番号の上限(変更可)
> LET lenID=CEIL(LOG10(IDmax))+1
> LET lenNAME=8   ! 氏名の最大文字数(変更可)
> LET lenTEL=14   ! 電話番号の最大文字数(変更可)
> DIM DT$(MX,3),DTid(MX),DTtel$(MX),sortID(MX)
> LET idrange$=STR$(IDmin)&"~"&STR$(IDmax)
> LET u$=REPEAT$("#",lenID)&" <"&REPEAT$("#",2*lenNAME-1)&" <"&REPEAT$("#",lenTEL)
> LET wd=0.1
> SET ECHO "OFF"
> LET dmx=0
> !
> DO
>    INPUT PROMPT "【ファイル】1.新規作成 2.読込み (終了は 0)":f
> LOOP UNTIL f=INT(f) AND f>=0 AND f<=2
> WAIT DELAY wd
> IF f=1 THEN
>    CALL main(1)
> ELSEIF f=2 THEN
>    FILE GETOPENNAME s$  ! 電話帳ファイルの読込み
>    OPEN #1: NAME s$
>    DO
>       LET dmx=dmx+1
>       INPUT #1, IF MISSING THEN EXIT DO: DT$(dmx,1),DT$(dmx,2),DT$(dmx,3)
>       LET DTid(dmx)=VAL(DT$(dmx,1))
>       CALL tel(DTtel$(dmx),DT$(dmx,3))
>    LOOP
>    LET dmx=dmx-1
> ELSE
>    STOP
> END IF
> !
> DO   ! メインルーチン
>    DO
>       INPUT PROMPT " 1.入力 2.削除 3.更新 4.検索 5.一覧 6.保存 0.終了" :n
>    LOOP UNTIL n=INT(n) AND n>=0 AND n<=6
>    WAIT DELAY wd
>    CALL main(n)
> LOOP UNTIL n=0
> !
> SUB main(n)
>    SELECT CASE n
>    CASE 1  ! [入力]
>       DO
>          IF dmx>=MX THEN
>             WAIT DELAY "DATA数が上限 "&STR$(MX)&" に達していて、入力が出来ません"
>             WAIT DELAY wd
>             EXIT SUB
>          END IF
>          DO
>             INPUT PROMPT " ID番号入力 "&idrange$&" (入力終了は 0)" :id
>          LOOP UNTIL id=INT(id) AND id>=IDmin AND id<=IDmax OR id=0
>          WAIT DELAY wd
>          IF id=0 THEN EXIT DO
>          INPUT PROMPT " 氏名を入力 (入力終了は 0)" :name$
>          WAIT DELAY wd
>          IF name$="0" THEN EXIT DO
>          INPUT PROMPT " 電話番号を入力 (入力終了は 0)" :tel$
>          WAIT DELAY wd
>          IF tel$="0" THEN EXIT DO
>          LET c$="このDATAで良いですか? 訂正は [いいえ]"&CHR$(10)&"ID:"
>          LET c$=c$&STR$(id)&CHR$(10)&"氏名:"&name$&CHR$(10)&"電話番号:"&tel$
>          IF CONFIRM$(c$)="YES" THEN
>             LET dmx=dmx+1
>             LET DT$(dmx,1)=STR$(id)
>             LET DT$(dmx,2)=name$
>             LET DT$(dmx,3)=tel$
>             LET DTid(dmx)=id
>             CALL tel(DTtel$(dmx),DT$(dmx,3))
>          END IF
>          WAIT DELAY wd
>       LOOP
>    CASE 2  ! [削除]
>       DO
>          INPUT PROMPT " 削除するDATAのID番号を入力 (キャンセルは 0)" :id
>       LOOP UNTIL id=INT(id) AND id>=IDmin AND id<=IDmax OR id=0
>       WAIT DELAY wd
>       IF id=0 THEN EXIT SUB
>       FOR i=1 TO dmx
>          IF DTid(i)=id THEN
>             LET d$="下記のDATAを削除しますか?"&CHR$(10)&"ID:"&DT$(i,1)
>             LET d$=d$&CHR$(10)&"氏名:"&DT$(i,2)&CHR$(10)&"電話番号:"&DT$(i,3)
>             IF CONFIRM$(d$)="YES" THEN
>                PRINT "削除したDATA"
>                PRINT USING u$: DT$(i,1),DT$(i,2),DT$(i,3)
>                FOR j=i+1 TO dmx
>                   LET DT$(j-1,1)=DT$(j,1)
>                   LET DT$(j-1,2)=DT$(j,2)
>                   LET DT$(j-1,3)=DT$(j,3)
>                   LET DTid(j-1)=VAL(DT$(j,1))
>                   LET DTtel$(j-1)=DTtel$(j)
>                NEXT j
>                LET DT$(dmx,1),DT$(dmx,2),DT$(dmx,3),DTtel$(dmx)=""
>                LET DTid(dmx)=0
>                LET dmx=dmx-1
>             END IF
>             WAIT DELAY wd
>             EXIT SUB
>          END IF
>       NEXT i
>       WAIT DELAY "ID番号 "&STR$(id)&" のDATAが見つかりません"
>    CASE 3  ! [更新]
>       DO
>          INPUT PROMPT " 更新するDATAのID番号を入力 (キャンセルは 0)" :id
>       LOOP UNTIL id=INT(id) AND id>=IDmin AND id<=IDmax OR id=0
>       WAIT DELAY wd
>       IF id=0 THEN EXIT SUB
>       FOR i=1 TO dmx
>          IF DTid(i)=id THEN
>             LET d$="下記のDATAを書き換えますか?"&CHR$(10)&"ID:"&DT$(i,1)
>             LET d$=d$&CHR$(10)&"氏名:"&DT$(i,2)&CHR$(10)&"電話番号:"&DT$(i,3)
>             IF CONFIRM$(d$)="NO" THEN EXIT SUB
>             PRINT "更新前のDATA"
>             PRINT USING u$: DT$(i,1),DT$(i,2),DT$(i,3)
>             DO
>                INPUT PROMPT " 氏名を入力 (入力終了は 0)" :name$
>                WAIT DELAY wd
>                IF name$="0" THEN EXIT SUB
>                INPUT PROMPT " 電話番号を入力 (入力終了は 0)" :tel$
>                WAIT DELAY wd
>                IF tel$="0" THEN EXIT SUB
>                LET c$="このDATAで良いですか? 訂正は [いいえ]"&CHR$(10)&"ID:"
>                LET c$=c$&STR$(id)&CHR$(10)&"氏名:"&name$&CHR$(10)&"電話番号:"&tel$
>                IF CONFIRM$(c$)="YES" THEN
>                   LET DT$(i,2)=name$
>                   LET DT$(i,3)=tel$
>                   CALL tel(DTtel$(i),DT$(i,3))
>                   EXIT DO
>                END IF
>             LOOP
>             WAIT DELAY wd
>             EXIT SUB
>          END IF
>       NEXT i
>       WAIT DELAY "ID番号 "&STR$(id)&" のDATAが見つかりません"
>    CASE 4  ! [検索]
>       DO
>          INPUT PROMPT " 検索項目  1.氏名  2.電話番号  (キャンセルは 0)": sa
>       LOOP UNTIL sa=INT(sa) AND sa>=0 AND sa<=2
>       WAIT DELAY wd
>       IF sa=0 THEN EXIT SUB
>       INPUT PROMPT " 検索文字列 (一部分でも可, キャンセルは 0)": sa$
>       WAIT DELAY wd
>       IF sa$="0" THEN EXIT SUB
>       IF sa=1 THEN LET t$="氏名" ELSE LET t$="電話番号"
>       PRINT "検索結果 [";t$;",""";sa$;"""]"
>       LET sr=0
>       IF sa=1 THEN
>          FOR i=1 TO dmx
>             IF POS(DT$(i,2),sa$)>0 THEN
>                PRINT USING u$: DT$(i,1),DT$(i,2),DT$(i,3)
>                LET sr=sr+1
>             END IF
>          NEXT i
>       ELSE  ! sa=2
>          FOR j=LEN(sa$) TO 1 STEP -1
>             IF sa$(j:j)<"0" OR sa$(j:j)>"9" THEN LET sa$(j:j)=""
>          NEXT j
>          FOR i=1 TO dmx
>             IF POS(DTtel$(i),sa$)>0 THEN
>                PRINT USING u$: DT$(i,1),DT$(i,2),DT$(i,3)
>                LET sr=sr+1
>             END IF
>          NEXT i
>       END IF
>       IF sr=0 THEN PRINT "該当するDATAはありませんでした"
>    CASE 5  ! [一覧]
>       DO
>          INPUT PROMPT " 1.DATA順  2.ID番号順  (キャンセルは 0)" : li
>       LOOP UNTIL li=INT(li) AND li>=0 AND li<=2
>       IF li=1 THEN
>          PRINT "DATA一覧"
>          FOR i=1 TO dmx
>             PRINT USING u$: DT$(i,1),DT$(i,2),DT$(i,3)
>          NEXT i
>       ELSEIF li=2 THEN
>          MAT sortID=ZER
>          CALL sort(DTid,sortID,dmx)
>          PRINT "DATA一覧 (ID番号順)"
>          FOR i=1 TO dmx
>             PRINT USING u$: DT$(sortID(i),1),DT$(sortID(i),2),DT$(sortID(i),3)
>          NEXT i
>       END IF
>    CASE 6  ! [保存]
>       CALL save
>    CASE 0  ! [終了]
>       IF CONFIRM$("プログラムを終了しますか?")="NO" THEN EXIT SUB
>       IF CONFIRM$("DATAをファイルに保存しますか?")="YES" THEN CALL save
>       CLOSE #1
>    END SELECT
>    WAIT DELAY wd
> END SUB
> !
> SUB save
>    IF f=1 THEN
>       FILE GETSAVENAME s$
>       OPEN #1: NAME s$
>       LET f=f+10
>    END IF
>    ERASE #1
>    FOR i=1 TO dmx
>       IF DTid(i)<>0 THEN PRINT#1: DT$(i,1)&","&DT$(i,2)&","&DT$(i,3)
>    NEXT i
> END SUB
> !
> SUB tel(t$,d$)
>    LET t$=""
>    FOR j2=1 TO LEN(d$)
>       IF d$(j2:j2)>="0" AND d$(j2:j2)<="9" THEN LET t$=t$&d$(j2:j2)
>    NEXT j2
> END SUB
> !
> END
> ! 十進BASICライブラリ"\Decimal BASIC\BASICw32\Library\SORT2.LIB"
> ! ixにはmと下限,上限を一致させた空の配列を指定する。
> ! mは参照されるのみ。
> ! ixにmの添字を大きさの順に並べて返す。
> ! つまり,m(ix(1))≦m(ix(2))≦m(ix(3))≦・・・となる。
> EXTERNAL SUB sort(m(),ix(),n)  ! ソート
> DECLARE EXTERNAL SUB q_sort
> DECLARE NUMERIC i
> FOR i=1 TO n
>    LET ix(i)=i
> NEXT i
> CALL q_sort(m,ix,1,n)
> END SUB
> !
> EXTERNAL SUB q_sort(m(),a(),l,r)
> DECLARE NUMERIC i,j,pv,t
> IF r<=l THEN
>    EXIT SUB
> ELSE
>    LET i=l-1
>    LET j=r
>    LET pv=m(a(r))
>    DO
>       DO
>          LET i=i+1
>       LOOP UNTIL pv<=m(a(i))
>       DO
>          LET j=j-1
>       LOOP UNTIL j<=i OR m(a(j))<=pv
>       IF j<=i THEN EXIT DO
>       LET t=a(i)
>       LET a(i)=a(j)
>       LET a(j)=t
>    LOOP
>    LET t=a(i)
>    LET a(i)=a(r)
>    LET a(r)=t
>    CALL q_sort(m,a,l,i-1)
>    CALL q_sort(m,a,i+1,r)
> END IF
> END SUB
 

Re: 電話帳プログラム作成プロセスと、プログラムの例

 投稿者:RCカー  投稿日:2021年 8月12日(木)09時50分10秒
  > No.4940[元記事へ]

nagramさんへのお返事です。

  nagramさんへ
 早速実行してみました。
 一人分のデータを入力して、入力、検索、一覧表示、保存、試しました。
 エラーなしで実行できました。
 ID番号を、1からではなく、1001からにしたのは、何か理由がありますか??
 有難う御座いました。

> RCカーさんへのお返事です。
>
> >  フォームによる、データ入力、削除、更新、検索
> >  データは、ID番号、氏名、電話番号。
> >  個人用なので可能だと思う。一覧表示機能。
> >  ファイルへの、データ保存。
> >  氏名からの電話番号検索
> >  電話番号からの氏名検索
> >
>
> 作ってみました。
> まず実行前に、データの上限を指定する変数MXの値を決定してください。
> その他、変更可の変数の値も必要であれば変更してください。
> 実行するとまず、データファイルを新規作成するか、既存のファイルを読み込むかの選択をします。
> データの入力は、ID番号・氏名・電話番号の順です(追加で入力できます)。
> 電話番号は"09012345678","090-1234-5678","090(1234)5678"いずれの形式でもかまいません。
> 苗字と名前の間など、入力データに空白があってもかまいませんが、半角カンマ","は使えません。
> 入力または読み込みが終わるとメインメニューになります。
>   1.入力 2.削除 3.更新 4.検索 5.一覧 6.保存 0.終了
> から選択です。
> [入力][削除][更新]があった場合は、プログラム終了までに必ず[保存]してください。
> 保存しないデータはプログラム終了で失われます。
> 保存したファイルはカンマ区切りのCSV形式なのでExcelなどで読み込むことが出来ます。
> 検索は、苗字だけとか電話番号の一部だけといった部分一致検索に対応してます。
>
> 質問や不具合があれば、この掲示板にお願いします。
>
> DECLARE EXTERNAL SUB sort
> DECLARE NUMERIC MX,IDmin,IDmax,lenID,lenname,lentel,dmx,f,n,id,li,sa,sr,i,j,j2,wd
> DECLARE STRING idrange$,u$,s$,name$,tel$,d$,c$,sa$,t$
> OPTION CHARACTER KANJI
> LET MX=200      ! data数の上限(変更可)
> LET IDmin=1001  ! ID番号の下限(変更可) IDmin>=1
> LET IDmax=9999  ! ID番号の上限(変更可)
> LET lenID=CEIL(LOG10(IDmax))+1
> LET lenNAME=8   ! 氏名の最大文字数(変更可)
> LET lenTEL=14   ! 電話番号の最大文字数(変更可)
> DIM DT$(MX,3),DTid(MX),DTtel$(MX),sortID(MX)
> LET idrange$=STR$(IDmin)&"~"&STR$(IDmax)
> LET u$=REPEAT$("#",lenID)&" <"&REPEAT$("#",2*lenNAME-1)&" <"&REPEAT$("#",lenTEL)
> LET wd=0.1
> SET ECHO "OFF"
> LET dmx=0
> !
> DO
>    INPUT PROMPT "【ファイル】1.新規作成 2.読込み (終了は 0)":f
> LOOP UNTIL f=INT(f) AND f>=0 AND f<=2
> WAIT DELAY wd
> IF f=1 THEN
>    CALL main(1)
> ELSEIF f=2 THEN
>    FILE GETOPENNAME s$  ! 電話帳ファイルの読込み
>    OPEN #1: NAME s$
>    DO
>       LET dmx=dmx+1
>       INPUT #1, IF MISSING THEN EXIT DO: DT$(dmx,1),DT$(dmx,2),DT$(dmx,3)
>       LET DTid(dmx)=VAL(DT$(dmx,1))
>       CALL tel(DTtel$(dmx),DT$(dmx,3))
>    LOOP
>    LET dmx=dmx-1
> ELSE
>    STOP
> END IF
> !
> DO   ! メインルーチン
>    DO
>       INPUT PROMPT " 1.入力 2.削除 3.更新 4.検索 5.一覧 6.保存 0.終了" :n
>    LOOP UNTIL n=INT(n) AND n>=0 AND n<=6
>    WAIT DELAY wd
>    CALL main(n)
> LOOP UNTIL n=0
> !
> SUB main(n)
>    SELECT CASE n
>    CASE 1  ! [入力]
>       DO
>          IF dmx>=MX THEN
>             WAIT DELAY "DATA数が上限 "&STR$(MX)&" に達していて、入力が出来ません"
>             WAIT DELAY wd
>             EXIT SUB
>          END IF
>          DO
>             INPUT PROMPT " ID番号入力 "&idrange$&" (入力終了は 0)" :id
>          LOOP UNTIL id=INT(id) AND id>=IDmin AND id<=IDmax OR id=0
>          WAIT DELAY wd
>          IF id=0 THEN EXIT DO
>          INPUT PROMPT " 氏名を入力 (入力終了は 0)" :name$
>          WAIT DELAY wd
>          IF name$="0" THEN EXIT DO
>          INPUT PROMPT " 電話番号を入力 (入力終了は 0)" :tel$
>          WAIT DELAY wd
>          IF tel$="0" THEN EXIT DO
>          LET c$="このDATAで良いですか? 訂正は [いいえ]"&CHR$(10)&"ID:"
>          LET c$=c$&STR$(id)&CHR$(10)&"氏名:"&name$&CHR$(10)&"電話番号:"&tel$
>          IF CONFIRM$(c$)="YES" THEN
>             LET dmx=dmx+1
>             LET DT$(dmx,1)=STR$(id)
>             LET DT$(dmx,2)=name$
>             LET DT$(dmx,3)=tel$
>             LET DTid(dmx)=id
>             CALL tel(DTtel$(dmx),DT$(dmx,3))
>          END IF
>          WAIT DELAY wd
>       LOOP
>    CASE 2  ! [削除]
>       DO
>          INPUT PROMPT " 削除するDATAのID番号を入力 (キャンセルは 0)" :id
>       LOOP UNTIL id=INT(id) AND id>=IDmin AND id<=IDmax OR id=0
>       WAIT DELAY wd
>       IF id=0 THEN EXIT SUB
>       FOR i=1 TO dmx
>          IF DTid(i)=id THEN
>             LET d$="下記のDATAを削除しますか?"&CHR$(10)&"ID:"&DT$(i,1)
>             LET d$=d$&CHR$(10)&"氏名:"&DT$(i,2)&CHR$(10)&"電話番号:"&DT$(i,3)
>             IF CONFIRM$(d$)="YES" THEN
>                PRINT "削除したDATA"
>                PRINT USING u$: DT$(i,1),DT$(i,2),DT$(i,3)
>                FOR j=i+1 TO dmx
>                   LET DT$(j-1,1)=DT$(j,1)
>                   LET DT$(j-1,2)=DT$(j,2)
>                   LET DT$(j-1,3)=DT$(j,3)
>                   LET DTid(j-1)=VAL(DT$(j,1))
>                   LET DTtel$(j-1)=DTtel$(j)
>                NEXT j
>                LET DT$(dmx,1),DT$(dmx,2),DT$(dmx,3),DTtel$(dmx)=""
>                LET DTid(dmx)=0
>                LET dmx=dmx-1
>             END IF
>             WAIT DELAY wd
>             EXIT SUB
>          END IF
>       NEXT i
>       WAIT DELAY "ID番号 "&STR$(id)&" のDATAが見つかりません"
>    CASE 3  ! [更新]
>       DO
>          INPUT PROMPT " 更新するDATAのID番号を入力 (キャンセルは 0)" :id
>       LOOP UNTIL id=INT(id) AND id>=IDmin AND id<=IDmax OR id=0
>       WAIT DELAY wd
>       IF id=0 THEN EXIT SUB
>       FOR i=1 TO dmx
>          IF DTid(i)=id THEN
>             LET d$="下記のDATAを書き換えますか?"&CHR$(10)&"ID:"&DT$(i,1)
>             LET d$=d$&CHR$(10)&"氏名:"&DT$(i,2)&CHR$(10)&"電話番号:"&DT$(i,3)
>             IF CONFIRM$(d$)="NO" THEN EXIT SUB
>             PRINT "更新前のDATA"
>             PRINT USING u$: DT$(i,1),DT$(i,2),DT$(i,3)
>             DO
>                INPUT PROMPT " 氏名を入力 (入力終了は 0)" :name$
>                WAIT DELAY wd
>                IF name$="0" THEN EXIT SUB
>                INPUT PROMPT " 電話番号を入力 (入力終了は 0)" :tel$
>                WAIT DELAY wd
>                IF tel$="0" THEN EXIT SUB
>                LET c$="このDATAで良いですか? 訂正は [いいえ]"&CHR$(10)&"ID:"
>                LET c$=c$&STR$(id)&CHR$(10)&"氏名:"&name$&CHR$(10)&"電話番号:"&tel$
>                IF CONFIRM$(c$)="YES" THEN
>                   LET DT$(i,2)=name$
>                   LET DT$(i,3)=tel$
>                   CALL tel(DTtel$(i),DT$(i,3))
>                   EXIT DO
>                END IF
>             LOOP
>             WAIT DELAY wd
>             EXIT SUB
>          END IF
>       NEXT i
>       WAIT DELAY "ID番号 "&STR$(id)&" のDATAが見つかりません"
>    CASE 4  ! [検索]
>       DO
>          INPUT PROMPT " 検索項目  1.氏名  2.電話番号  (キャンセルは 0)": sa
>       LOOP UNTIL sa=INT(sa) AND sa>=0 AND sa<=2
>       WAIT DELAY wd
>       IF sa=0 THEN EXIT SUB
>       INPUT PROMPT " 検索文字列 (一部分でも可, キャンセルは 0)": sa$
>       WAIT DELAY wd
>       IF sa$="0" THEN EXIT SUB
>       IF sa=1 THEN LET t$="氏名" ELSE LET t$="電話番号"
>       PRINT "検索結果 [";t$;",""";sa$;"""]"
>       LET sr=0
>       IF sa=1 THEN
>          FOR i=1 TO dmx
>             IF POS(DT$(i,2),sa$)>0 THEN
>                PRINT USING u$: DT$(i,1),DT$(i,2),DT$(i,3)
>                LET sr=sr+1
>             END IF
>          NEXT i
>       ELSE  ! sa=2
>          FOR j=LEN(sa$) TO 1 STEP -1
>             IF sa$(j:j)<"0" OR sa$(j:j)>"9" THEN LET sa$(j:j)=""
>          NEXT j
>          FOR i=1 TO dmx
>             IF POS(DTtel$(i),sa$)>0 THEN
>                PRINT USING u$: DT$(i,1),DT$(i,2),DT$(i,3)
>                LET sr=sr+1
>             END IF
>          NEXT i
>       END IF
>       IF sr=0 THEN PRINT "該当するDATAはありませんでした"
>    CASE 5  ! [一覧]
>       DO
>          INPUT PROMPT " 1.DATA順  2.ID番号順  (キャンセルは 0)" : li
>       LOOP UNTIL li=INT(li) AND li>=0 AND li<=2
>       IF li=1 THEN
>          PRINT "DATA一覧"
>          FOR i=1 TO dmx
>             PRINT USING u$: DT$(i,1),DT$(i,2),DT$(i,3)
>          NEXT i
>       ELSEIF li=2 THEN
>          MAT sortID=ZER
>          CALL sort(DTid,sortID,dmx)
>          PRINT "DATA一覧 (ID番号順)"
>          FOR i=1 TO dmx
>             PRINT USING u$: DT$(sortID(i),1),DT$(sortID(i),2),DT$(sortID(i),3)
>          NEXT i
>       END IF
>    CASE 6  ! [保存]
>       CALL save
>    CASE 0  ! [終了]
>       IF CONFIRM$("プログラムを終了しますか?")="NO" THEN EXIT SUB
>       IF CONFIRM$("DATAをファイルに保存しますか?")="YES" THEN CALL save
>       CLOSE #1
>    END SELECT
>    WAIT DELAY wd
> END SUB
> !
> SUB save
>    IF f=1 THEN
>       FILE GETSAVENAME s$
>       OPEN #1: NAME s$
>       LET f=f+10
>    END IF
>    ERASE #1
>    FOR i=1 TO dmx
>       IF DTid(i)<>0 THEN PRINT#1: DT$(i,1)&","&DT$(i,2)&","&DT$(i,3)
>    NEXT i
> END SUB
> !
> SUB tel(t$,d$)
>    LET t$=""
>    FOR j2=1 TO LEN(d$)
>       IF d$(j2:j2)>="0" AND d$(j2:j2)<="9" THEN LET t$=t$&d$(j2:j2)
>    NEXT j2
> END SUB
> !
> END
> ! 十進BASICライブラリ"\Decimal BASIC\BASICw32\Library\SORT2.LIB"
> ! ixにはmと下限,上限を一致させた空の配列を指定する。
> ! mは参照されるのみ。
> ! ixにmの添字を大きさの順に並べて返す。
> ! つまり,m(ix(1))≦m(ix(2))≦m(ix(3))≦・・・となる。
> EXTERNAL SUB sort(m(),ix(),n)  ! ソート
> DECLARE EXTERNAL SUB q_sort
> DECLARE NUMERIC i
> FOR i=1 TO n
>    LET ix(i)=i
> NEXT i
> CALL q_sort(m,ix,1,n)
> END SUB
> !
> EXTERNAL SUB q_sort(m(),a(),l,r)
> DECLARE NUMERIC i,j,pv,t
> IF r<=l THEN
>    EXIT SUB
> ELSE
>    LET i=l-1
>    LET j=r
>    LET pv=m(a(r))
>    DO
>       DO
>          LET i=i+1
>       LOOP UNTIL pv<=m(a(i))
>       DO
>          LET j=j-1
>       LOOP UNTIL j<=i OR m(a(j))<=pv
>       IF j<=i THEN EXIT DO
>       LET t=a(i)
>       LET a(i)=a(j)
>       LET a(j)=t
>    LOOP
>    LET t=a(i)
>    LET a(i)=a(r)
>    LET a(r)=t
>    CALL q_sort(m,a,l,i-1)
>    CALL q_sort(m,a,i+1,r)
> END IF
> END SUB
 

Re: 電話帳プログラム作成プロセスと、プログラムの例

 投稿者:RCカー  投稿日:2021年 8月12日(木)11時52分19秒
  RCカーさんへのお返事です。
 データ入力ダイアログで、数字を、入れずに、OKを、クリックしたとき、シンタックスエラーが出ます。input文に、イレギュラーな、場合にどうするかを、しょりほうほうを、プログラムで、決めないと、駄目なのかな?、教えて下さい。
待ってます。

> nagramさんへのお返事です。
>
>   nagramさんへ
>  早速実行してみました。
>  一人分のデータを入力して、入力、検索、一覧表示、保存、試しました。
>  エラーなしで実行できました。
>  ID番号を、1からではなく、1001からにしたのは、何か理由がありますか??
>  有難う御座いました。
>
> > RCカーさんへのお返事です。
> >
> > >  フォームによる、データ入力、削除、更新、検索
> > >  データは、ID番号、氏名、電話番号。
> > >  個人用なので可能だと思う。一覧表示機能。
> > >  ファイルへの、データ保存。
> > >  氏名からの電話番号検索
> > >  電話番号からの氏名検索
> > >
> >
> > 作ってみました。
> > まず実行前に、データの上限を指定する変数MXの値を決定してください。
> > その他、変更可の変数の値も必要であれば変更してください。
> > 実行するとまず、データファイルを新規作成するか、既存のファイルを読み込むかの選択をします。
> > データの入力は、ID番号・氏名・電話番号の順です(追加で入力できます)。
> > 電話番号は"09012345678","090-1234-5678","090(1234)5678"いずれの形式でもかまいません。
> > 苗字と名前の間など、入力データに空白があってもかまいませんが、半角カンマ","は使えません。
> > 入力または読み込みが終わるとメインメニューになります。
> >   1.入力 2.削除 3.更新 4.検索 5.一覧 6.保存 0.終了
> > から選択です。
> > [入力][削除][更新]があった場合は、プログラム終了までに必ず[保存]してください。
> > 保存しないデータはプログラム終了で失われます。
> > 保存したファイルはカンマ区切りのCSV形式なのでExcelなどで読み込むことが出来ます。
> > 検索は、苗字だけとか電話番号の一部だけといった部分一致検索に対応してます。
> >
> > 質問や不具合があれば、この掲示板にお願いします。
> >
> > DECLARE EXTERNAL SUB sort
> > DECLARE NUMERIC MX,IDmin,IDmax,lenID,lenname,lentel,dmx,f,n,id,li,sa,sr,i,j,j2,wd
> > DECLARE STRING idrange$,u$,s$,name$,tel$,d$,c$,sa$,t$
> > OPTION CHARACTER KANJI
> > LET MX=200      ! data数の上限(変更可)
> > LET IDmin=1001  ! ID番号の下限(変更可) IDmin>=1
> > LET IDmax=9999  ! ID番号の上限(変更可)
> > LET lenID=CEIL(LOG10(IDmax))+1
> > LET lenNAME=8   ! 氏名の最大文字数(変更可)
> > LET lenTEL=14   ! 電話番号の最大文字数(変更可)
> > DIM DT$(MX,3),DTid(MX),DTtel$(MX),sortID(MX)
> > LET idrange$=STR$(IDmin)&"~"&STR$(IDmax)
> > LET u$=REPEAT$("#",lenID)&" <"&REPEAT$("#",2*lenNAME-1)&" <"&REPEAT$("#",lenTEL)
> > LET wd=0.1
> > SET ECHO "OFF"
> > LET dmx=0
> > !
> > DO
> >    INPUT PROMPT "【ファイル】1.新規作成 2.読込み (終了は 0)":f
> > LOOP UNTIL f=INT(f) AND f>=0 AND f<=2
> > WAIT DELAY wd
> > IF f=1 THEN
> >    CALL main(1)
> > ELSEIF f=2 THEN
> >    FILE GETOPENNAME s$  ! 電話帳ファイルの読込み
> >    OPEN #1: NAME s$
> >    DO
> >       LET dmx=dmx+1
> >       INPUT #1, IF MISSING THEN EXIT DO: DT$(dmx,1),DT$(dmx,2),DT$(dmx,3)
> >       LET DTid(dmx)=VAL(DT$(dmx,1))
> >       CALL tel(DTtel$(dmx),DT$(dmx,3))
> >    LOOP
> >    LET dmx=dmx-1
> > ELSE
> >    STOP
> > END IF
> > !
> > DO   ! メインルーチン
> >    DO
> >       INPUT PROMPT " 1.入力 2.削除 3.更新 4.検索 5.一覧 6.保存 0.終了" :n
> >    LOOP UNTIL n=INT(n) AND n>=0 AND n<=6
> >    WAIT DELAY wd
> >    CALL main(n)
> > LOOP UNTIL n=0
> > !
> > SUB main(n)
> >    SELECT CASE n
> >    CASE 1  ! [入力]
> >       DO
> >          IF dmx>=MX THEN
> >             WAIT DELAY "DATA数が上限 "&STR$(MX)&" に達していて、入力が出来ません"
> >             WAIT DELAY wd
> >             EXIT SUB
> >          END IF
> >          DO
> >             INPUT PROMPT " ID番号入力 "&idrange$&" (入力終了は 0)" :id
> >          LOOP UNTIL id=INT(id) AND id>=IDmin AND id<=IDmax OR id=0
> >          WAIT DELAY wd
> >          IF id=0 THEN EXIT DO
> >          INPUT PROMPT " 氏名を入力 (入力終了は 0)" :name$
> >          WAIT DELAY wd
> >          IF name$="0" THEN EXIT DO
> >          INPUT PROMPT " 電話番号を入力 (入力終了は 0)" :tel$
> >          WAIT DELAY wd
> >          IF tel$="0" THEN EXIT DO
> >          LET c$="このDATAで良いですか? 訂正は [いいえ]"&CHR$(10)&"ID:"
> >          LET c$=c$&STR$(id)&CHR$(10)&"氏名:"&name$&CHR$(10)&"電話番号:"&tel$
> >          IF CONFIRM$(c$)="YES" THEN
> >             LET dmx=dmx+1
> >             LET DT$(dmx,1)=STR$(id)
> >             LET DT$(dmx,2)=name$
> >             LET DT$(dmx,3)=tel$
> >             LET DTid(dmx)=id
> >             CALL tel(DTtel$(dmx),DT$(dmx,3))
> >          END IF
> >          WAIT DELAY wd
> >       LOOP
> >    CASE 2  ! [削除]
> >       DO
> >          INPUT PROMPT " 削除するDATAのID番号を入力 (キャンセルは 0)" :id
> >       LOOP UNTIL id=INT(id) AND id>=IDmin AND id<=IDmax OR id=0
> >       WAIT DELAY wd
> >       IF id=0 THEN EXIT SUB
> >       FOR i=1 TO dmx
> >          IF DTid(i)=id THEN
> >             LET d$="下記のDATAを削除しますか?"&CHR$(10)&"ID:"&DT$(i,1)
> >             LET d$=d$&CHR$(10)&"氏名:"&DT$(i,2)&CHR$(10)&"電話番号:"&DT$(i,3)
> >             IF CONFIRM$(d$)="YES" THEN
> >                PRINT "削除したDATA"
> >                PRINT USING u$: DT$(i,1),DT$(i,2),DT$(i,3)
> >                FOR j=i+1 TO dmx
> >                   LET DT$(j-1,1)=DT$(j,1)
> >                   LET DT$(j-1,2)=DT$(j,2)
> >                   LET DT$(j-1,3)=DT$(j,3)
> >                   LET DTid(j-1)=VAL(DT$(j,1))
> >                   LET DTtel$(j-1)=DTtel$(j)
> >                NEXT j
> >                LET DT$(dmx,1),DT$(dmx,2),DT$(dmx,3),DTtel$(dmx)=""
> >                LET DTid(dmx)=0
> >                LET dmx=dmx-1
> >             END IF
> >             WAIT DELAY wd
> >             EXIT SUB
> >          END IF
> >       NEXT i
> >       WAIT DELAY "ID番号 "&STR$(id)&" のDATAが見つかりません"
> >    CASE 3  ! [更新]
> >       DO
> >          INPUT PROMPT " 更新するDATAのID番号を入力 (キャンセルは 0)" :id
> >       LOOP UNTIL id=INT(id) AND id>=IDmin AND id<=IDmax OR id=0
> >       WAIT DELAY wd
> >       IF id=0 THEN EXIT SUB
> >       FOR i=1 TO dmx
> >          IF DTid(i)=id THEN
> >             LET d$="下記のDATAを書き換えますか?"&CHR$(10)&"ID:"&DT$(i,1)
> >             LET d$=d$&CHR$(10)&"氏名:"&DT$(i,2)&CHR$(10)&"電話番号:"&DT$(i,3)
> >             IF CONFIRM$(d$)="NO" THEN EXIT SUB
> >             PRINT "更新前のDATA"
> >             PRINT USING u$: DT$(i,1),DT$(i,2),DT$(i,3)
> >             DO
> >                INPUT PROMPT " 氏名を入力 (入力終了は 0)" :name$
> >                WAIT DELAY wd
> >                IF name$="0" THEN EXIT SUB
> >                INPUT PROMPT " 電話番号を入力 (入力終了は 0)" :tel$
> >                WAIT DELAY wd
> >                IF tel$="0" THEN EXIT SUB
> >                LET c$="このDATAで良いですか? 訂正は [いいえ]"&CHR$(10)&"ID:"
> >                LET c$=c$&STR$(id)&CHR$(10)&"氏名:"&name$&CHR$(10)&"電話番号:"&tel$
> >                IF CONFIRM$(c$)="YES" THEN
> >                   LET DT$(i,2)=name$
> >                   LET DT$(i,3)=tel$
> >                   CALL tel(DTtel$(i),DT$(i,3))
> >                   EXIT DO
> >                END IF
> >             LOOP
> >             WAIT DELAY wd
> >             EXIT SUB
> >          END IF
> >       NEXT i
> >       WAIT DELAY "ID番号 "&STR$(id)&" のDATAが見つかりません"
> >    CASE 4  ! [検索]
> >       DO
> >          INPUT PROMPT " 検索項目  1.氏名  2.電話番号  (キャンセルは 0)": sa
> >       LOOP UNTIL sa=INT(sa) AND sa>=0 AND sa<=2
> >       WAIT DELAY wd
> >       IF sa=0 THEN EXIT SUB
> >       INPUT PROMPT " 検索文字列 (一部分でも可, キャンセルは 0)": sa$
> >       WAIT DELAY wd
> >       IF sa$="0" THEN EXIT SUB
> >       IF sa=1 THEN LET t$="氏名" ELSE LET t$="電話番号"
> >       PRINT "検索結果 [";t$;",""";sa$;"""]"
> >       LET sr=0
> >       IF sa=1 THEN
> >          FOR i=1 TO dmx
> >             IF POS(DT$(i,2),sa$)>0 THEN
> >                PRINT USING u$: DT$(i,1),DT$(i,2),DT$(i,3)
> >                LET sr=sr+1
> >             END IF
> >          NEXT i
> >       ELSE  ! sa=2
> >          FOR j=LEN(sa$) TO 1 STEP -1
> >             IF sa$(j:j)<"0" OR sa$(j:j)>"9" THEN LET sa$(j:j)=""
> >          NEXT j
> >          FOR i=1 TO dmx
> >             IF POS(DTtel$(i),sa$)>0 THEN
> >                PRINT USING u$: DT$(i,1),DT$(i,2),DT$(i,3)
> >                LET sr=sr+1
> >             END IF
> >          NEXT i
> >       END IF
> >       IF sr=0 THEN PRINT "該当するDATAはありませんでした"
> >    CASE 5  ! [一覧]
> >       DO
> >          INPUT PROMPT " 1.DATA順  2.ID番号順  (キャンセルは 0)" : li
> >       LOOP UNTIL li=INT(li) AND li>=0 AND li<=2
> >       IF li=1 THEN
> >          PRINT "DATA一覧"
> >          FOR i=1 TO dmx
> >             PRINT USING u$: DT$(i,1),DT$(i,2),DT$(i,3)
> >          NEXT i
> >       ELSEIF li=2 THEN
> >          MAT sortID=ZER
> >          CALL sort(DTid,sortID,dmx)
> >          PRINT "DATA一覧 (ID番号順)"
> >          FOR i=1 TO dmx
> >             PRINT USING u$: DT$(sortID(i),1),DT$(sortID(i),2),DT$(sortID(i),3)
> >          NEXT i
> >       END IF
> >    CASE 6  ! [保存]
> >       CALL save
> >    CASE 0  ! [終了]
> >       IF CONFIRM$("プログラムを終了しますか?")="NO" THEN EXIT SUB
> >       IF CONFIRM$("DATAをファイルに保存しますか?")="YES" THEN CALL save
> >       CLOSE #1
> >    END SELECT
> >    WAIT DELAY wd
> > END SUB
> > !
> > SUB save
> >    IF f=1 THEN
> >       FILE GETSAVENAME s$
> >       OPEN #1: NAME s$
> >       LET f=f+10
> >    END IF
> >    ERASE #1
> >    FOR i=1 TO dmx
> >       IF DTid(i)<>0 THEN PRINT#1: DT$(i,1)&","&DT$(i,2)&","&DT$(i,3)
> >    NEXT i
> > END SUB
> > !
> > SUB tel(t$,d$)
> >    LET t$=""
> >    FOR j2=1 TO LEN(d$)
> >       IF d$(j2:j2)>="0" AND d$(j2:j2)<="9" THEN LET t$=t$&d$(j2:j2)
> >    NEXT j2
> > END SUB
> > !
> > END
> > ! 十進BASICライブラリ"\Decimal BASIC\BASICw32\Library\SORT2.LIB"
> > ! ixにはmと下限,上限を一致させた空の配列を指定する。
> > ! mは参照されるのみ。
> > ! ixにmの添字を大きさの順に並べて返す。
> > ! つまり,m(ix(1))≦m(ix(2))≦m(ix(3))≦・・・となる。
> > EXTERNAL SUB sort(m(),ix(),n)  ! ソート
> > DECLARE EXTERNAL SUB q_sort
> > DECLARE NUMERIC i
> > FOR i=1 TO n
> >    LET ix(i)=i
> > NEXT i
> > CALL q_sort(m,ix,1,n)
> > END SUB
> > !
> > EXTERNAL SUB q_sort(m(),a(),l,r)
> > DECLARE NUMERIC i,j,pv,t
> > IF r<=l THEN
> >    EXIT SUB
> > ELSE
> >    LET i=l-1
> >    LET j=r
> >    LET pv=m(a(r))
> >    DO
> >       DO
> >          LET i=i+1
> >       LOOP UNTIL pv<=m(a(i))
> >       DO
> >          LET j=j-1
> >       LOOP UNTIL j<=i OR m(a(j))<=pv
> >       IF j<=i THEN EXIT DO
> >       LET t=a(i)
> >       LET a(i)=a(j)
> >       LET a(j)=t
> >    LOOP
> >    LET t=a(i)
> >    LET a(i)=a(r)
> >    LET a(r)=t
> >    CALL q_sort(m,a,l,i-1)
> >    CALL q_sort(m,a,i+1,r)
> > END IF
> > END SUB
 

Re: 電話帳プログラム作成プロセスと、プログラムの例

 投稿者:nagram  投稿日:2021年 8月12日(木)19時47分38秒
  > No.4943[元記事へ]

RCカーさんへのお返事です。

>ID番号を、1からではなく、1001からにしたのは、何か理由がありますか??

→ 4桁に揃えただけで特に意味はありません。
ID番号の下限、上限は IDmin,IDmaxで設定できるので、目的に合った値に変更してください。
また、入力データのID番号は連番でなくともかまいません。
例えば IDmin=1,IDmax=100 に設定し、入力を 20,15,4,16,27,…といった順番で入力してもかまいません。
データ一覧の出力は、入力した順とID番号順の並びを選択できます。


>データ入力ダイアログで、数字を、入れずに、OKを、クリックしたとき、シンタックスエラーが出ます。input文に、イレギュラーな、場合にどうするかを、しょりほうほうを、プログラムで、決めないと、駄目なのかな?、教えて下さい。

→ input文で数値変数に入力するときに数値以外(空文字列も含む)を入力すると再入力を促すのは十進BASICの仕様なので、利用者はどうすることもできません。
ただし、文字列変数に入力するようにすれば空文字列の入力も認められるので、[OK]クリックで[0]を入力したのと同じ扱いにすることはできます。

-----------------------------------------------------------------------------
DO   ! メインルーチン
   DO
      INPUT PROMPT " 1.入力 2.削除 3.更新 4.検索 5.一覧 6.保存 0.終了" :n
   LOOP UNTIL n=INT(n) AND n>=0 AND n<=6
   WAIT DELAY wd
   CALL main(n)
LOOP UNTIL n=0
-----------------------------------------------------------------------------
上記の部分を、次のようにすれば[OK]クリックや[Enter]キーで[0]と同じ扱い。
-----------------------------------------------------------------------------
WHEN EXCEPTION IN
   DO   ! メインルーチン
      DO
         INPUT PROMPT " 1.入力 2.削除 3.更新 4.検索 5.一覧 6.保存 0.終了" :n$  !文字列変数入力
         LET n=VAL(n$)   ! 文字列変数を数値に変換。空文字列や"abc"などは例外発生。
      LOOP UNTIL n=INT(n) AND n>=0 AND n<=6
      WAIT DELAY wd
      CALL main(n)
   LOOP UNTIL n=0
USE  ! 例外発生時の処理
   LET n=0
   CONTINUE
END WHEN
-----------------------------------------------------------------------------


◎ 重要なバグを発見しました。
"プログラムを終了しますか?" というメッセージボックスで[いいえ]を選択しても終了してしまいます。
副プログラム SUB main(n) 内のselect区で、CASE 0 を次のように修正してください。
--------------------------------------------------------------------------
【誤】
  CASE 0  ! [終了]
      IF CONFIRM$("プログラムを終了しますか?")="NO" THEN EXIT SUB
      IF CONFIRM$("DATAをファイルに保存しますか?")="YES" THEN CALL save
      CLOSE #1
   END SELECT
--------------------------------------------------------------------------
【正】
  CASE 0  ! [終了]
      IF CONFIRM$("プログラムを終了しますか?")="NO" THEN  ! 訂正
         LET n=7   ! 訂正
         EXIT SUB  ! 訂正
      END IF       ! 訂正
      IF CONFIRM$("DATAをファイルに保存しますか?")="YES" THEN CALL save
      CLOSE #1
   END SELECT
--------------------------------------------------------------------------
 

Re: 電話帳プログラム作成プロセスと、プログラムの例

 投稿者:RCカー  投稿日:2021年 8月13日(金)09時21分51秒
  > No.4944[元記事へ]

nagramさんへのお返事です。

まだシンタックスエラーが出ます。
 

Re: 電話帳プログラム作成プロセスと、プログラムの例

 投稿者:RCカー  投稿日:2021年 8月13日(金)11時47分9秒
  > No.4944[元記事へ]

nagramさんへのお返事です。

以下、変更点を、編集したプログラムです。間違っていたら教えて下さい。
DECLARE EXTERNAL SUB sort
DECLARE NUMERIC MX,IDmin,IDmax,lenID,lenname,lentel,dmx,f,n,id,li,sa,sr,i,j,j2,wd
DECLARE STRING idrange$,u$,s$,name$,tel$,d$,c$,sa$,t$
OPTION CHARACTER KANJI
LET MX=200      ! data数の上限(変更可)
LET IDmin=1001  ! ID番号の下限(変更可) IDmin>=1
LET IDmax=9999  ! ID番号の上限(変更可)
LET lenID=CEIL(LOG10(IDmax))+1
LET lenNAME=8   ! 氏名の最大文字数(変更可)
LET lenTEL=14   ! 電話番号の最大文字数(変更可)
DIM DT$(MX,3),DTid(MX),DTtel$(MX),sortID(MX)
LET idrange$=STR$(IDmin)&"~"&STR$(IDmax)
LET u$=REPEAT$("#",lenID)&" <"&REPEAT$("#",2*lenNAME-1)&" <"&REPEAT$("#",lenTEL)
LET wd=0.1
SET ECHO "OFF"
LET dmx=0
!
DO
   INPUT PROMPT "【ファイル】1.新規作成 2.読込み (終了は 0)":f
LOOP UNTIL f=INT(f) AND f>=0 AND f<=2
WAIT DELAY wd
IF f=1 THEN
   CALL main(1)
ELSEIF f=2 THEN
   FILE GETOPENNAME s$  ! 電話帳ファイルの読込み
   OPEN #1: NAME s$
   DO
      LET dmx=dmx+1
      INPUT #1, IF MISSING THEN EXIT DO: DT$(dmx,1),DT$(dmx,2),DT$(dmx,3)
      LET DTid(dmx)=VAL(DT$(dmx,1))
      CALL tel(DTtel$(dmx),DT$(dmx,3))
   LOOP
   LET dmx=dmx-1
ELSE
   STOP
END IF
!
WHEN EXCEPTION IN
   DO   ! メインルーチン
      DO
         INPUT PROMPT " 1.入力 2.削除 3.更新 4.検索 5.一覧 6.保存 0.終了" :n$  !文字列変数入力
         LET n=VAL(n$)   ! 文字列変数を数値に変換。空文字列や"abc"などは例外発生。
      LOOP UNTIL n=INT(n) AND n>=0 AND n<=6
      WAIT DELAY wd
      CALL main(n)
   LOOP UNTIL n=0
USE  ! 例外発生時の処理
   LET n=0
   CONTINUE
END WHEN!
SUB main(n)
   SELECT CASE n
   CASE 1  ! [入力]
      DO
         IF dmx>=MX THEN
            WAIT DELAY "DATA数が上限 "&STR$(MX)&" に達していて、入力が出来ません"
            WAIT DELAY wd
            EXIT SUB
         END IF
         DO
            INPUT PROMPT " ID番号入力 "&idrange$&" (入力終了は 0)" :id
         LOOP UNTIL id=INT(id) AND id>=IDmin AND id<=IDmax OR id=0
         WAIT DELAY wd
         IF id=0 THEN EXIT DO
         INPUT PROMPT " 氏名を入力 (入力終了は 0)" :name$
         WAIT DELAY wd
         IF name$="0" THEN EXIT DO
         INPUT PROMPT " 電話番号を入力 (入力終了は 0)" :tel$
         WAIT DELAY wd
         IF tel$="0" THEN EXIT DO
         LET c$="このDATAで良いですか? 訂正は [いいえ]"&CHR$(10)&"ID:"
         LET c$=c$&STR$(id)&CHR$(10)&"氏名:"&name$&CHR$(10)&"電話番号:"&tel$
         IF CONFIRM$(c$)="YES" THEN
            LET dmx=dmx+1
            LET DT$(dmx,1)=STR$(id)
            LET DT$(dmx,2)=name$
            LET DT$(dmx,3)=tel$
            LET DTid(dmx)=id
            CALL tel(DTtel$(dmx),DT$(dmx,3))
         END IF
         WAIT DELAY wd
      LOOP
   CASE 2  ! [削除]
      DO
         INPUT PROMPT " 削除するDATAのID番号を入力 (キャンセルは 0)" :id
      LOOP UNTIL id=INT(id) AND id>=IDmin AND id<=IDmax OR id=0
      WAIT DELAY wd
      IF id=0 THEN EXIT SUB
      FOR i=1 TO dmx
         IF DTid(i)=id THEN
            LET d$="下記のDATAを削除しますか?"&CHR$(10)&"ID:"&DT$(i,1)
            LET d$=d$&CHR$(10)&"氏名:"&DT$(i,2)&CHR$(10)&"電話番号:"&DT$(i,3)
            IF CONFIRM$(d$)="YES" THEN
               PRINT "削除したDATA"
               PRINT USING u$: DT$(i,1),DT$(i,2),DT$(i,3)
               FOR j=i+1 TO dmx
                  LET DT$(j-1,1)=DT$(j,1)
                  LET DT$(j-1,2)=DT$(j,2)
                  LET DT$(j-1,3)=DT$(j,3)
                  LET DTid(j-1)=VAL(DT$(j,1))
                  LET DTtel$(j-1)=DTtel$(j)
               NEXT j
               LET DT$(dmx,1),DT$(dmx,2),DT$(dmx,3),DTtel$(dmx)=""
               LET DTid(dmx)=0
               LET dmx=dmx-1
            END IF
            WAIT DELAY wd
            EXIT SUB
         END IF
      NEXT i
      WAIT DELAY "ID番号 "&STR$(id)&" のDATAが見つかりません"
   CASE 3  ! [更新]
      DO
         INPUT PROMPT " 更新するDATAのID番号を入力 (キャンセルは 0)" :id
      LOOP UNTIL id=INT(id) AND id>=IDmin AND id<=IDmax OR id=0
      WAIT DELAY wd
      IF id=0 THEN EXIT SUB
      FOR i=1 TO dmx
         IF DTid(i)=id THEN
            LET d$="下記のDATAを書き換えますか?"&CHR$(10)&"ID:"&DT$(i,1)
            LET d$=d$&CHR$(10)&"氏名:"&DT$(i,2)&CHR$(10)&"電話番号:"&DT$(i,3)
            IF CONFIRM$(d$)="NO" THEN EXIT SUB
            PRINT "更新前のDATA"
            PRINT USING u$: DT$(i,1),DT$(i,2),DT$(i,3)
            DO
               INPUT PROMPT " 氏名を入力 (入力終了は 0)" :name$
               WAIT DELAY wd
               IF name$="0" THEN EXIT SUB
               INPUT PROMPT " 電話番号を入力 (入力終了は 0)" :tel$
               WAIT DELAY wd
               IF tel$="0" THEN EXIT SUB
               LET c$="このDATAで良いですか? 訂正は [いいえ]"&CHR$(10)&"ID:"
               LET c$=c$&STR$(id)&CHR$(10)&"氏名:"&name$&CHR$(10)&"電話番号:"&tel$
               IF CONFIRM$(c$)="YES" THEN
                  LET DT$(i,2)=name$
                  LET DT$(i,3)=tel$
                  CALL tel(DTtel$(i),DT$(i,3))
                  EXIT DO
               END IF
            LOOP
            WAIT DELAY wd
            EXIT SUB
         END IF
      NEXT i
      WAIT DELAY "ID番号 "&STR$(id)&" のDATAが見つかりません"
   CASE 4  ! [検索]
      DO
         INPUT PROMPT " 検索項目  1.氏名  2.電話番号  (キャンセルは 0)": sa
      LOOP UNTIL sa=INT(sa) AND sa>=0 AND sa<=2
      WAIT DELAY wd
      IF sa=0 THEN EXIT SUB
      INPUT PROMPT " 検索文字列 (一部分でも可, キャンセルは 0)": sa$
      WAIT DELAY wd
      IF sa$="0" THEN EXIT SUB
      IF sa=1 THEN LET t$="氏名" ELSE LET t$="電話番号"
      PRINT "検索結果 [";t$;",""";sa$;"""]"
      LET sr=0
      IF sa=1 THEN
         FOR i=1 TO dmx
            IF POS(DT$(i,2),sa$)>0 THEN
               PRINT USING u$: DT$(i,1),DT$(i,2),DT$(i,3)
               LET sr=sr+1
            END IF
         NEXT i
      ELSE  ! sa=2
         FOR j=LEN(sa$) TO 1 STEP -1
            IF sa$(j:j)<"0" OR sa$(j:j)>"9" THEN LET sa$(j:j)=""
         NEXT j
         FOR i=1 TO dmx
            IF POS(DTtel$(i),sa$)>0 THEN
               PRINT USING u$: DT$(i,1),DT$(i,2),DT$(i,3)
               LET sr=sr+1
            END IF
         NEXT i
      END IF
      IF sr=0 THEN PRINT "該当するDATAはありませんでした"
   CASE 5  ! [一覧]
      DO
         INPUT PROMPT " 1.DATA順  2.ID番号順  (キャンセルは 0)" : li
      LOOP UNTIL li=INT(li) AND li>=0 AND li<=2
      IF li=1 THEN
         PRINT "DATA一覧"
         FOR i=1 TO dmx
            PRINT USING u$: DT$(i,1),DT$(i,2),DT$(i,3)
         NEXT i
      ELSEIF li=2 THEN
         MAT sortID=ZER
         CALL sort(DTid,sortID,dmx)
         PRINT "DATA一覧 (ID番号順)"
         FOR i=1 TO dmx
            PRINT USING u$: DT$(sortID(i),1),DT$(sortID(i),2),DT$(sortID(i),3)
         NEXT i
      END IF
   CASE 6  ! [保存]
      CALL save
CASE 0  ! [終了]
      IF CONFIRM$("プログラムを終了しますか?")="NO" THEN  ! 訂正
         LET n=7   ! 訂正
         EXIT SUB  ! 訂正
      END IF       ! 訂正
      IF CONFIRM$("DATAをファイルに保存しますか?")="YES" THEN CALL save
      CLOSE #1
   END SELECT
   WAIT DELAY wd
END SUB
!
SUB save
   IF f=1 THEN
      FILE GETSAVENAME s$
      OPEN #1: NAME s$
      LET f=f+10
   END IF
   ERASE #1
   FOR i=1 TO dmx
      IF DTid(i)<>0 THEN PRINT#1: DT$(i,1)&","&DT$(i,2)&","&DT$(i,3)
   NEXT i
END SUB
!
SUB tel(t$,d$)
   LET t$=""
   FOR j2=1 TO LEN(d$)
      IF d$(j2:j2)>="0" AND d$(j2:j2)<="9" THEN LET t$=t$&d$(j2:j2)
   NEXT j2
END SUB
!
END
! 十進BASICライブラリ"\Decimal BASIC\BASICw32\Library\SORT2.LIB"
! ixにはmと下限,上限を一致させた空の配列を指定する。
! mは参照されるのみ。
! ixにmの添字を大きさの順に並べて返す。
! つまり,m(ix(1))≦m(ix(2))≦m(ix(3))≦・・・となる。
EXTERNAL SUB sort(m(),ix(),n)  ! ソート
DECLARE EXTERNAL SUB q_sort
DECLARE NUMERIC i
FOR i=1 TO n
   LET ix(i)=i
NEXT i
CALL q_sort(m,ix,1,n)
END SUB
!
EXTERNAL SUB q_sort(m(),a(),l,r)
DECLARE NUMERIC i,j,pv,t
IF r<=l THEN
   EXIT SUB
ELSE
   LET i=l-1
   LET j=r
   LET pv=m(a(r))
   DO
      DO
         LET i=i+1
      LOOP UNTIL pv<=m(a(i))
      DO
         LET j=j-1
      LOOP UNTIL j<=i OR m(a(j))<=pv
      IF j<=i THEN EXIT DO
      LET t=a(i)
      LET a(i)=a(j)
      LET a(j)=t
   LOOP
   LET t=a(i)
   LET a(i)=a(r)
   LET a(r)=t
   CALL q_sort(m,a,l,i-1)
   CALL q_sort(m,a,i+1,r)
END IF
END SUB
END


> RCカーさんへのお返事です。
>
> >ID番号を、1からではなく、1001からにしたのは、何か理由がありますか??
>
> → 4桁に揃えただけで特に意味はありません。
> ID番号の下限、上限は IDmin,IDmaxで設定できるので、目的に合った値に変更してください。
> また、入力データのID番号は連番でなくともかまいません。
> 例えば IDmin=1,IDmax=100 に設定し、入力を 20,15,4,16,27,…といった順番で入力してもかまいません。
> データ一覧の出力は、入力した順とID番号順の並びを選択できます。
>
>
> >データ入力ダイアログで、数字を、入れずに、OKを、クリックしたとき、シンタックスエラーが出ます。input文に、イレギュラーな、場合にどうするかを、しょりほうほうを、プログラムで、決めないと、駄目なのかな?、教えて下さい。
>
> → input文で数値変数に入力するときに数値以外(空文字列も含む)を入力すると再入力を促すのは十進BASICの仕様なので、利用者はどうすることもできません。
> ただし、文字列変数に入力するようにすれば空文字列の入力も認められるので、[OK]クリックで[0]を入力したのと同じ扱いにすることはできます。
>
> -----------------------------------------------------------------------------
> DO   ! メインルーチン
>    DO
>       INPUT PROMPT " 1.入力 2.削除 3.更新 4.検索 5.一覧 6.保存 0.終了" :n
>    LOOP UNTIL n=INT(n) AND n>=0 AND n<=6
>    WAIT DELAY wd
>    CALL main(n)
> LOOP UNTIL n=0
> -----------------------------------------------------------------------------
> 上記の部分を、次のようにすれば[OK]クリックや[Enter]キーで[0]と同じ扱い。
> -----------------------------------------------------------------------------
> WHEN EXCEPTION IN
>    DO   ! メインルーチン
>       DO
>          INPUT PROMPT " 1.入力 2.削除 3.更新 4.検索 5.一覧 6.保存 0.終了" :n$  !文字列変数入力
>          LET n=VAL(n$)   ! 文字列変数を数値に変換。空文字列や"abc"などは例外発生。
>       LOOP UNTIL n=INT(n) AND n>=0 AND n<=6
>       WAIT DELAY wd
>       CALL main(n)
>    LOOP UNTIL n=0
> USE  ! 例外発生時の処理
>    LET n=0
>    CONTINUE
> END WHEN
> -----------------------------------------------------------------------------
>
>
> ◎ 重要なバグを発見しました。
> "プログラムを終了しますか?" というメッセージボックスで[いいえ]を選択しても終了してしまいます。
> 副プログラム SUB main(n) 内のselect区で、CASE 0 を次のように修正してください。
> --------------------------------------------------------------------------
> 【誤】
>   CASE 0  ! [終了]
>       IF CONFIRM$("プログラムを終了しますか?")="NO" THEN EXIT SUB
>       IF CONFIRM$("DATAをファイルに保存しますか?")="YES" THEN CALL save
>       CLOSE #1
>    END SELECT
> --------------------------------------------------------------------------
> 【正】
>   CASE 0  ! [終了]
>       IF CONFIRM$("プログラムを終了しますか?")="NO" THEN  ! 訂正
>          LET n=7   ! 訂正
>          EXIT SUB  ! 訂正
>       END IF       ! 訂正
>       IF CONFIRM$("DATAをファイルに保存しますか?")="YES" THEN CALL save
>       CLOSE #1
>    END SELECT
> --------------------------------------------------------------------------
 

Re: 電話帳プログラム作成プロセスと、プログラムの例

 投稿者:RCカー  投稿日:2021年 8月13日(金)11時49分56秒
  > No.4944[元記事へ]

nagramさんへのお返事です。

  まだ、シンタックスエラーがでて、
  また、終了しますか  いいえ  で、終了してしまいます。

> RCカーさんへのお返事です。
>
> >ID番号を、1からではなく、1001からにしたのは、何か理由がありますか??
>
> → 4桁に揃えただけで特に意味はありません。
> ID番号の下限、上限は IDmin,IDmaxで設定できるので、目的に合った値に変更してください。
> また、入力データのID番号は連番でなくともかまいません。
> 例えば IDmin=1,IDmax=100 に設定し、入力を 20,15,4,16,27,…といった順番で入力してもかまいません。
> データ一覧の出力は、入力した順とID番号順の並びを選択できます。
>
>
> >データ入力ダイアログで、数字を、入れずに、OKを、クリックしたとき、シンタックスエラーが出ます。input文に、イレギュラーな、場合にどうするかを、しょりほうほうを、プログラムで、決めないと、駄目なのかな?、教えて下さい。
>
> → input文で数値変数に入力するときに数値以外(空文字列も含む)を入力すると再入力を促すのは十進BASICの仕様なので、利用者はどうすることもできません。
> ただし、文字列変数に入力するようにすれば空文字列の入力も認められるので、[OK]クリックで[0]を入力したのと同じ扱いにすることはできます。
>
> -----------------------------------------------------------------------------
> DO   ! メインルーチン
>    DO
>       INPUT PROMPT " 1.入力 2.削除 3.更新 4.検索 5.一覧 6.保存 0.終了" :n
>    LOOP UNTIL n=INT(n) AND n>=0 AND n<=6
>    WAIT DELAY wd
>    CALL main(n)
> LOOP UNTIL n=0
> -----------------------------------------------------------------------------
> 上記の部分を、次のようにすれば[OK]クリックや[Enter]キーで[0]と同じ扱い。
> -----------------------------------------------------------------------------
> WHEN EXCEPTION IN
>    DO   ! メインルーチン
>       DO
>          INPUT PROMPT " 1.入力 2.削除 3.更新 4.検索 5.一覧 6.保存 0.終了" :n$  !文字列変数入力
>          LET n=VAL(n$)   ! 文字列変数を数値に変換。空文字列や"abc"などは例外発生。
>       LOOP UNTIL n=INT(n) AND n>=0 AND n<=6
>       WAIT DELAY wd
>       CALL main(n)
>    LOOP UNTIL n=0
> USE  ! 例外発生時の処理
>    LET n=0
>    CONTINUE
> END WHEN
> -----------------------------------------------------------------------------
>
>
> ◎ 重要なバグを発見しました。
> "プログラムを終了しますか?" というメッセージボックスで[いいえ]を選択しても終了してしまいます。
> 副プログラム SUB main(n) 内のselect区で、CASE 0 を次のように修正してください。
> --------------------------------------------------------------------------
> 【誤】
>   CASE 0  ! [終了]
>       IF CONFIRM$("プログラムを終了しますか?")="NO" THEN EXIT SUB
>       IF CONFIRM$("DATAをファイルに保存しますか?")="YES" THEN CALL save
>       CLOSE #1
>    END SELECT
> --------------------------------------------------------------------------
> 【正】
>   CASE 0  ! [終了]
>       IF CONFIRM$("プログラムを終了しますか?")="NO" THEN  ! 訂正
>          LET n=7   ! 訂正
>          EXIT SUB  ! 訂正
>       END IF       ! 訂正
>       IF CONFIRM$("DATAをファイルに保存しますか?")="YES" THEN CALL save
>       CLOSE #1
>    END SELECT
> --------------------------------------------------------------------------
 

Re: 電話帳プログラム作成プロセスと、プログラムの例

 投稿者:nagram  投稿日:2021年 8月13日(金)19時31分45秒
  RCカーさんへのお返事です。

>   まだ、シンタックスエラーがでて、

→ 前回の投稿で改善したのはメインメニューの部分だけなので、他の部分での数値変数のinput文ではエラーになります。


>   また、終了しますか  いいえ  で、終了してしまいます。

→ マウスの左ボタンやEnterキーを長く押すと次の入力ボックスに制御が移り、そこで空文字列を入力したと認識されてしまうのが原因です。
それを回避するために WAIT DELAY wd (wdは0.1秒に設定) で一時休止しているのですが、0.1秒を超えて押すと次の制御に移ります。
対策の一つは、変数wdを0.5ぐらいに設定することです。ただし素早く操作したい利用者には不評でしょう。
もう一つは、GetKeyState関数を使いマウスボタンやEnterキーが解放されるのを待つということです。
ヘルプにはありませんが、GetKeyState(1)でマウスの左ボタン、GetKeyState(2)で右ボタンの状態を得ることが出来ます。
   DO
   LOOP UNTIL GetKeyState(1)>=0 AND GetKeyState(13)>=0
上記の2行をマウスやEnterキーの操作ごとに記述しました。
マウスの左ボタンとEnterキーの指を離すまで、次の行に移りません。


DECLARE EXTERNAL SUB sort
DECLARE NUMERIC MX,IDmin,IDmax,lenID,lenname,lentel,dmx,f,n,id,li,sa,sr,i,j,j2
DECLARE STRING idrange$,u$,s$,name$,tel$,d$,c$,sa$,t$,f$,n$,id$,sa2$,li$
OPTION CHARACTER KANJI
LET MX=200      ! data数の上限(変更可)
LET IDmin=1001  ! ID番号の下限(変更可) IDmin>=1
LET IDmax=9999  ! ID番号の上限(変更可)
LET lenID=CEIL(LOG10(IDmax))+1
LET lenNAME=8   ! 氏名の最大文字数(変更可)
LET lenTEL=14   ! 電話番号の最大文字数(変更可)
DIM DT$(MX,3),DTid(MX),DTtel$(MX),sortID(MX)
LET idrange$=STR$(IDmin)&"~"&STR$(IDmax)
LET u$=REPEAT$("#",lenID)&" <"&REPEAT$("#",2*lenNAME-1)&" <"&REPEAT$("#",lenTEL)
SET ECHO "OFF"
LET dmx=0
!
WHEN EXCEPTION IN
   DO
      INPUT PROMPT "【ファイル】1.新規作成 2.読込み (終了は 0)":f$
      LET f=VAL(f$)
   LOOP UNTIL f=INT(f) AND f>=0 AND f<=2
USE
   LET f=0
   CONTINUE
END WHEN
DO
LOOP UNTIL GetKeyState(1)>=0 AND GetKeyState(13)>=0
IF f=1 THEN
   CALL main(1)
ELSEIF f=2 THEN
   FILE GETOPENNAME s$  ! 電話帳ファイルの読込み
   OPEN #1: NAME s$
   DO
      LET dmx=dmx+1
      INPUT #1, IF MISSING THEN EXIT DO: DT$(dmx,1),DT$(dmx,2),DT$(dmx,3)
      LET DTid(dmx)=VAL(DT$(dmx,1))
      CALL tel(DTtel$(dmx),DT$(dmx,3))
   LOOP
   LET dmx=dmx-1
   DO
   LOOP UNTIL GetKeyState(1)>=0 AND GetKeyState(13)>=0
ELSE
   STOP
END IF
!
WHEN EXCEPTION IN
   DO   ! メインルーチン
      DO
         INPUT PROMPT " 1.入力 2.削除 3.更新 4.検索 5.一覧 6.保存 0.終了" :n$
         LET n=VAL(n$)
      LOOP UNTIL n=INT(n) AND n>=0 AND n<=6
      DO
      LOOP UNTIL GetKeyState(1)>=0 AND GetKeyState(13)>=0
      CALL main(n)
   LOOP UNTIL n=0
USE
   LET n=0
   CONTINUE
END WHEN
!
SUB main(n)
   SELECT CASE n
   CASE 1  ! [入力]
      DO
         IF dmx>=MX THEN
            WAIT DELAY "DATA数が上限 "&STR$(MX)&" に達していて、入力が出来ません"
            DO
            LOOP UNTIL GetKeyState(1)>=0 AND GetKeyState(13)>=0
            EXIT SUB
         END IF
         WHEN EXCEPTION IN
            DO
               INPUT PROMPT " ID番号入力 "&idrange$&" (入力終了は 0)" :id$
               LET id=VAL(id$)
            LOOP UNTIL id=INT(id) AND id>=IDmin AND id<=IDmax OR id=0
         USE
            LET id=0
            CONTINUE
         END WHEN
         DO
         LOOP UNTIL GetKeyState(1)>=0 AND GetKeyState(13)>=0
         IF id=0 THEN EXIT DO
         INPUT PROMPT " 氏名を入力 (入力終了は 0)" :name$
         DO
         LOOP UNTIL GetKeyState(1)>=0 AND GetKeyState(13)>=0
         IF name$="0" OR name$="" THEN EXIT DO
         INPUT PROMPT " 電話番号を入力 (入力終了は 0)" :tel$
         DO
         LOOP UNTIL GetKeyState(1)>=0 AND GetKeyState(13)>=0
         IF tel$="0" OR tel$="" THEN EXIT DO
         LET c$="このDATAで良いですか? 訂正は [いいえ]"&CHR$(10)&"ID:"
         LET c$=c$&STR$(id)&CHR$(10)&"氏名:"&name$&CHR$(10)&"電話番号:"&tel$
         IF CONFIRM$(c$)="YES" THEN
            LET dmx=dmx+1
            LET DT$(dmx,1)=STR$(id)
            LET DT$(dmx,2)=name$
            LET DT$(dmx,3)=tel$
            LET DTid(dmx)=id
            CALL tel(DTtel$(dmx),DT$(dmx,3))
         END IF
         DO
         LOOP UNTIL GetKeyState(1)>=0 AND GetKeyState(13)>=0
      LOOP
   CASE 2  ! [削除]
      WHEN EXCEPTION IN
         DO
            INPUT PROMPT " 削除するDATAのID番号を入力 (キャンセルは 0)" :id$
            LET id=VAL(id$)
         LOOP UNTIL id=INT(id) AND id>=IDmin AND id<=IDmax OR id=0
      USE
         LET id=0
         CONTINUE
      END WHEN
      DO
      LOOP UNTIL GetKeyState(1)>=0 AND GetKeyState(13)>=0
      IF id=0 THEN EXIT SUB
      FOR i=1 TO dmx
         IF DTid(i)=id THEN
            LET d$="下記のDATAを削除しますか?"&CHR$(10)&"ID:"&DT$(i,1)
            LET d$=d$&CHR$(10)&"氏名:"&DT$(i,2)&CHR$(10)&"電話番号:"&DT$(i,3)
            IF CONFIRM$(d$)="YES" THEN
               PRINT "削除したDATA"
               PRINT USING u$: DT$(i,1),DT$(i,2),DT$(i,3)
               FOR j=i+1 TO dmx
                  LET DT$(j-1,1)=DT$(j,1)
                  LET DT$(j-1,2)=DT$(j,2)
                  LET DT$(j-1,3)=DT$(j,3)
                  LET DTid(j-1)=VAL(DT$(j,1))
                  LET DTtel$(j-1)=DTtel$(j)
               NEXT j
               LET DT$(dmx,1),DT$(dmx,2),DT$(dmx,3),DTtel$(dmx)=""
               LET DTid(dmx)=0
               LET dmx=dmx-1
            END IF
            DO
            LOOP UNTIL GetKeyState(1)>=0 AND GetKeyState(13)>=0
            EXIT SUB
         END IF
      NEXT i
      WAIT DELAY "ID番号 "&STR$(id)&" のDATAが見つかりません"
   CASE 3  ! [更新]
      WHEN EXCEPTION IN
         DO
            INPUT PROMPT " 更新するDATAのID番号を入力 (キャンセルは 0)" :id$
            LET id=VAL(id$)
         LOOP UNTIL id=INT(id) AND id>=IDmin AND id<=IDmax OR id=0
      USE
         LET id=0
         CONTINUE
      END WHEN
      DO
      LOOP UNTIL GetKeyState(1)>=0 AND GetKeyState(13)>=0
      IF id=0 THEN EXIT SUB
      FOR i=1 TO dmx
         IF DTid(i)=id THEN
            LET d$="下記のDATAを書き換えますか?"&CHR$(10)&"ID:"&DT$(i,1)
            LET d$=d$&CHR$(10)&"氏名:"&DT$(i,2)&CHR$(10)&"電話番号:"&DT$(i,3)
            IF CONFIRM$(d$)="NO" THEN EXIT SUB
            PRINT "更新前のDATA"
            PRINT USING u$: DT$(i,1),DT$(i,2),DT$(i,3)
            DO
            LOOP UNTIL GetKeyState(1)>=0 AND GetKeyState(13)>=0
            DO
               INPUT PROMPT " 氏名を入力 (入力終了は 0)" :name$
               DO
               LOOP UNTIL GetKeyState(1)>=0 AND GetKeyState(13)>=0
               IF name$="0" OR name$="" THEN EXIT SUB
               INPUT PROMPT " 電話番号を入力 (入力終了は 0)" :tel$
               DO
               LOOP UNTIL GetKeyState(1)>=0 AND GetKeyState(13)>=0
               IF tel$="0" OR tel$="" THEN EXIT SUB
               LET c$="このDATAで良いですか? 訂正は [いいえ]"&CHR$(10)&"ID:"
               LET c$=c$&STR$(id)&CHR$(10)&"氏名:"&name$&CHR$(10)&"電話番号:"&tel$
               IF CONFIRM$(c$)="YES" THEN
                  LET DT$(i,2)=name$
                  LET DT$(i,3)=tel$
                  CALL tel(DTtel$(i),DT$(i,3))
                  EXIT DO
               END IF
            LOOP
            DO
            LOOP UNTIL GetKeyState(1)>=0 AND GetKeyState(13)>=0
            EXIT SUB
         END IF
      NEXT i
      WAIT DELAY "ID番号 "&STR$(id)&" のDATAが見つかりません"
   CASE 4  ! [検索]
      WHEN EXCEPTION IN
         DO
            INPUT PROMPT " 検索項目  1.氏名  2.電話番号  (キャンセルは 0)": sa2$
            LET sa=VAL(sa2$)
         LOOP UNTIL sa=INT(sa) AND sa>=0 AND sa<=2
      USE
         LET sa=0
         CONTINUE
      END WHEN
      DO
      LOOP UNTIL GetKeyState(1)>=0 AND GetKeyState(13)>=0
      IF sa=0 THEN EXIT SUB
      INPUT PROMPT " 検索文字列 (一部分でも可, キャンセルは 0)": sa$
      DO
      LOOP UNTIL GetKeyState(1)>=0 AND GetKeyState(13)>=0
      IF sa$="0" OR sa$="" THEN EXIT SUB
      IF sa=1 THEN LET t$="氏名" ELSE LET t$="電話番号"
      PRINT "検索結果 [";t$;",""";sa$;"""]"
      LET sr=0
      IF sa=1 THEN
         FOR i=1 TO dmx
            IF POS(DT$(i,2),sa$)>0 THEN
               PRINT USING u$: DT$(i,1),DT$(i,2),DT$(i,3)
               LET sr=sr+1
            END IF
         NEXT i
      ELSE  ! sa=2
         FOR j=LEN(sa$) TO 1 STEP -1
            IF sa$(j:j)<"0" OR sa$(j:j)>"9" THEN LET sa$(j:j)=""
         NEXT j
         FOR i=1 TO dmx
            IF POS(DTtel$(i),sa$)>0 THEN
               PRINT USING u$: DT$(i,1),DT$(i,2),DT$(i,3)
               LET sr=sr+1
            END IF
         NEXT i
      END IF
      IF sr=0 THEN PRINT "該当するDATAはありませんでした"
   CASE 5  ! [一覧]
      WHEN EXCEPTION IN
         DO
            INPUT PROMPT " 1.DATA順  2.ID番号順  (キャンセルは 0)" : li$
            LET li=VAL(li$)
         LOOP UNTIL li=INT(li) AND li>=0 AND li<=2
      USE
         LET li=0
         CONTINUE
      END WHEN
      DO
      LOOP UNTIL GetKeyState(1)>=0 AND GetKeyState(13)>=0
      IF li=1 THEN
         PRINT "DATA一覧"
         FOR i=1 TO dmx
            PRINT USING u$: DT$(i,1),DT$(i,2),DT$(i,3)
         NEXT i
      ELSEIF li=2 THEN
         MAT sortID=ZER
         CALL sort(DTid,sortID,dmx)
         PRINT "DATA一覧 (ID番号順)"
         FOR i=1 TO dmx
            PRINT USING u$: DT$(sortID(i),1),DT$(sortID(i),2),DT$(sortID(i),3)
         NEXT i
      END IF
   CASE 6  ! [保存]
      CALL save
   CASE 0  ! [終了]
      IF CONFIRM$("プログラムを終了しますか?")="NO" THEN
         LET n=7
         DO
         LOOP UNTIL GetKeyState(1)>=0 AND GetKeyState(13)>=0
         EXIT SUB
      END IF
      DO
      LOOP UNTIL GetKeyState(1)>=0 AND GetKeyState(13)>=0
      IF CONFIRM$("DATAをファイルに保存しますか?")="YES" THEN CALL save
      CLOSE #1
   END SELECT
   DO
   LOOP UNTIL GetKeyState(1)>=0 AND GetKeyState(13)>=0
END SUB
!
SUB save
   IF f=1 THEN
      FILE GETSAVENAME s$
      OPEN #1: NAME s$
      LET f=f+10
   END IF
   ERASE #1
   FOR i=1 TO dmx
      IF DTid(i)<>0 THEN PRINT#1: DT$(i,1)&","&DT$(i,2)&","&DT$(i,3)
   NEXT i
END SUB
!
SUB tel(t$,d$)
   LET t$=""
   FOR j2=1 TO LEN(d$)
      IF d$(j2:j2)>="0" AND d$(j2:j2)<="9" THEN LET t$=t$&d$(j2:j2)
   NEXT j2
END SUB
!
END
! 十進BASICライブラリ"\Decimal BASIC\BASICw32\Library\SORT2.LIB"
! ixにはmと下限,上限を一致させた空の配列を指定する。
! mは参照されるのみ。
! ixにmの添字を大きさの順に並べて返す。
! つまり,m(ix(1))≦m(ix(2))≦m(ix(3))≦・・・となる。
EXTERNAL SUB sort(m(),ix(),n)  ! ソート
DECLARE EXTERNAL SUB q_sort
DECLARE NUMERIC i
FOR i=1 TO n
   LET ix(i)=i
NEXT i
CALL q_sort(m,ix,1,n)
END SUB
!
EXTERNAL SUB q_sort(m(),a(),l,r)
DECLARE NUMERIC i,j,pv,t
IF r<=l THEN
   EXIT SUB
ELSE
   LET i=l-1
   LET j=r
   LET pv=m(a(r))
   DO
      DO
         LET i=i+1
      LOOP UNTIL pv<=m(a(i))
      DO
         LET j=j-1
      LOOP UNTIL j<=i OR m(a(j))<=pv
      IF j<=i THEN EXIT DO
      LET t=a(i)
      LET a(i)=a(j)
      LET a(j)=t
   LOOP
   LET t=a(i)
   LET a(i)=a(r)
   LET a(r)=t
   CALL q_sort(m,a,l,i-1)
   CALL q_sort(m,a,i+1,r)
END IF
END SUB
 

Re: 電話帳プログラム作成プロセスと、プログラムの例

 投稿者:RCカー  投稿日:2021年 8月13日(金)19時39分34秒
  > No.4948[元記事へ]

nagramさんへのお返事です。

早速の御返信ありがとうございます。
 

Re: 電話帳プログラム作成プロセスと、プログラムの例

 投稿者:nagram  投稿日:2021年 8月15日(日)18時29分40秒
  > No.4949[元記事へ]

RCカーさんへのお返事です。

不具合を発見したので修正をお願いします。
ID番号の重複チェックをしていませんでした。同じID番号での登録ができてしまいます。
副プログラム SUB main(n) の select区 CASE 1 の WHEN EXCEPTION IN ~ END WHEN の部分を下記のように修正してください。

---------------------------------------------------------------------------------
【誤】
WHEN EXCEPTION IN
   DO
      INPUT PROMPT " ID番号入力 "&idrange$&" (入力終了は 0)" :id$
      LET id=VAL(id$)
   LOOP UNTIL id=INT(id) AND id>=IDmin AND id<=IDmax OR id=0
USE
   LET id=0
   CONTINUE
END WHEN
---------------------------------------------------------------------------------
【正】
WHEN EXCEPTION IN
   DO
      LET check=0
      DO
         INPUT PROMPT " ID番号入力 "&idrange$&" (入力終了は 0)" :id$
         LET id=VAL(id$)
         DO
         LOOP UNTIL GetKeyState(1)>=0 AND GetKeyState(13)>=0
      LOOP UNTIL id=INT(id) AND id>=IDmin AND id<=IDmax OR id=0
      FOR i=1 TO dmx
         IF DTid(i)=id THEN
            LET c$="ID番号 "&id$&" は既に使われています。"&CHR$(10)
            LET c$=c$&"他の番号にするか、[削除]または[更新]を利用してください。"
            WAIT DELAY c$
            DO
            LOOP UNTIL GetKeyState(1)>=0 AND GetKeyState(13)>=0
            LET check=1
            EXIT FOR
         END IF
      NEXT i
   LOOP UNTIL check=0
USE
   LET id=0
   CONTINUE
END WHEN
---------------------------------------------------------------------------------
 

nagramさんへ

 投稿者:RCカー  投稿日:2021年 8月15日(日)20時26分50秒
  ありがとうございます。

訂正させていただきました。

確認お願いします。



DECLARE EXTERNAL SUB sort
DECLARE NUMERIC MX,IDmin,IDmax,lenID,lenname,lentel,dmx,f,n,id,li,sa,sr,i,j,j2
DECLARE STRING idrange$,u$,s$,name$,tel$,d$,c$,sa$,t$,f$,n$,id$,sa2$,li$
OPTION CHARACTER KANJI
LET MX=200      ! data数の上限(変更可)
LET IDmin=1001  ! ID番号の下限(変更可) IDmin>=1
LET IDmax=9999  ! ID番号の上限(変更可)
LET lenID=CEIL(LOG10(IDmax))+1
LET lenNAME=8   ! 氏名の最大文字数(変更可)
LET lenTEL=14   ! 電話番号の最大文字数(変更可)
DIM DT$(MX,3),DTid(MX),DTtel$(MX),sortID(MX)
LET idrange$=STR$(IDmin)&"~"&STR$(IDmax)
LET u$=REPEAT$("#",lenID)&" <"&REPEAT$("#",2*lenNAME-1)&" <"&REPEAT$("#",lenTEL)
SET ECHO "OFF"
LET dmx=0
!
WHEN EXCEPTION IN
   DO
      INPUT PROMPT "【ファイル】1.新規作成 2.読込み (終了は 0)":f$
      LET f=VAL(f$)
   LOOP UNTIL f=INT(f) AND f>=0 AND f<=2
USE
   LET f=0
   CONTINUE
END WHEN
DO
LOOP UNTIL GetKeyState(1)>=0 AND GetKeyState(13)>=0
IF f=1 THEN
   CALL main(1)
ELSEIF f=2 THEN
   FILE GETOPENNAME s$  ! 電話帳ファイルの読込み
   OPEN #1: NAME s$
   DO
      LET dmx=dmx+1
      INPUT #1, IF MISSING THEN EXIT DO: DT$(dmx,1),DT$(dmx,2),DT$(dmx,3)
      LET DTid(dmx)=VAL(DT$(dmx,1))
      CALL tel(DTtel$(dmx),DT$(dmx,3))
   LOOP
   LET dmx=dmx-1
   DO
   LOOP UNTIL GetKeyState(1)>=0 AND GetKeyState(13)>=0
ELSE
   STOP
END IF
!
WHEN EXCEPTION IN
   DO   ! メインルーチン
      DO
         INPUT PROMPT " 1.入力 2.削除 3.更新 4.検索 5.一覧 6.保存 0.終了" :n$
         LET n=VAL(n$)
      LOOP UNTIL n=INT(n) AND n>=0 AND n<=6
      DO
      LOOP UNTIL GetKeyState(1)>=0 AND GetKeyState(13)>=0
      CALL main(n)
   LOOP UNTIL n=0
USE
   LET n=0
   CONTINUE
END WHEN
!
SUB main(n)
   SELECT CASE n
   CASE 1  ! [入力]
      DO
         IF dmx>=MX THEN
            WAIT DELAY "DATA数が上限 "&STR$(MX)&" に達していて、入力が出来ません"
            DO
            LOOP UNTIL GetKeyState(1)>=0 AND GetKeyState(13)>=0
            EXIT SUB
         END IF
        WHEN EXCEPTION IN
   DO
      LET check=0
      DO
         INPUT PROMPT " ID番号入力 "&idrange$&" (入力終了は 0)" :id$
         LET id=VAL(id$)
         DO
         LOOP UNTIL GetKeyState(1)>=0 AND GetKeyState(13)>=0
      LOOP UNTIL id=INT(id) AND id>=IDmin AND id<=IDmax OR id=0
      FOR i=1 TO dmx
         IF DTid(i)=id THEN
            LET c$="ID番号 "&id$&" は既に使われています。"&CHR$(10)
            LET c$=c$&"他の番号にするか、[削除]または[更新]を利用してください。"
            WAIT DELAY c$
            DO
            LOOP UNTIL GetKeyState(1)>=0 AND GetKeyState(13)>=0
            LET check=1
            EXIT FOR
         END IF
      NEXT i
   LOOP UNTIL check=0
USE
   LET id=0
   CONTINUE
END WHEN
         DO
         LOOP UNTIL GetKeyState(1)>=0 AND GetKeyState(13)>=0
         IF id=0 THEN EXIT DO
         INPUT PROMPT " 氏名を入力 (入力終了は 0)" :name$
         DO
         LOOP UNTIL GetKeyState(1)>=0 AND GetKeyState(13)>=0
         IF name$="0" OR name$="" THEN EXIT DO
         INPUT PROMPT " 電話番号を入力 (入力終了は 0)" :tel$
         DO
         LOOP UNTIL GetKeyState(1)>=0 AND GetKeyState(13)>=0
         IF tel$="0" OR tel$="" THEN EXIT DO
         LET c$="このDATAで良いですか? 訂正は [いいえ]"&CHR$(10)&"ID:"
         LET c$=c$&STR$(id)&CHR$(10)&"氏名:"&name$&CHR$(10)&"電話番号:"&tel$
         IF CONFIRM$(c$)="YES" THEN
            LET dmx=dmx+1
            LET DT$(dmx,1)=STR$(id)
            LET DT$(dmx,2)=name$
            LET DT$(dmx,3)=tel$
            LET DTid(dmx)=id
            CALL tel(DTtel$(dmx),DT$(dmx,3))
         END IF
         DO
         LOOP UNTIL GetKeyState(1)>=0 AND GetKeyState(13)>=0
      LOOP
   CASE 2  ! [削除]
      WHEN EXCEPTION IN
         DO
            INPUT PROMPT " 削除するDATAのID番号を入力 (キャンセルは 0)" :id$
            LET id=VAL(id$)
         LOOP UNTIL id=INT(id) AND id>=IDmin AND id<=IDmax OR id=0
      USE
         LET id=0
         CONTINUE
      END WHEN
      DO
      LOOP UNTIL GetKeyState(1)>=0 AND GetKeyState(13)>=0
      IF id=0 THEN EXIT SUB
      FOR i=1 TO dmx
         IF DTid(i)=id THEN
            LET d$="下記のDATAを削除しますか?"&CHR$(10)&"ID:"&DT$(i,1)
            LET d$=d$&CHR$(10)&"氏名:"&DT$(i,2)&CHR$(10)&"電話番号:"&DT$(i,3)
            IF CONFIRM$(d$)="YES" THEN
               PRINT "削除したDATA"
               PRINT USING u$: DT$(i,1),DT$(i,2),DT$(i,3)
               FOR j=i+1 TO dmx
                  LET DT$(j-1,1)=DT$(j,1)
                  LET DT$(j-1,2)=DT$(j,2)
                  LET DT$(j-1,3)=DT$(j,3)
                  LET DTid(j-1)=VAL(DT$(j,1))
                  LET DTtel$(j-1)=DTtel$(j)
               NEXT j
               LET DT$(dmx,1),DT$(dmx,2),DT$(dmx,3),DTtel$(dmx)=""
               LET DTid(dmx)=0
               LET dmx=dmx-1
            END IF
            DO
            LOOP UNTIL GetKeyState(1)>=0 AND GetKeyState(13)>=0
            EXIT SUB
         END IF
      NEXT i
      WAIT DELAY "ID番号 "&STR$(id)&" のDATAが見つかりません"
   CASE 3  ! [更新]
      WHEN EXCEPTION IN
         DO
            INPUT PROMPT " 更新するDATAのID番号を入力 (キャンセルは 0)" :id$
            LET id=VAL(id$)
         LOOP UNTIL id=INT(id) AND id>=IDmin AND id<=IDmax OR id=0
      USE
         LET id=0
         CONTINUE
      END WHEN
      DO
      LOOP UNTIL GetKeyState(1)>=0 AND GetKeyState(13)>=0
      IF id=0 THEN EXIT SUB
      FOR i=1 TO dmx
         IF DTid(i)=id THEN
            LET d$="下記のDATAを書き換えますか?"&CHR$(10)&"ID:"&DT$(i,1)
            LET d$=d$&CHR$(10)&"氏名:"&DT$(i,2)&CHR$(10)&"電話番号:"&DT$(i,3)
            IF CONFIRM$(d$)="NO" THEN EXIT SUB
            PRINT "更新前のDATA"
            PRINT USING u$: DT$(i,1),DT$(i,2),DT$(i,3)
            DO
            LOOP UNTIL GetKeyState(1)>=0 AND GetKeyState(13)>=0
            DO
               INPUT PROMPT " 氏名を入力 (入力終了は 0)" :name$
               DO
               LOOP UNTIL GetKeyState(1)>=0 AND GetKeyState(13)>=0
               IF name$="0" OR name$="" THEN EXIT SUB
               INPUT PROMPT " 電話番号を入力 (入力終了は 0)" :tel$
               DO
               LOOP UNTIL GetKeyState(1)>=0 AND GetKeyState(13)>=0
               IF tel$="0" OR tel$="" THEN EXIT SUB
               LET c$="このDATAで良いですか? 訂正は [いいえ]"&CHR$(10)&"ID:"
               LET c$=c$&STR$(id)&CHR$(10)&"氏名:"&name$&CHR$(10)&"電話番号:"&tel$
               IF CONFIRM$(c$)="YES" THEN
                  LET DT$(i,2)=name$
                  LET DT$(i,3)=tel$
                  CALL tel(DTtel$(i),DT$(i,3))
                  EXIT DO
               END IF
            LOOP
            DO
            LOOP UNTIL GetKeyState(1)>=0 AND GetKeyState(13)>=0
            EXIT SUB
         END IF
      NEXT i
      WAIT DELAY "ID番号 "&STR$(id)&" のDATAが見つかりません"
   CASE 4  ! [検索]
      WHEN EXCEPTION IN
         DO
            INPUT PROMPT " 検索項目  1.氏名  2.電話番号  (キャンセルは 0)": sa2$
            LET sa=VAL(sa2$)
         LOOP UNTIL sa=INT(sa) AND sa>=0 AND sa<=2
      USE
         LET sa=0
         CONTINUE
      END WHEN
      DO
      LOOP UNTIL GetKeyState(1)>=0 AND GetKeyState(13)>=0
      IF sa=0 THEN EXIT SUB
      INPUT PROMPT " 検索文字列 (一部分でも可, キャンセルは 0)": sa$
      DO
      LOOP UNTIL GetKeyState(1)>=0 AND GetKeyState(13)>=0
      IF sa$="0" OR sa$="" THEN EXIT SUB
      IF sa=1 THEN LET t$="氏名" ELSE LET t$="電話番号"
      PRINT "検索結果 [";t$;",""";sa$;"""]"
      LET sr=0
      IF sa=1 THEN
         FOR i=1 TO dmx
            IF POS(DT$(i,2),sa$)>0 THEN
               PRINT USING u$: DT$(i,1),DT$(i,2),DT$(i,3)
               LET sr=sr+1
            END IF
         NEXT i
      ELSE  ! sa=2
         FOR j=LEN(sa$) TO 1 STEP -1
            IF sa$(j:j)<"0" OR sa$(j:j)>"9" THEN LET sa$(j:j)=""
         NEXT j
         FOR i=1 TO dmx
            IF POS(DTtel$(i),sa$)>0 THEN
               PRINT USING u$: DT$(i,1),DT$(i,2),DT$(i,3)
               LET sr=sr+1
            END IF
         NEXT i
      END IF
      IF sr=0 THEN PRINT "該当するDATAはありませんでした"
   CASE 5  ! [一覧]
      WHEN EXCEPTION IN
         DO
            INPUT PROMPT " 1.DATA順  2.ID番号順  (キャンセルは 0)" : li$
            LET li=VAL(li$)
         LOOP UNTIL li=INT(li) AND li>=0 AND li<=2
      USE
         LET li=0
         CONTINUE
      END WHEN
      DO
      LOOP UNTIL GetKeyState(1)>=0 AND GetKeyState(13)>=0
      IF li=1 THEN
         PRINT "DATA一覧"
         FOR i=1 TO dmx
            PRINT USING u$: DT$(i,1),DT$(i,2),DT$(i,3)
         NEXT i
      ELSEIF li=2 THEN
         MAT sortID=ZER
         CALL sort(DTid,sortID,dmx)
         PRINT "DATA一覧 (ID番号順)"
         FOR i=1 TO dmx
            PRINT USING u$: DT$(sortID(i),1),DT$(sortID(i),2),DT$(sortID(i),3)
         NEXT i
      END IF
   CASE 6  ! [保存]
      CALL save
   CASE 0  ! [終了]
      IF CONFIRM$("プログラムを終了しますか?")="NO" THEN
         LET n=7
         DO
         LOOP UNTIL GetKeyState(1)>=0 AND GetKeyState(13)>=0
         EXIT SUB
      END IF
      DO
      LOOP UNTIL GetKeyState(1)>=0 AND GetKeyState(13)>=0
      IF CONFIRM$("DATAをファイルに保存しますか?")="YES" THEN CALL save
      CLOSE #1
   END SELECT
   DO
   LOOP UNTIL GetKeyState(1)>=0 AND GetKeyState(13)>=0
END SUB
!
SUB save
   IF f=1 THEN
      FILE GETSAVENAME s$
      OPEN #1: NAME s$
      LET f=f+10
   END IF
   ERASE #1
   FOR i=1 TO dmx
      IF DTid(i)<>0 THEN PRINT#1: DT$(i,1)&","&DT$(i,2)&","&DT$(i,3)
   NEXT i
END SUB
!
SUB tel(t$,d$)
   LET t$=""
   FOR j2=1 TO LEN(d$)
      IF d$(j2:j2)>="0" AND d$(j2:j2)<="9" THEN LET t$=t$&d$(j2:j2)
   NEXT j2
END SUB
!
END
! 十進BASICライブラリ"\Decimal BASIC\BASICw32\Library\SORT2.LIB"
! ixにはmと下限,上限を一致させた空の配列を指定する。
! mは参照されるのみ。
! ixにmの添字を大きさの順に並べて返す。
! つまり,m(ix(1))≦m(ix(2))≦m(ix(3))≦・・・となる。
EXTERNAL SUB sort(m(),ix(),n)  ! ソート
DECLARE EXTERNAL SUB q_sort
DECLARE NUMERIC i
FOR i=1 TO n
   LET ix(i)=i
NEXT i
CALL q_sort(m,ix,1,n)
END SUB
!
EXTERNAL SUB q_sort(m(),a(),l,r)
DECLARE NUMERIC i,j,pv,t
IF r<=l THEN
   EXIT SUB
ELSE
   LET i=l-1
   LET j=r
   LET pv=m(a(r))
   DO
      DO
         LET i=i+1
      LOOP UNTIL pv<=m(a(i))
      DO
         LET j=j-1
      LOOP UNTIL j<=i OR m(a(j))<=pv
      IF j<=i THEN EXIT DO
      LET t=a(i)
      LET a(i)=a(j)
      LET a(j)=t
   LOOP
   LET t=a(i)
   LET a(i)=a(r)
   LET a(r)=t
   CALL q_sort(m,a,l,i-1)
   CALL q_sort(m,a,i+1,r)
END IF
END SUB
END
 

Re: nagramさんへ

 投稿者:nagram  投稿日:2021年 8月16日(月)17時33分22秒
  > No.4951[元記事へ]

RCカーさんへのお返事です。

> ありがとうございます。
>
> 訂正させていただきました。
>
> 確認お願いします。

はい、これで大丈夫だと思います。
 

Re: nagramさんへ

 投稿者:RCカー  投稿日:2021年 8月16日(月)17時35分13秒
  nagramさんへのお返事です。

> RCカーさんへのお返事です。
>
> > ありがとうございます。
> >
> > 訂正させていただきました。
> >
> > 確認お願いします。
>
> はい、これで大丈夫だと思います。

nagramさんへ、ありがとう。
嬉しいです。
 

Lazarus fpc-3.2.2-win64 計算時間が短縮

 投稿者:たろさ  投稿日:2021年 9月13日(月)20時59分32秒
  動作報告です。

動作環境
Intel Core i7 -8565U    mouse m-Book MB-R500 ノート PC
Intel COre i7 -10700K   自作パソコン
Intel Core i9 -11900KF 自作パソコン

Windows Version
Microsoft Windows 10 (10.0) Professional 64-bit

Paract BASIC Ver. 2.1.2.4 Rev.2   (2021.06.19)

Lazarus fpc-3.2.2-win64
lazarus-2.2.0RC1-fpc-3.2.2-win64.exe               2021-07-08 199.7 MB
lazarus-2.2.0RC1-fpc-3.2.2-cross-i386-win32-win64.exe 2021-07-08  55.1 MB


Paract BASIC プログラム  6n+k篩  素数の個数を数えるプログラム

!最新6n+k篩  8スレッド     2021/08/12
!
!#4360
!
!Paract BASIC 6n+k篩 Ver.12  MAX500兆  5/9  (1E8) step
!
DECLARE STRUCTURE struct1: 1 OF NUMERIC
DECLARE STRUCTURE struct2: 1 OF NUMERIC(1536277)
DECLARE STRUCTURE struct4: 3 OF NUMERIC
DECLARE SHARED sha OF struct2
DECLARE MESSAGE mes2 OF struct4
DECLARE MESSAGE mes3 OF struct4
DECLARE MESSAGE mes4 OF struct4
DECLARE MESSAGE mes5 OF struct4
DECLARE MESSAGE mes6 OF struct4
DECLARE MESSAGE mes7 OF struct4
DECLARE MESSAGE mes8 OF struct4
DECLARE MESSAGE met2 OF struct1
DECLARE MESSAGE met3 OF struct1
DECLARE MESSAGE met4 OF struct1
DECLARE MESSAGE met5 OF struct1
DECLARE MESSAGE met6 OF struct1
DECLARE MESSAGE met7 OF struct1
DECLARE MESSAGE met8 OF struct1

PARACT PART1
OPTION ARITHMETIC NATIVE
LET t1=TIME
PRINT DATE$;"  ";TIME$
LET k=24494963
LET k3=1536277
DECLARE EXTERNAL SUB prime
CALL prime(k)
WAIT EVENT Ok5
LET S=464E12  !2140E11  !pi(1E12),37607912018
LET E=466E12  !2160E11  !pi(1E11),4118054813    (1E10)455052511
LET ST=1E8

START PART2
START PART3
START PART4
START PART5
START PART6
START PART7
START PART8
SEND TO mes2 FROM S,E,ST
SEND TO mes3 FROM S,E,ST
SEND TO mes4 FROM S,E,ST
SEND TO mes5 FROM S,E,ST
SEND TO mes6 FROM S,E,ST
SEND TO mes7 FROM S,E,ST
SEND TO mes8 FROM S,E,ST

LET TOTAL=14173019702434 !5761455
DECLARE EXTERNAL FUNCTION cprime
!DECLARE NUMERIC X,Y,Z

FOR I=S TO E-ST STEP ST
   LET t0=TIME
   LET L=cprime(I,I+ST/8)
   RECEIVE FROM met2 TO X
   RECEIVE FROM met3 TO Y
   RECEIVE FROM met4 TO Z
   RECEIVE FROM met5 TO X1
   RECEIVE FROM met6 TO Y1
   RECEIVE FROM met7 TO Z1
   RECEIVE FROM met8 TO X2

   LET L=L+X+Y+Z+X1+Y1+Z1+X2
   LET TOTAL=TOTAL+L

   PRINT (I+ST)/1E8;TOTAL;L;
   LET TM=TIME-t0
   PRINT USING"###.###":TM;
   PRINT "秒"

NEXT I
LET TM=TIME-t1
PRINT USING"#####.##":TM;
PRINT "秒"
PRINT DATE$;"  ";TIME$
END PARACT

PARACT PART2
OPTION ARITHMETIC NATIVE
RECEIVE FROM mes2 TO S,E,ST
DECLARE EXTERNAL FUNCTION cprime
DECLARE NUMERIC L
FOR I=S TO E-ST STEP ST
   LET L=cprime(I+ST/8,I+ST/4)
   SEND TO met2 FROM L
NEXT I
END PARACT

PARACT PART3
OPTION ARITHMETIC NATIVE
RECEIVE FROM mes3 TO S,E,ST
DECLARE EXTERNAL FUNCTION cprime
DECLARE NUMERIC L
FOR I=S TO E-ST STEP ST
   LET L=cprime(I+ST/4,I+3*ST/8)
   SEND TO met3 FROM L
NEXT I
END PARACT

PARACT PART4
OPTION ARITHMETIC NATIVE
RECEIVE FROM mes4 TO S,E,ST
DECLARE EXTERNAL FUNCTION cprime
DECLARE NUMERIC L
FOR I=S TO E-ST STEP ST
   LET L=cprime(I+3*ST/8,I+ST/2)
   SEND TO met4 FROM L
NEXT I
END PARACT

PARACT PART5
OPTION ARITHMETIC NATIVE
RECEIVE FROM mes5 TO S,E,ST
DECLARE EXTERNAL FUNCTION cprime
DECLARE NUMERIC L
FOR I=S TO E-ST STEP ST
   LET L=cprime(I+ST/2,I+5*ST/8)
   SEND TO met5 FROM L
NEXT I
END PARACT

PARACT PART6
OPTION ARITHMETIC NATIVE
RECEIVE FROM mes6 TO S,E,ST
DECLARE EXTERNAL FUNCTION cprime
DECLARE NUMERIC L
FOR I=S TO E-ST STEP ST
   LET L=cprime(I+5*ST/8,I+3*ST/4)
   SEND TO met6 FROM L
NEXT I
END PARACT

PARACT PART7
OPTION ARITHMETIC NATIVE
RECEIVE FROM mes7 TO S,E,ST
DECLARE EXTERNAL FUNCTION cprime
DECLARE NUMERIC L
FOR I=S TO E-ST STEP ST
   LET L=cprime(I+3*ST/4,I+7*ST/8)
   SEND TO met7 FROM L
NEXT I
END PARACT

PARACT PART8
OPTION ARITHMETIC NATIVE
RECEIVE FROM mes8 TO S,E,ST
DECLARE EXTERNAL FUNCTION cprime
DECLARE NUMERIC L
FOR I=S TO E-ST STEP ST
   LET L=cprime(I+7*ST/8,I+ST)
   SEND TO met8 FROM L
NEXT I
END PARACT

EXTERNAL FUNCTION cprime(k4,k6)
OPTION ARITHMETIC NATIVE
DECLARE NUMERIC G(1536277) !素数
GET FROM sha TO G
DIM B(2)   !素数の最小値7から
DATA 1,5
MAT READ B
LET Q=6
LET U=IP(k6/Q)
LET U1=IP(SQR(k6))
LET W=IP(k4/Q)
LET kD=IP(k6/29)
LET M7=W

DIM D(0 TO U-M7)
LET COUNT=0
FOR r=1 TO 2
   LET rr=B(r)
   MAT D = ZER

   FOR t=3 TO U1
      LET x=G(t)
      IF x^2>k6 THEN EXIT FOR
      LET G1=INT(W/x)

      IF MOD(x+rr,Q)=0 THEN
         LET y=-(x+rr)/Q
         GOTO 70
      END IF

      IF MOD(x-rr,Q)=0 THEN
         LET y=(x-rr)/Q
         GOTO 70
      END IF

70       FOR f=G1 TO kD
            IF x*f+y<W THEN GOTO 80
            IF x*f+y>U THEN GOTO 90
            LET D(x*f+y-M7)=1
80       NEXT f
90    NEXT t

      FOR n=0 TO U-M7
         LET ST=n+M7
         IF D(n)=0 THEN
            IF Q*ST+rr>k4 AND Q*ST+rr<k6 THEN LET COUNT=COUNT+1
         END IF
      NEXT n
   NEXT r
   LET cprime=COUNT
END FUNCTION


  EXTERNAL SUB prime(k)
   OPTION ARITHMETIC NATIVE
   DECLARE NUMERIC G(1536277) !素数
   !エラトステネスの篩
   LET Fu=5633
   LET Fm=739
   DIM P(Fu)
   DIM A(Fm)
   MAT P=ZER
   MAT A=ZER
   LET A(1)=2
   LET H1=1
   FOR I=3 TO SQR(Fu) STEP 2
      IF P(I)=0 THEN
         FOR J=I*I TO Fu STEP I
            LET P(J)=1
         NEXT J
      END IF
   NEXT I
   FOR I=3 TO Fu STEP 2
      IF P(I)=0 THEN
         LET H1=H1+1
         LET A(H1)=I
      END IF
   NEXT I

   LET Q=6
   LET k7=k          !篩の計算範囲
   LET k5=IP(k7/Q)+1
   DIM Au(k5),Av(k5)

   MAT Au = ZER     !(6*n-1)
   MAT Av = ZER     !(6*n+1)

   FOR n=3 TO Fm
      LET Pu=A(n)
      IF Pu^2>=k THEN EXIT FOR
      IF MOD(Pu+1,Q)=0 THEN !(6*n-1)
         LET ru=(Pu+1)/Q
         FOR i=1 TO k5
            IF Pu*i+ru>k5 THEN EXIT FOR
            LET Au(Pu*i+ru)=1
         NEXT i
      END IF

      IF MOD(Pu-1,Q)=0 THEN
         LET ru=(Pu-1)/Q
         FOR i=1 TO k5
            IF Pu*i-ru>k5 THEN EXIT FOR
            LET Au(Pu*i-ru)=1
         NEXT i
      END IF

      IF MOD(Pu+1,Q)=0 THEN !(6*n+1)
         LET ru=(Pu+1)/Q
         FOR i=1 TO k5
            IF Pu*i-ru>k5 THEN EXIT FOR
            LET Av(Pu*i-ru)=1
         NEXT i
      END IF

      IF MOD(Pu-1,Q)=0 THEN
         LET ru=(Pu-1)/Q
         FOR i=1 TO k5
            IF Pu*i+ru>k5 THEN EXIT FOR
            LET Av(Pu*i+ru)=1
         NEXT i
      END IF
   NEXT n

   LET G(1)=2
   LET G(2)=3
   LET cz=2
   FOR n=1 TO k5
      IF 6*n-1>k7 THEN GOTO 100
      IF Au(n)=0 THEN
         LET cz=cz+1
         LET G(cz)=6*n-1
      END IF
100    IF 6*n+1>k7 THEN EXIT FOR
       IF Av(n)=0  THEN
          LET cz=cz+1
          LET G(cz)=6*n+1
       END IF
    NEXT n
    PUT TO sha FROM G
    SIGNAL Ok5
END SUB


計算結果
4660000  14232238570791  2962547    平均計算時間0.342475秒
4680000  14291449873702  2960711

6849.50秒  1時間54分09.5秒 1兆間の計算時間 57分04.75秒
20210913  16:59:47
20210913  18:53:57


Lazarus fpc-3.2.2-win64 計算時間が短縮

難点

表示される数値が?
#4926

対策 win32-win64を切り替えて使用している。

問題点

自作パソコンのCPUのスレッドが16あるので

16スレッド お願いいたします。

知識不足のため 16スレッド失敗してます。
 

Re: Lazarus fpc-3.2.2-win64 計算時間が短縮

 投稿者:SHIRAISHI Kazuo  投稿日:2021年 9月15日(水)08時25分5秒
  > No.4955[元記事へ]

並行単位(paract~end paract)の個数は,CPUのスレッド数-2 程度を目安にしてみてください。

>
> 問題点
>
> 自作パソコンのCPUのスレッドが16あるので
>
> 16スレッド お願いいたします。
>
> 知識不足のため 16スレッド失敗してます。

http://hp.vector.co.jp/authors/VA008683/

 

Re: Lazarus fpc-3.2.2-win64 計算時間が短縮

 投稿者:たろさ  投稿日:2021年 9月15日(水)18時36分16秒
  > No.4956[元記事へ]

SHIRAISHI Kazuoさんへのお返事です。

> 並行単位(paract~end paract)の個数は,CPUのスレッド数-2 程度を目安にしてみてください。
>
> >
> > 問題点
> >
> > 自作パソコンのCPUのスレッドが16あるので
> >
> > 16スレッド お願いいたします。
> >
> > 知識不足のため 16スレッド失敗してます。


了解しました。
 

mod(6n+3,3)=0, 6n-1,6n+1以外から素数は出ません。

 投稿者:たろさ  投稿日:2021年 9月15日(水)18時53分24秒
  ! 6n±1篩 Ver.2
OPTION ARITHMETIC NATIVE       !2進モード
LET t0=TIME
LET k=1E8         !1E7   9999991 素数 (664579th)
LET k1=IP(k/6)    !1E8  99999989 素数 (5761455th)
LET k2=IP(SQR(k1))!5E8 499999993 素数 (26355867th)
DIM A5(k1),A7(k1)

MAT A5=ZER
MAT A7=ZER

LET P1=5
LET C1=1

DO
   FOR n=1 TO k1
      LET P6=P1*n+C1
      IF P6 > k1 THEN EXIT FOR
      LET A5(P6)=1
   NEXT n
   FOR n=1 TO k1
      LET P6=P1*n-C1
      IF P6 > k1 THEN EXIT FOR
      LET A7(P6)=1
   NEXT n

   LET P1=P1+6
   LET C1=C1+1
   IF P1 >k1 THEN EXIT DO
LOOP


LET P1=7
LET C1=1
DO
   FOR n=1 TO k1
      LET P6=P1*n+C1
      IF P6 > k1 THEN EXIT FOR
      LET A7(P6)=1
   NEXT n

   FOR n=1 TO k1
      LET P6=P1*n-C1
      IF P6 > k1 THEN EXIT FOR
      LET A5(P6)=1
   NEXT n

   LET P1=P1+6
   LET C1=C1+1
   IF P1 >k1 THEN EXIT DO
LOOP
PRINT "2"
PRINT "3"
LET c=2
FOR n=1 TO k1
   LET P5=6*n-1
   LET P7=6*n+1
   IF A5(n)=0 THEN
      LET c=c+1
      IF k-1000<P5 THEN PRINT P5
   END IF
   IF A7(n)=0 THEN
      LET c=c+1
      IF k-1000<P7 THEN PRINT P7
   END IF
NEXT n

PRINT c
LET TM=TIME-t0
PRINT TM;"秒"

END

計算結果

2
3
99999043
99999073
99999077
99999079
99999089
99999103
99999113
99999131
99999157
99999167
99999187
99999217
途中省略
99999931
99999941
99999959
99999971
99999989
5761455
4.438000000009 秒
BASIC Accelerator Ver. 1.2.0.5 (2020.03.31)

mod(6n+3,3)=0 は正しいと思うので
6n-1,6n+1 以外から素数は出ません。
 

騎士巡歴

 投稿者:匿名希望  投稿日:2021年10月 8日(金)10時47分7秒
  質問させてください。今、騎士巡歴問題のプログラムを触っているのですが
ナイトの動きを(1,2)から(1,3)や(2,3)に変更したプログラムは可能でしょうか。
可能な場合どのようなコードにすればよろしいのでしょうか。
 

素晴らしい

 投稿者:陣内正人  投稿日:2021年10月10日(日)19時56分3秒
  BASICを使って半世紀になる測量屋です。当時の主流は企業向けのコボルかフォートランでしてビジコンやソニーなどの機械語に近い言語ですが関数計算は出来ました。1972年にhp9830aがブリントformatがあるhp-BASICを購入しました。TRSやコモドールなど全盛時代でした。余談ですがシャープMZの中古カセットを近所で日本ソフトバンク店が開店。自慢話ですみません
半世紀BASICで生きてきますと「BASIC」は素晴らしいです。十進BASICは関数精度が完璧です。そのてん今使っている汎用BASICは大変です。残念ながらすべてマルチステートで作成してまして、シングルで置き換えるには時間がかかりますが、頑張ります。
十進BASICは世界一と思います。これからもよろしくお願いします。1951生まれ
 

Re: 素晴らしい

 投稿者:RCカー  投稿日:2021年10月11日(月)00時22分12秒
  陣内正人さんへのお返事です。

> BASICを使って半世紀になる測量屋です。当時の主流は企業向けのコボルかフォートランでしてビジコンやソニーなどの機械語に近い言語ですが関数計算は出来ました。1972年にhp9830aがブリントformatがあるhp-BASICを購入しました。TRSやコモドールなど全盛時代でした。余談ですがシャープMZの中古カセットを近所で日本ソフトバンク店が開店。自慢話ですみません
> 半世紀BASICで生きてきますと「BASIC」は素晴らしいです。十進BASICは関数精度が完璧です。そのてん今使っている汎用BASICは大変です。残念ながらすべてマルチステートで作成してまして、シングルで置き換えるには時間がかかりますが、頑張ります。
> 十進BASICは世界一と思います。これからもよろしくお願いします。1951生まれ

僕は、1972年生まれです。
エクセルや、ベーシック言語で、測量計算に使うアプリケーションソフトで、内業や、外業の手助けになる物を、作りたいと思いました。
もし、よろしければで、いいのですが、一番好きなベーシックプログラムを、紹介していただけませんか??
参考にした本の中で、一番好きな本、一番難しかった本を、教えていただけませんか?
理由もあれば僕としても役に立つと思うし、嬉しい事ですので、よろしければお願いします。
 

dllファイルの実行ができません

 投稿者:しばっち  投稿日:2021年11月 3日(水)17時59分28秒
  Windows 11を使用しています。

Windows用Lazarus版Basic0705Ja(Win64)でdllを
使おうとすると「ASSIGNはここに書けません」とエラーが出ます。

これは仕様変更されたのでしょうか?
ヘルプのサンプルも実行できません。

DECLARE EXTERNAL FUNCTION MesBox
LET n=MesBox(0,"Hello","BASIC",3)
PRINT n
END

EXTERNAL FUNCTION MesBox(owner,text$,caption$,flag)
ASSIGN "user32.dll","MessageBoxA"
END FUNCTION


もしくはASSIGNはWindows用Lazarus版(Win64)では未サポートなのでしょうか



また、S-JISで保存されたBASファイルは
日本語文字が文字化けするようです

PRINT "あいうえお";123456789
END

UTF-8で保存されたBASファイルでは問題ないようです
 

素数個数関数

 投稿者:しばっち  投稿日:2021年11月 3日(水)18時00分30秒
  素数個数関数
http://ijmcs.future-in-tech.net/9.2/R-RuizSondow.pdf

PRINT π(1000)
END

EXTERNAL  FUNCTION π(N)
FOR J=2 TO INT(N)
   LET SS=0
   FOR I=1 TO J
      LET SS=SS+INT(J/I)-INT((J-1)/I)
   NEXT I
   LET S=S+(1+INT((2-SS)/J))
NEXT J
LET π=S
END FUNCTION
-------------------------------------------------------
PRINT π(1000)
END

EXTERNAL  FUNCTION π(N)
FOR I=2 TO N
   LET S=S+ISPRIME(I)
NEXT I
LET π=S
END FUNCTION

EXTERNAL  FUNCTION ISPRIME(N)
LET S=1
FOR I=2 TO N-1
   LET S=MOD(S*I,N)
NEXT I
IF MOD(S*S,N)=1 THEN
   LET ISPRIME=1
ELSE
   LET ISPRIME=0
END IF
END FUNCTION
 

篩法

 投稿者:しばっち  投稿日:2021年11月 3日(水)18時01分10秒
  篩法
ネットからの移植版です
https://37zigen.com/linear-sieve/

LET N=105000
DIM PRIME(N),LDF(N)
FOR D=2 TO N
   IF LDF(D)=0 THEN
      LET LDF(D)=D
      LET K=K+1
      LET PRIME(K)=D
      IF MOD(K,1000)=0 THEN PRINT K;"th prime ";D
   END IF
   FOR I=1 TO K
      LET P=PRIME(I)
      IF P*D>N OR P>LDF(D) THEN EXIT FOR
      LET LDF(P*D)=P
   NEXT  I
NEXT D
END
 

試し割法

 投稿者:しばっち  投稿日:2021年11月 3日(水)18時01分43秒
  試し割法
https://ja.wikipedia.org/wiki/試し割り法


LET N=105000
LET COUNT=1
FOR I=3 TO N STEP 2
   LET FL=0
   FOR J=3 TO INT(SQR(I))
      IF MOD(I,J)=0 THEN
         LET FL=1
         EXIT FOR
      END IF
   NEXT J
   IF FL=0 THEN
      LET COUNT=COUNT+1
      IF MOD(COUNT,100)=0 THEN PRINT COUNT;"th prime ";I
   END IF
NEXT I
END
-------------------------------------------------------------------------------
LET S=1
DO WHILE S<100
   LET S=NEXTPRIME(S)
   PRINT S
LOOP
END

EXTERNAL  FUNCTION NEXTPRIME(X)
IF X<2 THEN
   LET NEXTPRIME=2
   EXIT FUNCTION
END IF
IF MOD(X,2)=0 THEN LET X=X+1 ELSE LET X=X+2
DO
   LET FL=0
   FOR N=3 TO INT(SQR(X))
      IF MOD(X,N)=0 THEN
         LET FL=1
         EXIT FOR
      END IF
   NEXT  N
   IF FL=0 THEN
      LET NEXTPRIME=X
      EXIT FUNCTION
   END IF
   LET X=X+2
LOOP
END FUNCTION
 

サンダラムのふるい

 投稿者:しばっち  投稿日:2021年11月 3日(水)18時02分21秒
  サンダラムのふるい
https://en.wikipedia.org/wiki/Sieve_of_Sundaram


FOR I=1 TO 6
   LET N=10^I
   PRINT N;"th prime";NTHPRIME(N)
NEXT I
END

EXTERNAL  FUNCTION NTHPRIME(M)
LET N=M*(LOG(M)+LOG(LOG(M)))
LET K=INT((N-2)/2)
DIM A(K)
FOR I=1 TO INT(K/3)
   LET J=I
   DO WHILE I+J+2*I*J<=K
      LET S=I+J+2*I*J
      LET A(S)=1
      LET J=J+1
   LOOP
NEXT I
LET COUNT=1
FOR I=1 TO K
   IF A(I)=0 THEN
      LET COUNT=COUNT+1
      IF COUNT=M THEN
         LET NTHPRIME=I*2+1
         EXIT FUNCTION
      END IF
   END IF
NEXT  I
END FUNCTION
 

アトキンのふるい

 投稿者:しばっち  投稿日:2021年11月 3日(水)18時02分54秒
  アトキンのふるい

https://en.wikipedia.org/wiki/Sieve_of_Atkin
https://tjkendev.github.io/procon-library/python/prime/sieve.html
http://fantom1x.blog130.fc2.com/blog-entry-212.html

ネットからの移植版です。エラトステネスの篩より速いとされるアトキンの篩です。

FOR I=1 TO 10
   LET N=I*10^5
   PRINT N;"th prime";NTHPRIME(N)
NEXT I
END

EXTERNAL  FUNCTION NTHPRIME(M)
LET N=M*(LOG(M)+LOG(LOG(M)))
DIM ISPRIME(N)
FOR Z=1 TO 5 STEP 4
   FOR Y=Z TO SQR(N) STEP 6
      FOR X=1 TO SQR(N)
         LET NN=4*X*X+Y*Y
         IF NN>N THEN EXIT FOR
         LET ISPRIME(NN)=BITNOT(ISPRIME(NN))
      NEXT X
      FOR X=Y+1 TO SQR(N) STEP 2
         LET NN=3*X*X-Y*Y
         IF NN>N THEN EXIT FOR
         LET ISPRIME(NN)=BITNOT(ISPRIME(NN))
      NEXT X
   NEXT Y
NEXT Z

FOR Z=2 TO 4 STEP 2
   FOR Y=Z TO SQR(N) STEP 6
      FOR X=1 TO SQR(N) STEP 2
         LET NN=3*X*X+Y*Y
         IF NN>N THEN EXIT FOR
         LET ISPRIME(NN)=BITNOT(ISPRIME(NN))
      NEXT X
      FOR X=Y+1 TO SQR(N) STEP 2
         LET NN=3*X*X-Y*Y
         IF NN>N THEN EXIT FOR
         LET ISPRIME(NN)=BITNOT(ISPRIME(NN))
      NEXT X
   NEXT Y
NEXT Z

FOR Z=1 TO 2
   FOR Y=3 TO SQR(N) STEP 6
      FOR X=Z TO SQR(N) STEP 3
         LET NN=4*X*X+Y*Y
         IF NN>N THEN EXIT FOR
         LET ISPRIME(NN)=BITNOT(ISPRIME(NN))
      NEXT X
   NEXT  Y
NEXT  Z

FOR P=5 TO SQR(N)
   IF ISPRIME(P)=-1 THEN
      FOR K=P*P TO N STEP P*P
         LET ISPRIME(K)=0
      NEXT K
   END IF
NEXT P
LET ISPRIME(2)=-1
LET ISPRIME(3)=-1

LET COUNT=1
FOR I=3 TO N STEP 2
   IF ISPRIME(I)=-1 THEN
      LET COUNT=COUNT+1
      IF COUNT=M THEN
         LET NTHPRIME=I
         EXIT FUNCTION
      END IF
   END IF
NEXT I
END FUNCTION
-------------------------------------------------------------------------------
LET LIMIT=1000000
DIM SIEVE(LIMIT)
LET FACTOR=INT(SQR(LIMIT))+1
FOR I=1 TO FACTOR
   FOR J=1 TO FACTOR
      LET N=4*I*I+J*J
      IF N<=LIMIT AND (MOD(N,12)=1 OR MOD(N,12)=5) THEN LET SIEVE(N)=BITNOT(SIEVE(N))
      LET N=3*I*I+J*J
      IF N<=LIMIT AND MOD(N,12)=7 THEN LET SIEVE(N)=BITNOT(SIEVE(N))
      IF I>J THEN
         LET N=3*I*I-J*J
         IF N<=LIMIT AND MOD(N,12)=11 THEN LET SIEVE(N)=BITNOT(SIEVE(N))
      END IF
   NEXT J
NEXT I
FOR I=5 TO FACTOR
   IF SIEVE(I)=-1 THEN
      FOR J=I*I TO LIMIT STEP I*I
         LET SIEVE(J)=0
      NEXT J
   END IF
NEXT I
LET COUNT=3 ! [2 3 5]
FOR I=7 TO LIMIT STEP 2
   IF SIEVE(I)=-1 THEN LET COUNT=COUNT+1
NEXT I
PRINT COUNT
END
-------------------------------------------------------------------------------
LET M=1000000
DIM P(M)
LET SM=INT(SQR(M))
FOR X=1 TO INT(SM/2)
   LET V=4*X*X+1
   LET Y=8
   DO WHILE V<=M
      IF MOD(V,12)<>9 THEN LET P(V)=BITXOR(P(V),1)
      LET V=V+Y
      LET Y=Y+8
   LOOP
NEXT X

FOR X=1 TO INT(SM/3^.5) STEP 2
   LET V=3*X*X+4
   LET Y=12
   DO WHILE V<=M
      IF MOD(V,12)=7 THEN LET P(V)=BITXOR(P(V),1)
      LET V=V+Y
      LET Y=Y+8
   LOOP
NEXT X

FOR X=2 TO INT(SM/2^.5)
   LET V=2*X*(X+1)-1
   LET Y=4*X-8
   DO WHILE Y>=0 AND V<=M
      IF MOD(V,12)=11 THEN LET P(V)=BITXOR(P(V),1)
      LET V=V+Y
      LET Y=Y-8
   LOOP
NEXT X

FOR N=5 TO SM
   IF P(N)>0 THEN
      FOR Z=N*N TO M-1 STEP N*N
         LET P(Z)=0
      NEXT Z
   END IF
NEXT N
LET P(2)=1
LET P(3)=1

FOR I=2 TO M-1
   IF P(I)>0 THEN LET COUNT=COUNT+1
NEXT I
PRINT COUNT
END
 

エラトステネスのふるい(2n+1)

 投稿者:しばっち  投稿日:2021年11月 3日(水)18時04分43秒
  エラトステネスのふるい(2n+1)

LET N=5
FOR I=1 TO 10
   LET E=I*10^N
   LET PE=PRIMECOUNT(E)
   PRINT S+1;"~";E;":";PE-PS;PE
   LET S=E
   LET PS=PE
NEXT I
END

EXTERNAL  FUNCTION PRIMECOUNT(N)
DIM P(N)
! 2を特別扱い
FOR I=1 TO INT(SQR(N)/2) ! ループ SQR(N)/2
   LET K=2*I+1
   IF N<K THEN EXIT FOR
   IF P(K)=0 THEN
      FOR L=K*K TO N STEP K*2
         LET P(L)=1
      NEXT L
   END IF
NEXT I
LET COUNT=1 ! 2
FOR I=1 TO INT(N/2)
   LET K=2*I+1
   IF N<K THEN EXIT FOR
   IF P(K)=0 THEN LET COUNT=COUNT+1
NEXT I
LET PRIMECOUNT=COUNT
END FUNCTION
 

エラトステネスのふるい(6n+k)

 投稿者:しばっち  投稿日:2021年11月 3日(水)18時07分6秒
  エラトステネスのふるい(6n+k)

LET N=5
FOR I=1 TO 10
   LET E=I*10^N
   LET PE=PRIMECOUNT(E)
   PRINT S+1;"~";E;":";PE-PS;PE
   LET S=E
   LET PS=PE
NEXT I
END

EXTERNAL  FUNCTION PRIMECOUNT(N)
DIM A(2),P(N)
MAT READ A
! 2・3を特別扱い
DATA 1,5
FOR I=0 TO INT(SQR(N)/6) ! ループ SQR(N)*2/6=SQR(N)/3
   FOR J=1 TO 2
      IF I=0 AND J=1 THEN LET J=2
      LET K=6*I+A(J)
      IF N<K THEN EXIT FOR
      IF P(K)=0 THEN
         FOR L=K*K TO N STEP K*2
            LET P(L)=1
         NEXT L
      END IF
   NEXT J
NEXT I
LET COUNT=2 ! 2 3
FOR I=0 TO INT(N/6)
   FOR J=1 TO 2
      IF I=0 AND J=1 THEN LET J=2
      LET K=6*I+A(J)
      IF N<K THEN EXIT FOR
      IF P(K)=0 THEN LET COUNT=COUNT+1
   NEXT J
NEXT I
LET PRIMECOUNT=COUNT
END FUNCTION


https://en.wikipedia.org/wiki/Wheel_factorization


2n+k         1/2    2を特別扱い
6n+k         2/6=1/3    2,3を特別扱い
30n+k        8/30=1/3.75    2,3,5を特別扱い
210n+k       48/210=1/4.375    2,3,5,7を特別扱い
2310n+k      480/2310=1/4.8125    2,3,5,7,11を特別扱い
30030n+k     5760/30030=1/5.21354166666667    2,3,5,7,11,13を特別扱い
510510n+k    92160/510510=1/5.53938802083333    2,3,5,7,11,13,17を特別扱い
9699690n+k   1658880/9699690=1/5.84713179976852    2,3,5,7,11,13,17,19を特別扱い
223092870n+k 36495336/223092870=1/6.112914537901501    2,3,5,7,11,13,17,19,23を特別扱い


素数階乗(素数積)以外では
60n+k(1,7,11,13,17,19,23,29,31,37,41,43,47,49,53,59) の16個となり16/60=1/3.75
つまり30n+kと計算量は同じになります

10n+k(1,3,7,9) 4/10=1/2.5
100n+k(1,3,7,9,11,13,17,19,21,23,27,29,31,33,37,39,41,43,47,49,51,53,57,59,61,63,67,69,71,73,77,79,81,83,87,89,91,93,97,99) の40個係数が必要で
40/100=1/2.5となり 6n+k(1,5) 2/6=1/3 6n+kよりも計算量が多くなります。

6n+k(1,5),6n+k(5,7),6n+k(-1,1),6n+k(-5,-1)でも計算可能です(nの範囲が異なります)


   係数の求め方

30n+kでn=0,1,2,...とした時、30n+kが素数になるkを求めます。

30n+1 : 31,61,151...素数
30n+2 : 2で割れる
30n+3 : 3で割れる
30n+5 : 5で割れる
30n+7 : 7,37,67...素数
30n+9 : 3で割れる
30n+11: 11,41,71...素数
30n+13: 13,43,73...素数
30n+15: 15で割れる
30n+17: 17,47,107...素数
30n+19: 19,79,109...素数
30n+21: 3で割れる
30n+23: 23,53,73...素数
30n+25: 5で割れる
30n+27: 3で割れる
30n+29: 29,59,89...素数

よって
30n+k(1,7,11,13,17,19,23,29)となります
30n+k(7,11,13,17,19,23,29,31)でも計算できます
 

エラトステネスのふるい(30n+k)

 投稿者:しばっち  投稿日:2021年11月 3日(水)18時08分34秒
  エラトステネスのふるい(30n+k)

LET N=3
FOR I=0 TO 9
   LET S=ERATOS(I*10^N,(I+1)*10^N)
   LET SUM=SUM+S
   PRINT I*10^N+1;"~";(I+1)*10^N;":";S;SUM
NEXT I
END

EXTERNAL  FUNCTION ERATOS(S,E) ! S>=0 , S<E , E>5
DIM P(0 TO E-S+1),A(8)
MAT READ A
DATA 1,7,11,13,17,19,23,29
FOR I=0 TO INT(SQR(E)/30)
   FOR J=1 TO 8
      IF I=0 AND J=1 THEN LET J=2
      LET K=30*I+A(J)
      LET KK=INT(S/K)*K
      IF KK=0 THEN LET KK=K*K
      IF KK < S THEN LET KK=KK+K
      IF MOD(KK,K)<>0 THEN LET KK=KK+K
      IF MOD(INT(KK/K),2)=0 THEN LET KK=KK+K
      FOR L=KK TO E STEP K*2
         LET P(L-S)=1
      NEXT L
   NEXT  J
NEXT  I
IF S<=5 THEN LET COUNT=1
IF S<=3 THEN LET COUNT=2
IF S<=2 THEN LET COUNT=3
FOR I=INT(S/30) TO INT(E/30)
   FOR J=1 TO 8
      IF I=0 AND J=1 THEN LET J=2
      LET K=30*I+A(J)
      IF K>E THEN EXIT FOR
      IF K>=S AND P(K-S)=0 THEN LET COUNT=COUNT+1
   NEXT J
NEXT I
LET ERATOS=COUNT
END FUNCTION
 

エラトステネスのふるい(210n+k)

 投稿者:しばっち  投稿日:2021年11月 3日(水)18時09分16秒
  エラトステネスのふるい(210n+k)

FOR I=1 TO 10
   LET N=I*10^5
   PRINT N;"th prime ";NTHPRIME(N)
NEXT I
END

EXTERNAL  FUNCTION NTHPRIME(M) ! M>4
LET N=M*(LOG(M)+LOG(LOG(M)))
DIM P(N),A(48)
MAT READ A
DATA 1,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,121,127,131,137,139,143,149,151,157,163,167,169,173,179,181,187,191,193,197,199,209
FOR I=0 TO INT(SQR(N)/210)
   FOR J=1 TO 48
      IF I=0 AND J=1 THEN LET J=2
      LET K=210*I+A(J)
      FOR L=K*K TO N STEP K*2
         LET P(L)=1
      NEXT L
   NEXT  J
NEXT  I
LET COUNT=4 ! M>4
FOR I=0 TO INT(N/210)
   FOR J=1 TO 48
      IF I=0 AND J=1 THEN LET J=2
      LET K=210*I+A(J)
      IF P(K)=0 THEN
         LET COUNT=COUNT+1
         IF COUNT=M THEN
            LET NTHPRIME=K
            EXIT FUNCTION
         END IF
      END IF
   NEXT J
NEXT I
END FUNCTION
 

エラトステネスのふるい(2310n+k)

 投稿者:しばっち  投稿日:2021年11月 3日(水)18時10分25秒
  エラトステネスのふるい(2310n+k)


FOR I=1 TO 6
   LET N=10^I
   PRINT N;"th prime";NTHPRIME(N)
NEXT I
END

EXTERNAL  FUNCTION NTHPRIME(N)
LET SIZE=10000000
DIM P(SIZE),A(480)
MAT READ A
DATA    1,  13,  17,  19,  23,  29,  31,  37,  41,  43,  47,  53,  59,  61,  67,  71,  73,  79,  83,  89,  97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 169, 173, 179, 181, 191, 193, 197, 199, 211, 221, 223, 227, 229, 233, 239, 241, 247, 251, 257, 263, 269, 271, 277, 281, 283, 289, 293, 299, 307, 311, 313, 317, 323, 331, 337, 347, 349, 353, 359, 361, 367, 373, 377, 379, 383
DATA  389, 391, 397, 401, 403, 409, 419, 421, 431, 433, 437, 439, 443, 449, 457, 461, 463, 467, 479, 481, 487, 491, 493, 499, 503, 509, 521, 523, 527, 529, 533, 541, 547, 551, 557, 559, 563, 569, 571, 577, 587, 589, 593, 599, 601, 607, 611, 613, 617, 619, 629, 631, 641, 643, 647, 653, 659, 661, 667, 673, 677, 683, 689, 691, 697, 701, 703, 709, 713, 719, 727, 731, 733, 739, 743, 751, 757, 761, 767, 769
DATA  773, 779, 787, 793, 797, 799, 809, 811, 817, 821, 823, 827, 829, 839, 841, 851, 853, 857, 859, 863, 871, 877, 881, 883, 887, 893, 899, 901, 907, 911, 919, 923, 929, 937, 941, 943, 947, 949, 953, 961, 967, 971, 977, 983, 989, 991, 997,1003,1007,1009,1013,1019,1021,1027,1031,1033,1037,1039,1049,1051,1061,1063,1069,1073,1079,1081,1087,1091,1093,1097,1103,1109,1117,1121,1123,1129,1139,1147,1151,1153
DATA 1157,1159,1163,1171,1181,1187,1189,1193,1201,1207,1213,1217,1219,1223,1229,1231,1237,1241,1247,1249,1259,1261,1271,1273,1277,1279,1283,1289,1291,1297,1301,1303,1307,1313,1319,1321,1327,1333,1339,1343,1349,1357,1361,1363,1367,1369,1373,1381,1387,1391,1399,1403,1409,1411,1417,1423,1427,1429,1433,1439,1447,1451,1453,1457,1459,1469,1471,1481,1483,1487,1489,1493,1499,1501,1511,1513,1517,1523,1531,1537
DATA 1541,1543,1549,1553,1559,1567,1571,1577,1579,1583,1591,1597,1601,1607,1609,1613,1619,1621,1627,1633,1637,1643,1649,1651,1657,1663,1667,1669,1679,1681,1691,1693,1697,1699,1703,1709,1711,1717,1721,1723,1733,1739,1741,1747,1751,1753,1759,1763,1769,1777,1781,1783,1787,1789,1801,1807,1811,1817,1819,1823,1829,1831,1843,1847,1849,1853,1861,1867,1871,1873,1877,1879,1889,1891,1901,1907,1909,1913,1919,1921
DATA 1927,1931,1933,1937,1943,1949,1951,1957,1961,1963,1973,1979,1987,1993,1997,1999,2003,2011,2017,2021,2027,2029,2033,2039,2041,2047,2053,2059,2063,2069,2071,2077,2081,2083,2087,2089,2099,2111,2113,2117,2119,2129,2131,2137,2141,2143,2147,2153,2159,2161,2171,2173,2179,2183,2197,2201,2203,2207,2209,2213,2221,2227,2231,2237,2239,2243,2249,2251,2257,2263,2267,2269,2273,2279,2281,2287,2291,2293,2297,2309
LET T=0
DO
   LET S=T*SIZE
   LET E=(T+1)*SIZE
   MAT P=ZER
   FOR I=0 TO INT(SQR(E)/2310)
      FOR J=1 TO 480
         IF I=0 AND J=1 THEN LET J=2
         LET K=2310*I+A(J)
         LET KK=INT(S/K)*K
         IF KK=0 THEN LET KK=K*K
         IF KK < S THEN LET KK=KK+K
         IF MOD(KK,K)<>0 THEN LET KK=KK+K
         IF MOD(INT(KK/K),2)=0 THEN LET KK=KK+K
         FOR L=KK TO E STEP K*2
            LET P(L-S)=1
         NEXT L
      NEXT  J
   NEXT  I
   LET COUNT=0
   IF S<=11 THEN LET COUNT=1
   IF S<=7 THEN LET COUNT=2
   IF S<=5 THEN LET COUNT=3
   IF S<=3 THEN LET COUNT=4
   IF S<=2 THEN LET COUNT=5
   FOR I=INT(S/2310) TO INT(E/2310)
      FOR J=1 TO 480
         IF I=0 AND J=1 THEN LET J=2
         LET K=2310*I+A(J)
         IF K>E THEN EXIT FOR
         IF K>=S AND P(K-S)=0 THEN
            LET COUNT=COUNT+1
            IF TOTAL+COUNT>=N THEN
               LET NTHPRIME=K
               EXIT FUNCTION
            END IF
         END IF
      NEXT J
   NEXT I
   LET TOTAL=TOTAL+COUNT
   LET T=T+1
LOOP
END FUNCTION
 

エラトステネスのふるい(30030n+k)

 投稿者:しばっち  投稿日:2021年11月 3日(水)18時12分21秒
  エラトステネスのふるい(30030n+k)


FOR I=1 TO 10
   LET N=I*10^5
   PRINT N;"primesum";PRIMESUM(N)
NEXT I
END

EXTERNAL  FUNCTION PRIMESUM(N) ! N>13
DIM A(5760),P(N)
MAT READ A
DATA     1,   17,   19,   23,   29,   31,   37,   41,   43,   47,   53,   59,   61,   67,   71,   73,   79,   83,   89,   97,  101,  103,  107,  109,  113,  127,  131,  137,  139,  149,  151,  157,  163,  167,  173,  179,  181,  191,  193,  197,  199,  211,  223,  227,  229,  233,  239,  241,  251,  257,  263,  269,  271,  277,  281,  283,  289,  293,  307,  311,  313,  317,  323,  331,  337,  347,  349,  353,  359,  361,  367,  373,  379,  383,  389,  391,  397,  401,  409,  419
DATA   421,  431,  433,  437,  439,  443,  449,  457,  461,  463,  467,  479,  487,  491,  493,  499,  503,  509,  521,  523,  527,  529,  541,  547,  551,  557,  563,  569,  571,  577,  587,  589,  593,  599,  601,  607,  613,  617,  619,  629,  631,  641,  643,  647,  653,  659,  661,  667,  673,  677,  683,  691,  697,  701,  703,  709,  713,  719,  727,  731,  733,  739,  743,  751,  757,  761,  769,  773,  779,  787,  797,  799,  809,  811,  817,  821,  823,  827,  829,  839
DATA   841,  851,  853,  857,  859,  863,  877,  881,  883,  887,  893,  899,  901,  907,  911,  919,  929,  937,  941,  943,  947,  953,  961,  967,  971,  977,  983,  989,  991,  997, 1003, 1007, 1009, 1013, 1019, 1021, 1031, 1033, 1037, 1039, 1049, 1051, 1061, 1063, 1069, 1073, 1081, 1087, 1091, 1093, 1097, 1103, 1109, 1117, 1121, 1123, 1129, 1139, 1147, 1151, 1153, 1159, 1163, 1171, 1181, 1187, 1189, 1193, 1201, 1207, 1213, 1217, 1219, 1223, 1229, 1231, 1237, 1241, 1247, 1249
DATA  1259, 1271, 1273, 1277, 1279, 1283, 1289, 1291, 1297, 1301, 1303, 1307, 1319, 1321, 1327, 1333, 1343, 1349, 1357, 1361, 1363, 1367, 1369, 1373, 1381, 1387, 1399, 1403, 1409, 1411, 1423, 1427, 1429, 1433, 1439, 1447, 1451, 1453, 1457, 1459, 1471, 1481, 1483, 1487, 1489, 1493, 1499, 1501, 1511, 1513, 1517, 1523, 1531, 1537, 1541, 1543, 1549, 1553, 1559, 1567, 1571, 1577, 1579, 1583, 1591, 1597, 1601, 1607, 1609, 1613, 1619, 1621, 1627, 1633, 1637, 1643, 1649, 1657, 1663, 1667
DATA  1669, 1679, 1681, 1691, 1693, 1697, 1699, 1709, 1711, 1717, 1721, 1723, 1733, 1739, 1741, 1747, 1751, 1753, 1759, 1763, 1769, 1777, 1783, 1787, 1789, 1801, 1811, 1817, 1819, 1823, 1829, 1831, 1843, 1847, 1849, 1853, 1861, 1867, 1871, 1873, 1877, 1879, 1889, 1891, 1901, 1907, 1909, 1913, 1919, 1921, 1927, 1931, 1933, 1943, 1949, 1951, 1957, 1961, 1973, 1979, 1987, 1993, 1997, 1999, 2003, 2011, 2017, 2021, 2027, 2029, 2033, 2039, 2047, 2053, 2059, 2063, 2069, 2071, 2077, 2081
DATA  2083, 2087, 2089, 2099, 2111, 2113, 2117, 2129, 2131, 2137, 2141, 2143, 2147, 2153, 2159, 2161, 2173, 2179, 2183, 2201, 2203, 2207, 2209, 2213, 2221, 2227, 2231, 2237, 2239, 2243, 2251, 2257, 2263, 2267, 2269, 2273, 2279, 2281, 2287, 2291, 2293, 2297, 2309, 2311, 2323, 2329, 2333, 2339, 2341, 2347, 2351, 2357, 2363, 2369, 2371, 2377, 2381, 2383, 2389, 2393, 2399, 2407, 2411, 2413, 2417, 2419, 2423, 2437, 2441, 2447, 2449, 2459, 2461, 2467, 2473, 2477, 2479, 2489, 2491, 2501
DATA  2503, 2507, 2521, 2531, 2533, 2537, 2539, 2543, 2549, 2551, 2557, 2567, 2573, 2579, 2581, 2591, 2593, 2599, 2603, 2609, 2617, 2621, 2623, 2627, 2633, 2641, 2647, 2657, 2659, 2663, 2669, 2671, 2677, 2683, 2687, 2689, 2693, 2699, 2701, 2707, 2711, 2713, 2719, 2729, 2731, 2741, 2747, 2749, 2753, 2759, 2767, 2771, 2773, 2777, 2789, 2791, 2797, 2801, 2803, 2809, 2813, 2819, 2831, 2833, 2837, 2839, 2843, 2851, 2857, 2861, 2867, 2869, 2879, 2881, 2887, 2897, 2903, 2909, 2911, 2917
DATA  2921, 2923, 2927, 2929, 2939, 2941, 2953, 2957, 2963, 2969, 2971, 2983, 2987, 2993, 2999, 3001, 3007, 3011, 3013, 3019, 3023, 3037, 3041, 3043, 3049, 3053, 3061, 3067, 3071, 3077, 3079, 3083, 3089, 3097, 3103, 3109, 3119, 3121, 3127, 3131, 3137, 3139, 3149, 3151, 3161, 3163, 3167, 3169, 3173, 3181, 3187, 3191, 3193, 3197, 3203, 3209, 3217, 3221, 3229, 3233, 3239, 3247, 3251, 3253, 3257, 3259, 3271, 3277, 3281, 3287, 3293, 3299, 3301, 3307, 3313, 3317, 3319, 3323, 3329, 3331
DATA  3337, 3343, 3347, 3349, 3359, 3361, 3371, 3373, 3379, 3383, 3389, 3391, 3397, 3401, 3403, 3407, 3413, 3427, 3431, 3433, 3439, 3449, 3457, 3461, 3463, 3467, 3469, 3473, 3481, 3491, 3499, 3503, 3511, 3517, 3527, 3529, 3533, 3539, 3541, 3547, 3551, 3557, 3559, 3569, 3571, 3581, 3583, 3587, 3589, 3593, 3599, 3607, 3611, 3613, 3617, 3623, 3629, 3631, 3637, 3643, 3649, 3659, 3667, 3671, 3673, 3677, 3683, 3691, 3697, 3701, 3709, 3713, 3719, 3721, 3727, 3733, 3737, 3739, 3743, 3749
DATA  3761, 3763, 3767, 3769, 3779, 3781, 3791, 3793, 3797, 3799, 3803, 3811, 3821, 3823, 3827, 3833, 3841, 3847, 3851, 3853, 3859, 3863, 3869, 3877, 3881, 3889, 3893, 3901, 3907, 3911, 3917, 3919, 3923, 3929, 3931, 3937, 3943, 3947, 3953, 3959, 3961, 3967, 3973, 3977, 3979, 3989, 4001, 4003, 4007, 4009, 4013, 4019, 4021, 4027, 4031, 4033, 4049, 4051, 4057, 4061, 4063, 4073, 4079, 4087, 4091, 4093, 4097, 4099, 4111, 4117, 4127, 4129, 4133, 4139, 4141, 4153, 4157, 4159, 4163, 4171
DATA  4177, 4181, 4183, 4187, 4189, 4201, 4211, 4217, 4219, 4223, 4229, 4231, 4237, 4241, 4243, 4247, 4253, 4259, 4261, 4267, 4271, 4273, 4283, 4289, 4297, 4307, 4309, 4313, 4321, 4327, 4331, 4337, 4339, 4343, 4349, 4351, 4357, 4363, 4369, 4373, 4379, 4387, 4391, 4393, 4397, 4399, 4409, 4421, 4423, 4427, 4429, 4439, 4441, 4447, 4451, 4453, 4457, 4463, 4469, 4471, 4481, 4483, 4489, 4493, 4507, 4513, 4517, 4519, 4523, 4531, 4541, 4547, 4549, 4553, 4559, 4561, 4567, 4573, 4577, 4579
DATA  4583, 4591, 4597, 4601, 4603, 4607, 4619, 4621, 4633, 4637, 4639, 4643, 4649, 4651, 4657, 4661, 4663, 4673, 4679, 4681, 4687, 4691, 4699, 4703, 4709, 4717, 4721, 4723, 4727, 4729, 4733, 4747, 4751, 4757, 4759, 4769, 4777, 4783, 4787, 4789, 4793, 4799, 4801, 4811, 4813, 4817, 4819, 4831, 4841, 4843, 4847, 4853, 4859, 4861, 4867, 4871, 4877, 4883, 4889, 4891, 4897, 4903, 4909, 4913, 4919, 4931, 4933, 4937, 4943, 4951, 4957, 4967, 4969, 4973, 4981, 4987, 4993, 4997, 4999, 5003
DATA  5009, 5011, 5017, 5021, 5023, 5029, 5039, 5041, 5051, 5053, 5059, 5063, 5069, 5077, 5081, 5087, 5099, 5101, 5107, 5111, 5113, 5119, 5123, 5129, 5141, 5143, 5147, 5149, 5153, 5167, 5171, 5177, 5179, 5183, 5189, 5191, 5197, 5207, 5209, 5219, 5221, 5227, 5231, 5233, 5237, 5249, 5251, 5261, 5263, 5267, 5273, 5279, 5281, 5287, 5293, 5297, 5303, 5309, 5311, 5321, 5323, 5329, 5333, 5339, 5347, 5351, 5353, 5359, 5363, 5371, 5377, 5381, 5387, 5389, 5393, 5399, 5407, 5413, 5417, 5419
DATA  5429, 5431, 5437, 5441, 5443, 5449, 5459, 5461, 5471, 5477, 5479, 5483, 5491, 5497, 5501, 5503, 5507, 5513, 5519, 5521, 5527, 5531, 5539, 5543, 5549, 5557, 5561, 5563, 5567, 5569, 5573, 5581, 5587, 5591, 5597, 5609, 5611, 5617, 5623, 5627, 5633, 5639, 5641, 5647, 5651, 5653, 5657, 5659, 5669, 5671, 5683, 5689, 5693, 5699, 5701, 5711, 5713, 5717, 5723, 5729, 5737, 5741, 5743, 5749, 5767, 5771, 5773, 5777, 5779, 5783, 5791, 5801, 5807, 5809, 5813, 5821, 5827, 5833, 5839, 5843
DATA  5849, 5851, 5857, 5861, 5867, 5869, 5879, 5881, 5891, 5893, 5897, 5899, 5903, 5909, 5911, 5917, 5921, 5923, 5927, 5933, 5939, 5947, 5953, 5959, 5963, 5969, 5977, 5981, 5983, 5987, 5989, 6001, 6007, 6011, 6023, 6029, 6031, 6037, 6043, 6047, 6049, 6053, 6059, 6067, 6073, 6077, 6079, 6089, 6091, 6101, 6103, 6107, 6109, 6113, 6119, 6121, 6131, 6133, 6137, 6143, 6151, 6157, 6161, 6163, 6169, 6173, 6179, 6187, 6191, 6197, 6199, 6203, 6211, 6217, 6221, 6229, 6233, 6239, 6241, 6247
DATA  6257, 6263, 6269, 6271, 6277, 6283, 6287, 6289, 6299, 6301, 6311, 6313, 6317, 6319, 6323, 6329, 6337, 6341, 6343, 6353, 6359, 6361, 6367, 6371, 6373, 6379, 6389, 6397, 6401, 6403, 6407, 6421, 6427, 6431, 6437, 6439, 6443, 6449, 6451, 6463, 6467, 6469, 6473, 6481, 6491, 6493, 6497, 6499, 6509, 6511, 6521, 6527, 6529, 6533, 6541, 6547, 6551, 6553, 6557, 6563, 6569, 6571, 6577, 6581, 6583, 6593, 6599, 6607, 6613, 6619, 6623, 6631, 6637, 6641, 6647, 6649, 6653, 6659, 6661, 6667
DATA  6673, 6679, 6683, 6689, 6691, 6697, 6701, 6703, 6707, 6709, 6719, 6731, 6733, 6737, 6739, 6749, 6751, 6757, 6761, 6763, 6767, 6779, 6781, 6791, 6793, 6803, 6817, 6821, 6823, 6827, 6829, 6833, 6841, 6847, 6857, 6859, 6863, 6869, 6871, 6883, 6887, 6889, 6893, 6899, 6901, 6907, 6911, 6913, 6917, 6931, 6943, 6947, 6949, 6953, 6959, 6961, 6967, 6971, 6973, 6977, 6983, 6989, 6991, 6997, 7001, 7003, 7009, 7013, 7019, 7027, 7031, 7037, 7039, 7043, 7057, 7061, 7067, 7069, 7079, 7081
DATA  7087, 7093, 7097, 7099, 7103, 7109, 7121, 7123, 7127, 7129, 7141, 7151, 7153, 7157, 7159, 7169, 7171, 7177, 7181, 7187, 7193, 7199, 7201, 7207, 7211, 7213, 7219, 7223, 7229, 7237, 7243, 7247, 7253, 7261, 7277, 7279, 7283, 7289, 7291, 7297, 7303, 7307, 7309, 7313, 7321, 7327, 7331, 7333, 7339, 7349, 7351, 7361, 7363, 7367, 7369, 7373, 7379, 7387, 7391, 7393, 7409, 7411, 7417, 7421, 7429, 7433, 7439, 7451, 7453, 7457, 7459, 7463, 7471, 7477, 7481, 7487, 7489, 7493, 7499, 7507
DATA  7517, 7519, 7523, 7529, 7531, 7537, 7541, 7543, 7547, 7549, 7559, 7561, 7571, 7573, 7577, 7583, 7589, 7591, 7597, 7603, 7607, 7613, 7619, 7621, 7627, 7633, 7639, 7643, 7649, 7661, 7663, 7669, 7673, 7681, 7687, 7691, 7697, 7699, 7703, 7717, 7723, 7727, 7729, 7739, 7741, 7747, 7751, 7753, 7757, 7759, 7769, 7771, 7781, 7783, 7789, 7793, 7801, 7807, 7811, 7817, 7823, 7829, 7831, 7837, 7841, 7849, 7853, 7859, 7867, 7871, 7873, 7877, 7879, 7883, 7897, 7901, 7907, 7913, 7919, 7921
DATA  7927, 7933, 7937, 7939, 7949, 7951, 7957, 7961, 7963, 7967, 7979, 7981, 7991, 7993, 7999, 8003, 8009, 8011, 8017, 8023, 8027, 8033, 8039, 8051, 8053, 8059, 8069, 8077, 8081, 8083, 8087, 8089, 8093, 8101, 8111, 8117, 8119, 8123, 8131, 8137, 8143, 8147, 8149, 8153, 8159, 8161, 8167, 8171, 8179, 8189, 8191, 8201, 8207, 8209, 8213, 8219, 8221, 8227, 8231, 8233, 8237, 8243, 8249, 8251, 8257, 8263, 8269, 8273, 8279, 8287, 8291, 8293, 8297, 8299, 8303, 8311, 8317, 8321, 8329, 8339
DATA  8341, 8347, 8353, 8357, 8363, 8369, 8377, 8381, 8383, 8387, 8389, 8399, 8401, 8413, 8417, 8419, 8423, 8429, 8431, 8441, 8443, 8447, 8453, 8461, 8467, 8471, 8473, 8479, 8483, 8497, 8501, 8507, 8509, 8513, 8521, 8527, 8531, 8537, 8539, 8543, 8549, 8551, 8557, 8563, 8573, 8579, 8581, 8587, 8597, 8599, 8609, 8611, 8621, 8623, 8627, 8629, 8633, 8639, 8641, 8647, 8651, 8653, 8663, 8669, 8677, 8681, 8683, 8689, 8693, 8699, 8707, 8711, 8713, 8717, 8719, 8731, 8737, 8741, 8747, 8753
DATA  8759, 8761, 8773, 8777, 8779, 8783, 8791, 8797, 8803, 8807, 8809, 8819, 8821, 8831, 8837, 8839, 8843, 8849, 8851, 8857, 8861, 8863, 8867, 8873, 8881, 8887, 8891, 8893, 8903, 8909, 8917, 8923, 8927, 8929, 8933, 8941, 8947, 8951, 8959, 8963, 8969, 8971, 8977, 8989, 8993, 8999, 9001, 9007, 9011, 9013, 9017, 9019, 9029, 9041, 9043, 9047, 9049, 9059, 9067, 9071, 9073, 9077, 9083, 9089, 9091, 9101, 9103, 9109, 9127, 9131, 9133, 9137, 9143, 9151, 9157, 9161, 9167, 9169, 9173, 9179
DATA  9181, 9187, 9193, 9197, 9199, 9203, 9209, 9211, 9221, 9223, 9227, 9239, 9241, 9253, 9257, 9259, 9263, 9271, 9277, 9281, 9283, 9287, 9293, 9299, 9301, 9307, 9311, 9313, 9319, 9323, 9329, 9337, 9341, 9343, 9349, 9353, 9367, 9371, 9377, 9379, 9389, 9391, 9397, 9403, 9407, 9409, 9413, 9419, 9421, 9431, 9433, 9437, 9439, 9461, 9463, 9467, 9469, 9473, 9479, 9481, 9487, 9491, 9497, 9509, 9511, 9517, 9521, 9523, 9533, 9539, 9547, 9551, 9553, 9557, 9563, 9571, 9577, 9587, 9589, 9593
DATA  9599, 9601, 9613, 9617, 9619, 9623, 9629, 9631, 9637, 9641, 9643, 9649, 9661, 9671, 9673, 9677, 9679, 9683, 9689, 9697, 9701, 9703, 9707, 9719, 9721, 9727, 9731, 9733, 9739, 9743, 9749, 9761, 9767, 9769, 9773, 9781, 9787, 9791, 9797, 9799, 9803, 9809, 9811, 9817, 9827, 9829, 9833, 9839, 9847, 9851, 9853, 9857, 9859, 9869, 9871, 9881, 9883, 9887, 9899, 9901, 9907, 9913, 9917, 9923, 9929, 9931, 9937, 9941, 9943, 9949, 9953, 9959, 9967, 9973, 9979, 9983, 9991,10001,10007,10009
DATA 10013,10019,10027,10033,10037,10039,10051,10057,10061,10063,10067,10069,10079,10081,10091,10093,10097,10099,10103,10111,10117,10121,10123,10133,10139,10141,10147,10151,10159,10163,10169,10177,10181,10183,10187,10189,10193,10201,10207,10211,10217,10223,10229,10237,10243,10247,10249,10253,10259,10261,10267,10271,10273,10277,10279,10289,10291,10301,10303,10313,10319,10321,10327,10331,10333,10337,10343,10349,10357,10363,10369,10379,10391,10393,10397,10399,10403,10411,10421,10427
DATA 10429,10433,10441,10447,10453,10457,10459,10463,10469,10471,10477,10481,10487,10489,10499,10501,10511,10513,10519,10523,10529,10531,10537,10541,10547,10553,10559,10561,10567,10573,10579,10583,10589,10597,10601,10603,10607,10609,10613,10627,10631,10639,10643,10649,10651,10657,10663,10667,10669,10679,10687,10691,10693,10697,10709,10711,10721,10723,10727,10729,10733,10739,10741,10753,10757,10763,10771,10781,10783,10789,10793,10799,10807,10811,10817,10819,10823,10831,10837,10841
DATA 10847,10849,10853,10859,10861,10867,10873,10877,10883,10889,10891,10897,10903,10909,10919,10921,10931,10937,10939,10943,10949,10951,10957,10961,10963,10973,10979,10981,10987,10991,10993,10999,11003,11009,11017,11021,11023,11027,11029,11041,11047,11051,11057,11059,11069,11071,11083,11087,11093,11101,11107,11111,11113,11117,11119,11129,11131,11147,11149,11153,11159,11161,11171,11173,11177,11183,11189,11191,11197,11201,11203,11213,11227,11233,11237,11239,11243,11251,11257,11261
DATA 11267,11269,11273,11279,11281,11287,11293,11299,11303,11309,11311,11317,11321,11327,11329,11339,11351,11353,11357,11359,11369,11371,11377,11381,11383,11387,11393,11399,11411,11413,11419,11423,11437,11441,11443,11447,11449,11461,11467,11471,11477,11483,11489,11491,11497,11503,11507,11509,11513,11519,11521,11527,11533,11537,11549,11551,11563,11567,11569,11573,11579,11581,11587,11591,11593,11597,11603,11611,11617,11621,11623,11629,11633,11639,11647,11651,11653,11657,11659,11663
DATA 11677,11681,11689,11699,11701,11707,11717,11719,11723,11729,11731,11741,11743,11747,11749,11761,11771,11773,11777,11779,11783,11789,11797,11801,11807,11813,11819,11821,11827,11831,11833,11839,11849,11857,11861,11863,11867,11873,11881,11887,11897,11899,11903,11909,11911,11917,11923,11927,11929,11933,11939,11941,11951,11953,11959,11969,11971,11981,11983,11987,11989,11993,12007,12011,12013,12017,12029,12031,12037,12041,12043,12049,12053,12059,12071,12073,12079,12083,12091,12097
DATA 12101,12107,12109,12113,12119,12121,12127,12137,12139,12143,12149,12151,12157,12161,12163,12167,12169,12179,12191,12193,12197,12203,12209,12211,12217,12223,12227,12239,12241,12247,12251,12253,12263,12269,12277,12281,12283,12289,12293,12301,12307,12317,12319,12323,12329,12343,12347,12349,12359,12361,12367,12371,12373,12377,12379,12391,12401,12403,12407,12409,12413,12421,12427,12431,12433,12437,12443,12449,12451,12457,12461,12469,12473,12479,12487,12491,12497,12499,12503,12511
DATA 12517,12521,12527,12533,12539,12541,12547,12553,12557,12559,12563,12569,12577,12581,12583,12587,12589,12599,12601,12611,12613,12619,12629,12631,12637,12641,12643,12647,12653,12659,12667,12671,12673,12679,12689,12697,12703,12707,12709,12713,12721,12731,12737,12739,12743,12751,12757,12763,12767,12769,12773,12781,12787,12791,12797,12799,12809,12811,12821,12823,12827,12829,12833,12839,12841,12847,12851,12853,12863,12869,12871,12877,12889,12893,12899,12907,12911,12913,12917,12919
DATA 12923,12931,12937,12941,12949,12953,12959,12967,12973,12977,12979,12983,12989,12997,13001,13003,13007,13009,13019,13021,13031,13033,13037,13043,13049,13051,13061,13063,13067,13073,13081,13087,13093,13099,13103,13109,13121,13127,13129,13133,13141,13147,13151,13157,13159,13163,13171,13177,13183,13187,13193,13199,13201,13207,13213,13217,13219,13229,13231,13241,13243,13249,13253,13259,13261,13267,13271,13283,13289,13291,13297,13301,13303,13309,13313,13319,13327,13331,13333,13337
DATA 13339,13357,13361,13367,13369,13373,13379,13381,13393,13397,13399,13411,13417,13421,13423,13427,13439,13441,13451,13457,13459,13463,13469,13471,13477,13483,13487,13493,13499,13501,13511,13513,13523,13529,13537,13543,13547,13549,13553,13561,13567,13571,13577,13579,13583,13589,13591,13597,13603,13609,13613,13619,13621,13627,13631,13633,13639,13649,13661,13667,13669,13679,13681,13687,13691,13693,13697,13703,13709,13711,13721,13723,13729,13733,13747,13751,13753,13757,13759,13763
DATA 13771,13777,13781,13787,13789,13799,13801,13807,13813,13817,13823,13829,13831,13837,13841,13843,13847,13859,13861,13873,13877,13879,13883,13889,13891,13901,13903,13907,13913,13919,13921,13927,13931,13933,13939,13943,13957,13961,13963,13967,13969,13973,13987,13991,13997,13999,14009,14011,14017,14023,14029,14033,14039,14041,14051,14057,14059,14071,14081,14083,14087,14089,14093,14099,14101,14107,14111,14117,14123,14129,14137,14141,14143,14149,14153,14159,14167,14171,14173,14177
DATA 14191,14197,14207,14213,14219,14221,14227,14233,14237,14239,14243,14249,14251,14257,14263,14269,14279,14281,14291,14293,14297,14299,14303,14309,14317,14321,14323,14327,14341,14347,14351,14353,14359,14363,14369,14381,14383,14387,14389,14393,14401,14407,14411,14419,14423,14429,14431,14437,14447,14449,14453,14459,14461,14467,14471,14473,14477,14479,14489,14491,14501,14503,14507,14513,14519,14527,14533,14537,14543,14549,14551,14557,14561,14563,14569,14579,14587,14591,14593,14603
DATA 14611,14617,14621,14627,14629,14633,14639,14647,14653,14657,14659,14669,14671,14681,14683,14687,14689,14699,14701,14711,14713,14717,14719,14723,14731,14737,14741,14743,14747,14753,14759,14761,14767,14771,14779,14783,14789,14797,14801,14803,14809,14813,14821,14827,14831,14837,14843,14849,14851,14857,14863,14867,14869,14873,14879,14881,14887,14891,14893,14897,14899,14909,14921,14923,14929,14933,14939,14941,14947,14951,14953,14957,14969,14977,14981,14983,14999,15007,15011,15013
DATA 15017,15019,15023,15031,15047,15049,15053,15061,15073,15077,15079,15083,15089,15091,15097,15101,15107,15109,15121,15131,15133,15137,15139,15143,15149,15151,15157,15161,15163,15167,15173,15179,15181,15187,15193,15199,15203,15209,15217,15221,15227,15229,15233,15241,15247,15251,15259,15263,15269,15271,15277,15283,15287,15289,15293,15299,15307,15311,15313,15317,15319,15329,15331,15341,15343,15347,15349,15359,15361,15371,15373,15377,15383,15391,15397,15401,15403,15409,15413,15419
DATA 15427,15437,15439,15443,15451,15461,15467,15469,15473,15479,15481,15487,15493,15497,15503,15511,15517,15523,15527,15529,15539,15541,15551,15553,15557,15559,15563,15569,15571,15577,15581,15583,15593,15599,15601,15607,15611,15619,15623,15629,15637,15641,15643,15647,15649,15661,15667,15671,15677,15679,15683,15689,15703,15707,15709,15713,15721,15727,15731,15733,15737,15739,15749,15751,15761,15767,15773,15779,15781,15787,15791,15793,15797,15803,15809,15811,15817,15823,15833,15839
DATA 15853,15857,15859,15863,15871,15877,15881,15887,15889,15893,15901,15907,15913,15919,15923,15929,15931,15937,15941,15943,15947,15949,15959,15971,15973,15979,15989,15991,15997,16001,16007,16013,16019,16021,16031,16033,16039,16043,16057,16061,16063,16067,16069,16073,16087,16091,16097,16099,16103,16109,16111,16117,16123,16127,16129,16139,16141,16147,16151,16153,16157,16169,16171,16183,16187,16189,16193,16199,16201,16207,16213,16217,16223,16229,16231,16241,16243,16249,16253,16259
DATA 16267,16271,16273,16277,16279,16283,16297,16301,16307,16309,16319,16321,16327,16333,16337,16339,16343,16349,16351,16361,16363,16369,16381,16391,16397,16399,16403,16409,16411,16417,16421,16427,16433,16439,16441,16447,16451,16453,16459,16463,16469,16477,16481,16483,16487,16493,16501,16507,16517,16519,16529,16531,16537,16543,16547,16553,16559,16561,16567,16571,16573,16579,16589,16591,16603,16607,16609,16613,16619,16631,16633,16637,16649,16651,16657,16661,16663,16669,16673,16691
DATA 16693,16697,16699,16703,16711,16717,16721,16727,16729,16733,16739,16741,16747,16759,16763,16769,16771,16777,16781,16787,16789,16799,16801,16811,16813,16817,16823,16829,16831,16837,16843,16847,16853,16859,16867,16871,16873,16879,16883,16889,16897,16901,16903,16909,16921,16927,16931,16937,16943,16949,16957,16963,16967,16969,16979,16981,16987,16993,16997,16999,17009,17011,17021,17023,17027,17029,17033,17041,17047,17051,17053,17057,17063,17071,17077,17081,17089,17093,17099,17107
DATA 17111,17113,17117,17119,17123,17131,17137,17141,17153,17159,17161,17167,17177,17179,17183,17189,17191,17197,17201,17203,17207,17209,17219,17221,17231,17233,17239,17243,17249,17257,17261,17263,17267,17273,17279,17287,17291,17293,17299,17309,17317,17321,17323,17327,17333,17341,17351,17357,17359,17363,17371,17377,17383,17387,17389,17393,17399,17401,17411,17417,17419,17429,17431,17441,17443,17447,17449,17453,17461,17467,17471,17473,17477,17483,17489,17491,17497,17503,17509,17513
DATA 17519,17527,17531,17533,17539,17543,17551,17557,17561,17569,17573,17579,17581,17587,17593,17597,17599,17603,17609,17617,17621,17623,17627,17629,17639,17651,17653,17657,17659,17663,17669,17671,17681,17683,17687,17701,17707,17711,17713,17723,17729,17737,17741,17747,17749,17753,17761,17767,17777,17779,17783,17789,17791,17803,17807,17813,17819,17821,17827,17833,17837,17839,17851,17861,17863,17867,17869,17873,17879,17881,17887,17891,17893,17903,17909,17911,17917,17921,17923,17929
DATA 17933,17939,17947,17951,17957,17959,17971,17977,17981,17987,17989,17993,17999,18001,18013,18017,18019,18023,18037,18041,18043,18047,18049,18059,18061,18071,18077,18079,18089,18091,18097,18101,18103,18107,18113,18119,18121,18127,18131,18133,18143,18149,18157,18163,18167,18169,18173,18181,18191,18197,18199,18203,18209,18211,18217,18223,18229,18233,18241,18247,18251,18253,18257,18259,18269,18281,18283,18287,18289,18299,18301,18307,18311,18313,18323,18329,18331,18341,18349,18353
DATA 18367,18371,18373,18377,18379,18383,18391,18397,18401,18407,18409,18413,18419,18427,18433,18437,18439,18443,18449,18451,18457,18461,18463,18467,18479,18481,18493,18497,18503,18509,18511,18517,18521,18523,18527,18533,18539,18541,18547,18553,18559,18563,18569,18581,18583,18587,18589,18593,18607,18611,18617,18619,18631,18637,18643,18647,18649,18653,18659,18661,18671,18673,18677,18679,18691,18701,18703,18709,18713,18719,18721,18727,18731,18737,18743,18749,18751,18757,18761,18763
DATA 18769,18773,18779,18787,18791,18793,18797,18803,18817,18827,18829,18833,18839,18841,18847,18853,18857,18859,18869,18871,18877,18881,18883,18899,18901,18911,18913,18917,18919,18923,18929,18937,18943,18947,18959,18961,18971,18973,18979,18983,18989,19001,19003,19007,19009,19013,19021,19027,19031,19037,19039,19043,19049,19051,19057,19067,19069,19073,19079,19081,19087,19091,19093,19099,19109,19111,19121,19127,19133,19139,19141,19147,19153,19157,19163,19169,19171,19177,19181,19183
DATA 19189,19193,19199,19207,19211,19213,19219,19223,19231,19237,19241,19247,19249,19259,19267,19273,19277,19289,19291,19297,19301,19303,19307,19309,19319,19321,19333,19337,19339,19343,19351,19361,19363,19367,19373,19379,19381,19387,19391,19399,19403,19417,19421,19423,19427,19429,19433,19441,19447,19451,19457,19463,19469,19471,19477,19483,19489,19493,19499,19501,19507,19511,19517,19519,19529,19531,19541,19543,19549,19553,19559,19561,19567,19571,19573,19577,19583,19589,19597,19601
DATA 19603,19609,19619,19627,19631,19633,19637,19639,19651,19661,19667,19673,19681,19687,19693,19697,19699,19703,19709,19711,19717,19727,19729,19739,19741,19751,19753,19757,19759,19763,19769,19771,19777,19781,19783,19787,19793,19801,19807,19813,19819,19823,19829,19837,19841,19843,19847,19849,19853,19861,19867,19871,19879,19883,19889,19891,19897,19907,19909,19913,19919,19927,19931,19933,19937,19939,19949,19951,19961,19963,19967,19969,19973,19979,19991,19993,19997,20003,20011,20017
DATA 20021,20023,20029,20039,20047,20051,20057,20063,20071,20077,20081,20087,20089,20093,20099,20101,20107,20113,20117,20123,20129,20131,20143,20147,20149,20159,20161,20171,20173,20177,20179,20183,20191,20197,20201,20203,20213,20219,20221,20227,20231,20233,20239,20243,20249,20257,20261,20263,20269,20281,20287,20291,20297,20299,20303,20309,20311,20323,20327,20329,20333,20341,20347,20351,20353,20357,20359,20369,20381,20387,20389,20393,20399,20401,20407,20411,20413,20417,20429,20431
DATA 20437,20441,20443,20453,20459,20467,20473,20477,20479,20483,20491,20497,20507,20509,20513,20519,20521,20533,20539,20543,20549,20551,20557,20561,20563,20567,20569,20591,20593,20597,20599,20609,20611,20617,20621,20623,20627,20633,20639,20641,20651,20653,20659,20663,20677,20681,20687,20689,20693,20701,20707,20711,20717,20719,20723,20729,20731,20737,20743,20747,20749,20753,20759,20767,20771,20773,20777,20789,20791,20803,20807,20809,20819,20821,20827,20831,20833,20837,20843,20849
DATA 20851,20857,20861,20863,20869,20873,20879,20887,20893,20897,20899,20903,20921,20927,20929,20939,20941,20947,20953,20957,20959,20963,20971,20981,20983,20987,20989,21001,21011,21013,21017,21019,21023,21029,21031,21037,21041,21053,21059,21061,21067,21071,21079,21083,21089,21097,21101,21103,21107,21113,21121,21127,21137,21139,21143,21149,21157,21163,21167,21169,21173,21179,21181,21187,21191,21193,21199,21209,21211,21221,21223,21227,21233,21239,21247,21251,21253,21257,21269,21271
DATA 21277,21283,21289,21293,21299,21311,21313,21317,21319,21323,21331,21337,21341,21347,21349,21353,21361,21367,21377,21379,21383,21389,21391,21397,21401,21403,21407,21409,21419,21421,21431,21433,21443,21449,21451,21457,21467,21473,21479,21481,21487,21491,21493,21499,21503,21509,21517,21521,21523,21529,21533,21547,21551,21557,21559,21563,21569,21577,21583,21587,21589,21599,21601,21607,21611,21613,21617,21629,21631,21641,21643,21647,21649,21653,21661,21667,21673,21677,21683,21689
DATA 21691,21701,21709,21713,21719,21727,21731,21733,21737,21739,21743,21751,21757,21761,21767,21773,21779,21781,21787,21793,21797,21799,21803,21809,21811,21817,21821,21823,21829,21839,21841,21851,21859,21863,21869,21871,21877,21881,21883,21887,21893,21899,21907,21911,21913,21919,21929,21937,21941,21943,21947,21949,21953,21961,21971,21977,21979,21991,21997,22003,22007,22013,22019,22021,22027,22031,22037,22039,22049,22051,22063,22067,22069,22073,22079,22081,22091,22093,22097,22103
DATA 22109,22111,22117,22123,22129,22133,22147,22151,22153,22157,22159,22163,22171,22177,22181,22189,22193,22199,22201,22207,22213,22219,22223,22229,22237,22241,22247,22249,22259,22261,22271,22273,22277,22279,22283,22289,22291,22301,22303,22307,22313,22327,22331,22333,22339,22343,22349,22357,22361,22367,22369,22381,22387,22391,22397,22403,22409,22411,22417,22423,22427,22433,22439,22441,22447,22453,22457,22459,22469,22471,22481,22483,22487,22489,22493,22499,22501,22507,22511,22513
DATA 22523,22531,22537,22541,22543,22549,22553,22559,22567,22571,22573,22577,22579,22591,22597,22601,22609,22613,22619,22621,22637,22639,22643,22651,22657,22661,22663,22667,22669,22679,22681,22691,22697,22699,22703,22709,22717,22721,22723,22727,22733,22739,22741,22747,22751,22753,22769,22777,22783,22787,22793,22801,22807,22811,22817,22819,22823,22829,22831,22837,22843,22849,22853,22859,22861,22871,22873,22877,22879,22889,22901,22903,22907,22909,22921,22927,22931,22933,22937,22943
DATA 22949,22951,22961,22963,22969,22973,22987,22991,22993,22999,23003,23011,23017,23021,23027,23029,23033,23039,23041,23047,23053,23057,23059,23063,23069,23071,23077,23081,23083,23087,23099,23113,23117,23119,23123,23129,23131,23137,23141,23143,23147,23159,23161,23167,23171,23173,23183,23189,23197,23201,23203,23207,23209,23213,23227,23237,23239,23249,23251,23263,23267,23269,23273,23279,23281,23291,23293,23297,23299,23311,23321,23323,23327,23329,23333,23339,23341,23347,23351,23357
DATA 23363,23369,23371,23377,23381,23383,23389,23393,23399,23407,23411,23417,23423,23431,23437,23447,23449,23453,23459,23461,23467,23473,23477,23479,23483,23489,23497,23501,23503,23509,23519,23521,23531,23533,23537,23539,23549,23557,23561,23563,23567,23579,23581,23587,23591,23593,23599,23603,23609,23623,23627,23629,23633,23641,23651,23657,23659,23663,23669,23671,23677,23687,23689,23693,23701,23707,23711,23713,23717,23719,23729,23731,23741,23743,23747,23753,23759,23761,23767,23773
DATA 23783,23789,23791,23797,23801,23809,23813,23819,23827,23831,23833,23839,23843,23851,23857,23861,23867,23869,23873,23879,23887,23893,23897,23899,23909,23911,23917,23921,23923,23927,23929,23939,23941,23951,23953,23957,23963,23971,23977,23981,23983,23987,23993,23999,24001,24007,24019,24023,24029,24041,24043,24047,24049,24053,24061,24067,24071,24077,24083,24091,24097,24103,24107,24109,24113,24119,24121,24127,24131,24133,24137,24139,24149,24151,24161,24163,24169,24173,24179,24181
DATA 24187,24191,24197,24203,24209,24217,24221,24223,24229,24239,24247,24251,24253,24257,24259,24263,24281,24287,24289,24293,24301,24307,24313,24317,24319,24329,24331,24337,24341,24347,24359,24361,24371,24373,24377,24379,24383,24389,24391,24397,24403,24407,24413,24419,24421,24433,24439,24443,24449,24457,24461,24463,24467,24469,24473,24481,24487,24491,24499,24503,24509,24511,24517,24523,24527,24529,24533,24539,24547,24551,24553,24559,24569,24571,24581,24587,24589,24593,24599,24601
DATA 24611,24613,24617,24623,24631,24637,24641,24643,24649,24653,24659,24667,24671,24677,24679,24683,24691,24697,24701,24707,24709,24719,24721,24727,24733,24737,24743,24749,24751,24757,24763,24767,24769,24779,24781,24793,24797,24799,24803,24809,24811,24821,24823,24833,24839,24841,24847,24851,24853,24859,24863,24877,24881,24883,24887,24889,24901,24907,24911,24917,24919,24923,24929,24931,24943,24949,24953,24961,24967,24971,24977,24979,24989,24991,25001,25007,25009,25013,25019,25021
DATA 25027,25031,25033,25037,25043,25049,25057,25061,25063,25073,25079,25087,25093,25097,25099,25111,25117,25121,25127,25133,25139,25141,25147,25153,25159,25163,25169,25171,25177,25183,25187,25189,25199,25211,25213,25217,25219,25229,25231,25237,25241,25243,25247,25253,25261,25271,25273,25279,25283,25297,25301,25303,25307,25309,25313,25321,25327,25331,25339,25343,25349,25351,25357,25367,25369,25373,25379,25381,25387,25391,25393,25397,25409,25411,25423,25427,25429,25433,25439,25447
DATA 25451,25453,25457,25463,25469,25471,25477,25481,25483,25489,25499,25507,25511,25513,25517,25523,25537,25541,25547,25549,25559,25561,25567,25573,25577,25579,25583,25589,25591,25601,25603,25607,25609,25621,25631,25633,25637,25639,25643,25651,25657,25661,25667,25673,25679,25681,25687,25691,25693,25699,25703,25709,25717,25721,25723,25733,25741,25747,25757,25759,25763,25769,25771,25777,25783,25787,25789,25793,25799,25801,25807,25811,25813,25819,25829,25841,25843,25847,25849,25853
DATA 25859,25867,25871,25873,25877,25889,25891,25897,25901,25903,25913,25919,25931,25933,25937,25939,25943,25951,25957,25967,25969,25973,25979,25981,25997,25999,26003,26009,26011,26017,26021,26023,26027,26029,26041,26051,26053,26057,26063,26069,26071,26077,26083,26087,26093,26099,26101,26107,26111,26113,26119,26123,26129,26137,26141,26149,26153,26161,26167,26171,26177,26179,26183,26189,26197,26203,26207,26209,26219,26227,26231,26233,26237,26239,26249,26251,26261,26263,26267,26269
DATA 26281,26287,26291,26293,26297,26303,26309,26311,26317,26321,26329,26333,26339,26347,26353,26357,26359,26363,26371,26381,26387,26393,26399,26401,26407,26413,26417,26419,26423,26431,26437,26441,26443,26447,26449,26459,26461,26471,26473,26479,26483,26489,26491,26497,26501,26503,26513,26519,26527,26531,26539,26549,26557,26561,26563,26567,26569,26573,26581,26591,26597,26599,26603,26617,26623,26627,26629,26633,26639,26641,26647,26651,26657,26659,26669,26671,26681,26683,26687,26693
DATA 26699,26701,26707,26711,26713,26717,26723,26729,26731,26737,26743,26749,26753,26759,26771,26773,26777,26779,26783,26791,26797,26801,26809,26813,26821,26827,26833,26837,26839,26843,26849,26857,26861,26863,26867,26869,26879,26881,26891,26893,26899,26903,26909,26911,26921,26927,26933,26941,26947,26951,26953,26959,26963,26969,26977,26981,26987,26989,26993,27007,27011,27017,27019,27023,27029,27031,27037,27043,27047,27059,27061,27067,27073,27077,27089,27091,27101,27103,27107,27109
DATA 27113,27119,27121,27127,27133,27143,27149,27151,27161,27163,27169,27173,27179,27187,27191,27193,27197,27199,27211,27217,27221,27227,27229,27233,27239,27241,27253,27257,27259,27263,27271,27277,27281,27283,27289,27299,27301,27311,27317,27319,27323,27329,27331,27337,27341,27343,27347,27353,27359,27361,27367,27371,27373,27383,27389,27397,27403,27407,27409,27413,27421,27427,27431,27437,27439,27449,27451,27457,27463,27473,27479,27481,27487,27491,27493,27497,27499,27509,27523,27527
DATA 27529,27539,27541,27551,27553,27557,27563,27569,27571,27581,27583,27589,27593,27607,27611,27613,27617,27619,27623,27631,27637,27641,27647,27649,27653,27659,27661,27667,27673,27679,27683,27689,27691,27697,27701,27707,27719,27721,27733,27737,27739,27743,27749,27751,27757,27761,27763,27767,27773,27779,27787,27791,27793,27799,27803,27809,27817,27821,27823,27827,27829,27847,27851,27857,27869,27871,27877,27883,27887,27889,27893,27899,27901,27913,27917,27919,27931,27941,27943,27947
DATA 27949,27953,27959,27961,27967,27971,27977,27983,27991,27997,28001,28003,28009,28013,28019,28027,28031,28033,28037,28043,28051,28057,28069,28073,28079,28081,28087,28097,28099,28103,28109,28111,28117,28121,28123,28129,28139,28141,28151,28153,28157,28159,28163,28169,28177,28181,28183,28187,28199,28201,28207,28211,28213,28219,28229,28241,28243,28247,28253,28261,28267,28271,28277,28279,28283,28289,28291,28297,28307,28309,28313,28319,28321,28331,28333,28337,28339,28349,28351,28361
DATA 28363,28367,28373,28381,28387,28393,28397,28403,28409,28411,28417,28421,28423,28429,28433,28439,28447,28451,28453,28459,28463,28471,28477,28481,28487,28489,28493,28499,28507,28513,28517,28519,28529,28531,28537,28541,28543,28547,28549,28559,28571,28573,28577,28579,28583,28591,28597,28601,28603,28607,28619,28621,28627,28631,28643,28649,28657,28661,28663,28667,28669,28673,28681,28687,28697,28703,28709,28711,28723,28727,28729,28733,28739,28741,28747,28751,28753,28757,28759,28771
DATA 28781,28783,28789,28793,28799,28801,28807,28811,28813,28817,28823,28829,28837,28841,28843,28849,28859,28867,28871,28877,28879,28883,28891,28901,28907,28909,28913,28921,28927,28933,28937,28939,28943,28949,28957,28961,28967,28969,28979,28981,28991,28993,28997,28999,29009,29011,29017,29021,29023,29027,29033,29039,29041,29047,29053,29059,29063,29069,29077,29083,29087,29089,29093,29101,29111,29119,29123,29129,29131,29137,29143,29147,29149,29153,29167,29171,29173,29177,29179,29189
DATA 29191,29201,29203,29207,29209,29213,29219,29221,29231,29233,29243,29251,29257,29261,29269,29273,29279,29287,29291,29297,29299,29303,29311,29317,29321,29327,29329,29333,29339,29347,29353,29357,29363,29369,29371,29377,29383,29387,29389,29399,29401,29411,29413,29417,29423,29429,29431,29437,29441,29443,29453,29459,29461,29467,29473,29479,29483,29489,29501,29503,29507,29509,29521,29527,29531,29537,29539,29543,29551,29563,29567,29569,29573,29581,29587,29591,29593,29597,29599,29609
DATA 29611,29621,29629,29633,29639,29641,29647,29651,29657,29663,29669,29671,29677,29681,29683,29693,29699,29707,29713,29717,29719,29723,29737,29741,29747,29749,29753,29759,29761,29767,29773,29779,29789,29791,29797,29801,29803,29807,29819,29831,29833,29837,29839,29849,29851,29857,29863,29867,29873,29879,29881,29891,29893,29899,29903,29917,29921,29923,29927,29929,29933,29941,29947,29951,29957,29959,29963,29969,29971,29977,29983,29987,29989,29993,29999,30001,30007,30011,30013,30029
FOR I=0 TO INT(SQR(N)/30030)
   FOR J=1 TO 5760
      IF I=0 AND J=1 THEN LET J=2
      LET K=30030*I+A(J)
      IF N<K THEN EXIT FOR
      IF P(K)=0 THEN
         FOR L=K*K TO N STEP K*2
            LET P(L)=1
         NEXT L
      END IF
   NEXT J
NEXT I
LET SUM=2+3+5+7+11+13
FOR I=0 TO INT(N/30030)
   FOR J=1 TO 5760
      IF I=0 AND J=1 THEN LET J=2
      LET K=30030*I+A(J)
      IF N<K THEN EXIT FOR
      IF P(K)=0 THEN
         LET SUM=SUM+K
      END IF
   NEXT J
NEXT I
LET PRIMESUM=SUM
END FUNCTION


なお、素数個数に関して私たちには足元にも及ばない(征に頂点に君臨する史上最速の)プログラムがあります。
超高速アルゴリズムを搭載し128bit整数型(10^31迄対応)を使用して10^27までの素数個数をも求めた
驚愕のソースプログラム(C++)が現在GitHubにて公開されています。(gccにてコンパイル可能)
wolfram社のあの有名ソフトにも採用されているようです


https://github.com/kimwalisch/primecount
https://freesoft.dev/program/10589177


10^1 4
10^2 25
10^3 168
10^4 1229
10^5 9592
10^6 78498
10^7 664579
10^8 5761455
10^9 50847534
10^10 455052511
10^11 4118054813
10^12 37607912018
10^13 346065536839
10^14 3204941750802
10^15 29844570422669
10^16 279238341033925
10^17 2623557157654233
10^18 24739954287740860
10^19 234057667276344607
10^20 2220819602560918840
10^21 21127269486018731928
10^22 201467286689315906290
10^23 1925320391606803968923
10^24 18435599767349200867866
10^25 176846309399143769411680
10^26 1699246750872437141327603
10^27 16352460426841680446427399
 

Re: dllファイルの実行ができません

 投稿者:白石 和夫  投稿日:2021年11月 4日(木)12時52分16秒
  > No.4962[元記事へ]

しばっちさんへのお返事です。

> Windows 11を使用しています。
>
> Windows用Lazarus版Basic0705Ja(Win64)でdllを
> 使おうとすると「ASSIGNはここに書けません」とエラーが出ます。
>
> これは仕様変更されたのでしょうか?
> ヘルプのサンプルも実行できません。
>

同梱のヘルプはVer.8.1のもので,Ver.0.7のヘルプは未完成です。
Ver. 0.7 は,Full BASIC規格の範囲では他のバージョンとほぼ同じですが,独自拡張部分は同等ではありません。





 

素数積篩 210n+k

 投稿者:たろさ  投稿日:2021年11月 7日(日)19時45分32秒
  !210n+k篩
OPTION ARITHMETIC NATIVE
LET t0=TIME

LET k=316241   !MAX 100,008,370,081
LET k2=27294
DIM P(k)
DIM A(k2) !素数
SUB prime(v)  !エラトステネスの奇数列篩
   LET k9=v
   LET h1=1
   LET A(h1)=2
   LET h1=2
   FOR n1=3 TO k9 STEP 2
      IF P(n1)=0 THEN
         LET A(h1)=n1
         LET h1=h1+1
         IF h1>k9+1 THEN GOTO 20
      END IF
      FOR k1=n1 TO k9 STEP 2
         LET m1=n1*k1
         IF m1>k9 THEN GOTO 10
         LET P(m1)=1
      NEXT k1
10    NEXT n1
20
   END SUB
   CALL prime(k)



   DIM B(48)
   DATA 1,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109
   DATA 113,121,127,131,137,139,143,149,151,157,163,167,169,173,179,181,187,191,193,197,199,209

   MAT READ B

   LET Q=210         !1E8=5761455(0.28秒)
   LET k1=1E8        !1E9=50847534(3.96秒) 1E6=78498
   LET ka=IP(k1/Q )  !1E10=455052511(54.25秒)
   LET kb=k1         !1E11=4118054813(686.84秒)11分26秒84 (686.93秒)
   LET kc=IP(SQR(k1))      !1E+8=1229, 1E+7=447
   LET kd=IP(ka/11+11)
   DIM D(ka)


   LET k3=0
   FOR n=1 TO k2
      LET PP=A(n)
      IF PP > kc THEN EXIT FOR
      LET k3=k3+1
   NEXT n
   !PRINT "k3=";k3;kc

   LET cj =46

   FOR r=1 TO 48
      LET rr=B(r)
      MAT D = ZER

      FOR t=5 TO k3
         LET x=A(t)   !素数篩
         IF x^2 >  k1 THEN EXIT FOR


         IF MOD(x-rr,Q)=0 THEN
            LET y=(x-rr)/Q
            FOR f=1 TO kd
               LET ii=x*f+y
               IF ii>ka THEN EXIT FOR
               LET D(ii)=1
            NEXT f

         ELSE

            FOR i=1 TO 48
               LET rv=B(i)
               IF MOD(x*rv+rr,Q)=0 THEN
                  LET y=-(x*rv+rr)/Q
                  EXIT FOR
               END IF
            NEXT i

            FOR f=1 TO kd
               LET ii=x*f+y
               IF ii > ka THEN EXIT FOR
               IF ii <= 0 THEN GOTO 100
               LET D(ii)=1
100          NEXT f
          END IF
          !PRINT x;kd;f;ii;ka
       NEXT t

       FOR n=1 TO ka
          IF n*Q+rr>k1   THEN EXIT FOR
          IF D(n)=0 THEN LET cj=cj+1
       NEXT n
    NEXT r

    PRINT cj
    LET TM=TIME-t0
    PRINT USING"####." & REPEAT$("#",2):TM;
    PRINT "秒"
END

動作報告です。

Paract BASIC プログラム  210n+k篩  素数の個数を数えるプログラム

動作環境
Intel Core i7 -8565U    mouse m-Book MB-R500 ノート PC

Windows Version
Microsoft Windows 10 (10.0) Professional 64-bit

Paract BASIC Ver. 2.1.2.4 Rev.2   (2021.06.19)

Lazarus fpc-3.2.2-win64
lazarus-2.2.0RC1-fpc-3.2.2-win64.exe               2021-07-08 199.7 MB
lazarus-2.2.0RC1-fpc-3.2.2-cross-i386-win32-win64.exe 2021-07-08  55.1 MB
 

素数積篩 90n+k

 投稿者:たろさ  投稿日:2021年11月 8日(月)02時26分14秒
  !90n+k篩
OPTION ARITHMETIC NATIVE
LET t0=TIME

LET k=316241 !MAX 100,008,370,081
LET k2=27294
DIM P(k)
DIM A(k2) !素数
SUB prime(v)  !エラトステネスの奇数列篩
   LET k9=v
   LET h1=1
   LET A(h1)=2
   LET h1=2
   FOR n1=3 TO k9 STEP 2
      IF P(n1)=0 THEN
         LET A(h1)=n1
         LET h1=h1+1
         IF h1>k9+1 THEN GOTO 20
      END IF
      FOR k1=n1 TO k9 STEP 2
         LET m1=n1*k1
         IF m1>k9 THEN GOTO 10
         LET P(m1)=1
      NEXT k1
10    NEXT n1
20
   END SUB
   CALL prime(k)
   LET QP=24
   DIM B(QP)
   DATA  1,7,11,13,17,19,23,29,31,37,41,43,47,49,53,59,61,67,71,73,77,79,83,89

   MAT READ B

   LET Q=90        !1E8=5761455(0.33秒)
   LET k1=1E8      !1E9=50847534(4.87秒) 1E6=78498
   LET ka=IP(k1/Q) !1E10=455052511(70.92秒)
   LET kb=k1
   LET kc=IP(SQR(k1))
   LET kd=IP(ka/7+7)
   DIM D(ka)


   LET k3=0
   FOR n=1 TO k2
      LET PP=A(n)
      IF PP > kc THEN EXIT FOR
      LET k3=k3+1
   NEXT n
  ! PRINT "k3=";k3;PP;kc

   LET cj =QP

   FOR r=1 TO QP
      LET rr=B(r)
      MAT D = ZER

      FOR t=4 TO k3
         LET x=A(t)   !素数篩
         IF x^2 >  k1 THEN EXIT FOR

         IF MOD(x-rr,Q)=0 THEN
            LET y=(x-rr)/Q
            FOR f=1 TO kd
               LET ii=x*f+y
               IF ii>ka THEN EXIT FOR
               LET D(ii)=1
            NEXT f

         ELSE

            FOR i=1 TO QP
               LET rv=B(i)
               IF MOD(x*rv+rr,Q)=0 THEN
                  LET y=-(x*rv+rr)/Q
                  EXIT FOR
               END IF
            NEXT i

            FOR f=1 TO kd
               LET ii=x*f+y
               IF ii > ka THEN EXIT FOR
               IF ii <= 0 THEN GOTO 100
               LET D(ii)=1
100          NEXT f
          END IF
          !PRINT x;kd;f;ii;ka
       NEXT t

       FOR n=1 TO ka
          IF n*Q+rr>k1   THEN EXIT FOR
          IF D(n)=0 THEN LET cj=cj+1
       NEXT n
    NEXT r

    PRINT cj
    LET TM=TIME-t0
    PRINT USING"####." & REPEAT$("#",2):TM;
    PRINT "秒"
END

--------------------------------------------------------------------

100 ! 素数積n +kの値と個数を求めるprogram
110 LET W=90 !素数積を入力(素数階乗 6,30,210,2310,30030,510510,,,)
120 LET p=w
130 LET z=w
140 OPTION BASE 0   ! DIM文より手前の行にOPTION BASE 0を追加する。
150 DIM A(p)
160 DIM B(z)
170 LET t0=TIME
180 LET p=0           ! p の初期値を0とすると、初回 1になる。140の!を削除
190 LET z=1
191 PRINT"DATA ";
192 LET cc=0
193 LET ct=20
200 FOR k=1 TO w STEP 2              !素数倍を代入
210    !
220    !
230    FOR n=1 TO 20                 !素数倍周期  何周でも可能
240       LET m=w*n+k                !素数倍を代入
250       FOR i=3 TO SQR(m)  STEP 2  !篩
260          IF MOD(m,i)=0 THEN 300
270       NEXT i
280       !
290       LET B(z)=m
300    NEXT n
310    IF B(z)=0 THEN GOTO 370
320    LET A(p)=p
330    LET p=p+1
340    LET z=z+1
350    !
355    PRINT STR$(k);
356    LET cc=cc+1
357    IF cc=ct THEN
358       PRINT
359    ELSE
360       PRINT  ",";
361    END IF
362    IF cc=ct THEN
363       !PRINT
364       PRINT"DATA ";
365       LET ct=ct+20
366    END IF
370 NEXT k
380 !
390 PRINT "k=1から数えて";p;"個"
400 PRINT TIME-t0;"秒で計算しました"
410 END
 

素数積篩 180n+k

 投稿者:たろさ  投稿日:2021年11月 8日(月)03時07分3秒
  !180n+k篩
OPTION ARITHMETIC NATIVE
LET t0=TIME

LET k=316241 !MAX 100,008,370,081
LET k2=27294
DIM P(k)
DIM A(k2) !素数
SUB prime(v)  !エラトステネスの奇数列篩
   LET k9=v
   LET h1=1
   LET A(h1)=2
   LET h1=2
   FOR n1=3 TO k9 STEP 2
      IF P(n1)=0 THEN
         LET A(h1)=n1
         LET h1=h1+1
         IF h1>k9+1 THEN GOTO 20
      END IF
      FOR k1=n1 TO k9 STEP 2
         LET m1=n1*k1
         IF m1>k9 THEN GOTO 10
         LET P(m1)=1
      NEXT k1
10    NEXT n1
20
   END SUB
   CALL prime(k)
   LET QP=48
   DIM B(QP)
   DATA 1,7,11,13,17,19,23,29,31,37,41,43,47,49,53,59,61,67,71,73
   DATA 77,79,83,89,91,97,101,103,107,109,113,119,121,127,131,133,137,139,143,149
   DATA 151,157,161,163,167,169,173,179

   MAT READ B

   LET Q=180       !1E8=5761455(0.33秒)
   LET k1=1E8      !1E9=50847534(4.72秒) 1E6=78498
   LET ka=IP(k1/Q) !1E10=455052511(66.10秒)
   LET kb=k1
   LET kc=IP(SQR(k1))
   LET kd=IP(ka/7+7)
   DIM D(ka)


   LET k3=0
   FOR n=1 TO k2
      LET PP=A(n)
      IF PP > kc THEN EXIT FOR
      LET k3=k3+1
   NEXT n
   ! PRINT "k3=";k3;PP;kc

   LET cj =QP-7

   FOR r=1 TO QP
      LET rr=B(r)
      MAT D = ZER

      FOR t=4 TO k3
         LET x=A(t)   !素数篩
         IF x^2 >  k1 THEN EXIT FOR

         IF MOD(x-rr,Q)=0 THEN
            LET y=(x-rr)/Q
            FOR f=1 TO kd
               LET ii=x*f+y
               IF ii>ka THEN EXIT FOR
               LET D(ii)=1
            NEXT f

         ELSE

            FOR i=1 TO QP
               LET rv=B(i)
               IF MOD(x*rv+rr,Q)=0 THEN
                  LET y=-(x*rv+rr)/Q
                  EXIT FOR
               END IF
            NEXT i

            FOR f=1 TO kd
               LET ii=x*f+y
               IF ii > ka THEN EXIT FOR
               IF ii <= 0 THEN GOTO 100
               LET D(ii)=1
100          NEXT f
          END IF
          !PRINT x;kd;f;ii;ka
       NEXT t

       FOR n=1 TO ka
          IF n*Q+rr>k1   THEN EXIT FOR
          IF D(n)=0 THEN LET cj=cj+1
       NEXT n
    NEXT r

    PRINT cj
    LET TM=TIME-t0
    PRINT USING"####." & REPEAT$("#",2):TM;
    PRINT "秒"
END  
 

素数積篩 360n+k

 投稿者:たろさ  投稿日:2021年11月 8日(月)03時16分56秒
  !360n+k篩
OPTION ARITHMETIC NATIVE
LET t0=TIME

LET k=316241 !MAX 100,008,370,081
LET k2=27294
DIM P(k)
DIM A(k2) !素数
SUB prime(v)  !エラトステネスの奇数列篩
   LET k9=v
   LET h1=1
   LET A(h1)=2
   LET h1=2
   FOR n1=3 TO k9 STEP 2
      IF P(n1)=0 THEN
         LET A(h1)=n1
         LET h1=h1+1
         IF h1>k9+1 THEN GOTO 20
      END IF
      FOR k1=n1 TO k9 STEP 2
         LET m1=n1*k1
         IF m1>k9 THEN GOTO 10
         LET P(m1)=1
      NEXT k1
10    NEXT n1
20
   END SUB
   CALL prime(k)
   LET QP=96
   DIM B(QP)
   DATA 1,7,11,13,17,19,23,29,31,37,41,43,47,49,53,59,61,67,71,73
   DATA 77,79,83,89,91,97,101,103,107,109,113,119,121,127,131,133,137,139,143,149
   DATA 151,157,161,163,167,169,173,179,181,187,191,193,197,199,203,209,211,217,221,223
   DATA 227,229,233,239,241,247,251,253,257,259,263,269,271,277,281,283,287,289,293,299
   DATA 301,307,311,313,317,319,323,329,331,337,341,343,347,349,353,359


   MAT READ B

   LET Q=360       !1E8=5761455(0.33秒)
   LET k1=1E8      !1E9=50847534(4.38秒) 1E6=78498
   LET ka=IP(k1/Q) !1E10=455052511(55.36秒)
   LET kb=k1
   LET kc=IP(SQR(k1))
   LET kd=IP(ka/7+7)
   DIM D(ka)


   LET k3=0
   FOR n=1 TO k2
      LET PP=A(n)
      IF PP > kc THEN EXIT FOR
      LET k3=k3+1
   NEXT n
   ! PRINT "k3=";k3;PP;kc

   LET cj =QP-24

   FOR r=1 TO QP
      LET rr=B(r)
      MAT D = ZER

      FOR t=4 TO k3
         LET x=A(t)   !素数篩
         IF x^2 >  k1 THEN EXIT FOR

         IF MOD(x-rr,Q)=0 THEN
            LET y=(x-rr)/Q
            FOR f=1 TO kd
               LET ii=x*f+y
               IF ii>ka THEN EXIT FOR
               LET D(ii)=1
            NEXT f

         ELSE

            FOR i=1 TO QP
               LET rv=B(i)
               IF MOD(x*rv+rr,Q)=0 THEN
                  LET y=-(x*rv+rr)/Q
                  EXIT FOR
               END IF
            NEXT i

            FOR f=1 TO kd
               LET ii=x*f+y
               IF ii > ka THEN EXIT FOR
               IF ii <= 0 THEN GOTO 100
               LET D(ii)=1
100          NEXT f
          END IF
          !PRINT x;kd;f;ii;ka
       NEXT t

       FOR n=1 TO ka
          IF n*Q+rr>k1   THEN EXIT FOR
          IF D(n)=0 THEN LET cj=cj+1
       NEXT n
    NEXT r

    PRINT cj
    LET TM=TIME-t0
    PRINT USING"####." & REPEAT$("#",2):TM;
    PRINT "秒"
END        
 

Paract BASIC 210n+k篩

 投稿者:たろさ  投稿日:2021年11月 8日(月)03時44分35秒
  !210n+k篩  8スレッド     2021/07/10
!
!#4360
!
!Paract BASIC 210n+k篩 Ver.12  500兆  5/9  (1E8) step
!
DECLARE STRUCTURE struct1: 1 OF NUMERIC
DECLARE STRUCTURE struct2: 1 OF NUMERIC(1536277)
DECLARE STRUCTURE struct4: 3 OF NUMERIC
DECLARE SHARED sha OF struct2
DECLARE MESSAGE mes2 OF struct4
DECLARE MESSAGE mes3 OF struct4
DECLARE MESSAGE mes4 OF struct4
DECLARE MESSAGE mes5 OF struct4
DECLARE MESSAGE mes6 OF struct4
DECLARE MESSAGE mes7 OF struct4
DECLARE MESSAGE mes8 OF struct4
DECLARE MESSAGE met2 OF struct1
DECLARE MESSAGE met3 OF struct1
DECLARE MESSAGE met4 OF struct1
DECLARE MESSAGE met5 OF struct1
DECLARE MESSAGE met6 OF struct1
DECLARE MESSAGE met7 OF struct1
DECLARE MESSAGE met8 OF struct1
PARACT PART1
OPTION ARITHMETIC NATIVE
LET t1=TIME
LET k=24494963
LET k3=1536277
DECLARE EXTERNAL SUB prime
CALL prime(k)
WAIT EVENT Ok5
LET S=1E8  !pi(1E12),37607912018
LET E=1E10  !pi(1E11),4118054813    (1E10)455052511
LET ST=1E8

START Part2
START PART3
START PART4
START PART5
START PART6
START PART7
START PART8
SEND TO mes2 FROM S,E,ST
SEND TO mes3 FROM S,E,ST
SEND TO mes4 FROM S,E,ST
SEND TO mes5 FROM S,E,ST
SEND TO mes6 FROM S,E,ST
SEND TO mes7 FROM S,E,ST
SEND TO mes8 FROM S,E,ST
LET TOTAL=5761455
DECLARE EXTERNAL FUNCTION cprime
!DECLARE NUMERIC X,Y,Z

FOR I=S TO E-ST STEP ST
   LET t0=TIME
   LET L=cprime(I,I+ST/8)
   RECEIVE FROM met2 TO X
   RECEIVE FROM met3 TO Y
   RECEIVE FROM met4 TO Z
   RECEIVE FROM met5 TO X1
   RECEIVE FROM met6 TO Y1
   RECEIVE FROM met7 TO Z1
   RECEIVE FROM met8 TO X2
   LET L=L+X+Y+Z+X1+Y1+Z1+X2
   LET TOTAL=TOTAL+L
   !IF MOD(I+ST,1E9)=0 THEN PRINT (I+ST)/1E9;TOTAL
   !PRINT TOTAL
   PRINT (I+ST)/1E8;TOTAL;L;
   LET TM=TIME-t0
   PRINT USING"###.###":TM;
   PRINT "秒"
NEXT I
LET TM=TIME-t1
PRINT USING"#####.##":TM;
PRINT "秒"
END PARACT

PARACT PART2
OPTION ARITHMETIC NATIVE
RECEIVE FROM mes2 TO S,E,ST
DECLARE EXTERNAL FUNCTION cprime
DECLARE NUMERIC L
FOR I=S TO E-ST STEP ST
   LET L=cprime(I+ST/8,I+ST/4)
   SEND TO met2 FROM L
NEXT I
END PARACT

PARACT PART3
OPTION ARITHMETIC NATIVE
RECEIVE FROM mes3 TO S,E,ST
DECLARE EXTERNAL FUNCTION cprime
DECLARE NUMERIC L
FOR I=S TO E-ST STEP ST
   LET L=cprime(I+ST/4,I+3*ST/8)
   SEND TO met3 FROM L
NEXT I
END PARACT

PARACT PART4
OPTION ARITHMETIC NATIVE
RECEIVE FROM mes4 TO S,E,ST
DECLARE EXTERNAL FUNCTION cprime
DECLARE NUMERIC L
FOR I=S TO E-ST STEP ST
   LET L=cprime(I+3*ST/8,I+ST/2)
   SEND TO met4 FROM L
NEXT I
END PARACT

PARACT PART5
OPTION ARITHMETIC NATIVE
RECEIVE FROM mes5 TO S,E,ST
DECLARE EXTERNAL FUNCTION cprime
DECLARE NUMERIC L
FOR I=S TO E-ST STEP ST
   LET L=cprime(I+ST/2,I+5*ST/8)
   SEND TO met5 FROM L
NEXT I
END PARACT

PARACT PART6
OPTION ARITHMETIC NATIVE
RECEIVE FROM mes6 TO S,E,ST
DECLARE EXTERNAL FUNCTION cprime
DECLARE NUMERIC L
FOR I=S TO E-ST STEP ST
   LET L=cprime(I+5*ST/8,I+3*ST/4)
   SEND TO met6 FROM L
NEXT I
END PARACT

PARACT PART7
OPTION ARITHMETIC NATIVE
RECEIVE FROM mes7 TO S,E,ST
DECLARE EXTERNAL FUNCTION cprime
DECLARE NUMERIC L
FOR I=S TO E-ST STEP ST
   LET L=cprime(I+3*ST/4,I+7*ST/8)
   SEND TO met7 FROM L
NEXT I
END PARACT

PARACT PART8
OPTION ARITHMETIC NATIVE
RECEIVE FROM mes8 TO S,E,ST
DECLARE EXTERNAL FUNCTION cprime
DECLARE NUMERIC L
FOR I=S TO E-ST STEP ST
   LET L=cprime(I+7*ST/8,I+ST)
   SEND TO met8 FROM L
NEXT I
END PARACT

EXTERNAL FUNCTION cprime(k4,k6)
OPTION ARITHMETIC NATIVE
DECLARE NUMERIC G(1536277) !素数
GET FROM sha TO G

DIM B(48)
DATA 1,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109
DATA 113,121,127,131,137,139,143,149,151,157,163,167,169,173,179,181,187,191,193,197,199,209

MAT READ B
LET Q=210
LET U=IP(k6/Q)
LET W=IP(k4/Q)
LET kd=IP(U/11+11)
LET kp=IP(SQR(k6))

DIM D(0 TO U-W)

LET COUNT=0
FOR r=1 TO 48
   LET rr=B(r)
   MAT D = ZER
   LET MD=0
   LET t=5

   DO
      LET cca=0
      LET x=G(t)
      IF x^2>k6 THEN EXIT DO
      LET G1=INT(W/x)
      IF MOD(x-rr,Q)=0 THEN
         LET y=(x-rr)/Q
         GOTO 800
      ELSE

         FOR i=1 TO 48
            LET rv=B(i)
            IF MOD(x*rv+rr,Q)=0 THEN
               LET y=-(x*rv+rr)/Q
               GOTO 800
               EXIT FOR
            END IF
         NEXT i
      END IF

      IF x*G1+y < W THEN
         DO
            LET G1=G1+x
            IF x*G1+y => W THEN EXIT DO
         LOOP
      END IF

800       FOR f=G1 TO kd
             IF x*f+y < W THEN  GOTO 900
             IF x*f+y>U THEN GOTO 1000
             LET D(x*f+y-W)=1
900       NEXT f
1000       LET t=t+1

        LOOP

        FOR n=0 TO U-W
           LET ST=n+W
           IF D(n)=0 THEN
              IF Q*ST+rr>k4 AND Q*ST+rr<k6 THEN LET COUNT=COUNT+1
           END IF
        NEXT n
        LET L=L+6
     NEXT r
     LET cprime=COUNT
  END FUNCTION

  EXTERNAL SUB prime(k)
     OPTION ARITHMETIC NATIVE
     DECLARE NUMERIC G(1536277) !素数
     !エラトステネスの篩
     LET Fu=5633
     LET Fm=739
     DIM P(Fu)
     DIM A(Fm)
     MAT P=ZER
     MAT A=ZER
     LET A(1)=2
     LET H1=1
     FOR I=3 TO SQR(Fu) STEP 2
        IF P(I)=0 THEN
           FOR J=I*I TO Fu STEP I
              LET P(J)=1
           NEXT J
        END IF
     NEXT I
     FOR I=3 TO Fu STEP 2
        IF P(I)=0 THEN
           LET H1=H1+1
           LET A(H1)=I
        END IF
     NEXT I

     LET Q=6
     LET k7=k          !篩の計算範囲
     LET k5=IP(k7/Q)+1
     DIM Au(k5),Av(k5)

     MAT Au = ZER     !(6*n-1)
     MAT Av = ZER     !(6*n+1)

     FOR n=3 TO Fm
        LET Pu=A(n)
        IF Pu^2>=k THEN EXIT FOR
        IF MOD(Pu+1,Q)=0 THEN !(6*n-1)
           LET ru=(Pu+1)/Q
           FOR i=1 TO k5
              IF Pu*i+ru>k5 THEN EXIT FOR
              LET Au(Pu*i+ru)=1
           NEXT i
        END IF

        IF MOD(Pu-1,Q)=0 THEN
           LET ru=(Pu-1)/Q
           FOR i=1 TO k5
              IF Pu*i-ru>k5 THEN EXIT FOR
              LET Au(Pu*i-ru)=1
           NEXT i
        END IF

        IF MOD(Pu+1,Q)=0 THEN !(6*n+1)
           LET ru=(Pu+1)/Q
           FOR i=1 TO k5
              IF Pu*i-ru>k5 THEN EXIT FOR
              LET Av(Pu*i-ru)=1
           NEXT i
        END IF

        IF MOD(Pu-1,Q)=0 THEN
           LET ru=(Pu-1)/Q
           FOR i=1 TO k5
              IF Pu*i+ru>k5 THEN EXIT FOR
              LET Av(Pu*i+ru)=1
           NEXT i
        END IF
     NEXT n

     LET G(1)=2
     LET G(2)=3
     LET cz=2
     FOR n=1 TO k5
        IF 6*n-1>k7 THEN GOTO 100
        IF Au(n)=0 THEN
           LET cz=cz+1
           LET G(cz)=6*n-1
        END IF
100    IF 6*n+1>k7 THEN EXIT FOR
       IF Av(n)=0  THEN
          LET cz=cz+1
          LET G(cz)=6*n+1
       END IF
    NEXT n
    PUT TO sha FROM G
    SIGNAL Ok5
END SUB


Paract BASIC プログラム 210n+k篩

1億ループ 1億間の素数の個数を数えます。

計算結果

2  11078937  5317482    .141秒
3  16252325  5173388    .109秒
4  21336326  5084001    .094秒
5  26355867  5019541    .187秒
6  31324703  4968836    .125秒
7  36252931  4928228    .109秒
8  41146179  4893248    .125秒
9  46009215  4863036    .110秒
10  50847534  4838319    .144秒

途中省略

90  411523195  4363605    .297秒
91  415885628  4362433    .312秒
92  420243162  4357534    .314秒
93  424603409  4360247    .305秒
94  428958595  4355186    .308秒
95  433311792  4353197    .316秒
96  437663672  4351880    .375秒
97  442014876  4351204    .312秒
98  446362736  4347860    .314秒
99  450708777  4346041    .376秒
100  455052511  4343734    .312秒
   25.93秒


動作環境
Intel Core i7 -8565U    mouse m-Book MB-R500 ノート PC
Intel COre i7 -10700K   自作パソコン
Intel Core i9 -11900KF 自作パソコン

Windows Version
Microsoft Windows 10 (10.0) Professional 64-bit

Paract BASIC Ver. 2.1.2.4 Rev.2   (2021.06.19)

Lazarus fpc-3.2.2-win64
lazarus-2.2.0RC1-fpc-3.2.2-win64.exe               2021-07-08 199.7 MB
lazarus-2.2.0RC1-fpc-3.2.2-cross-i386-win32-win64.exe 2021-07-08  55.1 MB
 

1億~1兆までの素数の個数を数える計算時間 14分21.37秒

 投稿者:たろさ  投稿日:2021年11月 8日(月)10時54分52秒
  !30n+k篩  8スレッド     2021/07/10
!
!#4360
!
!Paract BASIC 30n+k篩 Ver.12  500兆  5/9  (1E8) step
!
DECLARE STRUCTURE struct1: 1 OF NUMERIC
DECLARE STRUCTURE struct2: 1 OF NUMERIC(1536277)
DECLARE STRUCTURE struct4: 3 OF NUMERIC
DECLARE SHARED sha OF struct2
DECLARE MESSAGE mes2 OF struct4
DECLARE MESSAGE mes3 OF struct4
DECLARE MESSAGE mes4 OF struct4
DECLARE MESSAGE mes5 OF struct4
DECLARE MESSAGE mes6 OF struct4
DECLARE MESSAGE mes7 OF struct4
DECLARE MESSAGE mes8 OF struct4
DECLARE MESSAGE met2 OF struct1
DECLARE MESSAGE met3 OF struct1
DECLARE MESSAGE met4 OF struct1
DECLARE MESSAGE met5 OF struct1
DECLARE MESSAGE met6 OF struct1
DECLARE MESSAGE met7 OF struct1
DECLARE MESSAGE met8 OF struct1
PARACT PART1
OPTION ARITHMETIC NATIVE
LET t1=TIME
LET k=24494963
LET k3=1536277
DECLARE EXTERNAL SUB prime
CALL prime(k)
WAIT EVENT Ok5
LET S=1E8  !110E11  !pi(1E12),37607912018
LET E=1E10 !111E11  !pi(1E11),4118054813    (1E10)455052511
LET ST=1E8

START Part2
START PART3
START PART4
START PART5
START PART6
START PART7
START PART8
SEND TO mes2 FROM S,E,ST
SEND TO mes3 FROM S,E,ST
SEND TO mes4 FROM S,E,ST
SEND TO mes5 FROM S,E,ST
SEND TO mes6 FROM S,E,ST
SEND TO mes7 FROM S,E,ST
SEND TO mes8 FROM S,E,ST
LET TOTAL=5761455
DECLARE EXTERNAL FUNCTION cprime
!DECLARE NUMERIC X,Y,Z

FOR I=S TO E-ST STEP ST
   LET t0=TIME
   LET L=cprime(I,I+ST/8)
   RECEIVE FROM met2 TO X
   RECEIVE FROM met3 TO Y
   RECEIVE FROM met4 TO Z
   RECEIVE FROM met5 TO X1
   RECEIVE FROM met6 TO Y1
   RECEIVE FROM met7 TO Z1
   RECEIVE FROM met8 TO X2
   LET L=L+X+Y+Z+X1+Y1+Z1+X2
   LET TOTAL=TOTAL+L
   !IF MOD(I+ST,1E9)=0 THEN PRINT (I+ST)/1E9;TOTAL
   !PRINT TOTAL
   PRINT (I+ST)/1E8;TOTAL;L;
   LET TM=TIME-t0
   PRINT USING"###.###":TM;
   PRINT "秒"
NEXT I
LET TM=TIME-t1
PRINT USING"#####.##":TM;
PRINT "秒"
END PARACT

PARACT PART2
OPTION ARITHMETIC NATIVE
RECEIVE FROM mes2 TO S,E,ST
DECLARE EXTERNAL FUNCTION cprime
DECLARE NUMERIC L
FOR I=S TO E-ST STEP ST
   LET L=cprime(I+ST/8,I+ST/4)
   SEND TO met2 FROM L
NEXT I
END PARACT

PARACT PART3
OPTION ARITHMETIC NATIVE
RECEIVE FROM mes3 TO S,E,ST
DECLARE EXTERNAL FUNCTION cprime
DECLARE NUMERIC L
FOR I=S TO E-ST STEP ST
   LET L=cprime(I+ST/4,I+3*ST/8)
   SEND TO met3 FROM L
NEXT I
END PARACT

PARACT PART4
OPTION ARITHMETIC NATIVE
RECEIVE FROM mes4 TO S,E,ST
DECLARE EXTERNAL FUNCTION cprime
DECLARE NUMERIC L
FOR I=S TO E-ST STEP ST
   LET L=cprime(I+3*ST/8,I+ST/2)
   SEND TO met4 FROM L
NEXT I
END PARACT

PARACT PART5
OPTION ARITHMETIC NATIVE
RECEIVE FROM mes5 TO S,E,ST
DECLARE EXTERNAL FUNCTION cprime
DECLARE NUMERIC L
FOR I=S TO E-ST STEP ST
   LET L=cprime(I+ST/2,I+5*ST/8)
   SEND TO met5 FROM L
NEXT I
END PARACT

PARACT PART6
OPTION ARITHMETIC NATIVE
RECEIVE FROM mes6 TO S,E,ST
DECLARE EXTERNAL FUNCTION cprime
DECLARE NUMERIC L
FOR I=S TO E-ST STEP ST
   LET L=cprime(I+5*ST/8,I+3*ST/4)
   SEND TO met6 FROM L
NEXT I
END PARACT

PARACT PART7
OPTION ARITHMETIC NATIVE
RECEIVE FROM mes7 TO S,E,ST
DECLARE EXTERNAL FUNCTION cprime
DECLARE NUMERIC L
FOR I=S TO E-ST STEP ST
   LET L=cprime(I+3*ST/4,I+7*ST/8)
   SEND TO met7 FROM L
NEXT I
END PARACT

PARACT PART8
OPTION ARITHMETIC NATIVE
RECEIVE FROM mes8 TO S,E,ST
DECLARE EXTERNAL FUNCTION cprime
DECLARE NUMERIC L
FOR I=S TO E-ST STEP ST
   LET L=cprime(I+7*ST/8,I+ST)
   SEND TO met8 FROM L
NEXT I
END PARACT

EXTERNAL FUNCTION cprime(k4,k6)
OPTION ARITHMETIC NATIVE
DECLARE NUMERIC G(1536277) !素数
GET FROM sha TO G

DIM B(8)
DATA 1,7,11,13,17,19,23,29
MAT READ B
LET Q=30
LET U=IP(k6/Q)
LET W=IP(k4/Q)
LET kd=IP(U/7+7)
LET kp=IP(SQR(k6))

DIM D(0 TO U-W)

LET COUNT=0
FOR r=1 TO 8
   LET rr=B(r)
   MAT D = ZER
   LET MD=0
   LET t=4

   DO
      LET cca=0
      LET x=G(t)
      IF x^2>k6 THEN EXIT DO
      LET G1=INT(W/x)
      IF MOD(x-rr,Q)=0 THEN
         LET y=(x-rr)/Q
         GOTO 800
      ELSE

         FOR i=1 TO 7
            LET rv=B(i)
            IF MOD(x*rv+rr,Q)=0 THEN
               LET y=-(x*rv+rr)/Q
               GOTO 800
               EXIT FOR
            END IF
         NEXT i
      END IF

800       IF x*G1+y < W THEN
             DO
                LET G1=G1+1
                IF x*G1+y => W THEN EXIT DO
             LOOP
          END IF

          FOR f=G1 TO kd
             IF x*f+y < W THEN  GOTO 900
             IF x*f+y>U THEN GOTO 1000
             LET D(x*f+y-W)=1
900       NEXT f
1000       LET t=t+1

        LOOP

        FOR n=0 TO U-W
           LET ST=n+W
           IF D(n)=0 THEN
              IF Q*ST+rr>k4 AND Q*ST+rr<k6 THEN LET COUNT=COUNT+1
           END IF
        NEXT n
        LET L=L+6
     NEXT r
     LET cprime=COUNT
  END FUNCTION

  EXTERNAL SUB prime(k)
     OPTION ARITHMETIC NATIVE
     DECLARE NUMERIC G(1536277) !素数
     !エラトステネスの篩
     LET Fu=5633
     LET Fm=739
     DIM P(Fu)
     DIM A(Fm)
     MAT P=ZER
     MAT A=ZER
     LET A(1)=2
     LET H1=1
     FOR I=3 TO SQR(Fu) STEP 2
        IF P(I)=0 THEN
           FOR J=I*I TO Fu STEP I
              LET P(J)=1
           NEXT J
        END IF
     NEXT I
     FOR I=3 TO Fu STEP 2
        IF P(I)=0 THEN
           LET H1=H1+1
           LET A(H1)=I
        END IF
     NEXT I

     LET Q=6
     LET k7=k          !篩の計算範囲
     LET k5=IP(k7/Q)+1
     DIM Au(k5),Av(k5)

     MAT Au = ZER     !(6*n-1)
     MAT Av = ZER     !(6*n+1)

     FOR n=3 TO Fm
        LET Pu=A(n)
        IF Pu^2>=k THEN EXIT FOR
        IF MOD(Pu+1,Q)=0 THEN !(6*n-1)
           LET ru=(Pu+1)/Q
           FOR i=1 TO k5
              IF Pu*i+ru>k5 THEN EXIT FOR
              LET Au(Pu*i+ru)=1
           NEXT i
        END IF

        IF MOD(Pu-1,Q)=0 THEN
           LET ru=(Pu-1)/Q
           FOR i=1 TO k5
              IF Pu*i-ru>k5 THEN EXIT FOR
              LET Au(Pu*i-ru)=1
           NEXT i
        END IF

        IF MOD(Pu+1,Q)=0 THEN !(6*n+1)
           LET ru=(Pu+1)/Q
           FOR i=1 TO k5
              IF Pu*i-ru>k5 THEN EXIT FOR
              LET Av(Pu*i-ru)=1
           NEXT i
        END IF

        IF MOD(Pu-1,Q)=0 THEN
           LET ru=(Pu-1)/Q
           FOR i=1 TO k5
              IF Pu*i+ru>k5 THEN EXIT FOR
              LET Av(Pu*i+ru)=1
           NEXT i
        END IF
     NEXT n

     LET G(1)=2
     LET G(2)=3
     LET cz=2
     FOR n=1 TO k5
        IF 6*n-1>k7 THEN GOTO 100
        IF Au(n)=0 THEN
           LET cz=cz+1
           LET G(cz)=6*n-1
        END IF
100    IF 6*n+1>k7 THEN EXIT FOR
       IF Av(n)=0  THEN
          LET cz=cz+1
          LET G(cz)=6*n+1
       END IF
    NEXT n
    PUT TO sha FROM G
    SIGNAL Ok5
END SUB


初期設定は LET E=1E10 !    (1E10)455052511

計算結果

2  11078937  5317482    .156秒
3  16252325  5173388    .141秒
4  21336326  5084001    .152秒
5  26355867  5019541    .142秒
6  31324703  4968836    .168秒
7  36252931  4928228    .145秒
8  41146179  4893248    .163秒
9  46009215  4863036    .164秒
10  50847534  4838319    .165秒

途中省略

90  411523195  4363605    .167秒
91  415885628  4362433    .162秒
92  420243162  4357534    .170秒
93  424603409  4360247    .170秒
94  428958595  4355186    .162秒
95  433311792  4353197    .163秒
96  437663672  4351880    .179秒
97  442014876  4351204    .168秒
98  446362736  4347860    .170秒
99  450708777  4346041    .160秒
100  455052511  4343734    .175秒
   16.48秒     Lazarus fpc-3.2.2-win32

----------------------------------------

2  11078937  5317482    .082秒
3  16252325  5173388    .050秒
4  21336326  5084001    .067秒
5  26355867  5019541    .061秒
6  31324703  4968836    .070秒
7  36252931  4928228    .072秒
8  41146179  4893248    .083秒
9  46009215  4863036    .052秒
10  50847534  4838319    .071秒

途中省略

90  411523195  4363605    .079秒
91  415885628  4362433    .062秒
92  420243162  4357534    .088秒
93  424603409  4360247    .054秒
94  428958595  4355186    .082秒
95  433311792  4353197    .085秒
96  437663672  4351880    .076秒
97  442014876  4351204    .055秒
98  446362736  4347860    .086秒
99  450708777  4346041    .086秒
100  455052511  4343734    .065秒
    7.25秒     Lazarus fpc-3.2.2-win64

動作環境

Intel Core i9 -11900K 自作パソコン

Windows Version
Microsoft Windows 10 (10.0) Professional 64-bit

Paract BASIC Ver. 2.1.2.4 Rev.2   (2021.06.19)

Lazarus fpc-3.2.2-win64
lazarus-2.2.0RC1-fpc-3.2.2-win64.exe               2021-07-08 199.7 MB
lazarus-2.2.0RC1-fpc-3.2.2-cross-i386-win32-win64.exe 2021-07-08  55.1 MB
 

ベルマンフォード法

 投稿者:永野護  投稿日:2021年11月24日(水)10時40分51秒
  REM   ベルマンフォード法で最短経路を求めています。最短距離は何とか出てるみたいですが、途中経路の
REM   示し方がわかりません。ご多忙の折誠に恐縮ですが、よろしければ経路の示し方をご教授願えないでしょうか。
REM   コードは下記の通りです。7つの頂点を含むグラフです。

DIM  dist(7)

DIM  c(7,7)
FOR  y=1  TO  7
   FOR  z=1  TO  7
      LET c(y,z)=1000
   NEXT Z
NEXT Y

LET dist(1)=0
LET dist(2)=1000
LET dist(3)=1000
LET dist(4)=1000
LET dist(5)=1000
LET dist(6)=1000
LET dist(7)=1000
LET c(1,1)=0
LET c(2,2)=0
LET c(3,3)=0
LET c(4,4)=0
LET c(5,5)=0
LET c(6,6)=0
LET c(7,7)=0
LET c(1,2)=20
LET c(2,1)=20
LET c(1,3)=50
LET c(3,1)=50
LET c(2,3)=1
LET c(3,2)=1
LET c(2,4)=6
LET c(4,2)=6
LET c(3,4)=100
LET c(4,3)=100
LET c(3,5)=50
LET c(5,3)=50
LET c(4,5)=8
LET c(5,4)=8
LET c(4,7)=20
LET c(7,4)=20
LET c(5,7)=30
LET c(7,5)=30
LET c(5,6)=40
LET c(6,5)=40
LET c(6,7)=80
LET c(7,6)=80
REM-----------------------------------------------------------------
FOR  t=1  TO 6
   FOR i=1  TO  7
    IF     dist(i)>dist(t)+c(t,i)  THEN  LET dist(i)=dist(t)+c(t,i)
  NEXT  i
NEXT  t

REM   ------------------------------


FOR   x=1  TO  7
   PRINT  "最短距離="; dist(x);
NEXT x

END










 

Re: ベルマンフォード法

 投稿者:nagram  投稿日:2021年11月25日(木)10時18分33秒
  > No.4981[元記事へ]

永野護さんへのお返事です。

各頂点をA~Gとし、有向グラフの重みを次のようにし、Aを始点として各頂点への最短経路を求める問題ですね。

A→B=20, A→C=50
B→C=1, B→D=6
C→D=100, C→E=50
D→E=8, D→G=20
E→F=40, E→G=30
F→G=80


DIM  dist(7), node$(7),path$(7)
MAT READ node$
DATA  A,B,C,D,E,F,G
MAT path$=node$(1)&NUL$

DIM  c(7,7)
MAT c=1000*CON

LET dist(1)=0
LET dist(2)=1000
LET dist(3)=1000
LET dist(4)=1000
LET dist(5)=1000
LET dist(6)=1000
LET dist(7)=1000
LET c(1,1)=0
LET c(2,2)=0
LET c(3,3)=0
LET c(4,4)=0
LET c(5,5)=0
LET c(6,6)=0
LET c(7,7)=0
LET c(1,2)=20
LET c(2,1)=20
LET c(1,3)=50
LET c(3,1)=50
LET c(2,3)=1
LET c(3,2)=1
LET c(2,4)=6
LET c(4,2)=6
LET c(3,4)=100
LET c(4,3)=100
LET c(3,5)=50
LET c(5,3)=50
LET c(4,5)=8
LET c(5,4)=8
LET c(4,7)=20
LET c(7,4)=20
LET c(5,7)=30
LET c(7,5)=30
LET c(5,6)=40
LET c(6,5)=40
LET c(6,7)=80
LET c(7,6)=80
REM-----------------------------------------------------------------
FOR  t=1  TO 6
   FOR i=1  TO  7
      IF     dist(i)>dist(t)+c(t,i)  THEN
         LET dist(i)=dist(t)+c(t,i)
         LET path$(i)=path$(t)&node$(MAX(t,i))
      END IF
   NEXT  i
NEXT  t
REM   ------------------------------

FOR   x=1  TO  7
   PRINT  "最短距離="; dist(x); ", 経路=";path$(x)
NEXT x

END
 

(無題)

 投稿者:永野護  投稿日:2021年11月25日(木)11時09分21秒
  nagramさん、丁寧な解説ありがとうございました。
助かりました。
 

ベルマンフォード法

 投稿者:永野護  投稿日:2021年11月27日(土)18時31分44秒
  ベルマンフォード法は無向グラフにも適用できるのでしょうか。先ごろ作っていただきました
プログラムで対応可能でしょうか。度々質問してすみませんがご迷惑でなかったらご教授
お願いしたいのですが。何卒よろしくお願いします。本当に身勝手なお願いで申し訳ないです。
 

Re: ベルマンフォード法

 投稿者:nagram  投稿日:2021年11月29日(月)11時09分35秒
  永野護さんへのお返事です。

> ベルマンフォード法は無向グラフにも適用できるのでしょうか。先ごろ作っていただきました
> プログラムで対応可能でしょうか。度々質問してすみませんがご迷惑でなかったらご教授
> お願いしたいのですが。何卒よろしくお願いします。本当に身勝手なお願いで申し訳ないです。
>

私もグラフ理論に詳しいわけではないですが、ベルマンフォード法は有向グラフにしか使えないようですね。
無向グラフの解法も調べましたが、いい方法は見つけられませんでした。

永野護さんが提示したプログラムも有向グラフにしか適用できず、「辺の方向は頂点の順序により決定する」という条件が付きます。
c(p,q) を p<q のときのみ調査しています。(A→B,D→G は調査するが、E→C はスルー)
提示されたグラフのデータがその条件を満たしていたので解けましたが、c(5,2)=6 といったデータがあると上手く求めることができません。

ネットでベルマンフォード法のサンプルプログラムを見ましたが、[FOR i=1 TO 7] の部分を foreach文を利用しているものが多いですね。
foreach文は十進BASICにはない構文なので代替する方法を考えましたが、私の実力不足でうまくできませんでした。
下記のプログラムは、永野護さんが提示したプログラムを探査する向きを変えて2回実行しています。当然、計算量も2倍になります。
(データの一部を変えて、頂点の順序とは逆方向の辺を作っています。)
この方法が、(非負の重みの)すべての有向グラフに対して有効かは分かりません。


各頂点をA~Gとし、有向グラフの重みを次のようにし、Aを始点として各頂点への最短経路を求める。

A→B=20, A→C=50
B→C=150, B→D=6
C→E=4
D→C=3, D→E=8, D→G=20
E→F=40, E→G=30
F→G=80

LET n=7
DIM  dist(n), node$(n),path$(n)
MAT READ node$
DATA  A,B,C,D,E,F,G
MAT path$=node$(1)&NUL$

DIM  c(n,n)
MAT c=1000*CON

MAT dist=1000*CON
LET dist(1)=0

LET c(1,2)=20
LET c(1,3)=50
LET c(2,3)=150  ! c(2,3)=1
LET c(2,4)=6
LET c(4,3)=3  ! c(3,4)=100
LET c(3,5)=4  ! c(3,5)=50
LET c(4,5)=8
LET c(4,7)=20
LET c(5,7)=30
LET c(5,6)=40
LET c(6,7)=80
REM-----------------------------------------------------------------
FOR  t=1  TO n-1
   FOR i=1  TO  n
      IF     dist(i)>dist(t)+c(t,i)  THEN
         LET dist(i)=dist(t)+c(t,i)
         LET path$(i)=path$(t)&node$(i)
      END IF
   NEXT  i
NEXT  t
FOR  t=1  TO n-1
   FOR i=n  TO  1 STEP -1
      IF     dist(i)>dist(t)+c(t,i)  THEN
         LET dist(i)=dist(t)+c(t,i)
         LET path$(i)=path$(t)&node$(i)
      END IF
   NEXT  i
NEXT  t

REM   ------------------------------

FOR   x=1  TO  n
   PRINT  "最短距離="; dist(x); ", 経路=";path$(x)
NEXT x

END
 

ベルマンフォード法

 投稿者:永野護  投稿日:2021年11月29日(月)12時31分35秒
  nagram様、お忙しいところ貴重なプログラムを作っていただきましたことに心より感謝
します。ご多忙中にもかかわらず丁寧なご指導をいただき、ありがとうございました。
貴重な体験を糧とし、日々精進してまいりたいと存じます。
末筆ではございますが、nagram様の一層のご活躍を心よりお祈り申し上げます。
敬具
 

ベルマンフォード法

 投稿者:永野護  投稿日:2021年11月30日(火)12時24分19秒
  nagram様よりご提示いただきましたプログラムをヒントにdo  while   loopを加えてみました。
隣接行列の値も変えています。これでちゃんとできているみたいですが。

DIM  dist(7), node$(7),path$(7)
MAT READ node$
DATA  A,B,C,D,E,F,G
MAT path$=node$(1)&NUL$

DIM  c(7,7)
MAT c=1000*CON
LET inf=1000
LET dist(1)=0
LET dist(2)=inf
LET dist(3)=inf
LET dist(4)=inf
LET dist(5)=inf
LET dist(6)=inf
LET dist(7)=inf
LET c(1,1)=0
LET c(2,2)=0
LET c(3,3)=0
LET c(4,4)=0
LET c(5,5)=0
LET c(6,6)=0
LET c(7,7)=0
LET c(1,2)=30
LET c(2,1)=30
LET c(1,3)=20
LET c(3,1)=20
LET c(1,7)=1
LET c(7,1)=1
LET c(2,3)=2
LET c(3,2)=2
LET c(2,4)=6
LET c(4,2)=6
LET c(2,5)=1
LET c(5,2)=1
LET c(2,7)=6
LET c(7,2)=6
LET c(3,4)=2
LET c(4,3)=2
LET c(3,5)=3
LET c(5,3)=3
LET c(3,6)=1
LET c(6,3)=1
LET c(4,5)=20
LET c(5,4)=20
LET c(4,6)=30
LET c(6,4)=30
LET c(4,7)=100
LET c(7,4)=100
LET c(5,7)=2
LET c(7,5)=2
LET c(5,6)=5
LET c(6,5)=5
LET c(6,7)=10
LET c(7,6)=10

REM-----------------------------------------------------------------
LET w=0
DO  WHILE  w<=7
   FOR  t=1  TO 7
      FOR i=1  TO 7

         IF  dist(i)>dist(t)+c(t,i)  THEN
            LET dist(i)=dist(t)+c(t,i)
            LET path$(i)=path$(t)&node$(i)


         END IF

      NEXT  i

   NEXT  t
   LET w=w+1
LOOP
REM-----------------------------------
PRINT  "-------------------------------------------------------"

FOR   x=1  TO 7
   PRINT  "最短距離="; dist(x); ", 経路=";path$(x)
NEXT x

END





 

深さ優先グラフ探索

 投稿者:しばっち  投稿日:2021年12月12日(日)09時57分19秒
  深さ優先の再帰呼び出しによるグラフ探索です。


PUBLIC NUMERIC A(20,20),DISTANCE(20),VISITED(20),INDEX(100),SIZE,INF,TRUE,FALSE,START
PUBLIC NUMERIC MININDEX(100),MINDISTANCE,MAXINDEX(100),MAXDISTANCE
PUBLIC STRING NODE$(26)
MAT READ NODE$
DATA A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z
LET INF=100000000
LET MINDISTANCE=INF
LET MAXDISTANCE=-INF
LET TRUE=1
LET FALSE=0
RESTORE 10
READ SIZE
FOR I=1 TO SIZE ! 隣接行列読み込み
   FOR J=1 TO SIZE
      READ S$
      IF S$="INF" THEN
         LET A(I,J)=INF
      ELSE
         LET A(I,J)=VAL(S$)
      END IF
   NEXT J
NEXT I
LET START=8
LET GOAL=2
IF START<1 OR GOAL<1 OR START>SIZE OR GOAL>SIZE OR START=GOAL THEN
   PRINT "ERROR !!"
   STOP
END IF
CALL VISIT(START,GOAL)
PRINT REPEAT$("-",60)
LET K=START
DO
   PRINT NODE$(K);" → ";
   LET K=MININDEX(K)
LOOP UNTIL K=GOAL
PRINT NODE$(GOAL);"  MIN DISTANCE";MINDISTANCE
!LET K=START
!DO
!   PRINT NODE$(K);" → ";
!   LET K=MAXINDEX(K)
!LOOP UNTIL K=GOAL
!PRINT NODE$(GOAL);"  MAX DISTANCE";MAXDISTANCE

10 DATA 10 ! 有向グラフ
   DATA INF,  1,  4,INF,  5,INF,  2,INF,  2,INF
   DATA INF,INF,  3,INF,INF,  4,INF,INF,INF,INF
   DATA   3,INF,INF,  2,INF,INF,  1,INF,INF,  1
   DATA INF,INF,  2,INF,INF,INF,INF,  3,INF,INF
   DATA INF,  2,INF,INF,INF,  2,INF,INF,INF,  1
   DATA   1,INF,  4,INF,  1,INF,  5,INF,INF,INF
   DATA INF,  3,INF,INF,INF,  6,INF,  5,INF,INF
   DATA   1,INF,INF,  3,INF,INF,INF,INF,  5,INF
   DATA INF,  2,INF,  5,INF,  2,INF,  3,INF,  2
   DATA   1,INF,  4,  3,INF,INF,  5,INF,INF,INF

20 DATA 8 ! 無向グラフ(対角成分に対して対称。A(I,J)とA(J,I)が同値)
   DATA INF,  1,  1,INF,INF,INF,  1,  1
   DATA   1,INF,  1,INF,  1,INF,INF,INF
   DATA   1,  1,INF,  1,INF,  1,  1,INF
   DATA INF,INF,  1,INF,  1,INF,  1,  1
   DATA INF,  1,INF,  1,INF,  1,INF,INF
   DATA INF,INF,  1,INF,  1,INF,  1,INF
   DATA   1,INF,  1,  1,INF,  1,INF,  1
   DATA   1,INF,INF,  1,INF,INF,  1,INF

30 DATA 10 ! 有向グラフ
   DATA INF,  2,INF,  1,INF,  4,  6,INF,  7,INF
   DATA INF,INF,INF, -2,  1,INF,INF,  2,INF,  1
   DATA  -3,INF,INF,INF,  1,INF, -1,INF,  2,INF
   DATA INF,  2,INF,INF,INF,INF,  1,INF,INF,  3
   DATA INF,INF, -1,INF,INF,  2,INF,  3,  4,INF
   DATA   4,INF,INF,INF,  2,INF,INF,  1,INF,  5
   DATA INF,  1,INF,  2,INF,  1,INF,  5,INF,INF
   DATA   2,INF,INF,  4,INF,  3,INF,INF,  2,  4
   DATA INF,INF,  4,INF,  4,INF, -2,INF,INF,INF
   DATA   1,INF,  3,INF,  6,INF,  1,INF,INF,INF
END

EXTERNAL  SUB VISIT(I,GOAL)
   IF I=GOAL THEN
      LET K=START
      DO
         PRINT NODE$(K);" → ";
         LET K=INDEX(K)
      LOOP UNTIL K=GOAL
      PRINT NODE$(GOAL);"  DISTANCE";DISTANCE(GOAL)
      IF MINDISTANCE>DISTANCE(GOAL) THEN
         MAT MININDEX=INDEX
         LET MINDISTANCE=DISTANCE(GOAL)
      END IF
      !      IF MAXDISTANCE<DISTANCE(GOAL) THEN
      !         MAT MAXINDEX=INDEX
      !         LET MAXDISTANCE=DISTANCE(GOAL)
      !      END IF
   ELSE
   !IF MINDISTANCE>DISTANCE(I) THEN
      FOR J=1 TO SIZE
         IF I<>J AND A(I,J)<>INF AND VISITED(J)=FALSE THEN
            LET VISITED(I)=TRUE
            LET DISTANCE(J)=DISTANCE(I)+A(I,J)
            LET INDEX(I)=J
            CALL VISIT(J,GOAL)
            LET VISITED(I)=FALSE
            LET INDEX(I)=0
            LET DISTANCE(J)=0
         END IF
      NEXT J
      !END IF
   END IF
END SUB
 

ダイクストラ法

 投稿者:しばっち  投稿日:2021年12月12日(日)09時58分39秒
  https://ja.wikipedia.org/wiki/ダイクストラ法

ダイクストラ法によるグラフ探索です。
このプログラムは移植版です。


DIM NODE$(26)
MAT READ NODE$
DATA A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z
RESTORE 10
READ SIZE
DIM VISITED(SIZE),DISTANCE(SIZE),INDEX(SIZE),A(SIZE,SIZE)
LET TRUE=1
LET FALSE=0
LET INF=100000000
MAT DISTANCE=(INF)*CON
FOR I=1 TO SIZE
   FOR J=1 TO SIZE
      READ S$
      IF S$<>"INF" THEN LET A(I,J)=VAL(S$) ELSE LET A(I,J)=INF
   NEXT J
NEXT I
LET START=3
LET DISTANCE(START)=0
LET NEXTINDEX=START
DO
   LET I=NEXTINDEX
   LET VISITED(I)=TRUE
   LET LMIN=INF
   FOR J=1 TO SIZE
      IF VISITED(J)=FALSE THEN
         IF A(I,J)<>INF AND DISTANCE(J)>DISTANCE(I)+A(I,J) THEN
            LET DISTANCE(J)=DISTANCE(I)+A(I,J)
            LET INDEX(J)=I
         END IF
         IF DISTANCE(J)<LMIN THEN
            LET LMIN=DISTANCE(J)
            LET NEXTINDEX=J
         END IF
      END IF
   NEXT J
LOOP WHILE LMIN<INF
FOR I=1 TO SIZE
   IF I<>START AND VISITED(I)=TRUE THEN
      LET K=I
      PRINT NODE$(K);
      DO
         LET K=INDEX(K)
         PRINT " ← ";NODE$(K);
      LOOP UNTIL K=START
      PRINT "  DISTANCE";DISTANCE(I)
   END IF
NEXT I

10 DATA 10 ! 有向グラフ
   DATA INF,  1,  4,INF,  5,INF,  2,INF,  2,INF
   DATA INF,INF,  3,INF,INF,  4,INF,INF,INF,INF
   DATA   3,INF,INF,  2,INF,INF,  1,INF,INF,  1
   DATA INF,INF,  2,INF,INF,INF,INF,  3,INF,INF
   DATA INF,  2,INF,INF,INF,  2,INF,INF,INF,  1
   DATA   1,INF,  4,INF,  1,INF,  5,INF,INF,INF
   DATA INF,  3,INF,INF,INF,  6,INF,  5,INF,INF
   DATA   1,INF,INF,  3,INF,INF,INF,INF,  5,INF
   DATA INF,  2,INF,  5,INF,  2,INF,  3,INF,  2
   DATA   1,INF,  4,  3,INF,INF,  5,INF,INF,INF

20 DATA 8 ! 無向グラフ(対角成分に対して対称。A(I,J)とA(J,I)が同値)
   DATA INF,  1,  1,INF,INF,INF,  1,  1
   DATA   1,INF,  1,INF,  1,INF,INF,INF
   DATA   1,  1,INF,  1,INF,  1,  1,INF
   DATA INF,INF,  1,INF,  1,INF,  1,  1
   DATA INF,  1,INF,  1,INF,  1,INF,INF
   DATA INF,INF,  1,INF,  1,INF,  1,INF
   DATA   1,INF,  1,  1,INF,  1,INF,  1
   DATA   1,INF,INF,  1,INF,INF,  1,INF

30 DATA 10 ! 有向グラフ
   DATA INF,  2,INF,  1,INF,  4,  6,INF,  7,INF
   DATA INF,INF,INF, -2,  1,INF,INF,  2,INF,  1
   DATA  -3,INF,INF,INF,  1,INF, -1,INF,  2,INF
   DATA INF,  2,INF,INF,INF,INF,  1,INF,INF,  3
   DATA INF,INF, -1,INF,INF,  2,INF,  3,  4,INF
   DATA   4,INF,INF,INF,  2,INF,INF,  1,INF,  5
   DATA INF,  1,INF,  2,INF,  1,INF,  5,INF,INF
   DATA   2,INF,INF,  4,INF,  3,INF,INF,  2,  4
   DATA INF,INF,  4,INF,  4,INF, -2,INF,INF,INF
   DATA   1,INF,  3,INF,  6,INF,  1,INF,INF,INF

40 DATA 7
   DATA INF,  1,INF,  3,INF,  5,INF
   DATA   2,INF,  3,INF,INF,INF,  2
   DATA INF,  2,INF,  2,  4,INF,INF
   DATA INF,INF,  4,INF,INF,INF,  5
   DATA   3,INF,  3,  3,INF,  2,INF
   DATA INF,  1,INF,  4,  2,INF,INF
   DATA   5,INF,  2,INF,  3,  6,INF
END
 

DOT言語変換

 投稿者:しばっち  投稿日:2021年12月12日(日)10時01分48秒
  隣接行列からDOT言語に変換します。
隣接行列からグラフを作成するのはなかなか大変な作業ですが、このDOT言語からグラフ画像を作成してくれます。

DOT言語自体は無向グラフ、有向グラフに対応していますが、下記プログラムは有向グラフ版です。("digraph"を"graph"に、"->"を"--"に変更するだけですが...)
実行するとdotファイル(DOT言語)を書き出します。

このdotファイルをメモ帳で開いてもたいした意味はありませんので
下記URLよりダウンロードしてください。私はwindows版のzip版(win32)をダウンロードしました。

http://www.graphviz.org/


dot.exeがあるフォルダ(bin)でコマンドプロンプトから

dot sample.dot -Tpng -o sample.png

と打ち込むとグラフ画像(pngファイル)が出来上がります。

https://ja.wikipedia.org/wiki/DOT言語
http://cbrc3.cbrc.jp/~tominaga/translations/graphviz/dotguide.pdf
https://qiita.com/rubytomato@github/items/51779135bc4b77c8c20d


DIM NODE$(26)
MAT READ NODE$
DATA A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z
LET F$="D:\tool\Graphviz\bin\sample" !ドライブ、パスを指定してください。(ファイル名はsample.dotになります)
LET FORMAT$="png"  ! jpg gif svg ps pdf...
OPEN #1:NAME F$&".dot"
ERASE #1
PRINT #1:"digraph sample {"
!!PRINT #1:"  graph[rankdir=LR];" ! TB BT LR RL
!!PRINT #1:"  node [shape=box];"  ! box polygon ellipse circle point egg triangle diamond trapezium parallellogram house pentagon hexagon doublecircle...
RESTORE 10
READ SIZE
FOR J=1 TO SIZE
   FOR I=1 TO SIZE
      READ S$
      IF S$<>"INF" THEN
         PRINT #1:"    ";NODE$(J);" -> ";NODE$(I);" [fontcolor=red label=";CHR$(34);S$;CHR$(34);"];"
      END IF
   NEXT I
NEXT J
PRINT #1:"}"
CLOSE #1
!!EXECUTE "D:\tool\Graphviz\bin\dot.exe" WITH(F$&".dot","-T"&FORMAT$,"-o",F$&"."&FORMAT$)
!!GLOAD F$&"."&FORMAT$

10 DATA 10 ! 有向グラフ
   DATA INF,  1,  4,INF,  5,INF,  2,INF,  2,INF
   DATA INF,INF,  3,INF,INF,  4,INF,INF,INF,INF
   DATA   3,INF,INF,  2,INF,INF,  1,INF,INF,  1
   DATA INF,INF,  2,INF,INF,INF,INF,  3,INF,INF
   DATA INF,  2,INF,INF,INF,  2,INF,INF,INF,  1
   DATA   1,INF,  4,INF,  1,INF,  5,INF,INF,INF
   DATA INF,  3,INF,INF,INF,  6,INF,  5,INF,INF
   DATA   1,INF,INF,  3,INF,INF,INF,INF,  5,INF
   DATA INF,  2,INF,  5,INF,  2,INF,  3,INF,  2
   DATA   1,INF,  4,  3,INF,INF,  5,INF,INF,INF

20 DATA 8 ! 無向グラフ(対角成分に対して対称。A(I,J)とA(J,I)が同値)
   DATA INF,  1,  1,INF,INF,INF,  1,  1
   DATA   1,INF,  1,INF,  1,INF,INF,INF
   DATA   1,  1,INF,  1,INF,  1,  1,INF
   DATA INF,INF,  1,INF,  1,INF,  1,  1
   DATA INF,  1,INF,  1,INF,  1,INF,INF
   DATA INF,INF,  1,INF,  1,INF,  1,INF
   DATA   1,INF,  1,  1,INF,  1,INF,  1
   DATA   1,INF,INF,  1,INF,INF,  1,INF

30 DATA 10 ! 有向グラフ
   DATA INF,  2,INF,  1,INF,  4,  6,INF,  7,INF
   DATA INF,INF,INF, -2,  1,INF,INF,  2,INF,  1
   DATA  -3,INF,INF,INF,  1,INF, -1,INF,  2,INF
   DATA INF,  2,INF,INF,INF,INF,  1,INF,INF,  3
   DATA INF,INF, -1,INF,INF,  2,INF,  3,  4,INF
   DATA   4,INF,INF,INF,  2,INF,INF,  1,INF,  5
   DATA INF,  1,INF,  2,INF,  1,INF,  5,INF,INF
   DATA   2,INF,INF,  4,INF,  3,INF,INF,  2,  4
   DATA INF,INF,  4,INF,  4,INF, -2,INF,INF,INF
   DATA   1,INF,  3,INF,  6,INF,  1,INF,INF,INF
END

 

御助言お願いします

 投稿者:RCカー  投稿日:2021年12月19日(日)05時20分15秒
  構造化ベーシックについて今現在購入できる。
お勧め図書の御推薦をお待ちしています。
 

御助言お願いします の2

 投稿者:RCカー  投稿日:2021年12月19日(日)05時21分53秒
  十進ベーシックはウィンドウズ11対応予定はありますか?
 

Re: 御助言お願いします

 投稿者:SHIRAISHI Kazuo  投稿日:2021年12月19日(日)20時21分39秒
  > No.4991[元記事へ]

RCカーさんへのお返事です。

> 構造化ベーシックについて今現在購入できる。
> お勧め図書の御推薦をお待ちしています。
>
中古限定となりますが,入手可能です。

数学とコンピュータ1



数学とコンピュータ2
 森北出版 新数学入門シリーズ
 

Re: 御助言お願いします の2

 投稿者:SHIRAISHI Kazuo  投稿日:2021年12月19日(日)20時22分33秒
  > No.4992[元記事へ]

RCカーさんへのお返事です。

> 十進ベーシックはウィンドウズ11対応予定はありますか?
>
おそらく動作するものと思います。
不具合があればお知らせください。
 

白石先生へ

 投稿者:RCカー  投稿日:2021年12月19日(日)22時01分36秒
  有難う御座います  

日付時刻の国際標準表記

 投稿者:nagram  投稿日:2021年12月31日(金)17時23分41秒
  今年もあとわずかなので、日付時刻に関するプログラムです。
日付や時刻の表記法は様々な様式がありますが、ISO 8601 (日本では JIS X 0301) で規格化されています。
規格に沿った日付時刻を表示する関数を作りました。
皆さま、良いお年をお迎えください。

DECLARE EXTERNAL FUNCTION datetime1$, datetimesec1$, datetime2$, datetimesec2$
!
PRINT "基本形式"
PRINT datetime1$      ! "YYYYMMDDThhmmss+0900"
PRINT datetimesec1$   ! "YYYYMMDDThhmmss.ss+0900"
PRINT "拡張形式"
PRINT datetime2$      ! "YYYY-MM-DDThh:mm:ss+09:00"
PRINT datetimesec2$   ! "YYYY-MM-DDThh:mm:ss.ss+09:00"
END
!
EXTERNAL FUNCTION datetime1$  ! 日付時刻国際標準表記(基本形式)
LET d0$=DATE$
LET t$=TIME$
LET d$=DATE$
IF d$<>d0$ THEN LET t$="00:00:00"  ! 日付更新考慮
LET datetime1$=d$&"T"&t$(1:2)&t$(4:5)&t$(7:8)&"+0900"
END FUNCTION
!
EXTERNAL FUNCTION datetimesec1$  ! 日付時刻国際標準表記(基本形式,小数秒)
LET t0=TIME
LET d$=DATE$
LET t=TIME
IF t<t0 THEN LET d$=DATE$  ! 日付更新考慮
LET h=INT(t/3600)
LET hm$=RIGHT$("0"&STR$(h),2)&RIGHT$("0"&STR$(INT((t-3600*h)/60)),2)
LET t$=USING$("%%.##",MOD(t,60))
! LET t1=MOD(t,60)  ! 秒の小数部末尾の"0"を記述しない
! IF t1>=10 THEN LET t$=STR$(t1) ELSE LET t$="0"&STR$(t1)
! IF t1<1 THEN LET t$="0"&t$
LET datetimesec1$=d$&"T"&hm$&t$&"+0900"
END FUNCTION
!
EXTERNAL FUNCTION datetime2$  ! 日付時刻国際標準表記(拡張形式)
LET d0$=DATE$
LET t$=TIME$
LET d$=DATE$
IF d$<>d0$ THEN LET t$="00:00:00"  ! 日付更新考慮
LET datetime2$=d$(1:4)&"-"&d$(5:6)&"-"&d$(7:8)&"T"&t$&"+09:00"
END FUNCTION
!
EXTERNAL FUNCTION datetimesec2$  ! 日付時刻国際標準表記(拡張形式,小数秒)
LET t0=TIME
LET d$=DATE$
LET t=TIME
IF t<t0 THEN LET d$=DATE$  ! 日付更新考慮
LET h=INT(t/3600)
LET hm$=RIGHT$("0"&STR$(h),2)&":"&RIGHT$("0"&STR$(INT((t-3600*h)/60)),2)
LET t$=USING$("%%.##",MOD(t,60))
! LET t1=MOD(t,60)  ! 秒の小数部末尾の"0"を記述しない
! IF t1>=10 THEN LET t$=STR$(t1) ELSE LET t$="0"&STR$(t1)
! IF t1<1 THEN LET t$="0"&t$
LET datetimesec2$=d$(1:4)&"-"&d$(5:6)&"-"&d$(7:8)&"T"&hm$&":"&t$&"+09:00"
END FUNCTION
 

インストーラ版に同梱されていないファイルがあります

 投稿者:nagram  投稿日:2022年 2月28日(月)11時19分1秒
  Ver.7.8.6.4 の Windowsインストーラ版に下記のファイルが同梱されていません。

テキストファイル  REVISION.TXT
ファイルフォルダー  Tutorial

アーカイブ版にはあります。
 

Re: インストーラ版に同梱されていないファイルがあります

 投稿者:SHIRAISHI Kazuo  投稿日:2022年 2月28日(月)16時34分18秒
  > No.5026[元記事へ]

ご報告ありがとうございました。
修正版を作成します。


> Ver.7.8.6.4 の Windowsインストーラ版に下記のファイルが同梱されていません。
>
> テキストファイル  REVISION.TXT
> ファイルフォルダー  Tutorial
>
> アーカイブ版にはあります。
 

 戻る