投稿

1月, 2022の投稿を表示しています

N88-BASIC、Cで初心者向けプログラミング (1回目)

イメージ
2022/1/31(月) N88-BASIC、Cで初心者向けプログラミング (1回目)   式で、 a = 5 b = 3 c = a + b と書けば c は 8 です   BASICだと、 10 A = 5 20 B = 3 30 C = A + B   となり、C言語だと、 void main(void) {     int a, b, c;       a = 5;     b = 3;     c = a + b; } となります   BASICは、BASICを起動した画面で、1行打つごとに enterキーを押すと記憶してくれます (BASICはenterで反応するようになっています)   LIST(enterを忘れないように、以下省略) でプログラムを見ることができます 小文字は大文字に変換されます RUN でプログラムが走ります ? C で、8が表示されます ?はPRINTと同じです 40 PRINT C を追加すれば8を表示できます SAVE "test" でtest.basに保存できます LOAD "test" で読み込めます     C言語では、1番初めに呼ばれるのが、 関数mainで、{}の中に命令を書きます 3行目のint a, b, c;は変数の宣言で 整数型変数a,b,cを作ります   変数には型があり                    C言語      BASIC 整数型             int    a;  A% 単精度浮動小数点型 float  a;  A! , A 倍精度浮動小数点型 double a;  A# となります ここでは、詳しく説明しませんが 整数型は整数のみ、 単精度は桁が少ない実数(7桁位) 倍精度は桁が多い実数(16桁位) です   命令の最後は;が必要です 上記main関数のvoidは空という 意味で、void mainは戻り値が無い関数、 main(void)は引数がない関数です 引数は数学の関数f(x)のパラメータxに 当たるもので、戻り値はf(x)の値です   このプログラムをtest.cというファイルに 保存してCコンパイラーでコンパイルし、 リンクするとtest.exeが作られ、これを実行 (ダブルクリック)すると、表示していないので 見ることはでき

N88-BASIC、C、アセンブラでBinary search

イメージ
2022/1/27(木) N88-BASIC、C、アセンブラでBinary search   Binary search( 二 分探索)のアルゴリズム   以後、探したい値をキーと呼ぶことにします また、データは昇順に並び替えられているものとします 1. 要素の中央位置の値が探したい値なら終了 2. キーが中央位置の値より小ならそれより左を新たな要素にし    キーが中央位置の値より大ならそれより右を新たな要素にし 3. 1.2.を要素がなくなるまで繰り返す となります   例  0  1  2  3  4 (要素番号) 11 15 18 20 23 (要素) … A(0) = 11, A(1) = 15, ... から、キー15の要素番号を得るとします   L = 0, R = 4とし、M = [(L + R) /2] = 2 A(M) = A(2) = 18なので 15 < A(M)より 新たな要素はA(M)より左 L = 0, R = M-1 = 1、M = [(L + R) /2] = 0 A(M) = A(0) = 11なので 15 > A(M)より 新たな要素はA(M)より右 L = M+1 = 1, R = 1、M = [(L + R) /2] = 1 A(M) = A(1) = 15なので 15 = A(M)より要素番号1を返す   N88-BASICでは、途中経過を色付きで表示しています n:nは検索回数 青:検索範囲外 黄:検索範囲内 白:検索中   結果 白:キーの要素番号 赤:キー以外の要素番号   途中経過で黄色の範囲が約半分ずつ狭くなっていく 様子が分かると思います     C、Assemblerでは、途中経過の表示は省いています Enterのみの入力で終了します   NL-BASICとblg~.zip (bsrch001.bas、bsrch001.c、bsrch001asm.c)は このブログ(以下のリンク)からダウンロードできます https://ulprojectmail.blogspot.com Readme.txtを読んで遊んで下さい

N88-BASIC、C、アセンブラでQuick sort

イメージ
N88-BASIC、C、アセンブラでQuick sort   Quick sort(並替え)   N88-BASIC、C C(ポインター)、アセンブラ(8086系) でプログラミング   クイックソートは再帰的に定義すると   1. 要素か1個以下なら以下を操作しない 2. 基準となる数値を決める 3. 基準となる数値より小さい集合と大きい集合に分ける 4. 小さいものに1.~5.を適用する 5. 大きいものに1.~5.を適用する   となります   QSORT(数の集合)を、ある数より小さいものと 大きいものに分ける操作とする   QSORT(数の集合)   数の要素が1個以下ならQSORT終了   基準となる数値を決める   基準となる数値より小さい集合と大きい集合に分ける   QSORT(小さい集合)   QSORT(大きい集合) で並替る事ができます   {8 5 3 2} を昇順に並替えをしてみます   QSORT({8 5 3 2})   要素数4個なので以下の操作をする   中央付近の5を基準に選ぶ   5より小と大の2グループに分ける   つまり、{3 2} {8 5}に分ける   ({3 2} 5 {8} や {3 3 5} {8} に分けても良い)   QSORT({3 2})   QSORT({8 5}) {3 2} {8 5}   QSORT({3 2})   要素数2個なので以下の操作をする   中央付近の3を基準に選ぶ   3より小と大の2グループに分ける   {2} {3}   ({} {3 2} や {3 2} {} とすると終わらない)   QSORT({2})は要素数1個なので何もしない   QSORT({3})は要素数1個なので何もしない   {2} {3} {8 5}   QSORT({8 5})は同様に   {2} {3} {5} {8} となるり、小さい順(昇順)に並んでいます   8   5   3   2  を、基準5で小、大に分ける 3   2 | 8   5  それぞれ3や8で小、大に分ける 2 | 3 | 5 | 8 で並替えできます   分ける基準となる数値の決め方は色々ありますが 今回は中央付近の位置にある数にしています   クイックソートは基準の選び方と、データの並びの 相性によって、ソートにかかる時間が変

