ⅧⅡ技術の凝編 1215 TR 第 0 FOR IP 第一 TO NM ー 220 1225 Pi ま IP 十 1 FOR IQ PI ・ TO N 1230 ー 235 G = 100 * ABS (A(IPYIQ)) IF. ーく = 4 THEN 1265 1240 ABS IF ABS ( D ( I P ) + G) く 1245 ( 0 円 ) THEN 1265 は 0 A(IP'IQ) 第 0 IF ABS (D(IQ), + 6 ) く第〉 1255 ABS (D(IQ)) THEN 1265 GOTO 1525 ー 260 く デ TR THEN IF ABS (A(IP'IQ)) ー 265 1520 は 270 H 第 D(IQ) ー ,D(IP) ABS ( 1275 IF ABS (H) G く H ) TFEN 1295 ー 0 T 第 A ( IP Q) / H 60T0 1310 1285 一四 5 TH = 0.5 * H / A ( IP , IQ) ー 80 T = 1 / ( ABS (TH) ー + SQR ( 1 は 305 正く 0 THEN T = ー T 1310 C 第 1 / SQR ( 1 + T * T) ー 3 ー 5 S = C * T 1320 TA 第 S / ( 1 + C) 1325 H ま T * A ( IP , I Q) ー 330 Z(IP) ま Z ( (P) - H 1335 Z(IQ) ー 340 D(IP) 湯 0 (IP) ー H ー 345 0 は ) D ( (Q) + H ー 480 IF IV ド 0 THEN 1515 1485 FOR J = 1 TO N ー 490 6 第 V()' IP) 1495 H 第 V()' iQ) ー 500 V(J'IP) 6 ー S * (H + 6 * T ー 505 V (Q) ま H 十 S ・ * -(G H * T NEXT J ー 5 ー 0 1515 IR = IR + ー NEXT ー 520 1525 tEX T FÆXT ー 530 FOR = 1 TO N 1535 ー 540 B(IP) B(I 円 + Z(IP) 1545 D(IP) = B(IP) 1550 Z ( (P) = 0 X を IP 1555 1560 1 5 RETLRN 63995 REM COPYR I GHT REM 63996 1979 REM 63997 BY S. TANAQUAX 639 % REM 999 REM ー 0 A(IP'IQ) = 0 1355 PM = ーー ー 360 IF PM く = 0 THEN 1395 1365 J = ー TO ー 370 6 第 A(J,IP) ー 375 H = A(J'IQ) * T 6 ー 385 A(J'IQ) = H + S * ( 6 * T NEXT 0 ー 390 1395 第 IQ ー 1 ー 400 IF PI > 饂 THEN 1440 FOR J = PI TO QM 1405 ー 410 6 新 A(IP'J) ー 4 ー 5 H A(), IQ) * T G 420 A(IP,J) 第 6 * T ー 4 為 A(J,IQ) 第 H + NEXT J 30 ー 435 ー 440 QI IF QI > N THEN 1430 ー 445 J 第 QI 和 N 1450 1455 6 ま A(IP,J) 一 1460 H 置 A ( IQ , J) * T 1465 A ( IP, J) = 6 ー S * (H + 6 1470 A ( IQ' J ) = H + S * ( 6 * T ー H ー 475 tEXT J 驚異の低価格 , ワンポードマイコンキット ロー K バイト RAM2 Ⅱ 4 ( 4K 実装可 ) ロ IK バイト ROM 2708 ( 3K 実装可 ) ロ Z ー 80 CPU ロ TTY インターフェース ロタイビュータインターフェース ロオーディオカセット インターフェースい 200 ポ ロステップ動作プレーク , G 0 ロ 25 キー 6 桁 LED 表示 ロ拡張用 72P 工ッジコネクタ端子 ロ単一 5V 電源 ロ 150mmX180mm ☆電源も取り扱ってあります。 ( 発売中 ) 0 0 0 。 A 8 0 : 4 5 6 7 コンピュータ・リサーチ株式会社 通販も致してあります。 ( 〒 1 , 00 の ヨ 自 0 0 . ヨ しー 〒 220 横浜市西区南幸 2 ー 19 ー 3 主屋ビル 8 階バ ( 045 ) 314 ー 6321 173
100 、 DIM P(S) 0 EPS = 0.0 ふ IFUT ” C 120 (WT%) 】 30 I NPIJT ー” H (WT%) 140 INPUT “ 0 ( WT% ) { 0 160 C 第 C / 12 170 H H / コ 180 0 0 / 16 190 ー 200 P ( 1 ) = P ( 4 ) = N 210 P(2) H:P(5) ま 0 220 P(3) 0 230 REM —•-F I ND MA X M しーーー 240 MIN = P ( 1 ) 250 1 = 1 260 'IF P(I) ま 0 THEN 330 270 REM * * BEG I N * * 280 IF (P(I) く MIN) THEN MIN = p 0 ー第 + 1 300 GOTO 260 310 REM * * END * * 320 ー 330 FOR I ま 1 TO 5 340 P ( I ) = P ( I ) / M I N 350 NEXT I 360 370 MP 新 1 380 : プログラム 5 390 REM 400 を REM * * SOIE * * 410 420 : 430 1 ま 1 440 SOME ま 0 450 IF P(I) ま 0 THEN 510 460 S 第 MP * P ( I) INT (S + 0.5 ) ) IF ABS (S ー 470 ) EPS THEN SOME = SOME + 1 480 ー第一 + 1 490 8T0 450 500 REM I F SOME = 0 THEN 560 510 520 MP 震十 1 530 GOTO 390 540 REM 550 哥 560 REM * * 0 リ TPIJT * * 570 PR I NT 580 PRINT 、 PRINT C : H : 0 = 590 FOR 1 ま 1 丁 0 3 600 610 PRINT “ ' INT ()P * P ( I ) 十 0.5 620 IF 工く 、ン 3 THEN PRINT ” 630 NEXT ー 640 PR I NT 650 END 0 ・ 0 C ま H を 1 0 まー 5 : い 3 1 C (WT%) : 3.73 も H (WT%Y ー 0.622 0 (WT%) : 0 物 332 C ま H : 0 第 15 ー 30 ー , C (WT%) を 26. H (WT%) : 2.24 0 (WT%) ー 71.08 C 姜 H 0 第一 1 図 7 0 より大きく 1 未満の分数を次の 2 つのルールに従って 並べていきます . i ) 分母の小さい順に並べ , 分母が同しならは・分子の小さ い順に並べていく . ⅱ ) 分子と分母の和の小さい順に並べていき , 和が等しけ れば , 分子の小さい順に並べる . こうして , i ) とⅱ ) の並べ方で , みや十 , をなどのように どちらの並べ方でも同し位置にくる分数をすべて捜し出す こク ) ノヾスつレで、す -. のカゞ , この種のノヾズルは , 非常に時間がかかるのが常で , 夜 , 寝る前に RUN しておくと , 翌朝か翌々朝には答が出てい るという . ヒート・ラン ( 長時間電源を入れつばなしにし て , 異常が起こらないかどうかチェックすること ) 向けの プログラムです . 7 個目 , すなわち 7190 th fraction : 50 / 121 までは , 比較的簡単に出てくるのですが , あとはどうなる のか小生は知りません . ただ , ちょっと心配なのは , 変数 CNT がオーノヾーフローするのではないかということです ( 図 7 , プログラム 6 , 7 ). 問題 505 の解 INT ( S + 0.5 ) INT (VAL (X$) スタート S 1 ← 0 S 2 ← 0 M 2 ← 3 CNT ← 0 S 1 ← S 1 十 1 1 ~ M - 初期化 M 1 ← M 1 十 1 S 2 ← S 2 十 1 M 2 ← M 2 ー 1 2 M 0 ー = M 2 CNT, れ 0 ー > 1000 ある、、は 2 > 1000 Y05 銀行の利子の計算などでは , 特定の 2 時点の間の日数を 計算することが必要となります . この種の間題を解くとき 問題 507 ー 66
( 一同 ) 「ははあっ . 』 上文は , どんなふうでもよいから 部の紹介をやっといてくれ , という彼 の希望によるものです . なお , その研究会は , 機械語を中心 に活動しているそうです . くたばれ / オリジナルばんざい / マンネリ . しかし , オリジナル・ゲー ムを作るのは , むつかしい . このゲー ムは , オリジナル度 80 % といったとこ ろです . ・ BA S I C 用自殺プログラム ? 「文番号 ENDJ を「文番号 NEWJ にする ・世界一小さいプログラム ? 10 L I S T ( プログラムの表示をするプログラム ) あとがき 桃が流れて来る所を予知して , そこに構える . 念力を使って , 人間の所に桃 を流す . マイコン内の乱数を調べて , どのように桃が流れるかを調べる . プログラムを書き直して , 点 がたくさん取れるようにする . いいかげんにしろ / このプログラムのリストは , 、、ツクモ マイコンセンター名古屋店″の協力に よるものです . ありがとうございまし た ( それにしても , プリンタが欲しい / 頭カゞ高い / このヒ ラメ・・・しゃなかった . マイコンが目に こにおわすお方をどな 入らぬか / たと心得る / おそれ多くも岐阜大学 マイコン研究会の一員 , 奥村公であら せられるぞ / 』 塗塗塗 MZ-80 K モモタロウ・ゲー 乙 プログラ乙・リスト全 - - - - -4- - . 塗 . 2 自 , ) = 計に ( わ 1 目 REM シンセモをロウ・ - : O ひ 1 自 ( 18 , 1 ) 73 PÜKE 自 ( I + 1 , 煽 目 OEF FN 日 ( ト : ) = 印 : : ト : + 1 , 目 ) + INT ( RNO ( 1 ) * 3 ) + 了 9 74 F ・ロト : E 用 : I , 目 ) , 4 日 4 自 ( 1 ) = 532 斗甞 + 259 75 NEXT 1 5 目 SH = ー・ヨ・ヨ 9 : い = ・ヨ・ヨ ? 7é朝ら 0 LI 日 4 6ü 6 ロ 3 し旧 7 IF TZ = 1 らロ〒ロ 1 19 T こ = 目 ヨ目らロ TO 3 1 1 匸 = 目 1 ト : 2 目 2 : M ソ = 目 : L 自 = ロ 1 目臼 12 「・帽 = 5 24 ら + ? ・ヨ 5 1 1 PF.:INT T 自日 ( 1 ①峠 " ワリテ、、 1 ごらロ SL 旧ら目目 1 目 F ・ RINT 14 F'ÜKE M は 1 ト : 1 3 目 I F こ : H THEN SH = 印 : TI ま = " ら目自 " 1 目 4 目 IF ミ匸 : く引 d THEN Sb.I=SC: 31 T = 5 1 自 5 PRINT T 自 E : ( 1 ) 創」 F. : ミ匸 : ロ RE SC 229 FÜR l=ø TO ? ・ヨ ? 1 PRINT T 自日 ( 1 目 ) HI ら H ミ〔 : ロ : E SH 23 TI=TEI—WAL(TI$) 1 目 79 PRINT T 自 8 ( 1 目 i'IdÜRST 印 : ロ F, : E ・ミい 24 ら F ・ F.INT " T 自日 ( 27 “れイシ TI 1 臼 E : 臼 F ・ RINT を IF TI = ら CIT ロ 27 1 創ヨ 9 PRINT T 自日 ( : 5 " をウイチト・、 三ロスカ : いド ES = 1 : NÜ= ニé朝 NEXT I 1 1 目目 GET I PRINT ”田 T 自 8 ( 27 ) 当 1 1 19 I F I = 1 ら 0T0 1 目 1 12 目 I F I = THEN ENC' 39 O=INT<Z'*P..NO(I)> 1 1 目らロ T ロ 1 1 目 31 目自 ( 7 , 1 ・ ) = ら 3 * 〔ト 224 工トい GET L$ 3 目日ロミ L 旧 2 目目 2 1 IF L ま = " 日 " THEN L 自 = 目 IF MY=I THEN MY=Ü: らロ T ロ 42 IF L ま = " リ” THEN L 自 = ー 1 4 1 目 PÜKE 自 ( , 目 ) , IF L$•="N" THEN L 自 = 1 42 4 IF L 自 = 目 THEN RETLIF.:N 43 目自 ( い = 自 ( 1 3 1 ) ニ 1 目 t'll 帥 1 自 + L 自 44 F ・ロに E 自 ( 1 , 目目 : 1 1 t'12=F ・ EEE.•q•t ・ 11 ) 45 IF F ・ EE に ( 自 ( 自 , 臼 ) ) ) 朝らロ SL 旧 3 目自 : 129 IF t'12 = ららロ T ロ 22 4é THEN 印 : : 目 , 1 ) = 1 7 213 IF M2 = ・ヨらロ T ロ 2 ご 47 F ・ 0 に E 自 ( 目 , 目 ) , 自 ( 1 ) ニ 14 目 L 自 = 目 : RETLIRN 48 毛 05L 旧 4 目 PÜKE 享 4 ・ヨ IF TZ=I 日ロ T ロ 1 自 1 目 F ・ロに E 国 1 は 1 : : く " 5 目 FÜR 1 = 1 TO 6 MØ=MI 51 目らロ引 - 旧 2 目目 RETLIF.:N 心上 0 り 5Z' 自 ( I, 目 ) =FNE: ( I ) IF M ト : = 2 2 THEN L 自 = : RETLIP..N 53 自 ( I , 1 ) = 自 ( I + 1 , 231 鬻 54 目 F 、ロに E 自 ( I + ) 3 32 F ・ÜKE 「 , 1 2 ら 2 55 PCIKE 自 ( I , のリ中 : 1 , 1 ) F ・ CIKE 5424 83 560 NEXT I 234 M リ SI ロ“ - こ目” 57 目 らロ SL 旧 4 目 ← 2359 PCIKE 54246 , ・ヨ 53 IF T こ = 1 らロ T ロ 1 自 驀 236 目 S こ = ミ匸 + 5 自 6 目目 F 〔旧 1=7 TCI 12 らロ SL 旧 5 目目 E ・ 1 日〔旧 L 旧 299 目 L 自 = 目 E. 2 目 . 自 ( 1 , 目 ) = F ト旧 ( い 囓・ヨら RETLIRN 日目 F'OKE 自 ( I + 1 , 目 ) , I F 自 ( 目 , い =e,.3 らロ T ロ 31 ら目 64 目 PÜト :ZE 自 ( I , ) , 13 IF 自 ( い = 24 THEN 印 : : = ら〔 : ー目 了 1 目 E , 5 ・ <T I ご自 2 F ・ロに E PIÜ , 2 目 3 日朝日〔劇 - 旧 4 目 ら 7 目 IF T こ = 1 日 0T0 1 目 3 目 4 目た信 = 292 79 ら FCiR I = 13 TO - 17 自 ( ら , 1 ) = 292 こ目 5 71P らロリ日 5 目 ルる能力はあ・ ) ませんので ( イ 0 ンには , その能力はあるだろうが・・・ ・・ ) , もつばら M Z ー 80K 専用プログラムのみ . マイコンを手足の如く使いこ なせるようになるまで生きておられるかどうか , 心配が先に立つマイコン地獄 ( ノイローゼ ) でアリマスデス . MZ 一 80K 標準装備で , そのバイト数内におさまるゲームのプログラム ( すでに I / 0 誌などで発表ずみ ) があれば人助けと思らておせ一て〃類 ( 大阪・ビギナーおじさん ) はミナ兄弟 / ′ますは , マイコン愛好者先輩諸氏への仲間入り御挨拶 / ′
プログラム 2 図 4 BASIC PASCAL スタート 掛ける数 X の入力 INPUT 100 INPUT •y= 1 1 0 120 Z = 0 1 30 u = X NOT (U>O) THEN'200 ー F 150 ー F IJ MOD 2 THEN Z = Z 十 V 160 u = u / 2 170 V = V * 2 180 150 190 GOTO 200 P R ー N T X * Y = 2 1 0 P R ー N T 220 END ただし IJ MO D 2 は , を 2 て割った余り . IJ/ 2 は整数型の割算 ( たとえば , Tiny BASIC の割算など ) VAR X, Y, Z, u, V •.INTEGER BEGIN WRITE ( 、 X READ ( x ) ・ WRITELN WRITE ( 、 Y= R EA D ( Y ) ・ W R ー T E LN u : = X WHILE u > 0 DO BEGIN IF ODD(U) THEN Z : = Z 十 V; u : =u DIV 2 V : =V * 2 END ; W R ー T E LN END. 掛けられる数 Y の入 結果の初期化 Z ← 0 U > 0 か U の LSB は 1 か こでは , W H I L 文を I F 文で代用する方法に さて , ついて述べてあります . PA S CAL は , P-c 0 d e という中間 言語にコン / ヾイルする型のものが多いのですが , この P ー code も , 条件付きジャンプと無条件ジャンプしか持ってお らす , これらの組み合わせで変換を行なっているわけです . W HILE 文は P-code に直すときも , 比較的処理が面倒 うで , この例題のような変換をするので , こでやってい ることは , さしすめハンド・コン / ヾイルということになるので しようか . とすれば , これを機能的に行なわせて , PASCAL と BASIC の中間的存在 ( いわは構造化 FORTRAN : RA TFOR のような ) が作れるのではないでしようか . W H I LE 文の変換には , 前に述 べたとおり , GOTO 文が必要になっ てきます . しかし , これは , 単に機 械的に変換しているだけなのである 程度 , 慣れてくれば , どの IF 文と , どの GOTO がループを形成してい るかすぐにわかるはずです . すべて は私たちアマチュアの努力にかかっ ているのです . BASIC で構造化プロ ログラミングを実現しよう ! 問題 502 の解 NEXT I U ← U を右に 1 ビット シフト Z のプリント プログラム 3 PASCAL OUTPUT) ・ PROGRAMPOWER (INPUT, VAR Z :INTEGER W : R E A L BEGIN READ ( W ・ ) ・ WHILE ー > 0 DO BEGIN IF ODD ( ー ) THEN Z : = Z * W , ー DIV 2 ・ w : =SQR ( w ) ・ END; WRITE ( POWER =V, W R ー T E LN END, スタート ーの入力 W の入力 ーは奇数か Z ← Z * W ←ーを右に一ビット ・・べき乗サプルーチン 。のわ乗 , つまり。 6 を計算するプ ログラムを考えてみましよう . いま , “に相当するものを w , b に相当す るものを一に置き換えてプログラム して / 人ると , プログラム 3 のように なります . このプログラムは , 問題 503 のときほど , ピット操作が活かさ れておりませんが , 整数型の割り算 のところで使ってあります . このプログラムでは , WHILE 文 の書き換えがネックになるのですが , W H ILE の繰り返し部分に当たると ころを , REM 文で区切るとわかり - ニ 4 B A S ℃ 0 INPUT い 0 ー N P u T 120 P R ー N T IF NOT い > 0 ) THEN 0 0 REM 160 ー F THEN Z = Z * W ー = INT い / 2 ) 170 0 W = W * W 1 90 GOTO 200 R E M PRINT *POWER = 〃 幻 0 220 PRINT 230 END ・シフト W ← -W * W Z のプリント 工ンド ー 64
プログラム 6 PASCAL M2 十 CONST MAX = 10000 ; ( * 分母の最大値 * ) 1 ・ = 1 処理 プログラム 7 BEGIN ( * 分子 * ) M 2 ( * COUNTER * ) CNT . REPEAT ー F S 1 > = M 1 THEN BEGIN M 1 : =M 1 十 1 : S ( * 数列 1 の終わり * ) S 2 : =S 2 十 1 ; M 2 : =M 2 ー 1 ; IF S 2 > = M 2 THEN 400 MAX 第 R00 は 10 Si 0 120 S2 ま 0 ー 30 Mi 第 2 140 M2 第 3 ー 50 CNT 地 0 REM * * REPEAT * * 290 ー 3 Ⅸー 引 0 を 320 330 340 第 350 IF ((SI = (2) AND Ⅲ 1 M2)) THEN PRINT CNÜ"TH FRACTIO REM * * UNTIL 林 IF NOT ((MI 〉 MAX) OR ()2 〉 MAX) ) THEN 170 END ー 90 SI 第 SI 十 1 IF SI 〉 い SI = ー 230 S2 = S2 + 1 240 M2 = M2 ー 1 IF S2 > END E N D THEN 160 を 】 70 180 : 200 210 220 ー 250 260 270 = M 1 THEN REM END OF SERIES 1 ま M2 THEN SXS2 1 REM END 舮 SERIES 2 280 CNT CNT + 1 IRUN ITH FRACTION : 1 / 2 2TH FRACTION : 1 / 3 8TH FRACTION 要 2 / 5 40TH FRACTION ー 4 / 10 219TH FRACTION : 9 / 22 1246TH FRACTIN : 21 / 51 7190TH FRACTION : 50 / 121 BEGIN M 2 : =M 2 十 S 2 ; ( * 数列 2 の終わり * ) CNT . = CNT 十 1 ・ ( * 数列を数える * ) IF ( (S 1 = 2 ) and (M 1 =M 2 ) ) S 2 よく使われる方法に END. UNTIL ( (M 1 >MAX) 0 「 END , WRITELN (S 1 , 、 / , WRITE (CNT, 、 TH,—FRACTION BEGIN M 1 ) ; プログラム PASCAL FUNCTION UDAYS (Y, B E G ー、 ー F M > 2 TH E N M : = M 十 1 8 (M 2 >MAX ) ) ; ュリウス暦を使うものがあります . を 360 日として計算する場合には , 多少す・れが生してきます . られます . ただし , 金融計算などで , 1 ヶ月を 30 日 , 1 年 年 2 月 28 日までの 200 年間については , 実際の日数が求め このユリウス歴を使いますと , 1900 年 3 月 1 日から 2100 です . 陽暦のことで , 365 日と 6 時間をもって , 1 年とするもの ジュリアス・シーザー ( ュリウス・カエサル ) が定めた太 ュリウス暦 (JuIius 暦 ) というのは , ご存知のとおり , では , ますュリウス暦を計算するためのアルゴリズムを END; IJ D A Y S . ELSE 十 1720982 十 D 十 T ( 30.6001 * M ) = T ( 365.25 * Y ) END; M : = M 十 1 3 ; Y : = Y ー BEGIN 紹介しましよう . 公式 日数 = INT ( 365.25 *Y) 十 D 十 1720982 こで , D は日数 , 年数ー 1 年数 月数 + 13 月数 + 1 ( 30.6001 * M) (M = 1 or 2 ) 十 INT ( M > 2 ) (M = 1 or 2 ) (M > 2 ) BEGIN ( * OF MAIN * ) END . WRITELN WRITELN ( DAYS= DD : = A B S (D 2 ー D 1 D 1 :=UDAYS (), M, WRITELN; READ (), M, D); D 1 :=UDAYS (), M, WRITELN; READ (), M, D); ( ただし , 関数 T は定義されているものとする ) ↓ サプルーチン名 サプルーチン名 グラム 8 , 9 に示します . いたものを , それぞれプロ CAL および BASIC で書 このプログラムを , P A S RETURN 図 8 スタート 年数 1 を入力 Y とする 月数 1 を入力 M とする 日数 1 を入力 D とする ュリウス日数計算 サプルーチン 0 1 ←結果 年数 2 を入力 月 2 を入力 日数 2 を入力 ュリウス日数計算 サプルーチン D 2 ←結果 DD ← ABS(D2—Dl) 日数 DD をプリント 工ンド この公式を用いて , 2 時点間の日数を求めるには , それ ぞれの日数 ( 上の公式によるユリウス暦の日数 ) を求め , その差をとればよいのです . この日数計算のプログラムのフローチャートは , 図 8 の ようになります . 図 8 の中では , サプルーチンというものを使っています が , 詳しくは来月号で説明します . サプルーチンをフローチャートで書く場合には , 2 重線 をともなう長方形を使い , 中にはサプルーチン名を書いて おきます . そして , そのサプルーチンは , また別のフロー チャートを描いて , 最後は、、 R II 爪 N クにしておきます . ュリウス日数計算 M ← M 十 1 ← M 十一 RSLT ← T ( 365.25 * Y ) 十 T ( 30.6001 * M ) 十 D 十 1720982 167
多く用いる . 変数名は長くなってもわかりやすいものにする . BASIC では普通 2 文字しか使えないことになっ ていますが , 2 文字を判別に使うだけで , 長い名前を 付けても構わない場合が多いのです . 、、 ST クとする よりも、、 STACK" と名前を付けた方が , 後でメン テナンスがすっと楽になります . りやすくなったのですが スピードをあげるための技巧 CPU の高速化によって , わかりやすいプログラムを作 なってしまいます . データを記憶しておける RAM ェリアは , ますます少なく ェリアが 8 K から , 多いものですと 24 K バイトにも及び , のインタープリタを ROM に固定してあります . この ROM ータは、、スイッチ ON, BA S IC" の方式を採るため , BA S IC 64 K ノヾイトしかなく , また , 現在のパーソナル・コンピュ 直接アドレッシングできるメモリのこと カゞたかだか ディスクやテープといった外部記憶ではなく CPU が しかしながら , ノヾーソナル・コンピュータでは , 主記憶 図 1 PASCALT* は , IF—THEN—ELSE 文の場合 条件式 0 yes ステートメント 1 ステートメント 2 IF 条件式 THEN ステートメント 1 BASIC では ELSE ステートメント 2 ; を重視しなくても済むから メモリは 8 ピット CPU の宿命で大きくすることができす , 16 ピット CPU に付け 問題 501 にしましよう . と THEN" について , 基本から応用へと説明していくこと さて , それでは今月のテーマである、、条件分岐 込まれる余地があるのではないでしようか . IF たときにだけ , プログラムの流れが変わります . 具体的に す . 後者は必す分岐するのに対し , 前者は条件が満たされ つの分岐として , GOTO に代表される無条件分岐がありま IF—THEN に代表される条件分岐に対応するもうひと は , i ) ⅱ ) ⅳ ) v ) ⅵ ) A と B が等しかったら , 文番号 130 に飛ぶ . A が 6 以上だったら , 文番号 300 に飛ぶ . B が 1970 以上かっ 1980 未満であれば文番号 50 に飛ぶ . C が A 未満であれは , C に 2 を加える . X が Y 以下だったら , X に 3 をトけて文番号 30 に飛ぶ . 3- * Y 十 2 が 6 以下であれば , 文番号 100 に飛ぶ . などが挙げられます . こで , A = B とか , A 6 という ようなものを条件といいます . IF 文の一般形は , IF ( 条件式 ) THE 、 ( 行番号 0 「ステートメント ) で , ステートメントというのは , ふつう行番号 ()r 文番号 ) の後に書く文のことで で区切って複数のステートメ ントを書くこともできます . このように , 多くの文を 1 行 に書いたものをマルチ・ステートメントといいます . マルチ・ステートメントは , 行番号をタイプする手間を 省いたり , 処理時間を短縮したり , メモリの利用効率を上 げたり , いろいろのメリットを持っていますが , その中で も最大のものは , 標準 BASIC が持っていない論理構造文 , IF ( 条件式 ) TH EN ( ステートメント 1 ) ELSE ( ステートメント 2 ) の代用をさせることができることにあります ( 図 1) . の後に行番号を書くというのは , IF ( 条件式 ) THEN GOTO ( 行番号 ) THEN 100 IF 条件式 TH EN ステートメント 1 1 10 ステートメント 2 120 号 ) で取り扱った構造化プログラミングのテーマのひとっ : GOT0120 L が BASIC を駆遂するときが来て , そのとき , スピード 現在は BASIC が主流ですが , 近い将来 , 必ず PASCA のです . どを用いて書かれたプログラムの方が , すっと b et t er な ーンである IF, REPEAT, WHILE, FOR, CASE な グラムへの応用を考えるときなど , 人間の典型的思考パタ そのプログラムを改良したり ( メンテナンス ) , 他のプロ るいは技法的 ) プログラミングがあったとしても , あとで たとえ , これから使おうとする言語に適した技巧的 ( あ 算入門』を参照 ) で代用するのが定石です . ならなくなったとき , 匚匚 : ここ ] 文を使った展開型 ( 『数値計 匚ここ : コ , 匚こ : : ここコを使ってプログラミングしなければ ます考え , これらの匚こここコを持たない言語 , たとえば どの構造化文を使った , いわは・ PA S CAL 風プログラムを ー ELSE, REPEAT—UNTIL, WHILE— DO, FOR な では , こで話のまとめをしてみましよう . IF ー TH EN れているのです . え , 工ラー処理などのときのために , GOTO 文は用意さ 一応あらゆる構造化文を考慮して設計されている言語でさ 文が必要になるのです . その証拠に , PASCAL のように のような書き換えが必要で , それにはどうしても GOTO っていないような構造を作るためには , どうしても , 図 2 「 : 1 い一 1 二・衄が本来持 への書き換えが必要となるのです . そして 値計算入門』の中で扱ったような , PASCAL ・から BASIC そのため , 考えたアルゴリズムを実現するためには , 『数 一部分しか持っていません . れを受け継いでいる BA S IC は , 人間の考える思考の型の ができたは・かりの頃に作られた FO RT RAN や , その流 ん . しかし , まだソフトウェア工学が未熟で , 電子計算機 るとか を , すべて文として持っていなけれは・なりませ ある条件が満たされたらこれを , そうでなけれはあれをや 得る思考の型ーーある条件が満たされるまで繰り返すとか , ログラミングですから , プログラミング言語は人間が考え 人間が考えるアルゴリズムを具体的な形に表わすのがプ には少しも近づかないのです . I F 文を使っていたのでは , CG 0T0 レス・プログラミング』 ならば , GOTO 文は存在しないからいいだろうといって , IF ( 条件式 ) THEN ( 行番号 ) 文のないプログラムを書くときに である『 GOTO レス・プログラミング』 , つまり , GOTO の省略形なのですから , 『数値計算入門』 ( I / 0 ' 79 年 10 月 ー 62
y PASCAL 緊入門 参ー条件定をやってみよう 日本を離れ空中を飛んでいる間にこの原稿を思い出した のですが , もう無理です . 1 ヶ月延ばしてしまう結果にな ってしまいました . 南カルフォルニアは本当に暖かです . 寒さの嫌いな私は , できればこんなところでポケ ~ ととは 申しません . じゃんじゃん仕事に励むのが夢なんですけれ ところで , 皆様は前回のエデイタの感覚がわかりました か . 文章をまるでメタメタに切り貼りしているような感じ なので , どんなに間違えても手数さえ考慮に入れなければ 立派なものに仕立て上げられます . そしてコンパイルはどう でしよう . 確かに「いちいち面倒な」ということにはなり ますが . これで書いたプログラムを手直ししたり , 実行させるこ とができるようになったわけですから , これからはもうプ ログラムのことだけ書いていくことにしましよう . / 等号 , 不等号による条件物定 Tiny PASCAL でも IF 文があって , いろいろな条件を判定 することが可能です . IF«LA±WHITET THEN$ WRITECWHITE'D< ー ELSE cMRITE(t 、 N0町: WHIT ま ) こでみられるように IF の次に来ている A = W HITE が 条件で , これが TRUE ならば THEN の次を実行し , さも なければ ELSE の次を実行するというようになります . っ まり , A という変数が WHITE で表わされる内容と等しけ れば WH ー TE と印字し , さもなければ NOT WHITE と印 字していくことになります . 条件は感 クだけではありません . 次のように多くの場 合がありますから充分判定が可能でしよう . 頭の中がコン ガラぬようご用心 / 1- A く B ー第 A は B よ。り、小さい ; Å一 B ~ , Åは B ど同しを : ー A く SB ±A を B は同しでなし、ツ ・Äくデ B 引、Åは B に等しいか示さい第 次は割り算の例です . PROGRAM WARIZAN (INPUTV OUTPUT)+ 、 → VAR A, INTEGER 。 READ い #VB# リ ー了 B 0 T Ⅱ N •A# 寺 32 ? 6 ' ELSE QWRITE ( 13 評 A デ % A # 記みダ : NB = な B # な み % ! 人 / B デ叮 c 井い 3 注 ) みは , プランクの略 . ND な関係になってくるでしよう . 印字していきます . つまり , 印字は A , B , C と下のよう B = C と印字するし , さもなければ A> B AND B # C と で TRUE なら (), その後の THEN に従って A > B AND ELSE に従って A< = B を印字します . また , B = C の判定 の , 従って B = C の判定をしますし , さもなければ最後の この例では A が B より大のとき (A>B), すぐ後の THEN ー 5 気、 A く B , 、 A > BQAND 、 ,B# C つ「ル S WRITR ミ C€A> B< BAND B=C') ELSEe WRITÜQ IFRA>B THEN ー F B*COTHF,N では , 少々複雑になってきた場合を説明しましよう . まうことにしています . いので , とにかく 2 バイト長での最大の値を C に入れてし こでは , もし除数 B が 0 となると割るわけにはいかな A > B A > B B = C B く > C A く = B 関係なし A > B AND B = C A > B AND B # C A く = B .0 ゴチャゴチャ説明するよりは 1 っプログラムを書いて , 間違ったらエデイタで直して , COM PILE してやってみま 杯に 20 0 0 M ・カセット・ビスレ 0 ' 80 年 2 月号掲載の ' 平安京 = イリアン * , について多数のお問い合わせありがとうございました . 読者の 126 様からのご希望の多かった TK -80BS , MZ -80K , pc -80 田用カセット・テープができましたのでご利用ください . ご希望の方は \ 3 , 500 を現金書留に同封のうえ , 工学社「 T 係』までお申し込みください . * 平安京工イリアンは電気音響 ( 株 ) の登録商標です .
A AND B = X または A ・ B = X A 金持ち B 男子 X 結果 ) = コメント 問題外 / 0 0 それでもダ ~ メ 0 同上 考えてもいいわ 1 これを図では次のよう AND というのはキピシイですね . にも描きます . 、 ~ PROGRAM O$jO{ANTET (INPUT, OUTPUT) , CONST- C 豆 = 13 よ , VAR ~ 1 , YOU, SHE : INTEGER ; BEGIN ーー READ (I#,YOU#,SHE#)'« IF ー I<*YOU@THEN 。 IF*YOIJ*SHE 、当ー THEN WRITE (CR,'ZANNEN'VCR) 、「 ELSE WRITE(CR, ! 叮 (R) ぃ ELSE (CR, ! GO い GO!%CR) ; LEND. さあて , どんな結果になりますやら . 愛情度数のチェッ クでしようか ? / 理記号による条件物定 また , 条件には AN D, OR, N OT というような論理的 なものも含まれてきます . これで各種数値判断ばかりでな くプログラムはより人間的に , つまり口ジカルになってく るのです . 「え ? ロジカルなやつばかりが人間ではない』 ですって ? 確かにそうですよね . コンピュータ・ピープ ルは , しばしばクレイジーなんですから . ところで , 論理の方をあまり知らない方々に AN D, OR, NOT などといっても申し訳ないので , ちょっとここで付け 足しをやってみましよう . よくわかっている人は読み飛ば してください . 彼は金持ぢてほない +A 三 0 彼は美男子である ; ) - 。 1 彼は美男子ではない→ B = 0 つまり , 金持ちという条件を A , 美男子という条件を B にしたわけです . いまここで A も B もどちらもが 1 なら 「考えてもいいわ」とすると , これが AND なのです . 0 1 0 1 0 0 1 1 斜線部分 考えてもいいわ (A ・ B=I) → IF—THENvN—THEN—ELSE—ELSE— IF 文には条件の結果が ' 0 ーか , 0 より大きな値かで FALSE または TRUE をとることもできます . ですから , 'WWRITE('FALSE'). ELSE という文は A ー 1 がとなったときに 'FALSE' と印字 することになり , それ以外では 'TRUE' と印字してきま す . このことは , 0 は 0 以外をみるときに IF A—I=O•HENÄ ELSE— としないで良いことを示しています . ただし , 間違えてい けないのは , A ー 1 だけでやるのは単に「ヾ 0 ″かそうでな いか」だけの場合であって , A が 1 より大きいか , 小さい かの判定はまったくしません . 〇の中は A = 1 または B = 1 で , 〇の外は A = 0 および B = 0 の領域です . そして〇の重なっている所が A AND B が 1 になっているところになります . これは下のような具合になってきます . 次に OR ですが , B = X または A 十 B = X A OR 、 X( 結 これしやダ ~ メ 0 考えてもいいわ 1 同上 1 これも同上 1 0 0 1 1 斜線部分 考えてもいいわ (A + B=I) 〇の内側は前と同しく A または B が 1 の領域ですから , 〇の外はこれではダ ~ メなところ , つまり A と B の OR は 0 になってしまう領域ですが , 〇の内側はすべて 1 (TRU E) なのです . これならあなたにも希望が持てそうですよ . NOT はアマノジャクです . 斜線部分 考えてもいいわ (A=I) A 考えてもいいわ ええ , そうなんです . どうも金持ちは鼻につくし , 美男 子も 3 回みてりゃ飽きがきます . ~ 以上はヨミトバシの部分 ~ さて , AN D, OR を使用すると , どんなことになるでし iF に A. ,AND 、 B ー、 . THEN> WRITECKANGAETE = MO コ IWA 可 ) ELSE WRITE('DAé•ME')åa しゃあプログラムしてみましよう・ 1 0 0 1 127
数価計算ライプラリー ・逆行列 ( ガウスの消去法 ) 1 . 目的 与えられた正方行列 ( 最大次数を 50 とする ) の逆行列を , ガウスの消去法を用いて解く . 2 . 方法 連立方程式を解くときに使われる方法は , 逆行列でも同 様に用いることができる . 詳しくは , 「数値計算入門①』 ( ' 78 年 11 月号 ) を参照してください ノヾックナンノヾーのな い方はコピー送ります ( 一部千円 , 送料込み ) ーーー冗談で 3 . 入出力パラメータ す . N : 正方行列のサイズーーー最大 50 ( 2 x 2 行列 , 〃 x 〃行列など ) 配列 A(I,J) : 逆行列を求めるべき , 入力パラメータ 正方行列 4 . 計算例 プログラムのリストを , プログラム 1 2 に示します . ン・プログラムは行番号 100 から 255 まで , サプルーチンは行番号 1000 以降です . 実行例 1 では , 2 x 2 行列 メイ 逆行列を求める の逆行列を求めています . 行列 A の逆行列 A ー 1 は , A ・ A- 1 = E ( E は単位行列 ) という性質を持ちますから , 2 x 2 行列の場合は , られた公式より , よく知 1 , ad —bc ad—bc ad —bc ad—bc 0 ( 2 x 2 行列なら , 出力パラメータ EI : 工ラーインジケータ EI = 0 のとき , 工ラーなし EI= 1 のとき , 工ラー 配列 A (I,J) 配列 A の逆行列 0 ー A ( 50 , ) MAIN REM 2 ) 50 ー 040 1030 ー 020 は 80 逆行列は , 3 3 であるはすです . 確かに そうなっていますね . 実行列 2 では , 4 x 4 行列 プログラム 1 2 逆行列 ー 00 105 110 5 ー 20 130 135 ー 40 5 155 ー 60 165 ー 70 180 205 幻 0 215 220 2 為 230 235 240 245 250 255 PRINT PRINT FOR J 第一 TO N FOR ー = 1 TO N NEXT I NEXT J PRINT FOR K 0 TO 1 STEP 0 ) A ( I , の T ” TYPE MATRIX INPUT $IZE ー ";N PRINT g60 1070 ー 080 ー 1090 wi100 ー 1110 1130 1140 ま REM REM REM REM REM ATOR REM ー ー 120 EI = 0 ま ARRAY ま ARRAY SAZE OUTPUT PARAMETER ー INDIC ARRAY IF N く一 THEN EI い RETURN DIM NS(50Y INPUT PARAMETER A ( I , の EI N A ( し J ) INPUT 物 ANY CORRECTIOS (Y/N IF LEFT$ (A$, 1 ) ま "N" THEN IFUT ” TYPE ITS VALIJE A(I やリ T ” TYPE ITS 2ND SUBSCRI IPUT 物 TYPE ITS IST SUBSCRI 1150 正 N まー T}*EN A(i,i) 第一 / 1 0 ー 400 ー 1410 1430 1450 ー ー 460 ー 470 1490 : ー 500 520 1540 1 品 0 ー 580 1600 ー 6 ー 0 FOR J ま 2 TO N 1390 W = A(NN, 1 ) NEXT J 正 NS(J) 第 NN THEN ー 630 J NN TO N FOR = 1 TO N tEXT NN NEXT ー 1530 A ( N) = ー W * A ( , N) NEXT J 1510 A い , J ーい = A ( I , J) - W * A ( J 第 2 TO N 480 等第 A は , 1) IF ー = THEN 1540 FOR 1 第 1 TO N ー 440 A(NN'N) 第 1 / W NEXT J ー 420 A(böbJ 1) ま A(NN,J) / w (J)S PRINT NEXT リ 8 1000 正日。ぐ > 0 THEN FOR ー第 1 TO N FOR まー TO N PRINT ー PRINT REH END PRINT NEXT J ?EXT ー PRINT 物 60 : 1190 ー幻 0 1220 ー 1230 1250 】 23 1270 1280 一四 0 ー 1330 ー ー 340 A ( 1 , i) ー RETURN 1170 EPS 第 IE ー 10 FOR 1 TO N ー 200 NS(NN) 第 NN BEXT FOR NN ま 1 TO N ー 240 P ま 0 FOR 1 = TO N PRINT “ * * END 正 P く Aß (A ( I , 1) ) THEN p 朝 ABS (A(I, 1) IP まー NEXT ー IF P くま EPS THEN EI = T リ ー 300 第 NS(IP) 13 ー 0 ( IP ) = NS(my ー 320 NS(NN) = NW FOR 0 まー TO N 1350 W ま A(IP,J) ー 370 合 ( J ) 第 W 1360 A(IP'JY 霧 A(NN,J) 1620 一 40 ー ー 650 ー 6 知 1700 ー ー 7 ー 0 20 ー ー 730 1740 39 % 63996 63997 63998 639 RETI.RN 1680 A ( I , わま W ー 670 A(I,d) ま A(I,NN) 一品 0 W = A ( し J) ー第一 TO N ー 630 お ( 田 NS ( ) ?CXT J END REM REM REH REH C ( Y 灯 ー 979 BY S. T 船」 AX 170
・攫日当てのプログラ乙と実行例・ ファイルをロードした後 。 * * * PROGRAMMA PASCAL * VER 79.6 * * * BY MARTIN : TRACY COPYRI GHT - コー = 979 、 - COMMAND* E ー→ーーこ一、 -- 工デイタ、モードに入ります、 , = NEW / ED ー T ( E E 、→ーー - ファイルを新しくする ( N ) のではありません , PLEASE STANDBY—ーサーこニー少々お待ちくださ、いね . FILE HAS 20 LINES ゞ、 600 BYTE$ : イ 5000 ー 5257 ) 。 3 BLOCKS—— ーリストを出してください . PROGRAM 、 WHATWEEK 第プログラム名は WHATWEEK CONST C.R=13; ( * 13.. RETURN * 、定数言キャリッジ・リターンは ASC Ⅳでです , VAR YEAR' MONTH' DAY , X , Y , Z を INTEGERS 変数定義みな整数です . BEGIN いよいよ始まり . READ ( YEAR$* MONTH# , DAY# ( * : 、 .DECI MAL * ) 進数で年月日を読み込みます、一 WRITE('SEIREKI=%YEAR#, を TSUKI*% 、 MONTH#* を日一第 % DAY # , CR タイトルを付けます . .IF MONTH く 3 THEN BEG IN YEAR; =YEAR—I; MONTHS ま MONTH + 10 END ELSE MONTH: *MONTH—2So もし月く 3 なら BE 引 N より END までをやりをさもなければ月より 2 を引く . X:=YEAR DIV 00 Y 第 YEAR MOD ー 00 Z 第 = ( ( 26 * 岡 ONTH ー 2 を DIV 10 + DAY + Y + 、Y~0工V 4 ◆ X DIV 4 + S*X) MOD 7 ー CASE Z OF 年を 100 で割った余り ( M00 ) を Y へ 0 ー WRITE ぐ *NICHIYOU')3 年を加 0 てり X へ い WRI TE に GETSUYOU' ) 会 WRITE('KAYOV* ) ま 2 ー 3 ー WRITE(?SIJIYOIJ*)$F 結果としての Z の値の順にどれかを実行。 4 ー WRI TE い MOKUYOU' ) 第 5 ー WRITES$KINYOU'); 6 : WRI TE け DOYOU つ END END. F ILE HAS 20 L INES 、 600 BYTES ゞ ( 5000 ー 5257 ) 3 BLOCKS 、 COMMAND:C—コンパイルします . CCOMPILE/SYNTAX (S);C シンタックスエラーチェック ( S ) ではなくいコシバイルてす . ' PCODE ADDR ( 5000 ) を P コードの番地指定です . PCODE OR IG ( 5000 ) : フログラム・リスト ス プ ロ グ ム リ ス 実行例 1980 年 4 月 29 日火曜日 COMMAND ーリ・一一一ー→、一一一・、一一ょ・ - 実行します . RUN ADDR ( 5000 ) ーー , - ーニ P コードのスタートは $ 5000 番地ですを ー 980 4 29 SEIREK 工新 1980 TSUKl=4 Hl 新 29 KAYOU COMMAND: B ー・一一 - ーーー・ BAS ℃に戻ります . 「何が何だかわからない』とおっしやる方もいるでしよう PROGRAM 」 MUKOSAN (INPUT, OUTPUT)Q ねえ . CONST ー、 CR 13 ; VAR = ー MONEY, し OOKS : INTEGER ; ところで , ご注意いただきたいのは , もし , IF—THEN ME : INTEGER : ~ ELSE—というところで , 途中に「 ; 」を入れてしまうと , BEGI 、 もういけません . Tiny PASCAL は「 ; 」を文の区切りとし READ (MONEY# , LOOKS# ) ; ているからです . ますはエラー表示が出されるでしよう . READ (ME#) ; 論理判断を多くしていくと , 次第に自分で何をやってい I を、 ME# く 0 THEN るかわからなくなってしまうことに気付くでしよう . そん IF 。 = MONEY. 0 飛 LOOKS THEN なときは「何と自分は非論理的であろうか』と大いに反省 WRITE (CR,"NO / GOOD を , (R) : 。 ELSE してみるのも PA S CA L を勉強する上に役立つでしよう . そ '(CR,tWELL-', CR): れにしても人間の頭脳というのは素晴らしいものですね . ル S IF MONEY AND LOOKS だって , 朝起きたとき , すぐにどうしたら会社のタイム・ THEN WRITE (CR, 'WELL-', CR) レコーダまで残す時間で入れるかを実に正しく判断するで ELSE (CR, 'NO-GOOD% (R) ; ~ END. レ 0 プラザ 編集部のみなさんこんにちは私は , 現在計算機を設計中ですが , 現在のちゃち CPU を 1 個や 2 個使ったつまらない計算機を作るつもり はない . 現在の C P U は , あまりにも遅すぎる . しかしピット・スライスのチップは高い . どころがある本を読んでいると C P U の速度が遅くて も処理速度を速くすることができるということが載っていた ( 2 年前の本 ). そこで私が考えるに , いくら遅い C P U でもたくさん集めればもの 128