바이오리듬
biorhythm.bas
설명
1990년 '컴퓨터 쥬니어' 잡지에 실렸던 바이오리듬 프로그램을 다시 짠 것입니다.
줄 번호가 붙은 GW-BASIC 식 코드에 한글 출력용 hput, setmode 호출이 섞여 있습니다.
- 메뉴에서 1은 화면 출력, 2는
LPRINT로 여러 달치 인쇄, 3·4는 끝내기입니다. - 건강 23일, 감성 28일, 지성 33일 주기를
$,O,#문자로 그립니다. - 연도를 두 자리로 받아서 2000년 이후에는 살아온 날이 음수가 됩니다.
원본은 조합형 한글 파일이었습니다.
╔, ═, ║ 같은 선 문자는 원본에서 D4 C9, D4 CD처럼 2바이트로 적힌 한글 카드용 박스 문자라 화면에서 두 칸을 차지했습니다.
여기서는 같은 모양의 한 칸짜리 유니코드 문자로 바꿔서, 박스 줄의 길이가 원래보다 짧아 보입니다.
BIO.EXE(1991)는 이 소스보다 오래된 빌드라 옮기지 않았습니다.
소스
CALL setmode(1)CALL scrclsDIM M(13), G$(51)FOR I = 1 TO 13: READ M(I): NEXT IDATA 0,31,59,90,120,151,181,212,243,273,304,334,365menu:130 CALL hput(25, 5, 0, " B I O R Y T H M ")150 CALL hput(31, 9, 0, " Designed by 정 상 혁")170 CALL hput(30, 12, 0, " 1. 화 면 출 력 ")180 CALL hput(30, 14, 0, " 2. 인 쇄 용 지 ")190 CALL hput(30, 16, 0, " 3. 프로그램 끝 ")200 CALL hput(30, 18, 0, " 4. MS-DOS 복귀 ")230 A = VAL(INKEY$)240 IF A = 0 OR A > 4 GOTO 230250 ON A GOTO 300, 300, 260, 270260 END270 SYSTEM290 '300 REM 주 모듈310 CLS320 LOCATE 4, 20: PRINT "╔══════════════╗"330 LOCATE 5, 20: PRINT "║ 바 이 오 리 듬 ║"340 LOCATE 6, 20: PRINT "╚══════════════╝"350 PRINT : PRINT : PRINT "당신의 생년월일": PRINT360 Y1 = 1370 GOSUB 800: GOSUB 900380 T1 = T: Y1 = Y: M1 = M: D1 = D385 IF A = 2 GOTO 1000390 V$ = DATE$400 Y = VAL(MID$(V$, 9, 2))410 M = VAL(MID$(V$, 1, 2))420 D = VAL(MID$(V$, 4, 2))430 PRINT : PRINT : PRINT "오늘이"; Y; "년 "; M; "월"; D; "일이면 아무 키나 누르시고,"440 PRINT "아니면 N키를 누르시오": PRINT450 A$ = INKEY$455 IF A$ = "N" OR A$ = "n" THEN GOSUB 800460 IF A$ = "" THEN GOTO 450465 GOSUB 900470 T = T - T1480 CLS490 '500 REM 화면 그래픽510 COLOR 0, 7520 LOCATE 1, 30: PRINT " 바 이 오 리 듬 "530 COLOR 7, 0540 LOCATE 3, 25: PRINT "당신이 오늘 까지 살아온 날 = "; T + 1550 FOR I = 5 TO 23560 LOCATE I, 11: PRINT "║"570 NEXT I580 FOR I = 1 TO 8590 LOCATE 14, 10 * I - 9: PRINT "╬════"600 LOCATE 15, 10 * I - 9: PRINT 5 * I - 10610 NEXT I620 LOCATE 15, 74: PRINT "일후"630 LOCATE 23, 10: PRINT "오늘"640 B$ = "$": C$ = "건 강": Q = 23: GOSUB 700650 B$ = "O": C$ = "감 성": Q = 28: GOSUB 700660 B$ = "#": C$ = "지 성": Q = 33: GOSUB 700670 A$ = INKEY$680 IF A$ = "" GOTO 670690 GOTO menu695 '700 REM SIGN 그래프710 K = T - Q * INT(T / Q)720 FOR I = -10 TO 60730 Y = 14 - 8 * SIN(6.2832 * (K + .5 * I) / Q)740 LOCATE Y, I + 11: PRINT B$;750 NEXT I760 PRINT C$770 RETURN790 '800 REM 입력810 PRINT Y1; "년부터 99년 사이의 년도를 입력하시오.": PRINT820 INPUT "몇 년"; Y830 IF Y < Y1 OR Y > 99 THEN PRINT "입력이 틀렸습니다.": GOTO 820840 INPUT "몇 월"; M850 IF M < 1 OR M > 12 THEN PRINT "입력이 틀렸습니다.": GOTO 840860 INPUT "몇 일"; D870 IF D < 1 OR D > 31 THEN PRINT "입력이 틀렸습니다.": GOTO 860880 RETURN890 '900 REM 계산910 T = 365 * Y + M(M) + D + INT(Y / 4)920 IF Y = 4 * INT(Y / 4) AND 30 * M + D < 90 THEN T = T - 1930 RETURN990 '1000 REM 바이오 리듬 인쇄1010 FOR I = 1 TO 51: G$(I) = " ": NEXT I1020 PRINT : PRINT1030 INPUT "이름은"; N$1040 INPUT "인쇄를 원하는 해는 "; Y1045 IF Y > 99 THEN PRINT "끝의 두자리만 입력하세요.": GOTO 10401050 INPUT "원하는 처음 달은"; M1060 D = 1: GOSUB 900: T = T - T11070 INPUT "원하는 마지막 달은"; L1080 IF L < M THEN GOTO 10701090 '1100 REM 인쇄1102 LPRINT CHR$(27); "h";1104 LPRINT CHR$(27); "W"1110 LPRINT TAB(22); "**********************************"1120 LPRINT TAB(22); "*** ***"1130 LPRINT TAB(22); " 바 이 오 리 듬 달 력"1140 LPRINT TAB(22); "*** ***"1150 LPRINT TAB(22); "**********************************"1160 LPRINT : LPRINT : LPRINT TAB(29); "Designed by Jung Sang Hyuk": LPRINT : LPRINT1170 LPRINT TAB(3); "성 명 = "; N$1180 LPRINT TAB(3); "생년월일 = "; Y1; "."; M1; "."; D11190 LPRINT TAB(60); "건 강 = $$$$$$$$$$"1200 LPRINT TAB(60); "감 성 = OOOOOOOOOO"1210 LPRINT TAB(60); "지 성 = ##########"1220 LPRINT : LPRINT1230 LPRINT " 월 일 살아온 날"; TAB(44); "C O N D I T I O N": LPRINT1240 FOR I = -5 TO 51250 LPRINT TAB(5 * I + 51); 20 * I;1260 NEXT I1270 GOSUB 16001280 FOR I = M TO L1290 D = M(I + 1) - M(I)1300 FOR J = 1 TO D1310 GOSUB 14001320 NEXT J1330 IF Y = 4 * INT(Y / 4) AND I = 2 THEN D = 29: GOSUB 14001340 GOSUB 16001350 NEXT I1360 LPRINT CHR$(12)1370 GOTO menu1390 '1400 REM 사인 그래프1410 LPRINT TAB(2); I; TAB(8); J; TAB(15); T + 1; TAB(26); "I";1420 G$(26) = "I"1430 G$(INT(25 * SIN(6.2832 * T / 23) + 26)) = "$"1440 G$(INT(25 * SIN(6.2832 * T / 28) + 26)) = "O"1450 G$(INT(25 * SIN(6.2832 * T / 33) + 26)) = "#"1460 FOR K = 1 TO 511470 LPRINT TAB(K + 26); G$(K);1480 G$(K) = " "1490 NEXT K1500 LPRINT TAB(78); "I"1510 IF J = 15 THEN GOSUB 16001520 T = T + 11530 RETURN1590 '1600 REM 구분 선1610 FOR X = 27 TO 72 STEP 51620 LPRINT TAB(X); "+----";1630 NEXT X1640 LPRINT "+"1650 RETURN