N88-BASIC、C、アセンブラで階乗 (2回目)

イメージ
2022/1/21(金) N88-BASIC、C、アセンブラで階乗 (2回目)   再帰   N88-BASIC、C、インラインアセンブラ(8086系) で階乗を求めるプログラムを、再帰で作ってみます   関数やサブルーチン内から自身を呼出す 事を再帰呼出しといいます     C、インラインアセンブラは、 Cコンパイラーなどを準備して下さい 例、Microsoft Visual Studioなど windowsのconsoleアプリは実行終了後 ウインドウが閉じてしまうので 最後にキー入力待ちを入れています 数値を入れてenterを押すと終了します 関数名に_sが付いているものは_sを 消した関数名でも良いのですが、 エラーが出る場合があるので、 環境に合わせて選択してください     階乗に関しては、 N88-BASIC、C、アセンブラで階乗(通常) を参照して下さい   階乗の再帰定義 n! = n×(n-1)! 7! = 7×6!    = 7×6×5×4×3×2×1 = 5040   PCの変数の桁には限界がありますので ここでは大きな数の階乗には対応しません nは1桁位と思って下さい   BASICにはローカル変数が無いので 配列で代用しています   Cは再帰の方がすっきりします   インラインアセンブラ(8086系) ローカル変数をスタック(push pop)で 実現しています (Cのローカル変数はアセンブラのスタック で実現されています)   ~.cのファイルはTab=4で書いています (メモ帳はTab=8なのでズレます)   NL-BASICとblg~.zip (fact002.bas、fact002.c、fact002asm.c)は このブログ(以下のリンク)から ダウンロードできます https://ulprojectmail.blogspot.com Readme.txtを読んで遊んで下さい

N88-BASIC、C、アセンブラで階乗 (1回目)

イメージ
2022/1/17(月) N88-BASIC、C、アセンブラで階乗 (1回目)   N88-BASIC、C、インラインアセンブラ(8086系) で階乗を求めるプログラムを、 作ってみます   C、インラインアセンブラは、 Cコンパイラーなどを準備して下さい 例、Microsoft Visual Studioなど windowsのconsoleアプリは実行終了後 ウインドウが閉じてしまうので 最後にキー入力待ちを入れています 数値を入れてenterを押すと終了します 関数名に_sが付いているものは_sを 消した関数名でも良いのですが、 エラーが出る場合があるので、 環境に合わせて選択してください     階乗の通常の定義 n! = n×(n-1)×...×1 7! = 7×6×5×4×3×2×1    = 1×2×3×4×5×6×7 = 5040   A,B,C3人の並べ方は 1列目はA,B,Cの3通り 2列目は残り2人の2通り 3列目は残り1人の1通り なので3×2×1=6通り   n人の並べ方はn!通りあります   PCの変数の桁には限界がありますので ここでは大きな数の階乗には対応しません nは1桁位と思って下さい   ~.cのファイルはTab=4で書いています (メモ帳はTab=8なのでズレます)   NL-BASICとblg~.zip (fact001.bas、fact001.c、fact001asm.c)は このブログ(以下のリンク)から ダウンロードできます https://ulprojectmail.blogspot.com Readme.txtを読んで遊んで下さい  

N88-BASICでデジタル回路 (2回目)

イメージ
2022/1/14(金) N88-BASICでデジタル回路 (2回目)   1bit + 1bit = 2bits (2進数1桁同士の足し算) を計算するデジタル回路(加算器)を考えます   1=true(真)、0=false(偽)   a + b = cd 0   0   00 0   1   01 1   0   01 1   1   10   d = a XOR b c = a AND b   NOT、AND、OR、XOR素子を組合わせた回路を作ります a,bが入力、c,dが出力です   NOTは1、0の反転 ANDは両方1の時のみ1 OR は両方0の時のみ0 XORは両方同じとき0違うとき1 です   2bits + 2bits = 3bits (2進数2桁同士の足し算) を計算するデジタル回路(加算器)を考えます   a + b = cd 0   0   00 0   1   01 0   0   01 0   1   10   d = a XOR b c = a AND b これをもとに、筆算の要領で多桁の計算をします (例) 11 + 11 = 110    1     c1    11     ab +) 11  +) cd ------ ------   110    xyz   ab + cd = xyz   z  = b  XOR d  '--- d1 c1 = b  AND d d2 = a  XOR c c2 = a  AND c y  = d2 XOR c1 '--- d3 x  = d2 AND c1 OR c2   NOT、AND、OR、XOR素子を組合わせた回路を作ります a,b,c,dが入力、x,y,zが出力です (この回路は最適なものではなく、試行錯誤適当に考えて とりあえず動いたものです)   3bits + 3bits = 4bits (2進数3桁同士の足し算) を計算するデジタル回路(加算器)を考えます   a + b = cd 0   0   00 0   1   01 0   0   01 0   1   10   d = a XOR b c = a AND b これをもとに、筆算の要領で多桁の計算をします (例) 111 + 111 = 1110     11     111 +)  111 ----

