階乗(再帰)のプログラムの比較です
(アセンブり言語は8086系)
この記事はリニューアルしました
https://ulprojectmail.blogspot.com/2022/01/n88-basiccfact-2.html
N88-BASIC、C、アセンブラで階乗 (2回目)
階乗(再帰)のプログラムの比較です
(アセンブり言語は8086系)
この記事はリニューアルしました
https://ulprojectmail.blogspot.com/2022/01/n88-basiccfact-2.html
N88-BASIC、C、アセンブラで階乗 (2回目)
階乗のプログラムの比較です
(アセンブり言語は8086系)
この記事はリニューアルしました
https://ulprojectmail.blogspot.com/2022/01/n88-basiccfact-1.html
N88-BASIC、C、アセンブラで階乗 (1回目)
VL-BASIC、NL-BASICのAlt+vについて
最新版ではAlt+vで、クリップボード
の内容をペーストできます。
例えば、ウェブサイトの
行番号付きBASICプログラムを選び
Ctrl+cでコピーし、VL-BASIC、NL-BASIC
の画面で、Alt+vを押すと、ペースト
され、改行(\r\n)はenterに変換しますので
プログラムを入力できます。
行番号なしプログラムをペーストすると、
1行ずつ実行されてしまい記憶せれません。
ペーストによって、思わぬ行が上書きされ、
入力中のプログラムが台無しになるのを防ぐため、
使い慣れたCtrl+vではなく、使い慣れないAlt+vに
割当てました。
Alt+vを押すのに慣れて、作成中のプログラムを
上書きしてしまわない様注意して下さい。
最新版のVL-BASIC、NL-BASICは、次の
ホームページからダウンロードして下さい。
VL-BASIC(N88-BASIC互換?)ホームページへのリンク
NL-BASIC(N88-BASIC互換?)ホームページへのリンク
ホームページに書いてあるパスワードを入力して、
Readme.txtを読んで、遊んで見て下さい。
VL-BASICの3DCGのしくみについて
モデルモード(物体の位置決め)
GPU MATRIX(MODE, MODEL) モデルモード
GPU ROTATE 3.移動した状態で回転
GPU TRANSLATE 2.移動する
GPU ROTATE 1.その場で回転
GPU SPHERE SPHEREに近い方から適用される
行の下から上へと適用されるのは、
行列の計算順序が関係しています。
座標=TRpはTranslate、Rotate、sphereの順で
プログラムを書きますが、
Rの方がp(sphere)に近いので先に効果が
でるといったイメージです。
この動作は、OpenGLと同じです。
VL-BASICのROTATE、TRANSLATE、行列
などの3DCG用のコマンドは、
数値を変えたりして、どういう動作を
するかを体験しながら慣れていくのが
良いかと思います。
より詳しく理解するには、
このブログの
N88-BASICで3DCGの行列(matrix)
シリーズでを見て頂くのが良いかと
思います。
(説明が分かりにくいかもしれませんが
ご了承下さい。)
VL-BASIC(N88-BASIC互換?)ホームページへのリンク
ホームページに書いてあるパスワードを入力して、
Readme.txtを読んで、遊んで見て下さい。
/*
---------------------------------------------------------------------
3囚人問題(Three Prisoners problem)
A,B,Cの3死刑囚の内1人が恩赦を受ける
Aは看守にB,Cどちらかは死刑になるのだからどちらか教えてほしいと言う。
看守はBは死刑になると教えてくれた。
Aが助かる確率は上がったか、という問題。
(選択はすべて等確率で起こるとする。)
---------------------------------------------------------------------
*/
#include <stdio.h> /* printfを使用するため */
#include <stdlib.h> /* rand,srandを使用するため */
#include <time.h> /* clockを使用するため */
static /* このファイル内部のみで使用できる関数の定義 */
double rnd(void)
{
return ((double)rand()) / (((double)RAND_MAX)+1.0);
}
/* main関数から実行される */
void main(void)
{
int a, b, c, i, abc; /* 変数の定義 */
srand(clock()); /* 乱数の種 */
a = 0; /* Aが助った場合の数 */
b = 0; /* Bが助った場合の数 */
c = 0; /* Cが助った場合の数 */
for (i = 1; i <= 100000; i++) /* ゲーム回数 */
{
nocount:
abc = (int)(rnd() * 3); /* 0-2:A-C恩赦 */
/* A恩赦 → BCから看守がCを選択(1/2)はノーカウント */
if (abc == 0) if (rnd() < 0.5) goto nocount;
/* B恩赦 → 看守はCを選択するのでノーカウント */
if (abc == 1) goto nocount;
/* C恩赦 → 看守はBを選択するのでカウント */
switch (abc)
{
case 0: a++; break;/* 看守がBを選択時のAの恩赦数 */
case 1: b++; break;/* 看守がBを選択時のBの恩赦数 */
case 2: c++; break;/* 看守がBを選択時のCの恩赦数 */
}
if ((i % 10000) == 0)
{
printf("A = %5d [%6.4f] , ", a, a / (double)i);
printf("B = %5d [%6.4f] , ", b, b / (double)i);
printf("C = %5d [%6.4f]\n" , c, c / (double)i);
}
}
getchar(); /* キー入力待ち */
}
three001n.bas
100 '---------------------------------------------------------------------
110 ' 3囚人問題(Three Prisoners problem)
120 '
130 ' A,B,Cの3死刑囚の内1人が恩赦を受ける
140 ' Aは看守にB,Cどちらかは死刑になるのだからどちらか教えてほしいと言う。
150 ' 看守はBは死刑になると教えてくれた。
160 ' Aが助かる確率は上がったか、という問題。
170 ' (選択はすべて等確率で起こるとする。)
180 '---------------------------------------------------------------------
190 RANDOMIZE VAL(RIGHT$(TIME$,2)) '--- 乱数の種
200 A = 0 '--- Aが助った場合の数
210 B = 0 '--- Bが助った場合の数
220 C = 0 '--- Cが助った場合の数
230 FOR I=1 TO 100000 '--- ゲーム回数
240 *NOCOUNT
250 ABC = INT(RND(1) * 3) '--- 0-2:A-C恩赦
260 '--- A恩赦 → BCから看守がCを選択(1/2)したときノーカウント
270 IF ABC = 0 THEN IF RND(1) < 0.5 THEN *NOCOUNT
280 '--- B恩赦 → 看守はCを選択するのでノーカウント
290 IF ABC = 1 THEN *NOCOUNT
300 '--- C恩赦 → 看守はBを選択するのでカウント
310 IF ABC = 0 THEN A = A + 1 '--- 看守がBを選択時のAの恩赦数
320 IF ABC = 1 THEN B = B + 1 '--- 看守がBを選択時のBの恩赦数
330 IF ABC = 2 THEN C = C + 1 '--- 看守がBを選択時のCの恩赦数
340 IF I MOD 10000 THEN *NOPRINT
350 PRINT USING "A = ##### [#.####] , "; A, A / I;
360 PRINT USING "B = ##### [#.####] , "; B, B / I;
370 PRINT USING "C = ##### [#.####]" ; C, C / I
380 *NOPRINT
NL-BASICは、下記リンクよりダウンロードできます。
NL-BASIC(N88-BASIC互換?)ホームページへのリンク
Readme.txtを読んで、遊んで見て下さい。