10 Rem ---- Animesh Tripathy --- Rachel Carson Middle School -----

20 Rem ---- ACSL Junior Divison Contest 2 ------------------------

30 Print "Enter Search data : "

40 Line input SearchDataLine$:SearchDataLine$=Upper$(SearchDataLine$)

50 L=len(SearchDataLine$)

60 GOSUB 1000

70 REM Search starts here

80 LineCntr=1  'Line number, increases after each entry until LineCntr=5

90 While LineCntr<=5 'Total # of lines

100 Print "Enter Search String : "

110 Line input SearchString$:SearchString$=Upper$(SearchString$) 'String with command to search

120 GOSUB 2000

130 LineCntr=LineCntr+1 'Next line's number until after line 5

140 Wend

150 End

 

1000 REM Split words from Search Data Line

1010 I=1:J=1:K=1

1020 Word$=""

1030 For I = 1 TO L

1040 TmpChar$=MID$(SearchDataLine$,I,1)

1050 IF TmpChar$="," THEN GOSUB 1500 ELSE Word$=Word$+TmpChar$

1060 NEXT I

1070 SearchData$(K)=Word$

1080 For K=1 TO 4

1090 TmpWord$=SearchData$(K):WordLength=len(TmpWord$)

1100 FOR I=1 TO WordLength

1110 IF MID$(TmpWord$,I,1) <> " " THEN WordStartPos=I:SearchData$(K)=MID$(TmpWord$,I,WordLength):I=WordLength

1120 NEXT I

1130 NEXT K

1140 RETURN

 

1500 REM Store Search data

1510 SearchData$(K)=Word$

1520 Word$=""

1530 J=I+1

1540 K=K+1

1550 RETURN

 

2000 REM Construct Pattern to Search

2010 StarPos=Instr(SearchString$,"*") 'position of asterisk

2020 QuesPos=Instr(SearchString$,"?") 'position of question mark

2030 IF StarPos=0 AND QuesPos=0 THEN GOSUB 5000

2040 IF StarPos>0 AND QuesPos=0 THEN GOSUB 6000

2050 IF StarPos=0 AND QuesPos>0 THEN GOSUB 7000

2060 IF StarPos>0 AND QuesPos>0 THEN GOSUB 8000

2070 OutputString$=RIGHT$(OutputString$,len(OutputString$)-2)

2080 IF Len(OutputString$)=0 THEN PRINT "No Match" ELSE PRINT OutputString$

2090 RETURN

 

5000 REM No * and No ?

5010 OutputString$=""

5020 FOR K=1 TO 4

5030 IF SearchString$=SearchData$(K) THEN OutputString$=OutputString$+", "+SearchData$(K)

5040 NEXT K

5050 RETURN

 

6000 REM Yes * and No ?

6010 OutputString$=""

6020 L=len(SearchString$)

6030 IF StarPos=1 THEN SString$=RIGHT$(SearchString$,L-1)

6040 IF StarPos=L THEN SString$=LEFT$(SearchString$,StarPos-1)

6050 FOR K=1 TO 4

6060 IF StarPos=1 AND SString$=RIGHT$(SearchData$(K),len(SString$)) THEN OutputString$=OutputString$+", "+SearchData$(K)

6070 IF StarPos=L AND SString$=LEFT$(SearchData$(K),len(SString$)) THEN OutputString$=OutputString$+", "+SearchData$(K)

6080 NEXT K

6090 RETURN

 

7000 REM No * and Yes ?

7010 OutputString$=""

7020 L=len(SearchString$)

7030 IF QuesPos=1 THEN GOSUB 7500

7040 IF QuesPos=L THEN GOSUB 7600

7050 IF QuesPos>1 AND QuesPos<L THEN GOSUB 7700

7060 RETURN

 

7500 REM No * and Yes ? - QuesPos at the beginning

7510 SString$=RIGHT$(SearchString$,L-1)

7520 FOR K=1 TO 4

7530 IF len(SString$)=len(SearchData$(K))-1 AND SString$=RIGHT$(SearchData$(K),len(SString$)) THEN OutputString$=OutputString$+", "+SearchData$(K)

7540 NEXT K

7550 RETURN

 

7600 REM No * and Yes ? - QuesPos at the End

7610 SString$=LEFT$(SearchString$,L-1)

7620 FOR K=1 TO 4

7630 IF Len(SString$)=len(SearchData$(K))-1 AND SString$=LEFT$(SearchData$(K),len(SString$)) THEN OutputString$=OutputString$+", "+SearchData$(K)

7640 NEXT K

7650 RETURN

 

7700 REM No * and Yes ? - QuesPos anywhereelse

7710 SString$=LEFT$(SearchString$,L-1):SString1$=LEFT$(SearchString$,QuesPos-1):SString2$=RIGHT$(SearchString$,L-QuesPos)

7720 FOR K=1 TO 4

7730 IF Len(SString$)=len(SearchData$(K))-1 AND SString1$=LEFT$(SearchData$(K),len(SString1$)) AND SString2$=RIGHT$(SearchData$(K),len(SString2$))THEN OutputString$=OutputString$+", "+SearchData$(K)

7740 NEXT K

7750 RETURN

 

8000 REM Yes * and Yes ?

8010 OutputString$=""

8020 L=len(SearchString$)

8030 IF StarPos=1 AND QuesPos=L THEN GOSUB 8500

8040 IF StarPos=L AND QuesPos=1 THEN GOSUB 8600

8050 IF StarPos=1 AND QuesPos>1 AND QuesPos<L THEN GOSUB 8700

8060 IF StarPos=L AND QuesPos>1 AND QuesPos<L THEN GOSUB 8800

8070 RETURN

 

8500 REM Yes * and Yes ? - StarPos at the beginning and QuesPos at the end

8510 SString$=MID$(SearchString$,2,L-2)

8520 FOR K=1 TO 4

8530 IF SString$=RIGHT$(LEFT$(SearchData$(K),len(SearchData$(K))-1),len(SString$)) THEN OutputString$=OutputString$+", "+SearchData$(K)

8540 NEXT K

8550 RETURN

 

8600 REM Yes * and Yes ? - QuesPos at the beginning and StarPos at the end

8610 SString$=MID$(SearchString$,2,L-2)

8620 FOR K=1 TO 4

8630 IF SString$=MID$(SearchData$(K),2,len(SString$)) THEN OutputString$=OutputString$+", "+SearchData$(K)

8640 NEXT K

8650 RETURN

 

8700 REM Yes * and Yes ? - StarPos at the beginning and QuesPos anywhereelse

8710 SString1$=MID$(SearchString$,2,QuesPos-2):SString2$=MID$(SearchString$,QuesPos+1,L)

8720 FOR K=1 TO 4

8730 IF SString1$=MID$(SearchData$(K),len(SearchData$(K))-len(SString2$)-1,len(SString1$)) AND SString2$=RIGHT$(SearchData$(K),len(SString2$)) THEN OutputString$=OutputString$+", "+SearchData$(K)

8740 NEXT K

8750 RETURN

 

8800 REM Yes * and Yes ? - StarPos at the end and QuesPos anywhereelse

8810 SString1$=LEFT$(SearchString$,QuesPos-1):SString2$=MID$(SearchString$,QuesPos+1,StarPos-QuesPos-1)

8820 FOR K=1 TO 4

8830 IF SString1$=LEFT$(SearchData$(K),len(SString1$)) AND SString2$=MID$(SearchData$(K),QuesPos+1,len(SString2$)) THEN OutputString$=OutputString$+", "+SearchData$(K)

8840 NEXT K

8850 RETURN