N88-BASICでデジタル回路 (1回目)

イメージ
2022/1/12(水) N88-BASICでデジタル回路 (1回目)   2bits binary(2桁の2進数)を 7segment displayに10進表示する回路を 考えます    AAAA F    B F    B  GGGG E    C E    C  DDDD   2bitsの2進数yzとA~Gの表示の対応表 1=true(真)、0=false(偽)   yz  A B C D E F G 00  1 1 1 1 1 1 0 01  0 1 1 0 0 0 0 10  1 1 0 1 1 0 1 11  1 1 1 1 0 0 1   A = (NOT z) OR y B = -1 C = z OR (NOT y) D = A E = NOT z F = NOT (z OR y) G = y   y,zが入力でA~Gが出力で、1の時光らせます   NOT、AND、OR、XOR素子を組合わせた回路を作ります 優先順位を分かりやすくするため不要な()を付けています (この回路は最適ではなく、とりあえず動くものです)   NOTは1、0の反転 ANDは両方1の時のみ1 OR は両方0の時のみ0 XORは両方同じとき0違うとき1   次に3bits binary(3桁の2進数)を 7segment displayに10進表示する回路を 考えます    AAAA F    B F    B  GGGG E    C E    C  DDDD   3bitsの2進数xyzとA~Gの表示の対応表   xyz  A B C D E F G 000  1 1 1 1 1 1 0 001  0 1 1 0 0 0 0 010  1 1 0 1 1 0 1 011  1 1 1 1 0 0 1 100  0 1 1 0 0 1 1 101  1 0 1 1 0 1 1 110  1 0 1 1 1 1 1 111  1 1 1 0 0 1 0   A = (NOT (x XOR z)) OR y B = NOT ((z XOR y) AND x) C = (NOT y) OR z OR x D = (NOT ((z XOR y) XOR x)) OR ((NOT z) AND y) E = (NOT z) AND (y OR (NOT x)) F = (NOT (z

N88-BASICで地球内部の重力

イメージ
2022/1/10(月) N88-BASICで地球内部の重力   最後に書いた積分結果は 地球内部にいる時、自分より上 (中心から自分までの距離を半径とする球の外側) の成分は無くても重力は変わらないという結果です   つまり、自分より下の成分が無ければ (殻の内部の空洞にいる時は) 無重力になります   中心からの距離zの地球内部にいるとし 地球からの距離rの物質を考えると zより上の物質(r > z)が及ぼす重力は釣り合って0 になるという事が分かります   ただし、自分より上の物質は下の物質の重力により 引っ張られているのでトンネルが無ければ 自分は圧力で押しつぶされます (地球内部は高温高圧になります)   地上にいて、自分の上に60kgの重りが 乗っているとき、自分が地球に引かれる 力が重力で、重りが自分を押す力が圧力 です 地球内部で押しつぶされるのは、自分に対する 重力ではなく、圧力によるものです   よってzより下の物質が及ぼす重力のみ考えれば 良いことになります 半径zの球の表面の重力加速度aは 半径Rの地球の重力加速度gを使って g = GM/R 2  (万有引力定数G,地球の質量M) a = GM(z 3 /R 3 )/z 2  = zGM/R 2  / R = g(z/R) となり z = R(地表)でa = g z = 0(中心)でa = 0 になり、間はzに比例します ここでa,gは大きさを表し、 方向は考えていません   地球の中心を通る真空トンネル(空気抵抗なし) を開通させて、入ると、 中心からの距離に比例した向心力を受けるので 単振動することになります   角速度ω, 振幅A, 時間t, 変位x 単振動の位置x = Asinωt 単振動の速度v = dx/dt = ωAcosωt 単振動の加速度a = dv/dt = -ω 2 Asinωt = -ω 2 x   トンネル内の加速度a = -g(z/R) (方向有の式) x,zは中心からの距離で同じなので ω = √(g/R) 周期T = 2π/ω = 2π√(R/g) R ≒ 6.3×10 6  m, g ≒ 9.8 m/s 2  より T = 5037.… 秒 = 83.95 分 ≒ 84分 (往復)   空気抵抗や摩擦抵抗などがあれば どんどん振幅が小さくなり 最終的に