投稿

ラベル(C)が付いた投稿を表示しています

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

イメージ
2022/2/5(土) N88-BASIC、Cで初心者向けプログラミング (3回目)   制御命令(条件による分岐)   平成の年を入力し平成又は令和を表示する   BASICでは、 10 INPUT "平成"; Y 20 WHILE Y > 0 30   IF Y > 30 THEN PRINT "令和";: Y = Y - 30 ELSE PRINT "平成"; 40   IF Y =  1 THEN PRINT " 元 年" ELSE PRINT Y; "年" 50   PRINT 60   INPUT "平成"; Y 70 WEND   C言語では、 #include <stdio.h> void main(void) {     int y;       printf("平成? ");     scanf("%d", &y);     while (y > 0)     {         if (y > 30) { printf("令和"); y -= 30; } else printf("平成");         if (y == 1)         {             printf(" 元 年\n");         }         else         {             printf(" %d 年\n", y);         }         printf("\n");         printf("平成? ");         scanf("%d", &y);     } }   BASICの説明 IF Y > 30 THEN PRINT "令和";: Y = Y - 30 ELSE PRINT "平成"; IF 条件式 THEN .. ELSE .. は1つの行に 書かなければいけません 条件 式は0が偽、0以外

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

イメージ
2022/2/2(水) N88-BASIC、Cで初心者向けプログラミング  (2回目)   繰り返し 1から10まで足すといくつ?   ここでは、n(n+1)/2を使わずに 計算させてみましょう (因みに、10(10+1)/2 = 55)   BASICでは、 10 S = 0 20 FOR I=1 TO 10 30   S = S + I 40 NEXT 50 PRINT S   C言語では、 #include <stdio.h> void main(void) {     int i, s;       s = 0;     for (i = 1; i <= 10; i++)     {         s = s + i;     }     printf("%d\n", s); }   BASICの説明 FOR I=1 TO 10 NEXT は簡単に言うとI=1~10まで 1ずつ増やしながら FOR,NEXT間を繰り返した後、 次の命令に行きます    1回目 S = S + IはS =  0 +  1 =  1  2回目 S = S + IはS =  1 +  2 =  3  3回目 S = S + IはS =  3 +  3 =  6  4回目 S = S + IはS =  6 +  4 = 10  5回目 S = S + IはS = 10 +  5 = 15  6回目 S = S + IはS = 15 +  6 = 21  7回目 S = S + IはS = 21 +  7 = 28  8回目 S = S + IはS = 28 +  8 = 36  9回目 S = S + IはS = 36 +  9 = 45 10回目 S = S + IはS = 45 + 10 = 55 で、PRINT Sで55と表示されます   C言語の説明 int i, s;は、整数型変数iとsを作ります   for (i = 1; i <= 10; i++) { } はi = 1を実行後、 i <= 10なら{}内を実行し i++(iを1増す)を実行しi <= 10 が成り立っている間繰り返します i <= 10でないなら}の次に行き、 printf("%d\n", s); でsの内容が表示されま

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を読んで遊んで下さい