100 '  不等式の表す領域 ver.1.2 110 ' for N88-BASIC86 ver6.0 120 ' M.Ohtsuka (YOSHII HIGH SCHOOL) 130 ' 1993.7.26 140 ' 150 MAX=20 160 DIM A(MAX,4),LS$(MAX),RS$(MAX) 170 COLOR 7,,,,0:CONSOLE ,,0,1:SCREEN 3,0:CLS 3 180 XG=10:YG=10:GOSUB *GCSINIT:CLS 3 190 *MENU 200 SCREEN 3,0:CLS 3:LOCATE 0,2:LCX=18:LCY=13 210 PRINT " --------------------------------------" 220 PRINT " y=ax+b ・・・ 1 " 230 PRINT " y=ax2+bx+c ・・・ 2 " 240 PRINT " y=a(x−p)2+q   ・・・ 3 " 250 PRINT " ax+by+c=0 ・・・ 4 " 260 PRINT " (x−a)2+(y−b)2=r2 ・・・ 5 " 270 PRINT " x2+y2+ax+by+c=0・・ 6 " 280 PRINT " グラフを描く      ・・・ 7 " 290 PRINT " 終了          ・・・-1 " 300 PRINT " --------------------------------------" 310 I=0:IY=1:GR=0 320 WHILE NOT GR=7 330 I=I+1:IF I>MAX THEN *WE 340 IY=IY+1 350 A=0:B=0:C=0:ER=0 360 *INGR 370 FOR LY=LCY TO 20 380 LOCATE 0,LY:PRINT SPC(40) 390 NEXT 400 LOCATE LCX,LCY:INPUT "グラフの番号";GR 410 IF GR=-1 THEN END 420 IF GR<1 OR GR>7 THEN GOTO *INGR 430 A(I,0)=GR 440 ON GR GOSUB *LIN1,*QUAD,*QUAD2,*LIN2,*CIRC,*CIRC2 450 IF ER=1 THEN I=I-1:GOTO *NW 460 A(I,1)=A:A(I,2)=B:A(I,3)=C:LS$(I)=L$:RS$(I)=R$ 470 *NW 480 WEND 490 *WE 500 N=I-1 510 GOSUB *DRGR 520 COL=3 530 *PT 540 GOSUB *PNT 550 PRINT "領域指定 ・・・1 他のグラフ ・・・ 0" 560 INPUT K 570 IF K=1 THEN *PT 580 IF K=0 THEN *MENU 590 END 600 : 610 *LIN1 620 LOCATE LCX,LCY+1:INPUT "a=";A 630 LOCATE LCX,LCY+2:INPUT "b=";B 640 L$="y":R$="" 650 IF A<>0 THEN AA=A:CN=1:GOSUB *STA:R$=AA$+"x" 660 IF A=0 THEN CN=-1 ELSE CN=0 670 AA=B:GOSUB *STA:R$=R$+AA$ 680 LOCATE 45,IY:PRINT L$;"=";R$ 690 RETURN 700 : 710 *QUAD 720 LOCATE LCX,LCY+1:INPUT "a=";A 730 LOCATE LCX,LCY+2:INPUT "b=";B 740 LOCATE LCX,LCY+3:INPUT "c=";C 750 L$="y":R$="" 760 IF A<>0 THEN AA=A:CN=1:GOSUB *STA:R$=AA$+"x2" 770 IF A=0 THEN CN=1 ELSE CN=2 780 IF B<>0 THEN AA=B:GOSUB *STA:R$=R$+AA$+"x" 790 IF A=0 AND B=0 THEN CN=-1 ELSE CN=0 800 AA=C:GOSUB *STA:R$=R$+AA$ 810 LOCATE 45,IY:PRINT L$;"=";R$ 820 RETURN 830 : 840 *QUAD2 850 LOCATE LCX,LCY+1:INPUT "a=";A 860 LOCATE LCX,LCY+2:INPUT "p=";B 870 LOCATE LCX,LCY+3:INPUT "q=";C 880 L$="y":R$="" 890 IF A<>0 THEN AA=A:CN=1:GOSUB *STA:R$=AA$ 900 IF B=0 THEN R$=R$+"x2" ELSE AA=-B:CN=0:GOSUB *STA:R$=R$+"(x"+AA$+")2" 910 IF A=0 AND B=0 THEN CN=-1 ELSE CN=0 920 AA=C:GOSUB *STA:R$=R$+AA$ 930 LOCATE 45,IY:PRINT L$;"=";R$ 940 RETURN 950 : 960 *LIN2 970 LOCATE LCX,LCY+1:INPUT "a=";A 980 LOCATE LCX,LCY+2:INPUT "b=";B 990 LOCATE LCX,LCY+3:INPUT "c=";C 1000 L$="":R$="0" 1010 IF A<>0 THEN AA=A:CN=1:GOSUB *STA:L$=AA$+"x" 1020 IF A=0 THEN CN=1 ELSE CN=2 1030 IF B<>0 THEN AA=B:GOSUB *STA:L$=L$+AA$+"y" 1040 IF A=0 AND B=0 THEN CN=-1 ELSE CN=0 1050 AA=C:GOSUB *STA:L$=L$+AA$ 1060 IF A=0 AND B=0 THEN R$=R$+" ???":ER=1 1070 LOCATE 45,IY:PRINT L$;"=";R$ 1080 RETURN 1090 : 1100 *CIRC 1110 LOCATE LCX,LCY+1:INPUT "a=";A 1120 LOCATE LCX,LCY+2:INPUT "b=";B 1130 LOCATE LCX,LCY+3:INPUT "r2=";C 1140 IF A=0 THEN L$="x2" ELSE AA=-A:CN=0:GOSUB *STA:L$="(x"+AA$+")2" 1150 IF B=0 THEN L$=L$+"+y2" ELSE AA=-B:CN=0:GOSUB *STA:L$=L$+"+(y"+AA$+")2" 1160 R$=STR$(C) 1170 IF C<0 THEN R$=R$+" 半径がマイナス":ER=1 1180 IF C=0 THEN R$=R$+" 半径が0":ER=1 1190 LOCATE 45,IY:PRINT L$;"=";R$ 1200 RETURN 1210 : 1220 *CIRC2 1230 LOCATE LCX,LCY+1:INPUT "a=";A 1240 LOCATE LCX,LCY+2:INPUT "b=";B 1250 LOCATE LCX,LCY+3:INPUT "c=";C 1260 L$="x2+y2":R$="0":CN=2 1270 IF A<>0 THEN AA=A:GOSUB *STA:L$=L$+AA$+"x" 1280 IF B<>0 THEN AA=B:GOSUB *STA:L$=L$+AA$+"y" 1290 AA=C:CN=0:GOSUB *STA:L$=L$+AA$ 1300 R2=(A*A+B*B-4*C)/4 1310 IF R2<0 THEN R$=R$+" 半径がマイナス":ER=1 1320 IF R2=0 THEN R$=R$+" 半径が0":ER=1 1330 LOCATE 45,IY:PRINT L$;"=";R$ 1340 RETURN 1350 : 1360 '---------- Draw graph 1370 *DRGR 1380 X1=-10:X2=10:Y1=-9 :Y2=11:DX=.2 1390 VX1=278:VX2=638:VY1=20:VY2=380 1400 EPS=.01:PI=3.14159 1410 CLS 3:CONSOLE ,,0:CL=7 1420 WINDOW(X1,-Y2)-(X2,-Y1) 1430 VIEW(VX1,VY1)-(VX2,VY2),,4 1440 GOSUB *SCALE 1450 FOR I=1 TO N 1460 A=A(I,1):B=A(I,2):C=A(I,3) 1470 ON A(I,0) GOSUB *DRL,*DRQ,*DRQ2,*DRL2,*DRC,*DRC2 1480 NEXT 1490 RETURN 1500 : 1510 *DRL 1520 FOR X=X1 TO X2+EPS STEP DX 1530 Y=A*X+B 1540 IF X=X1 THEN PSET(X,-Y),CL ELSE LINE-(X,-Y),CL 1550 NEXT 1560 RETURN 1570 : 1580 *DRL2 1590 IF B=0 THEN LINE(-C/A,-Y1)-(-C/A,-Y2),CL:RETURN 1600 A=-A/B:B=-C/B:GOSUB *DRL 1610 RETURN 1620 : 1630 *DRQ 1640 FOR X=X1 TO X2+EPS STEP DX 1650 Y=A*X*X+B*X+C 1660 IF X=X1 THEN PSET(X,-Y),CL ELSE LINE-(X,-Y),CL 1670 NEXT 1680 RETURN 1690 : 1700 *DRQ2 1710 P=B:Q=C 1720 B=-2*A*P:C=A*P*P+Q 1730 GOSUB *DRQ 1740 RETURN 1750 : 1760 *DRC 1770 R=SQR(C) 1780 FOR TH=0 TO 2*PI+EPS STEP PI/(R*32) 1790 X=R*COS(TH)+A:Y=R*SIN(TH)+B 1800 IF TH=0 THEN LINE(X,-Y)-(X,-Y),CL ELSE LINE-(X,-Y),CL 1810 NEXT 1820 RETURN 1830 : 1840 *DRC2 1850 R2=(A*A+B*B-4*C)/4 1860 IF R2<0 THEN PRINT "半径がマイナス":RETURN 1870 IF R2=0 THEN PRINT "半径が0":RETURN 1880 A=-A/2:B=-B/2:C=R2 1890 GOSUB *DRC 1900 RETURN 1910 : 1920 '---------- scale 1930 *SCALE 1940 FOR X=0 TO X1 STEP -1 1950 LINE(X,-Y1)-(X,-Y2),1,,&H5555 1960 NEXT 1970 FOR X=0 TO X2 STEP 1 1980 LINE(X,-Y1)-(X,-Y2),1,,&H5555 1990 NEXT 2000 FOR Y=0 TO Y2 STEP 1 2010 LINE(X1,-Y)-(X2,-Y),1,,&H5555 2020 NEXT 2030 FOR Y=0 TO Y1 STEP -1 2040 LINE(X1,-Y)-(X2,-Y),1,,&H5555 2050 NEXT 2060 LINE(X1,0)-(X2,0),2 2070 LINE(0,-Y1)-(0,-Y2),2 2080 RETURN 2090 '---------- lattice point 2100 *LATTICE 2110 DFX=ABS(X-INT(X)):DFX2=ABS(INT(X+1)-X) 2120 IF DFX>DFX2 THEN DFX=DFX2 2130 DFY=ABS(Y-INT(Y)):DFY2=ABS(INT(Y+1)-Y) 2140 IF DFY>DFY2 THEN DFY=DFY2 2150 IF DFX0 THEN AA$=RIGHT$(SA$,LEN(SA$)-1):RETURN 2270 IF (CN=1 OR CN=2) AND AA=-1 THEN AA$="-":RETURN 2280 IF CN<>1 AND AA>0 THEN AA$="+"+RIGHT$(SA$,LEN(SA$)-1):RETURN 2290 AA$=SA$ 2300 RETURN 2310 : 2320 :'---------- 領域の判定 2330 *PNT 2340 PRINT "領域を指定してください" 2350 XG=MAP(0,0):YG=MAP(0,1) 2360 GOSUB *GCS 2370 X=MAP(XG,2):Y=MAP(YG,3) 2380 PAINT(X,Y),COL,CL 2390 Y=-Y 2400 : 2410 COLOR COL 2420 PRINT "-------------------------" 2430 FOR I=1 TO N 2440 A=A(I,1):B=A(I,2):C=A(I,3) 2450 ON A(I,0) GOSUB *SGL,*SGQ,*SGQ2,*SGL2,*SGC,*SGC2 2460 IF SG= 1 THEN SG$=">" 2470 IF SG= 0 THEN SG$="=" 2480 IF SG=-1 THEN SG$="<" 2490 PRINT LS$(I)+SG$+RS$(I) 2500 NEXT 2510 PRINT "-------------------------" 2520 COL=COL+1:IF COL=7 THEN COL=3 2530 COLOR 7 2540 RETURN 2550 : 2560 *SGL 2570 SG=SGN(Y-A*X-B):RETURN 2580 *SGQ 2590 SG=SGN(Y-A*X*X-B*X-C):RETURN 2600 *SGQ2 2610 SG=SGN(Y-A*X*X+2*A*B*X-A*P*P-C):RETURN 2620 *SGL2 2630 SG=SGN(A*X+B*Y+C):RETURN 2640 *SGC 2650 SG=SGN((X-A)*(X-A)+(Y-B)*(Y-B)-C):RETURN 2660 *SGC2 2670 SG=SGN(X*X+Y*Y+A*X+B*Y+C):RETURN 2680 '---------- graphic cursor 2690 *GCSINIT 2700 DIM CS%((((11+7)\8)*11*3+4+1)\2-1) 2710 LINE(XG-5,YG)-(XG+5,YG),7 2720 LINE(XG,YG-5)-(XG,YG+5),7 2730 GET@(XG-5,YG-5)-(XG+5,YG+5),CS% 2740 PUT@(XG-5,YG-5),CS%,XOR 2750 RETURN 2760 : 2770 *GCS 2780 XG0=XG:YG0=YG 2790 PUT@(XG-5,YG-5),CS%,XOR 2800 *PTG 2810 PUT@(XG0-5,YG0-5),CS%,XOR 2820 PUT@(XG-5,YG-5),CS%,XOR 2830 WHILE K$="":K$=INKEY$:WEND 2840 IF ASC(K$)=13 THEN *QUIT 2850 XG0=XG:YG0=YG 2860 IF ASC(K$)=28 THEN XG=XG+1:IF XG>633 THEN XG=6 2870 IF ASC(K$)=29 THEN XG=XG-1:IF XG<6 THEN XG=633 2880 IF ASC(K$)=30 THEN YG=YG-1:IF YG<6 THEN YG=393 2890 IF ASC(K$)=31 THEN YG=YG+1:IF YG>393 THEN YG=6 2900 K$="" 2910 GOTO *PTG 2920 : 2930 *QUIT 2940 PUT@(XG-5,YG-5),CS%,XOR 2950 K$="" 2960 RETURN