'* * * * * * * * * * * * * * * * * * * * * * * * * * *' '* --- MATH Teacher System --- *' '* *' '* Program Name: MATH.BAS *' '* Type: QBasic Source Code *' '* Created in: 1996 Apr. *' '* Created by: Zsolt Nagy Perge *' '* Version Number: 1.00 *' '* Z-SOFTWARE (R) *' '* * * * * * * * * * * * * * * * * * * * * * * * * * *' DEFINT A-Z '* * * * * * * * * * * * * * * * * * * * * * * * * * *' '* Functions *' '* * * * * * * * * * * * * * * * * * * * * * * * * * *' DECLARE SUB FPut (Number) DECLARE SUB GetKey (Key$) DECLARE SUB Search (DataCount, Name$(), TaskName$(), Task(), Mark(), PTask(), Speed(), CDate$(), CTime$(), LwrRes(), UprRes(), S()) DECLARE SUB PutMenu (Menu$(), Count, Selected) DECLARE SUB StrComp (Result, String1$, String2$) DECLARE SUB Scroller (CurrPos, MaxSize) DECLARE SUB SortData (BY, L, Name$(), TaskName$(), Task(), Mark(), WTask(), PTask(), Speed(), CDate$(), CTime$(), LwrRes(), UprRes(), S()) DECLARE SUB GetNumber (MaximumLength, Number$) '* * * * * * * * * * * * * * * * * * * * * * * * * * *' DECLARE SUB Help () DECLARE SUB Teach (OType$(), Operation) DECLARE SUB Wrong () DECLARE SUB Right () DECLARE SUB ViewData () DECLARE SUB SetValue (Operation, Upper, Lower, A, B, Result) DECLARE SUB Terminate () DECLARE SUB Initialize () '* * * * * * * * * * * * * * * * * * * * * * * * * * *' '* Declarations *' '* * * * * * * * * * * * * * * * * * * * * * * * * * *' DIM Menu$(7) DIM OType$(5) COMMON SHARED AutoAbort COMMON SHARED ErrorStatus '* * * * * * * * * * * * * * * * * * * * * * * * * * *' '* Main Program *' '* * * * * * * * * * * * * * * * * * * * * * * * * * *' MainProgram: 'ON ERROR GOTO Handler OType$(0) = "Four base operation" OType$(1) = "+Addition" OType$(2) = "-Subtraction" OType$(3) = "ùMultiplication" OType$(4) = "/Division" Menu$(0) = "Main Menu" Menu$(1) = "Addition (+)" Menu$(2) = "Subtraction (-)" Menu$(3) = "Multiplication (ù)" Menu$(4) = "Division (/)" Menu$(5) = "View Data List..." Menu$(6) = "About Help" Menu$(7) = "Exit..." Selected = 1 DO PutMenu Menu$(), 7, Selected IF Selected = 5 THEN ViewData ELSEIF Selected = 0 OR Selected = 7 THEN Terminate ELSEIF Selected = 6 THEN Help ELSE Teach OType$(), Selected END IF LOOP SYSTEM '* * * * * * * * * * * * * * * * * * * * * * * * * * *' Handler: ErrorStatus = ERR IF AutoAbort = 1 THEN BEEP LOCATE 8, 23: PRINT "É" + STRING$(34, "Í") + "»"; FOR Counter = 1 TO 7 LOCATE 8 + Counter, 23: PRINT "º" + SPACE$(34) + "º"; NEXT Counter LOCATE 15, 23: PRINT "È" + STRING$(34, "Í") + "¼"; LOCATE 8, 33: PRINT " Error Message "; LOCATE 13, 23: PRINT "Ç" + STRING$(34, "Ä") + "¶"; LOCATE 10, 25: PRINT "Error code:"; ErrorStatus LOCATE 11, 25: PRINT "Abnormal program termination" LOCATE 14, 25: PRINT "Press any key to return..." GetKey Key$ Terminate END IF RESUME NEXT '* * * * * * * * * * * * * * * * * * * * * * * * * * *' '* * * * * * * * * * * * * * * * * * * * * * * * * * *' SUB FPut (Number) Number$ = STR$(Number) Number$ = MID$(Number$, 2, LEN(Number$) - 1) PRINT #1, SPACE$(5 - LEN(Number$)) + Number$; END SUB SUB GetKey (Key$) Key$ = "" DO WHILE Key$ = "" Key$ = INKEY$ Number = RND LOOP END SUB SUB GetNumber (MaximumLength, Number$) Number$ = "" Col = POS(0) + Col Row = CSRLIN + Row DO LOCATE Row, Col, 1: PRINT ; GetKey Key$ SELECT CASE Key$ CASE CHR$(13): ' Enter IF Number$ = "" THEN BEEP ELSE LOCATE , , 0 EXIT SUB END IF CASE CHR$(0) + "M": ' Right Key$ = " " CASE CHR$(0) + "K": ' Left Key$ = CHR$(8) END SELECT IF Key$ = CHR$(8) THEN ' BackSpace IF LEN(Number$) > 0 THEN Col = Col - 1 IF Col = 0 THEN Col = 80 Row = Row - 1 END IF LOCATE Row, Col: PRINT " "; Number$ = MID$(Number$, 1, LEN(Number$) - 1) END IF ELSE IF ASC(Key$) > 47 AND ASC(Key$) < 58 THEN IF LEN(Number$) < MaximumLength THEN LOCATE Row, Col: PRINT Key$; Number$ = Number$ + Key$ Col = Col + 1 IF Col > 80 THEN Col = 1 Row = Row + 1 IF Row > 25 THEN Row = 25 END IF END IF END IF END IF LOOP END SUB SUB Help COLOR 15, 7 LOCATE 6, 10: PRINT "É" + STRING$(58, "Í") + "»"; LOCATE 6, 36: PRINT " Help "; FOR Counter = 1 TO 13 LOCATE Counter + 6, 10: PRINT "º" + SPACE$(58) + "º"; NEXT Counter LOCATE 18, 10: PRINT "Ç" + STRING$(58, "Ä") + "¶"; LOCATE 19, 12: PRINT "Press any key to return..."; LOCATE 20, 10: PRINT "È" + STRING$(58, "Í") + "¼"; COLOR 0 LOCATE 8, 12: PRINT "þ You can practice the four rules of arithmetics with" LOCATE 9, 12: PRINT " this program, and it will save the tasks and results" LOCATE 10, 12: PRINT " on disk for you." LOCATE 12, 12: PRINT "þ This program has a data base with some interesting" LOCATE 13, 12: PRINT " menus and functions too... (Sorting, Selecting, ...)" LOCATE 15, 12: PRINT "þ Created by Zsolt Nagy Perge in 1996 Apr." LOCATE 16, 12: PRINT " Microsoft Quick Basic Version 1.1" LOCATE 17, 12: PRINT " Z-SOFTWARE (C)" GetKey Key$ END SUB SUB Initialize SCREEN 0 WIDTH 80, 25 COLOR 7, 0 CLS RESET LOCATE , , 0, 12, 13 LOCATE 1, 1: PRINT STRING$(80, "Ä"); LOCATE 25, 1: PRINT STRING$(80, "Ä"); COLOR 15 LOCATE 1, 4: PRINT " MATH Teacher Program System (R) " LOCATE 1, 63: PRINT " Z-SOFTWARE (C) " COLOR 7 AutoAbort = 0 ErrorStatus = 0 END SUB SUB PutMenu (Menu$(), Count, Selected) MaxLength = 0 FOR Counter = 0 TO Count IF MaxLength < LEN(Menu$(Counter)) THEN MaxLength = LEN(Menu$(Counter)) NEXT Counter Initialize LOCATE 3, 3: PRINT "Ú" + STRING$(MaxLength + 2, "Ä") + "¿"; LOCATE 3, MaxLength / 2 + LEN(Menu$(0)) / MaxLength - 1: PRINT " " + Menu$(0) + " "; FOR Counter = 1 TO Count LOCATE 3 + Counter, 3: PRINT "³"; LOCATE 3 + Counter, MaxLength + 6: PRINT "³"; NEXT Counter LOCATE 4 + Count, 3: PRINT "À" + STRING$(MaxLength + 2, "Ä") + "Ù"; DO FOR Counter = 1 TO Count IF Selected = Counter THEN COLOR 0, 7 ELSE COLOR 7, 0 END IF LOCATE Counter + 3, 4: PRINT " " + Menu$(Counter) + SPACE$(MaxLength - LEN(Menu$(Counter)) + 1) NEXT Counter GetKey Key$ IF Key$ = CHR$(27) OR Key$ = CHR$(0) + "K" THEN Selected = 0 EXIT SUB ELSEIF Key$ = CHR$(13) OR Key$ = CHR$(0) + "M" THEN EXIT SUB END IF SELECT CASE Key$ CASE CHR$(0) + "H": ' Up IF Selected = 1 THEN Selected = Count ELSE Selected = Selected - 1 END IF CASE CHR$(0) + "P": ' Down IF Selected = Count THEN Selected = 1 ELSE Selected = Selected + 1 END IF END SELECT LOOP END SUB SUB Right PRINT #1, "R" END SUB SUB Scroller (CurrPos, MaxSize) PosLine = (CurrPos * 100 / MaxSize) * .13 COLOR 7, 0 LOCATE 6, 80: PRINT ""; LOCATE 21, 80: PRINT ""; FOR Counter = 0 TO 13 IF Counter = PosLine THEN COLOR 0, 7 ELSE COLOR 7, 0 END IF LOCATE Counter + 7, 80: PRINT "°"; NEXT Counter END SUB SUB Search (DataCount, Name$(), TaskName$(), Task(), Mark(), PTask(), Speed(), CDate$(), CTime$(), LwrRes(), UprRes(), S()) FOR Counter = 1 TO DataCount S(Counter) = 1 Percent = Counter * 100 / DataCount IF NOT Name$(0) = "" THEN IF NOT UCASE$(Name$(Counter)) = UCASE$(Name$(0)) THEN S(Counter) = 0 IF NOT TaskName$(0) = "" THEN IF NOT UCASE$(TaskName$(Counter)) = UCASE$(TaskName$(0)) THEN S(Counter) = 0 IF NOT Task(0) = -1 THEN IF NOT Task(Counter) = Task(0) THEN S(Counter) = 0 IF NOT Mark(0) = -1 THEN IF NOT Mark(Counter) = Mark(0) THEN S(Counter) = 0 IF NOT Speed(0) = -1 THEN IF NOT Speed(Counter) = Speed(0) THEN S(Counter) = 0 IF NOT LwrRes(0) = -1 THEN IF NOT LwrRes(Counter) = LwrRes(0) THEN S(Counter) = 0 IF NOT UprRes(0) = -1 THEN IF NOT UprRes(Counter) = UprRes(0) THEN S(Counter) = 0 IF NOT PTask(0) = -1 THEN IF NOT PTask(Counter) = PTask(0) THEN S(Counter) = 0 IF NOT CDate$(0) = "" THEN IF NOT UCASE$(CDate$(Counter)) = UCASE$(CDate$(0)) THEN S(Counter) = 0 IF NOT CTime$(0) = "" THEN IF NOT UCASE$(CTime$(Counter)) = UCASE$(CTime$(0)) THEN S(Counter) = 0 LOCATE 17, 12: PRINT Percent; LOCATE , POS(0) - 1: PRINT "%" NEXT Counter END SUB SUB SetValue (Operation, Upper, Lower, A, B, Result) SELECT CASE Operation CASE 1: Result = RND * (Upper - Lower) + Lower A = CINT(RND * Result / 1.5) B = Result - A CASE 2: Result = RND * (Upper - Lower) + Lower A = CINT(RND * Result * 1.5 + Result) B = A - Result CASE 3: A = RND * (Upper + Lower) + 1 B = RND * (Upper + Lower) + 1 Result = A * B CASE 4: B = RND * (Upper / 2 - Lower) + 1 A = CINT(RND * (Upper / 2 - Lower) + 1) * B Result = A / B END SELECT END SUB SUB SortData (BY, L, Name$(), TaskName$(), Task(), Mark(), WTask(), PTask(), Speed(), CDate$(), CTime$(), LwrRes(), UprRes(), S()) FOR Counter1 = L TO 1 STEP -1 LOCATE 14, 10: PRINT CINT(100 - Counter1 * 100 / L); LOCATE , POS(0) - 1: PRINT "%" FOR Counter2 = L TO Counter1 STEP -1 Result = 1 SELECT CASE BY CASE 1: StrComp Result, UCASE$(Name$(Counter1)), UCASE$(Name$(Counter2)) CASE 2: CD1$ = MID$(CDate$(Counter1), 8, 4) + MID$(CDate$(Counter1), 1, 6) CD2$ = MID$(CDate$(Counter2), 8, 4) + MID$(CDate$(Counter2), 1, 6) StrComp Result, UCASE$(CD1$), UCASE$(CD2$) CASE 3: StrComp Result, UCASE$(CTime$(Counter1)), UCASE$(CTime$(Counter2)) CASE 4: StrComp Result, UCASE$(TaskName$(Counter1)), UCASE$(TaskName$(Counter2)) CASE 5: IF Task(Counter2) < Task(Counter1) THEN Result = 2 CASE 6: IF Mark(Counter2) < Mark(Counter1) THEN Result = 2 CASE 7: IF PTask(Counter2) < PTask(Counter1) THEN Result = 2 CASE 8: IF Speed(Counter2) < Speed(Counter1) THEN Result = 2 CASE 9: IF S(Counter2) < S(Counter1) THEN Result = 2 END SELECT IF Result = 2 THEN SWAP Name$(Counter1), Name$(Counter2) SWAP TaskName$(Counter1), TaskName$(Counter2) SWAP Task(Counter1), Task(Counter2) SWAP Mark(Counter1), Mark(Counter2) SWAP WTask(Counter1), WTask(Counter2) SWAP PTask(Counter1), PTask(Counter2) SWAP Speed(Counter1), Speed(Counter2) SWAP CDate$(Counter1), CDate$(Counter2) SWAP CTime$(Counter1), CTime$(Counter2) SWAP LwrRes(Counter1), LwrRes(Counter2) SWAP UprRes(Counter1), UprRes(Counter2) SWAP S(Counter1), S(Counter2) END IF NEXT Counter2 NEXT Counter1 END SUB SUB StrComp (Result, String1$, String2$) IF LEN(String1$) > LEN(String2$) THEN MinimalLength = LEN(String2$) ELSE MinimalLength = LEN(String1$) END IF FOR Counter = 1 TO MinimalLength IF MID$(String1$, Counter, 1) = MID$(String2$, Counter, 1) THEN SameCharacterCounter = SameCharacterCounter + 1 ELSE GOTO NotSame END IF NEXT Counter NotSame: Character1$ = MID$(String1$, SameCharacterCounter + 1, 1) Character2$ = MID$(String2$, SameCharacterCounter + 1, 1) IF SameCharacterCounter = MinimalLength THEN Result = 1 IF LEN(String1$) > MinimalLength THEN Result = 2 IF LEN(String2$) > MinimalLength THEN Result = 0 EXIT SUB END IF IF ASC(Character1$) < ASC(Character2$) THEN Result = 0 EXIT SUB END IF IF ASC(Character1$) > ASC(Character2$) THEN Result = 2 EXIT SUB END IF END SUB SUB Teach (OType$(), Operation) GetDatas: DO Initialize LOCATE 3, 3: PRINT OType$(0); LOCATE 4, 3: PRINT MID$(OType$(Operation), 2, LEN(OType$(Operation))); LOCATE 5, 3: PRINT "Ú" + STRING$(50, "Ä") + "¿"; FOR Counter = 1 TO 4 LOCATE 5 + Counter, 3: PRINT "³" + SPACE$(50) + "³"; NEXT Counter LOCATE 10, 3: PRINT "À" + STRING$(50, "Ä") + "Ù"; LOCATE 6, 5: LINE INPUT "Your name is: ", Name$ LOCATE 7, 5: LINE INPUT "Lower result value is: ", Lower$: Lower = VAL(Lower$) LOCATE 8, 5: LINE INPUT "Upper result value is: ", Upper$: Upper = VAL(Upper$) DO LOCATE 9, 4: PRINT SPACE$(50); LOCATE 9, 5: LINE INPUT "How many tasks do you want to do: ", Task$: Task = VAL(Task$) IF Task > 0 THEN EXIT DO BEEP LOOP LOCATE 11, 3: LINE INPUT "Do you want to accept these (Yes/No/Return)? "; Answer$ IF UCASE$(Answer$) = "Y" THEN EXIT DO IF UCASE$(Answer$) = "R" THEN EXIT SUB LOOP LOCATE 13, 3: PRINT "Saving..."; LOCATE 14, 3: PRINT "Press any key to start..."; OPEN "MATH.DAT" FOR APPEND AS 1 PRINT #1, "Name: " + Name$ PRINT #1, "Tasks:"; Task PRINT #1, "Task name: " + MID$(OType$(Operation), 2, LEN(OType$(Operation))) PRINT #1, "Date: " + DATE$ PRINT #1, "Time: " + TIME$ PRINT #1, "Lower result:"; Lower PRINT #1, "Upper result:"; Upper PRINT #1, STRING$(50, "Ä") CLOSE 1 GetKey Key$ Initialize LOCATE 3, 3: PRINT OType$(0); LOCATE 4, 3: PRINT MID$(OType$(Operation), 2, LEN(OType$(Operation))) LOCATE 20, 1: PRINT STRING$(80, "Ä"); LOCATE 21, 40: PRINT "Name: " + Name$; LOCATE 22, 40: PRINT "Lower result vaule:"; Lower; LOCATE 23, 40: PRINT "Upper result vaule:"; Upper; OPEN "MATH.DAT" FOR APPEND AS 1 TeachMath: FOR Counter = 1 TO Task LOCATE 24, 40: PRINT "Not ready task(s):"; Task - Counter + 1; LOCATE 21, 3: PRINT "Current wrong task(s):"; CBTask LOCATE 22, 3: PRINT "Good and ready task(s):"; GTask; LOCATE 23, 3: PRINT "Bad and ready task(s):"; BTask; LOCATE 24, 3: PRINT "Ready task(s):"; Counter - 1; IF CBTask = 0 THEN LA = A LB = B DO WHILE LA = A AND LB = B SetValue Operation, Upper, Lower, A, B, Result LOOP END IF LOCATE 10, 1: PRINT SPACE$(80); COLOR 15 LOCATE 10, 35: PRINT A; MID$(OType$(Operation), 1, 1); B; "= "; COLOR 7 StartTime& = TIMER GetNumber LEN(STR$(Result)) - 1, Number$: InputResult = VAL(Number$) Time& = CLNG(TIMER - StartTime&) TotalTime& = TotalTime& + Time& Save: Time = Time&: FPut Time PRINT #1, " sec.: "; : FPut A PRINT #1, " " + MID$(OType$(Operation), 1, 1) + " "; : FPut B PRINT #1, " = "; : FPut Result PRINT #1, " == "; : FPut InputResult PRINT #1, " "; IF Result = InputResult THEN CBTask = 0 GTask = GTask + 1 Right ELSE Counter = Counter - 1 BTask = BTask + 1 CBTask = CBTask + 1 Wrong END IF NEXT Counter PRINT #1, STRING$(50, "Í") CLOSE 1 Informations: Initialize Percent = GTask * 100 / (BTask + GTask) LOCATE 6, 20: PRINT "É" + STRING$(38, "Í") + "»"; LOCATE 6, 40 - LEN(OType$(Operation)) / 2 - 1: PRINT " " + MID$(OType$(Operation), 2, LEN(OType$(Operation))) + " "; FOR Counter = 1 TO 10 LOCATE Counter + 6, 20: PRINT "º" + SPACE$(38) + "º"; NEXT Counter LOCATE 15, 20: PRINT "Ç" + STRING$(38, "Ä") + "¶"; LOCATE 16, 22: PRINT "Press any key to return..."; LOCATE 17, 20: PRINT "È" + STRING$(38, "Í") + "¼"; LOCATE 7, 22: PRINT "Name: " + Name$ LOCATE 9, 22: PRINT "Tasks:"; Task LOCATE 10, 22: PRINT "Wrong result(s):"; BTask LOCATE 11, 22: PRINT "Percent:"; Percent; LOCATE , POS(0) - 1: PRINT "% -> "; CINT(Percent / 20) LOCATE 12, 22: PRINT "Normal Time:"; Task * 15; "sec" LOCATE 13, 22: PRINT "Total Time:"; TotalTime&; "sec" LOCATE 14, 22: PRINT "Time:"; CINT(TotalTime& / Task * 10) / 10; "sec/tsk" COLOR 15 LOCATE 14, 44: PRINT "CONGRATULATION" GetKey Key$ END SUB SUB Terminate SCREEN 0 WIDTH 80, 25 COLOR 7, 0 CLS PRINT "Thank you for using this program..." SYSTEM END SUB SUB ViewData DIM Menu$(10) Initialize OPEN "MATH.DAT" FOR INPUT AS 1 IF ErrorStatus > 0 THEN BEEP LOCATE 8, 23: PRINT "É" + STRING$(34, "Í") + "»"; FOR Counter = 1 TO 6 LOCATE 8 + Counter, 23: PRINT "º" + SPACE$(34) + "º"; NEXT Counter LOCATE 14, 23: PRINT "È" + STRING$(34, "Í") + "¼"; LOCATE 8, 33: PRINT " Error Message "; LOCATE 12, 23: PRINT "Ç" + STRING$(34, "Ä") + "¶"; LOCATE 10, 25: PRINT "Can't found data file - MATH.DAT" LOCATE 13, 25: PRINT "Press any key to return..." GetKey Key$ EXIT SUB END IF Loading: LOCATE 3, 1: PRINT "Loading data..." DO WHILE NOT EOF(1) LINE INPUT #1, Record$ IF UCASE$(MID$(Record$, 1, 5)) = "NAME:" THEN Count = Count + 1 LOOP CLOSE 1 SData = 0 Offset = 1 DIM Mark(Count), WTask(Count), Speed(Count), S(Count) DIM Name$(Count), Task(Count), TaskName$(Count), PTask(Count) DIM CDate$(Count), CTime$(Count), LwrRes(Count), UprRes(Count) OPEN "MATH.DAT" FOR INPUT AS 1 DataCount = 0 DO WHILE NOT EOF(1) LINE INPUT #1, Record$ SELECT CASE UCASE$(MID$(Record$, 1, 5)) CASE "NAME:": DataCount = DataCount + 1 Name$(DataCount) = MID$(Record$, 7, 20) CASE "TASKS" Task(DataCount) = VAL(MID$(Record$, 7, LEN(Record$))) CASE "TASK " TaskName$(DataCount) = LTRIM$(MID$(Record$, 11, 30)) CASE "DATE:" CDate$(DataCount) = MID$(Record$, 6, LEN(Record$)) CASE "TIME:" CTime$(DataCount) = MID$(Record$, 6, LEN(Record$)) CASE "LOWER" LwrRes(DataCount) = VAL(MID$(Record$, 14, LEN(Record$))) CASE "UPPER" UprRes(DataCount) = VAL(MID$(Record$, 14, LEN(Record$))) CASE ELSE: IF NOT MID$(Record$, 1, 1) = "Í" AND NOT MID$(Record$, 1, 1) = "Ä" AND LEN(Record$) > 0 THEN Speed(DataCount) = Speed(DataCount) + VAL(MID$(Record$, 1, 5)) IF MID$(Record$, LEN(Record$), 1) = "W" THEN WTask(DataCount) = WTask(DataCount) + 1 END IF END IF END SELECT LOOP CLOSE 1 FOR Counter = 1 TO DataCount PTask(Counter) = (Task(Counter)) * 100 / (WTask(Counter) + Task(Counter)) Mark(Counter) = PTask(Counter) / 20 NEXT Counter Show: SC = 0 FOR Counter = 1 TO DataCount IF S(Counter) = 1 THEN SC = SC + 1 NEXT Counter COLOR 7, 0 LOCATE 3, 1: PRINT "É" + STRING$(78, "Í") + "»"; LOCATE 3, 34: PRINT " Data Viewer " FOR Counter = 1 TO 18 LOCATE 3 + Counter, 1: PRINT "º" + SPACE$(78) + "º"; NEXT Counter LOCATE 4, 3: PRINT "Name Task name Tasks Time Percent Mark" LOCATE 5, 2: PRINT STRING$(78, "Ä"); LOCATE 22, 1: PRINT "È" + STRING$(78, "Í") + "¼"; LOCATE 24, 1: PRINT "Press [F1] to see the help screen..."; DO COLOR 7, 0 LOCATE 22, 3: PRINT SC; "Item(s) are selected ÍÍÍÍ"; Scroller Offset + SData, DataCount FOR Counter = 1 TO 16 IF DataCount >= Counter THEN IF Offset = Counter THEN COLOR 7, 0 LOCATE 23, 1: PRINT "Date:" + CDate$(Counter + SData); " Time:" + CTime$(Counter + SData); PRINT " Lower result:"; LwrRes(Counter); " "; LOCATE , 54: PRINT "Upper result:"; UprRes(Counter); " "; COLOR 0, 7 IF S(Counter + SData) = 1 THEN COLOR 15, 7 ELSE COLOR 7, 0 IF S(Counter + SData) = 1 THEN COLOR 15, 0 END IF LOCATE Counter + 5, 2: PRINT " " + Name$(Counter + SData); PRINT SPACE$(22 - LEN(Name$(Counter + SData))) LOCATE Counter + 5, 25: PRINT TaskName$(Counter + SData); PRINT SPACE$(16 - LEN(TaskName$(Counter + SData))) LOCATE Counter + 5, 41: PRINT Task(Counter + SData); PRINT SPACE$(7 - LEN(STR$(Task(Counter + SData)))) LOCATE Counter + 5, 49 IF Task(Counter + SData) * 15 < Speed(Counter + SData) THEN PRINT "!"; ELSE PRINT " "; END IF LOCATE Counter + 5, 50: PRINT Speed(Counter + SData); PRINT SPACE$(8 - LEN(STR$(Speed(Counter + SData)))) LOCATE Counter + 5, 58: PRINT PTask(Counter + SData); LOCATE , POS(0) - 1: PRINT "%"; SPACE$(9 - LEN(STR$(PTask(Counter + SData)))) LOCATE Counter + 5, 68: PRINT Mark(Counter + SData); PRINT SPACE$(11 - LEN(STR$(Mark(Counter + SData)))) END IF NEXT Counter GetKey Key$ SELECT CASE Key$ CASE "": ' Ctrl+S GOTO SelectMenu CASE CHR$(13): ' Enter IF S(SData + Offset) = 0 THEN SC = SC + 1 S(SData + Offset) = 1 ELSE SC = SC - 1 S(SData + Offset) = 0 END IF GOTO Down CASE CHR$(27): ' Esc EXIT SUB CASE CHR$(0) + ";": ' F1 GOTO Help CASE CHR$(0) + "/": ' Alt+V GOTO ViewResults CASE CHR$(0) + "!": ' Alt+F GOTO Find CASE CHR$(0) + "": ' Alt+S GOTO Sort CASE CHR$(0) + "I": ' Page Up IF SData > 16 THEN SData = SData - 16 ELSE SData = 0 IF Offset > 1 THEN Offset = 1 END IF CASE CHR$(0) + "Q": ' Page Down IF DataCount > Offset + SData THEN IF SData + 32 < DataCount THEN SData = SData + 16 ELSE IF DataCount < 16 THEN Offset = DataCount SData = 0 ELSE Offset = 16 SData = DataCount - 16 END IF END IF END IF CASE CHR$(0) + "G": ' Home Offset = 1 SData = 0 CASE CHR$(0) + "O": ' End IF DataCount > 15 THEN Offset = 16 SData = DataCount - 16 ELSE Offset = DataCount END IF CASE CHR$(0) + "H": ' Up IF Offset > 1 THEN Offset = Offset - 1 ELSEIF SData > 0 THEN SData = SData - 1 END IF CASE CHR$(0) + "P": ' Down Down: IF DataCount > Offset + SData THEN Offset = Offset + 1 IF Offset > 16 THEN Offset = 16 IF SData + Offset < DataCount THEN SData = SData + 1 END IF END IF END IF END SELECT LOOP EXIT SUB '* * * * * * * * * * * * * * * * * * * * * * * * * * *' Help: COLOR 15, 7 LOCATE 7, 10: PRINT "É" + STRING$(58, "Í") + "»"; LOCATE 7, 36: PRINT " Help "; FOR Counter = 1 TO 12 LOCATE Counter + 7, 10: PRINT "º" + SPACE$(58) + "º"; NEXT Counter LOCATE 18, 10: PRINT "Ç" + STRING$(58, "Ä") + "¶"; LOCATE 19, 12: PRINT "Press any key to return..."; LOCATE 20, 10: PRINT "È" + STRING$(58, "Í") + "¼"; COLOR 0, 7 LOCATE 9, 12: PRINT "[F1] - Active this help..."; LOCATE 10, 12: PRINT "[Esc] - Return to Main Menu..."; LOCATE 11, 12: PRINT "[Enter] - Select an item" LOCATE 12, 12: PRINT "[Alt+S] - Active the Sort Menu..."; LOCATE 13, 12: PRINT "[Alt+F] - Active the Find Function..."; LOCATE 14, 12: PRINT "[Alt+V] - View the total results of a student"; LOCATE 15, 12: PRINT "[Ctrl+S] - Active the Select Menu..."; LOCATE 17, 12: PRINT "You can use the cursor movement keys too..."; GetKey Key$ GOTO Show '* * * * * * * * * * * * * * * * * * * * * * * * * * *' Sort: Selected = 1 Menu$(0) = "Sort by..." Menu$(1) = "Name" Menu$(2) = "Date" Menu$(3) = "Time" Menu$(4) = "Task name" Menu$(5) = "Tasks" Menu$(6) = "Mark" Menu$(7) = "Percent" Menu$(8) = "Speed" Menu$(9) = "Select " PutMenu Menu$(), 9, Selected COLOR 7, 0 IF NOT Selected = 0 THEN LOCATE 14, 3: PRINT "Sorting" SortData Selected, DataCount, Name$(), TaskName$(), Task(), Mark(), WTask(), PTask(), Speed(), CDate$(), CTime$(), LwrRes(), UprRes(), S() END IF GOTO Show '* * * * * * * * * * * * * * * * * * * * * * * * * * *' Find: Initialize LOCATE 3, 3: PRINT "Find..." LOCATE 4, 3: PRINT "Just press [Enter] if you don't known something..." LOCATE 5, 3: PRINT "Ú" + STRING$(50, "Ä") + "¿"; FOR Counter = 1 TO 10 LOCATE 5 + Counter, 3: PRINT "³" + SPACE$(50) + "³"; NEXT Counter LOCATE 16, 3: PRINT "À" + STRING$(50, "Ä") + "Ù"; Name$(0) = "": CDate$(0) = "": CTime$(0) = "": TaskName$(0) = "" Task(0) = -1: Mark(0) = -1: Speed(0) = -1: PTask(0) = -1: LwrRes(0) = -1: UprRes(0) = -1 LwrRes$ = "": UprRes$ = "": Speed$ = "": PTask$ = "": Task$ = "": Mark$ = "" LOCATE 6, 5: LINE INPUT "Name: ", Name$(0) LOCATE 7, 5: LINE INPUT "Date: ", CDate$(0) LOCATE 8, 5: LINE INPUT "Time: ", CTime$(0) LOCATE 9, 5: LINE INPUT "Task name: ", TaskName$(0) LOCATE 10, 5: LINE INPUT "Tasks: ", Task$ LOCATE 11, 5: LINE INPUT "Mark: ", Mark$ LOCATE 12, 5: LINE INPUT "Percent: ", PTask$ LOCATE 13, 5: LINE INPUT "Speed: ", Speed$ LOCATE 14, 5: LINE INPUT "Lower result value: ", LwrRes$ LOCATE 15, 5: LINE INPUT "Upper result value: ", UprRes$ LOCATE 17, 3: PRINT "Searching" Task(0) = VAL(Task$) Mark(0) = VAL(Mark$) Speed(0) = VAL(Speed$) PTask(0) = VAL(PTask$) LwrRes(0) = VAL(LwrRes$) UprRes(0) = VAL(UprRes$) IF Task$ = "" THEN Task(0) = -1 IF Mark$ = "" THEN Mark(0) = -1 IF Speed$ = "" THEN Speed(0) = -1 IF PTask$ = "" THEN PTask(0) = -1 IF LwrRes$ = "" THEN LwrRes(0) = -1 IF UprRes$ = "" THEN UprRes(0) = -1 Search DataCount, Name$(), TaskName$(), Task(), Mark(), PTask(), Speed(), CDate$(), CTime$(), LwrRes(), UprRes(), S() GOTO Show '* * * * * * * * * * * * * * * * * * * * * * * * * * *' ViewResults: COLOR 15, 7 AOp = 0 WTasks& = 0 TCounter& = 0 TotalSpeed& = 0 TotalTasks& = 0 LOCATE 7, 10: PRINT "É" + STRING$(58, "Í") + "»"; LOCATE 7, 33: PRINT " Total Results "; FOR Counter = 1 TO 12 LOCATE Counter + 7, 10: PRINT "º" + SPACE$(58) + "º"; NEXT Counter LOCATE 17, 10: PRINT "Ç" + STRING$(58, "Ä") + "¶"; LOCATE 18, 12: PRINT "Press any key to return..."; LOCATE 19, 10: PRINT "È" + STRING$(58, "Í") + "¼"; COLOR 0 LOCATE 9, 12: PRINT "Name: " + Name$(SData + Offset) FOR Counter = 1 TO DataCount IF UCASE$(Name$(Counter)) = UCASE$(Name$(SData + Offset)) AND S(Counter) = 1 THEN TCounter& = TCounter& + 1 WTasks& = WTasks& + WTask(Counter) TotalTasks& = TotalTasks& + Task(Counter) TotalSpeed& = TotalSpeed& + Speed(Counter) IF UCASE$(TaskName$(Counter)) = "ADDITION" THEN AOp = AOp OR 1 IF UCASE$(TaskName$(Counter)) = "SUBTRACTION" THEN AOp = AOp OR 2 IF UCASE$(TaskName$(Counter)) = "MULTIPLYCATION" THEN AOp = AOp OR 4 IF UCASE$(TaskName$(Counter)) = "DIVISION" THEN AOp = AOp OR 8 END IF NEXT Counter LOCATE 10, 12: PRINT "Operations: "; IF AOp AND 1 THEN PRINT "ADD "; IF AOp AND 2 THEN PRINT "SUB "; IF AOp AND 4 THEN PRINT "MUL "; IF AOp AND 8 THEN PRINT "DIV"; Tasks& = TotalTasks& / TCounter& RegSpeed = TotalSpeed& / TotalTasks& Percent = (TotalTasks& - WTasks&) * 100 / TotalTasks& Mark = CINT(Percent / 20) LOCATE 12, 12: PRINT "Regual results:" LOCATE 13, 14: PRINT "Speed: "; IF 15 < RegSpeed THEN PRINT "!"; END IF PRINT RegSpeed; "sec/tsk"; LOCATE 14, 14: PRINT "Wrong tasks:"; WTasks&; "tsk/opr"; LOCATE 15, 14: PRINT "Tasks:"; Tasks&; "tsk/opr"; LOCATE 16, 14: PRINT "Percent:"; Percent; LOCATE , POS(0) - 1: PRINT "% -> "; Mark GetKey Key$ GOTO Show '* * * * * * * * * * * * * * * * * * * * * * * * * * *' SelectMenu: Selected = 1 Menu$(0) = "Select..." Menu$(1) = "Change ending " Menu$(2) = "Select all" Menu$(3) = "Deselect all" PutMenu Menu$(), 3, Selected COLOR 7, 0 IF NOT Selected = 0 THEN SELECT CASE Selected CASE 1: FOR Counter = 1 TO DataCount / 2 SWAP Name$(Counter), Name$(DataCount - Counter + 1) SWAP TaskName$(Counter), TaskName$(DataCount - Counter + 1) SWAP Task(Counter), Task(DataCount - Counter + 1) SWAP Mark(Counter), Mark(DataCount - Counter + 1) SWAP WTask(Counter), WTask(DataCount - Counter + 1) SWAP PTask(Counter), PTask(DataCount - Counter + 1) SWAP Speed(Counter), Speed(DataCount - Counter + 1) SWAP CDate$(Counter), CDate$(DataCount - Counter + 1) SWAP CTime$(Counter), CTime$(DataCount - Counter + 1) SWAP LwrRes(Counter), LwrRes(DataCount - Counter + 1) SWAP UprRes(Counter), UprRes(DataCount - Counter + 1) SWAP S(Counter), S(DataCount - Counter + 1) NEXT Counter CASE 2: FOR Counter = 1 TO DataCount S(Counter) = 1 NEXT Counter CASE 3: FOR Counter = 1 TO DataCount S(Counter) = 0 NEXT Counter END SELECT END IF GOTO Show END SUB SUB Wrong PRINT #1, "W" BEEP END SUB