# Vertical Asymptotes: Finding # Sida Wang & Ryan Stawaisz # restart: with(Maplets[Elements]):with(Maplets[Tools]): StartEngine(); randomize(): lightorange:="#FFB300": lightcyan:="#DDFFFF": lightblue:="#CFCFFF": lightgreen:="#CCFFCC": darkgreen:="#00C000": ColorBkgd:=wheat: ColorDefaultMenu:=lightcyan: ColorHelpMenu:=lightorange: ColorFileMenu:=pink: ColorFooter:=lightcyan: ColorNewButton:=magenta: # or Make, Save, Enter Problem ColorReturnButton:=magenta: ColorCloseButton:=pink: # or Quit, Clear, Reset, Cancel ColorHintButton:=lightorange: # or Syntax ColorPrevButton:=turquoise: # or Update ColorEnterButton:=turquoise: ColorSimplifyButton:=lightorange: ColorCheckButton:=green: ColorShowButton:=lightorange: ColorPlotButton:=gold: ColorPlotButtonFrgd:=black: ColorPlotFrame:=gold: ColorTableBkgd:=lightgreen: ColorCalculatorBkgd:=gold: ColorBlackBox:=black: ColorBlackBoxFrgd:=yellow: ColorMessage:=white: ColorMessageFrgd:=black: ColorInput:=turquoise: ColorInputFrgd:=black: ColorCorrect:=green: ColorCorrectFrgd:=black: ColorIncorrect:=red: ColorIncorrectFrgd:=white: ColorWarning:=yellow: ColorWarningFrgd:=black: ColorShow:=lightorange: ColorShowFrgd:=black: ColorHint:=lightorange: ColorHintFrgd:=black: # or Info, Syntax ColorDisable:=wheat: ColorDisableFrgd:=black: FontFooter:=Font("helvetica",10): FontSymbol:=Font("symbol",12): FontBig:=Font("times",20): LIBLogo:=cat(libname,"/M4C/M4C.png"): Logo:="M4C.png": #LIBLogo:=cat(libname,"/M4C/WebALT_logo.png"): #Logo:="WebALT_logo.png": # ################################## # # Template Translation Table For All Maplets TEXTLprogrammers:= "Programmers: D.B. Meade & P.B. Yasskin": TEXTLcopyright:= "© Copyright: Maplets for Calculus 2006-10": #"© Copyright: WebALT 2006-07": TEXTLversion:= "M4C v1.3 July 2010": TEXTBQuit:= "Quit": TEXTBClose:= "Close": TEXTBCheck:= "Check": TEXTBShow:= "Show": TEXTBShowAll:= "Show All Steps": TEXTBCheckAns:= "Check Answer": TEXTBShowAns:= "Show Answer": TEXTBInstructions:= "Instructions": TEXTBHint:= "Hint": TEXTBHints:= "Hints": TEXTBSyntax:= "Syntax": TEXTBHintSyntax:= "Hints and Syntax": TEXTBPrev:= "Preview": TEXTBUpdate:= "Update": TEXTBDerivation:= "Derivation": TEXTBNewProblem:= "New Problem": TEXTBNewFunction:= "New Function": TEXTBNewGraph:= "New Graph": TEXTBNewEquation:= "New Equation": TEXTBNewLimit:= "New Limit": TEXTBNewDerivative:= "New Derivative": TEXTBNewIntegral:= "New Integral": TEXTBNewSequence:= "New Sequence": TEXTBNewSeries:= "New Series": TEXTBNewDiffEq:= "New Differential Equation": TEXTBNewCurve:= "New Curve": TEXTBEnterProblem:= "Enter Problem": TEXTBEnterFunction:= "Enter Function": TEXTBEnterGraph:= "Enter Graph": TEXTBEnterEquation:= "Enter Equation": TEXTBEnterLimit:= "Enter Limit": TEXTBEnterDerivative:= "Enter Derivative": TEXTBEnterIntegral:= "Enter Integral": TEXTBEnterSequence:= "Enter Sequence": TEXTBEnterSeries:= "Enter Series": TEXTBEnterDiffEq:= "Enter Differential Equation": TEXTBMake:= "Modify or Make Your Own Problem": TEXTBSaveClose:= "Save Problem and Close": TEXTBAskQuestion:= "Ask Question": TEXTBNextQuestion:= "Next Question": TEXTBHowtoAnswer:= "How to Answer": TEXTBEnter:= "Enter": TEXTBOK:= "OK": TEXTBAccept:= "Accept": TEXTBReturn:= "Return": TEXTBClear:= "Clear": TEXTBClearSelections:= "Clear Selections": TEXTBClearAll:= "Clear All Steps": TEXTBReset:= "Reset": TEXTBRestart:= "Restart": TEXTBCancel:= "Cancel": TEXTBPlot:= "Plot": TEXTBPlotIt:= "Plot It": TEXTBAnimate:= "Animate": TEXTBPlay:= "Play": TEXTBPause:= "Pause": TEXTBForward:= "Forward": TEXTBReverse:= "Reverse": TEXTBStep:= "Step": TEXTBUpdatePlot:= "Update Plot": TEXTBZoomIn:= "Zoom In": TEXTBZoomOut:= "Zoom Out": TEXTBPlotSetup:= "Plot Setup": TEXTBRefresh:= "Refresh": TEXTBCalculate:= "Calculate": TEXTBSimplify:= "Simplify": TEXTBFactor:= "Factor": TEXTBExpand:= "Expand": TEXTBNormalize:= "Normalize": TEXTBCombine:= "Combine": TEXTBRationalize:= "Rationalize": TEXTBSort:= "Sort": TEXTBDecimal:= "Decimal": TEXTBExact:= "Exact": TEXTCorrect:= " correct ": TEXTIncorrect:= "incorrect": TEXTAlmost:= " almost ": TEXTWarning:= " warning ": TEXTShown:= " shown ": TEXTSlower:= "Slower": TEXTFaster:= "Faster": TEXTEnterFormula:= " Enter Formula:": TEXTEvaluate:= " Evaluate:": TEXTApproximate:= " Approximate:": TEXTand:= " and ": TEXTor:= " or ": TEXTThus:= " Thus ": TEXTSo:= " So ": TEXTType:= " Type ": TEXTfor:= " for ": TEXTat:= " at ": TEXTorcheck:= " or check: ": TEXTvertical:= "vertical": TEXThorizontal:= "horizontal": TEXTleft:= "left": TEXTright:= "right": TEXTless:= "less": TEXTgreater:= "greater": TEXTCBDNE:= "does not exist": TEXTCBNone:= "None": TEXTCB11scaling:= "1-1 scaling": TEXTdefault:= " default ": TEXTCBDoNotShow:= "Do not show this window again.": TEXTRBNumeric:= "Numeric": TEXTRBSymbolic:= "Symbolic": TEXTRBTrue:= "True": TEXTRBFalse:= "False": TEXTRBT:= "T": TEXTRBF:= "F": TEXTRBOn:= "On": TEXTRBOff:= "Off": TEXTRed:= "Red": TEXTGreen:= "Green": TEXTBlue:= "Blue": TEXTCyan:= "Cyan": TEXTMagenta:= "Magenta": TEXTYellow:= "Yellow": TEXTRedR:= "R": TEXTGreenG:= "G": TEXTBlueB:= "B": TEXTRBPlot1:= "Plot # 1": TEXTRBPlot2:= "Plot # 2": TEXTRBPlot3:= "Plot # 3": TEXTRBPlot4:= "Plot # 4": TEXTRBPlot5:= "Plot # 5": TEXTRBPlot6:= "Plot # 6": TEXTRBconverge:= "converge": TEXTRBdiverge:= "diverge": TEXTRBconverges:= "converges": TEXTRBdiverges:= "diverges": TEXTRBdiverges2:= "diverges ": TEXTRBconvergent:= "Convergent": TEXTRBdivergent:= "Divergent": TEXTtitlePROBLEM:= "Modify or Make Your Own Problem": TEXTtitlePREVIEW:= "Preview": TEXTtitleHINT:= "Hint": TEXTtitleSYNTAX:= "Syntax": TEXTtitlePlotSetup:= "Plot Setup": TEXTCapGoal:= "Goal:": TEXTCapProbStat:= "Problem Statement:": TEXTCapSyntaxTutorial:= "Syntax Tutorial:": TEXTCapEnter:= "Enter:": TEXTCapSpecify:= "Specify:": TEXTCapTrueFalse:= "True or False?": TEXTCapCalculator:= "Calculator": TEXTCapPlot:= "Plot": TEXTCapLegend:= "Legend": TEXTCapEvaluate:= "Evaluate:": TEXTCapDataTable:= "Data Table": TEXTCapVis:= "Visualization": TEXTCapAnim:= "Animation": TEXTCapPreviewer:= "Previewer": TEXTCapHorRng:= "Horizontal Range:": TEXTxmin:= "xmin =": TEXTxmax:= "xmax =": TEXTCapVertRng:= "Vertical Range:": TEXTymin:= "ymin =": TEXTymax:= "ymax =": TEXTPlotWait:= #Use ColorHint " Please be patient while the plot is generated.": TEXTAnimWait:= " Please be patient while the animation is generated.": TEXTRotatePlot:= " You may rotate the plot with your mouse.": TEXTreplyNoCheck:= " You must enter an expression to be checked.": TEXTreplyNoCheckBoth:= " You must answer both questions before checking.": TEXTreplyNoChecks:= " You must answer all %a questions before checking.": TEXTreplyNoPrev:= " You must enter an expression to be previewed.": TEXTreplyNoSimplify:= " You must enter an expression to be simplified.": TEXTreplyNoFactor:= " You must enter an expression to be factored.": TEXTreplyNoExpand:= " You must enter an expression to be expanded.": TEXTreplyNoNormalize:= " You must enter an expression to be normalized.": TEXTreplyNoModify:= " You must enter an expression to be modified.": TEXTreplyNoPlot:= " Please select a plot.": TEXTreplyNoSelection:= " Please select an answer.": TEXTreplyNoSaveProblem:= " You must fill in all the boxes before saving the problem.": TEXTreplyNoSaveSettings:= " You must fill in all the boxes before saving the settings.": TEXTreplyNoSlider:= " Set the slider to a number between %a and %a": TEXTreplySideEqWrong:= " The %a side of your equation is wrong.": TEXTreplyBothSideEqWrong:= " Both sides of your equation are wrong.": TEXTreplySideIneqWrong:= " The %a side of your inequality is wrong.": TEXTreplyBothSideIneqWrong:= " Both sides of your inequality are wrong.": TEXTreplyNoConst:= " You forgot to add a constant of integration.": TEXTreplyManyConst:= " Your answer should have only one constant of integration.": TEXTreplyMinusErr:= " You have a minus sign error.": DNEset:= {"", undefined, Undefined, UNDEFINED, divergent, Divergent, DIVERGENT, diverges, Diverges, DIVERGES, dne, DNE, doesnotexist, DoesNotExist}: TEXTM_File:= "File": TEXTM_Fns:= "Functions": TEXTCBMI_polygen:= "Polynomials (Generalized)": TEXTCBMI_exp:= "Exponentials": TEXTCBMI_log:= "Logarithms": TEXTCBMI_trig:= "Trigonometric": TEXTCBMI_invtrig:= "Inverse Trigonometric": TEXTCBMI_hyper:= "Hyperbolic": TEXTCBMI_invhyper:= "Inverse Hyperbolic": TEXTCBMI_simpsubst:= "Allow Simple Substitutions": TEXTM_Rules:= "Rules": TEXTCBMI_prod:= "Product Rule": TEXTCBMI_quot:= "Quotient Rule": TEXTCBMI_power:= "Power Rule": TEXTCBMI_chain:= "Chain Rule": TEXTM_Methods:= "Methods": TEXTCBMI_subst:= "Substitution": TEXTCBMI_parts:= "Integration by Parts": TEXTCBMI_trigpow:= "Trigonometric Powers": TEXTCBMI_trigsubst:= "Trigonometric Substitution": TEXTCBMI_trigident:= "Trigonometric Identity": TEXTCBMI_parfrac:= "Partial Fractions": TEXTCBMI_impfrac:= "Improper Fraction": TEXTRBproper:= "only proper integrals": TEXTRBimproper:= "allow improper integrals": TEXTM_RulesProb:= "Rules per Problem": TEXTreply_manyrules:= " Problems which involve too many rules tend to become rather messy.": TEXTM_MaxTerms:= "Max # Terms": TEXTreply_manyterms:= " Problems with large numbers of terms tend to become rather messy.": TEXTM_TermsPoly:= "Terms in Polynomial": TEXTM_PowerProp:= "Power Properties": TEXTCBMI_neg:= "Allow Negatives": TEXTCBMI_frac:= "Allow Fractions": TEXTreply_largepower:= " Problems with large degree polynomials tend to become rather messy.": TEXTM_Help:= "Help": TEXTmenu_start:= "Getting Started": TEXTmenu_custom:= "Customized Problems": TEXTmenu_manip:= "Manipulating Functions": TEXTmenu_about:= "About this maplet": great:=[ " Bullseye.", " Right on the mark.", " Great.", " That's absolutely right.", " Awesome. You're unstoppable.", " Correct.", " WOW, nailed that one.", " You got it!", " YES! Right on.", " Way to go.", " Don't stop now.", " I knew you could do it!", " Perfect. You're unstoppable.", " Radical Dude.", " Power house.", " Sweet! Keep on Rockin'.", " You rock!", " You got those mad skills.", " Awesome!", " Wowzers! That was great!", " Awesome man!", " Good job! You really know what you are doing.", " You're awesome kid.", " Tearing it up.", " Right on the money.", " High Five!!!!!", " Cool Beans.", " What a nerd!", " You're so money.", " You're a genius.", " You hit the nail on the head.", " Excellent!", " If I had a cookie, I'd give it to you.", " You're a winner.", " That's a winner.", " Whoop! Way to go.", " That's the way, ah ha ah ha, I like it.", " Oh yeah!", " You're the bomb!", " That was fantastic!", " Oh Snap!", NULL ]: nextgeneric:=[ " Keep it up.", " Keep going.", NULL ]: nextprob:=[ " On to the next problem.", " Try another problem.", " You're ready for another problem.", NULL ]: nextquest:=[ " On to the next question.", " Try another question.", " You're ready for another question.", NULL ]: nextpart:=[ " On to the next part.", " Try another part.", " You're ready for another part.", NULL ]: nextstep:=[ " On to the next step.", " Try another step.", " You're ready for another step.", NULL ]: nexteq:=[ " On to the next equation.", " Try another equation.", " Solve another equation.", " You're ready for another equation.", NULL ]: nextfn:=[ " On to the next function.", " Try another function.", " You're ready for another function.", NULL ]: nextlim:=[ " On to the next limit.", " Try another limit.", " Compute another limit.", " You're ready for another limit.", " Find another limit.", NULL ]: nextderiv:=[ " On to the next derivative.", " Try another derivative.", " Compute another derivative.", " You're ready for another derivative.", " Differentiate another function.", NULL ]: nextinteg:=[ " On to the next integral.", " Try another integral.", " Compute another integral.", " You're ready for another integral.", " Integrate another function.", NULL ]: nextdiffeq:=[ " On to the next differential equation.", " Try another differential equation.", " You're ready for another differential equation.", " Analyze another differential equation.", NULL ]: nextseq:=[ " On to the next sequence.", " Try another sequence.", " Find the limit of another sequence.", " You're ready for another sequence.", NULL ]: nextser:=[ " On to the next series.", " Try another series.", " Sum another series.", " You're ready for another series.", NULL ]: almost:=[ " Close.", " Oh so close.", " Close call. ", " Near miss.", " Not quite good enough for government work.", " Ooooh...close.", " Yikes! Really close. You'll get it next time.", " Close, but no cigar.", " Slightly off.", " Off by a hair.", " Almost there.", " Almost got it.", NULL ]: sorry:=[ " Sorry, that's not right.", " Nope, but don't give up.", " Not quite, it's a little off.", " Bummer, thought you would get it this time.", " If you need help, please ask a human.", " I don't know where you went wrong.", " Sorry, killer problem.", " No, but don't blow it off.", " D'oh!", " That's whack.", " Thought you would get it this time.", " Nice try, but your answer is wrong.", " Ask your neighbor for help.", " Brutal kid.", " That won't fly.", " So close and yet so far.", " So, that was just practice.", " A swing and a miss.", " Better luck next time.", " Oops.", " Tilt. Play again.", " I know you can do better.", " Sorry Charlie.", " Tisk, tisk. It's a tough one.", " It takes a lot of wrongs to make a right.", " Even Einstein didn't get everything right.", " Today's not your lucky day.", " Don't quit your day job.", " You're colder than a polar bear's toenail.", op(almost), NULL ]: trygeneric:=[ " Fix your answer and check it again.", " Give it another try.", " Try again.", " Please try again.", NULL ]: tryhint:=[ " Try the hints and answer again.", " Read the hints and try again.", " Study the hints and answer again.", NULL ]: tryhelp:=[ " Try the Help menu and answer again.", " Look at the Help menu and try again.", NULL ]: showgeneric:=[ " OK That's just practice. But try doing it yourself.", " That's fine for practice. Try doing it yourself.", " Think about it and enter an answer yourself.", " Next time, compute an answer yourself.", " So that was practice. Try doing it yourself.", NULL ]: showhint:=[ " Next time, try the hints.", " Read the hints and enter an answer yourself.", NULL ]: showhelp:=[ " Next time, read the Help menu.", " Read the Help and enter an answer yourself.", NULL ]: # ################################## # Procs for all maplets. GetVersion:=proc() local S, S1, S3, S4; options `Copyright 2009-10, Philip B. Yasskin and Douglas B. Meade, Maplets for Calculus`; uses StringTools; S:=interface(version); S:=map( Trim, Split( S, "," ) ); S1:=Split(S[1], " " ); S3:=Split(S[3], " " ); S4:=Split(S[-1], " " ); sprintf("%s (%s)", S[2],S3[-1]); end proc: # ################################## # # Customize For Each Maplets with(plots):with(plottools): #with(RandomTools): #alias(e=exp(1)): nextlocal:=[ NULL ]: trylocal:=[ NULL ]: showlocal:=[ NULL ]: nexts1:=[ #Keep what is appropriate. This is for all but the last check. op(nextgeneric), #op(nextprob), op(nextquest), op(nextpart), op(nextstep), op(nextlocal), NULL ]: nexts2:=[ #Keep what is appropriate. This is for the last check. op(nextgeneric), op(nextprob), op(nextquest), #op(nexteq), op(nextfn), #op(nextlim), #op(nextderiv), #op(nextinteg), #op(nextdiffeq), #op(nextseq), #op(nextser), op(nextlocal), NULL ]: trys:=[ #Keep what is appropriate. op(trygeneric), #op(tryhint), #op(tryhelp), op(trylocal), NULL ]: shows:=[ #Keep what is appropriate. op(showgeneric), #op(showhint), #op(showhelp), op(showlocal), NULL ]: randgreat:=rand(1..nops(great)): randnext1:=rand(1..nops(nexts1)): randnext2:=rand(1..nops(nexts2)): randalmost:=rand(1..nops(almost)): randsorry:=rand(1..nops(sorry)): randtry:=rand(1..nops(trys)): randshow:=rand(1..nops(shows)): # ################################## # # Put Translation Table For Specfic Maplet Here TEXTLasstprogrammer:= "Assistant Programmers: Sida Wang & Ryan Stawaisz": TEXTtitleMAIN:= "Finding Vertical Asymptotes": TEXTCapGoal:= "Goal: Find all vertical asymptotes of the function:": TEXTCapfactored:= "Step 1: Factor the numerator and denominator and cancel any common factors.": TEXTCapzeroes:= "Step 2: Find the zeroes of the denominator.": TEXTwarnzeroesornone:= "Either enter the zeroes or check none, (not both).": TEXTwarnintegers:= "The zeroes should be integers. Try again.": TEXTplotnoasympt:= " Notice there are no asymptotes.": TEXTplotoneasympt:= " Notice there is only one asymptote at x = %s.": TEXTplotallasympt:= " Notice the asymptotes are at x = %s.": seeplot:=[ " Now look at the plot.", " Finish up by looking at the plot.", " Finally, look at the plot.", NULL ]: randseeplot:=rand(1..nops(seeplot)): # ################################## randroot:=rand(-9..9): randcancel:=rand(0..5): randexpon:=rand(0..4): randt:=rand(0..1): plot0:=plot(0, x=-10..10, -25..25, color=black): New_Function:=proc() global func, factored, num, denomi, zeroes, plot0; local a,b,c,d,e,p,q,r,s,t; options `Copyright 2006-10, Philip B. Yasskin and Douglas B. Meade, Maplets for Calculus`; func:=1; while func::realcons do a:=randroot(); b:=randroot(); c:=randroot(); d:=randroot(); a:=`if`(randcancel()>1,c,a); b:=`if`(randcancel()>1,d,b); p:=randexpon(); q:=randexpon(); r,s,t:=0,0,0; while r=0 and s=0 and t=0 do r:=randexpon(); s:=randexpon(); t:=randt(); end do; p:=`if`(p>1,1,p); q:=`if`(q>1,1,q); r:=`if`(r>1,1,r); s:=`if`(s>1,1,s); num:=(x-a)^p*(x-b)^q; denomi:=x^t*(x-c)^r*(x-d)^s; func:=expand(num)/expand(denomi); end do; factored:=factor(func); zeroes:={solve((denomi/num)=0)}; Set(MMLfn(value)=MathML[Export](func)); Set(TFfactored=""); Set(BfactoredPr(enabled)=true, BfactoredPr(background)=ColorPrevButton); Set(BfactoredCk(enabled)=true, BfactoredCk(background)=ColorCheckButton); Set(MRfactored="", MRfactored(background)=ColorMessage); Set(BfactoredSh(enabled)=true, BfactoredSh(background)=ColorShowButton); Set(MMLfactored(value)=""); Set(TFzeroes=""); Set(CBnone=false); Set(BzeroesCk(enabled)=false, BzeroesCk(background)=ColorDisable); Set(MRzeroes="", MRzeroes(background)=ColorMessage); Set(BzeroesSh(enabled)=false, BzeroesSh(background)=ColorDisable); Set(Pasymptote=plot0); Set(BPasymptote(enabled)=false, BPasymptote(background)=ColorDisable, BPasymptote(foreground)=ColorDisableFrgd); Set(reply="", reply(background)=ColorMessage); end proc: preview_factored:=proc() local user_factored; options `Copyright 2006-10, Philip B. Yasskin and Douglas B. Meade, Maplets for Calculus`; if Get(TFfactored)="" then Set(MRfactored=TEXTWarning, MRfactored(background)=ColorWarning, MRfactored(foreground)=ColorWarningFrgd); Set(reply=TEXTreplyNoPrev, reply(background)=ColorWarning, reply(foreground)=ColorWarningFrgd); return; end if; user_factored:=Get(TFfactored::algebraic, corrections=true, update=true); Set(MMLfactored(value)=MathML[Export](user_factored)); end proc: check_factored:=proc() global factored; local user_factored; options `Copyright 2006-10, Philip B. Yasskin and Douglas B. Meade, Maplets for Calculus`; if Get(TFfactored)="" then Set(MRfactored=TEXTWarning, MRfactored(background)=ColorWarning, MRfactored(foreground)=ColorWarningFrgd); Set(reply=TEXTreplyNoCheck, reply(background)=ColorWarning, reply(foreground)=ColorWarningFrgd); return; end if; user_factored:=Get(TFfactored::algebraic, corrections=true, update=true); if user_factored=factored then Set(MRfactored=TEXTCorrect, MRfactored(background)=ColorCorrect, MRfactored(foreground)=ColorCorrectFrgd); Set(reply=cat(great[randgreat()],nexts1[randnext1()]), reply(background)=ColorCorrect, reply(foreground)=ColorCorrectFrgd); Set(BzeroesCk(enabled)=true, BzeroesCk(background)=ColorCheckButton); Set(BzeroesSh(enabled)=true, BzeroesSh(background)=ColorShowButton); else Set(MRfactored=TEXTIncorrect, MRfactored(background)=ColorIncorrect, MRfactored(foreground)=ColorIncorrectFrgd); Set(reply=cat(sorry[randsorry()],trys[randtry()]), reply(background)=ColorIncorrect, reply(foreground)=ColorIncorrectFrgd); Set(TFzeroes=""); Set(CBnone=false); Set(BzeroesCk(enabled)=false, BzeroesCk(background)=ColorDisable); Set(MRzeroes="", MRzeroes(background)=ColorMessage); Set(BzeroesSh(enabled)=false, BzeroesSh(background)=ColorDisable); Set(Pasymptote=plot0); Set(BPasymptote(enabled)=false, BPasymptote(background)=ColorDisable, BPasymptote(foreground)=ColorDisableFrgd); end if; Set(MMLfactored(value)=MathML[Export](user_factored)); end proc: show_factored:=proc() global factored; options `Copyright 2006-10, Philip B. Yasskin and Douglas B. Meade, Maplets for Calculus`; Set(TFfactored=factored); Set(MMLfactored(value)=MathML[Export](factored)); Set(MRfactored=TEXTShown, MRfactored(background)=ColorShow, MRfactored(foreground)=ColorShowFrgd); Set(reply=shows[randshow()], reply(background)=ColorShow, reply(foreground)=ColorShowFrgd); Set(BzeroesCk(enabled)=true, BzeroesCk(background)=ColorCheckButton); Set(BzeroesSh(enabled)=true, BzeroesSh(background)=ColorShowButton); end proc: check_zeroes:=proc() global zeroes; local user_zeroes, user_none; options `Copyright 2006-10, Philip B. Yasskin and Douglas B. Meade, Maplets for Calculus`; user_zeroes:=Get(TFzeroes); user_none:=Get(CBnone); if (user_zeroes="" and not user_none) then Set(MRzeroes=TEXTWarning, MRzeroes(background)=ColorWarning, MRzeroes(foreground)=ColorWarningFrgd); Set(reply=TEXTreplyNoCheck, reply(background)=ColorWarning, reply(foreground)=ColorWarningFrgd); return; end if; if (user_zeroes<>"" and user_none) then Set(MRzeroes=TEXTWarning, MRzeroes(background)=ColorWarning, MRzeroes(foreground)=ColorWarningFrgd); Set(reply=cat(TEXTwarnzeroesornone,trys[randtry()]), reply(background)=ColorWarning, reply(foreground)=ColorWarningFrgd); return; end if; user_zeroes:={parse(user_zeroes)}; if not type(user_zeroes,set(integer)) then Set(MRzeroes=TEXTIncorrect, MRzeroes(background)=ColorIncorrect, MRzeroes(foreground)=ColorIncorrectFrgd); Set(reply=TEXTwarnintegers, reply(background)=ColorIncorrect, reply(foreground)=ColorIncorrectFrgd); return; end if; if user_none and zeroes={} or user_zeroes=zeroes then Set(MRzeroes=TEXTCorrect, MRzeroes(background)=ColorCorrect, MRzeroes(foreground)=ColorCorrectFrgd); Set(reply=cat(great[randgreat()],seeplot[randseeplot()]), reply(background)=ColorCorrect, reply(foreground)=ColorCorrectFrgd); Set(BPasymptote(enabled)=true, BPasymptote(background)=ColorPlotButton, BPasymptote(foreground)=ColorPlotButtonFrgd); else Set(MRzeroes=TEXTIncorrect, MRzeroes(background)=ColorIncorrect, MRzeroes(foreground)=ColorIncorrectFrgd); Set(reply=cat(sorry[randsorry()],trys[randtry()]), reply(background)=ColorIncorrect, reply(foreground)=ColorIncorrectFrgd); Set(Pasymptote=plot0); Set(BPasymptote(enabled)=false, BPasymptote(background)=ColorDisable, BPasymptote(foreground)=ColorDisableFrgd); end if; end proc: show_zeroes:=proc() global zeroes; options `Copyright 2006-10, Philip B. Yasskin and Douglas B. Meade, Maplets for Calculus`; if zeroes={} then Set(CBnone=true); Set(TFzeroes=""); else Set(TFzeroes=convert(zeroes,string)[2..-2]); Set(CBnone=false); end if; Set(MRzeroes=TEXTShown, MRzeroes(background)=ColorShow, MRzeroes(foreground)=ColorShowFrgd); Set(reply=shows[randshow()], reply(background)=ColorShow, reply(foreground)=ColorShowFrgd); Set(BPasymptote(enabled)=true, BPasymptote(background)=ColorPlotButton, BPasymptote(foreground)=ColorPlotButtonFrgd); end proc: plotfunc:=proc() global func, zeroes; local p1; options `Copyright 2006-10, Philip B. Yasskin and Douglas B. Meade, Maplets for Calculus`; p1:=plot(func, x=-10..10, -25..25, discont=true, thickness=2, color=blue); Set(Pasymptote=p1); Set(reply(background)=ColorMessage, reply(foreground)=ColorMessageFrgd); if nops(zeroes)=0 then Set(reply=cat(TEXTplotnoasympt,nexts2[randnext2()])); elif nops(zeroes)=1 then Set(reply=cat(sprintf(TEXTplotoneasympt,convert(zeroes,string)[2..-2]),nexts2[randnext2()])); else Set(reply=cat(sprintf(TEXTplotallasympt,convert(zeroes,string)[2..-2]),nexts2[randnext2()])); end if; end proc: VerticalAsymptotes:=Maplet(onstartup=RunWindow(MAIN), Window[MAIN](title=TEXTtitleMAIN, [ halign=none, valign=none, inset=0, spacing=0, background=ColorBkgd, [ halign=none, background=ColorBkgd, Button(TEXTBNewFunction, Evaluate (function="New_Function"), background=ColorNewButton), HorizontalGlue(), Button(TEXTBQuit, Shutdown(), background=ColorCloseButton) ], [ halign=none, valign=none, inset=0, spacing=0, background=ColorBkgd, [ halign=none, valign=none, inset=0, spacing=0, background=ColorBkgd, [ halign=none, background=ColorBkgd, border=true, caption=TEXTCapGoal, "f(x) =", MathMLViewer[MMLfn](width=200, height=75, background=ColorMessage) ], BoxColumn( halign=none, valign=none, inset=0, spacing=0, background=ColorBkgd, border=true, caption=TEXTCapfactored, [ halign=none, background=ColorBkgd, "f(x) =", TextField[TFfactored](width=20, background=ColorInput), HorizontalGlue(), Button[BfactoredPr](TEXTBPrev, Evaluate(function="preview_factored"), enabled=false, background=ColorDisable), Button[BfactoredCk](TEXTBCheck, Evaluate(function="check_factored"), enabled=false, background=ColorDisable), TextField[MRfactored](width=6, editable=false, background=ColorMessage), Button[BfactoredSh](TEXTBShow, Evaluate(function="show_factored"), enabled=false, background=ColorDisable) ], [ halign=none, background=ColorBkgd, "f(x) =", MathMLViewer[MMLfactored](width=200, height=75, background=ColorMessage) ] ), [ halign=none, background=ColorBkgd, border=true, caption=TEXTCapzeroes, "x = ", TextField[TFzeroes](width=10, background=ColorInput), CheckBox[CBnone](TEXTCBNone, background=ColorBkgd), HorizontalGlue(), Button[BzeroesCk](TEXTBCheck, Evaluate(function="check_zeroes"), enabled=false, background=ColorDisable), TextField[MRzeroes](width=6, editable=false, background=ColorMessage), Button[BzeroesSh](TEXTBShow, Evaluate(function="show_zeroes"), enabled=false, background=ColorDisable) ] ], [ halign=none, valign=none, background=ColorBkgd, border=true, caption=TEXTCapPlot, [ background=ColorPlotFrame, Plotter[Pasymptote](plot0, width=250, height=250) ], Button[BPasymptote](TEXTBPlotIt, Evaluate(function="plotfunc"), enabled=false, background=ColorDisable) ] ], BoxRow( background=ColorBkgd, TextBox[reply](width=60, height=2, editable=false, background=ColorMessage), Label(Image(Logo)), Label(Image(LIBLogo)) ), BoxColumn( halign=none, background=ColorFooter, inset=0, spacing=0, [ background=ColorFooter, inset=0, spacing=0, Label(TEXTLprogrammers, font=FontFooter), HorizontalGlue(), Label(TEXTLcopyright, font=FontFooter), HorizontalGlue(), Label(TEXTLversion, font=FontFooter) ], [ background=ColorFooter, inset=0, spacing=0, Label(TEXTLasstprogrammer, font=FontFooter), HorizontalGlue(), Label(GetVersion(), font=FontFooter) ] ) ] ) ): Maplets[Display]( VerticalAsymptotes );