14/03/14 03:44:10.36 Dt0a1Iuk
799の「200年カレンダー」を、Windows用の「99Basic」向けに作り直した
(「移植」とは呼べない。文字化けを除けばMSXでも動く。論理式を追放した。)
100 CLS
110 INPUT "年(1900~2100),月 ";Y,M
120 IF Y<1900 OR Y>2100 OR M<1 OR M>12 THEN RUN
130 YY=Y:Y=(Y+4) MOD 28
140 J=Y MOD 4:D=INT(Y/4)*5+J
150 IF J>0 THEN D=D+1
160 IF YY=1900 THEN D=1
170 X=0
180 FOR I=1 TO 12
190 IF I<=M THEN D=(D+X) MOD 7
200 READ X
210 IF I=2 AND J=0 THEN X=1
220 IF (YY=1900 AND I=2) OR (YY=2100 AND I=2) THEN X=0
230 IF I=M THEN XX=X+28
240 NEXT
250 PRINT:PRINT
260 FOR I=1 TO 7
270 READ A$:PRINT " ";A$;" ";
280 NEXT
290 PRINT:PRINT:PRINT SPACE$(D*4);
(続く)
801:799
14/03/14 03:58:27.59 Dt0a1Iuk
300 FOR I=1 TO XX
310 PRINT USING" ## ";I;:D=D+1
320 IF D=7 THEN D=0:PRINT:PRINT
330 NEXT
340 PRINT
350 IF D>0 THEN PRINT:PRINT
360 END
370 DATA 3,0,3,2,3,2,3,3,2,3,2,3
380 DATA "日","月","火","水","木","金","土"
主な修正点:1900年1・2月と2100年3月~12月も表示できるように。
・MSXで実行するときの注意点
110行のINPUT文・380行のDATA文にある「年」「月」「火」などの全角文字、
場合によっては270行の曜日前後にある空白を修正する必要がある。
・MSXの漢字BASICで実行するときの注意点
最低でも100行を「100 _CLS」に修正する必要がある。
インターレスモード~_KANJI2・_KANJI3でないと、上部が強制スクロールされる。
画面がちらつかない_KANJI・_KANJI1で実行するときは、改行の「PRINT」を削除する、
最後にINPUT$(1)やIF INKEY$="" THEN を加えるなどの工夫が必要。
802:799
14/03/14 04:13:09.54 Dt0a1Iuk
もう一つ。海外のBASICのことを考え、140行は Y\4 から INT(Y/4) に変更した。
整数除算の"\"は、海外(日本語環境以外・日本のMSX以外)では半角"\"になる。
110行 INPUT"年(1900~2100),月" ;Y,M → INPUT"M,Y(1900-2100)";M,Y
270行 PRINT " ";A$;" "; → PRINT A$;" "; (曜日名を英3文字にするため)
380行 DATA "日","月","火","水","木","金","土"
→DATA "SUN","MON","TUE","WED","THU","FRI","SAT"
それ以外の変更はなし……で動く海外のBASICはあるだろうか?
803:799
14/03/15 03:32:57.56 GTtrbY0y
訂正。MSXと99Basicは問題ないが、
N88互換のBASICの一つ「MBASIC86」でエラーが出た。
99Basicは作者が元MSXユーザーなので、MSXとの互換性をある程度重視している。
けど、N88BASIC系統は空白の省略は許されない。
PRINT命令やPRINT USING命令などの次には、空白が必要。
310 PRINT USING " ## ";I;:D=D+1
↑310行を訂正してほしい。申し訳ない。
「MBASIC86」は、これで動作した。
804:デフォルトの名無しさん
14/03/15 12:51:19.31 8TvWREf7
なにこの独り相撲
805:デフォルトの名無しさん
14/03/15 13:37:16.17 E7qCmrfx
IDありになって良かったな
806:799
14/03/15 22:22:48.57 GTtrbY0y
わざわざ過疎スレまで煽りに来たのか。
……昔のMファンをヤフオクで落札したので、自作品をここに書いただけ。
他人様の作品を無断転載はしないよ。
落札前に再び同じプログラムを作ろうとしたが、肝心の自分がアルゴリズムを忘れた。
私のカレンダーでは使っていないけど(28年分のカレンダーを使いまわしているだけ~例:1986年=2014年=2042年)
カレンダーのプログラムを作るなら、「ツェラーの公式」
URLリンク(ja.wikipedia.org)
を参考にするといいと思う。
……と書いたら、また煽られるだろうな。
昔~ひろゆき氏が熱心に活動していた頃~の2chは、
この程度で煽られることは少ない気はしたが。
ひろゆき氏が「PCが安価になったので、一部を除いては、2chは馬鹿ばかりになった」
と嘆いたのもわかる気が。
807:799
14/03/15 22:31:04.32 GTtrbY0y
ID制…といっても、末尾が「0」「O」「i」「P」ではないので、
ID云々で煽る板ではない気がする(少数だが、現時点でもIDがない板がある)。
内容はどうであれ、末尾が「P」はボロクソに罵倒される。
「P」はp2。p2はものすごく嫌われている。悪質な荒らしが多いのかも。
(そのせいで、荒らし以外が罵倒の被害に遭っている)
アク禁になったら、別の携帯電話や避難所のスレに代理書き込み依頼が多数のはず。
あと、書き込みが1日1回限定だとIDの意味をなさないと思う。
808:デフォルトの名無しさん
14/03/16 14:24:59.42 SqWBi3v6
なんかよくわからんけど、どうせなら、この世の全ての BASIC で動くコード
とかだと面白いんだけどな
809:デフォルトの名無しさん
14/03/16 14:50:41.80 4mUPyn+t
独り相撲してナンボのスレだけどな
まあ、番号コテの人にはスレタイくらい読んでおいてほしかったとは思うな
810:デフォルトの名無しさん
14/03/16 15:08:12.80 gkqHMcUQ
BASICでは、ダークと99はNGに入ってるわ、俺。
811:799
14/03/16 16:50:59.39 P7mFBOx5
Wikiや他サイトを参考にし、カレンダーの曜日を求める式を作ったところ…
変数 H:曜日(0~6、0=日・1=月…6=土)、Y:年(2014など) M:月(3など) D:日(今回は1のみ)
H=(365*Y+INT(Y/4)-INT(Y/100)+INT(Y/400)+INT((306*(M+1))/10)+D-428) MOD 7
N88互換系では実行できたけど……MSXでは"Overflow in xxx"エラー。
MSXのMOD演算子や整数除算"\(海外版は\)"は、
2バイトの整数型(-32768~32767)の範囲に限られる。
365×西暦4桁がある時点でアウト。
……ので、MODの被除数を32767以下にしてみるか。7の倍数で最も32767に近い値を減算するとどうだろう。
MSXで動かないプログラムを作っても……と思うし。
行番号は追放する方針。>>800->>801のプログラムも、最初はDATA命令の行番号を指示する
"RESTORE 380"があったが、180~240行を無駄ループにして回避。
812:799(MSXで動作可)
14/03/16 17:47:43.30 P7mFBOx5
100 CLS
110 INPUT "Y,M ";Y,M:MM=M:D=1:U=Y MOD 4
120 IF U=0 THEN UU=1
130 IF U=0 AND (Y MOD 100)=0 AND (Y MOD 400)>0 THEN UU=0
140 IF M=1 OR M=2 THEN M=M+12:Y=Y-1
150 IF Y<0 OR Y>9999 OR MM<1 OR MM>12 THEN RUN
160 H1=(365*Y+INT(Y/4)-INT(Y/100)+INT(Y/400)+INT((306*(M+1))/10)+D-428)
170 HH=INT(H1/32767):H=(H1-32767*HH) MOD 7
180 FOR I=1 TO 12
190 READ X
200 IF MM=I THEN D=X+28
210 IF MM=2 AND UU=1 THEN D=29
220 NEXT
230 PRINT:PRINT
240 FOR I=1 TO 7
250 READ A$:PRINT A$;" ";
260 NEXT
270 PRINT:PRINT:PRINT SPACE$(H*4);
280 FOR I=1 TO D
290 PRINT USING " ## ";I;:H=H+1
300 IF H=7 THEN H=0:PRINT:PRINT
310 NEXT
320 PRINT
330 IF H>0 THEN PRINT:PRINT
340 END
350 DATA 3,0,3,2,3,2,3,3,2,3,2,3
360 DATA "SUN","MON","TUE","WED","THU","FRI","SAT"
813:デフォルトの名無しさん
14/03/16 21:18:49.40 lTEgNzO7
>>807
俺P2からの書き込みだけどPにならんよ
814:799
14/03/17 00:30:21.19 wkMqB80o
>>813
この板ではならない。
末尾に"7"などの数字・"Q"などその他の英字がある時点で
「ここはp2・ガラケー・iPhone・PCなどその他 の判別がない」とわかるはず?
末尾が"P"になってもp2とは無関係。"0" "O" "i"も同様。
このような板だと、プロバイダがアク禁のときにp2から書き込んでもバレないけど。
>>809
>スレタイくらい読んでおいてほしかったとは思うな
MSXでMファンに採用された1行プログラムを作ったとき、「これはMSXの仕様に依存している」
と意識した。SPC関数はMSX独自。論理式の"A=D=6"は、正しくは"A=(D=6)"
(D=6のときAが-1に・その他はAが0に、の意)と書くべきだが、エラー覚悟で書いたところ実行できた。
99BasicやMBASIC86でも動く…を目指すと、どうしても脱MSXになる傾向が。
>>812のプログラムの160行・170行はMSX対策。
MODや整数除算"\"は、MSXは32767以下限定。「MSX対策」と書かないとなぜ?と聞かれると思う。
815:デフォルトの名無しさん
14/03/17 00:41:51.33 cdm9pD2a
「これはMSXの仕様に依存している」…まさしくそれがスレタイの意味するところじゃねかしら?
ほかのBASICで動くなら、MSX-BASICの奥義でもなんでもないし
816:799
14/03/17 04:47:53.34 wkMqB80o
>>812のカレンダーだけど、MSXでもエラーが出ない式があったので訂正。
160 '
170 H=(Y+INT(Y/4)-INT(Y/100)+INT(Y/400)+INT((13*M+8)/5)+D) MOD 7
(160行は削除してもよい。GOTO xxなどがないので、RENUMコマンドも問題ない。)
被除数は常に32767未満なので、MOD演算子でOverflowが出ることはない。
曜日は 0=日・1=月…6=土 なので使いやすい。
調べたところ、0=土・1=日…6=金 と返す式もあるから。
あとは…漢字BASICの_KANJI版を作ったら、カレンダーは終わりにするか。
_KANJI2・_KANJI3を除く漢字BASICは、いかに改行を減らすか…
改行の問題さえ解決すれば、数字が大きいので見やすいはず。
そのうち~バスの電磁大光ブザーを真似た PLAY"S8M90O6G" とSOUND命令版も紹介するか。
これは自分で考えたもの。 PLAY"S8M90O7G" だと、通常のアナログブザーに。
…当時のMSXのクイズプログラムは、不正解の音は PLAY"O1C" などワンパターンだった。
ちなみにエミュレータのfMSXとRuMSXは、これらの音は再現できない=PSG再現に難がある。
817:799(漢字BASIC版、改行は最小限に)
14/03/17 05:17:53.14 wkMqB80o
100 _KANJI:WIDTH 29:_CLS
110 INPUT "Y,M ";Y,M:MM=M:D=1:U=Y MOD 4:UU=0
120 IF U=0 THEN UU=1
130 IF U=0 AND (Y MOD 100)=0 AND (Y MOD 400)>0 THEN UU=0
140 IF M=1 OR M=2 THEN M=M+12:Y=Y-1
150 IF Y<0 OR Y>9999 OR MM<1 OR MM>12 THEN RUN
160 H=(Y+INT(Y/4)-INT(Y/100)+INT(Y/400)+INT((13*M+8)/5)+D) MOD 7
170 D=31:M=MM
180 IF M=4 OR M=6 OR M=9 OR M=11 THEN D=30
190 IF M=2 THEN D=28+UU
200 PRINT:PRINT "SUN MON TUE WED THU FRI SAT"
210 PRINT SPACE$(H*4);
220 FOR I=1 TO D
230 PRINT USING " ## ";I;:H=H+1
240 IF H=7 THEN H=0:PRINT
250 NEXT
260 PRINT
270 IF H>0 THEN PRINT
280 END
818:デフォルトの名無しさん
14/03/19 12:04:38.51 OxhLoqdL
ここもちらしの裏だし
まいっか
819:デフォルトの名無しさん
14/06/04 15:34:40.19 ZiHf6GEW
揚げろや屑やろう!
820:デフォルトの名無しさん
14/06/04 15:40:59.44 3TCFL1gZ
断る