Re: Re: looping
- To: mathgroup at smc.vnet.net
- Subject: [mg106841] Re: [mg106766] Re: [mg106704] looping
- From: DrMajorBob <btreat1 at austin.rr.com>
- Date: Sun, 24 Jan 2010 05:45:32 -0500 (EST)
- References: <201001210955.EAA16523@smc.vnet.net>
- Reply-to: drmajorbob at yahoo.com
Thanks! I've just noticed something I don't understand, however. How can displayPanel[] be used outside the makeScorePanel function, when it uses studentInfo, text, buttons, and class -- all of which are local to the Module?? Bobby On Sat, 23 Jan 2010 14:57:25 -0600, Leonid Shifrin <lshifr at gmail.com> wrote: > Hi Bobby, > > I agree - your modification makes it more elegant. I particularly liked > your use of indexed variables and RandomChoice. > > Cheers, > Leonid > > > On Sat, Jan 23, 2010 at 12:48 PM, DrMajorBob <btreat1 at austin.rr.com> > wrote: > >> I'd style this a bit differently: >> >> Clear[makeScorePanel]; >> makeScorePanel[names : {__String}] := >> Module[{text, k = Length@names, name = RandomChoice@names, >> studentInfo, classFlag = True, buttons, class, percent, next, >> correct, questions}, >> >> "internal functions"; >> correct[_] = 0; questions[_] = 0; >> percent[name_] /; questions[name] == 0 = 0; >> percent[name_] := Round[100*correct[name]/questions[name]]; >> >> "display elements"; >> >> text = "Was the answer correct?"; >> next := (questions[name]++; name = RandomChoice@names); >> >> class := >> If[classFlag, >> Panel[Grid[ >> Prepend[Transpose[{names, getQuestionCount[], >> getCorrectCount[], getPercent[]}], {"Name", "Questions", >> "# correct", "% correct"}], Spacings -> 3, >> Dividers -> Center]], ""]; >> buttons := >> Row[{Button[" Yes ", correct[name]++; next], >> Button[" No ", next], >> Button[If[classFlag, "Hide Roster", "Show Roster"], >> classFlag = ! classFlag]}]; >> studentInfo := >> Panel[ >> Grid[{{"Name", name}, {"Questions", >> questions@name}, {"Correct answers", >> correct@name}, {"% correct", percent@name}}, >> Alignment -> Left]]; >> >> "exported functions"; >> Clear[getCorrectCount, getQuestionCount, getPercent, >> displayPanel]; >> getCorrectCount[] := correct /@ names; >> getQuestionCount[] := questions /@ names; >> getPercent[] := percent /@ names; >> displayPanel[] := >> >> Dynamic@Panel[Column[{studentInfo, text, buttons, class}]] >> ]; >> makeScorePanel[{"apple", "bob", "cat", "dog", "ear", "frog", "greg", >> "hippo", "i9", "joe"}] >> displayPanel[] >> >> Bobby >> >> >> On Sat, 23 Jan 2010 06:30:56 -0600, Leonid Shifrin <lshifr at gmail.com> >> wrote: >> >> Hi Glenn, >>> >>> You don't need a loop at all, if I understand your goal correctly. What >>> you >>> need is a bit of Dynamic functionality. Hope this will get you started: >>> >>> Clear[makeScorePanel, getScores, getCalled, getPrcntp, bpanel]; >>> makeScorePanel[names : {__String}] := >>> Module[{text, n = RandomInteger[Length[names] - 1] + 1, studentInfo, >>> classFlag = False, buttons, class, percent, next, >>> score , called , prcnt}, >>> Clear[getScores, getCalled, getPrcntp, bpanel]; >>> score = called = prcnt = Table[0, {Length[names]}]; >>> getScores[] := score; >>> getCalled[] := called; >>> getPrcntp[] := prcnt; >>> text := "Was the answer correct?"; >>> next := (called[[n]]++; n = RandomInteger[Length[names] - 1] + 1); >>> class := >>> If[classFlag, >>> Panel[Grid[ >>> Transpose[{names, score, >>> IntegerPart[100*score/(called /. (0 -> 1))]/100.} >>> ], >>> Spacings -> 3, Dividers -> Center]], >>> ""]; >>> buttons := >>> Row[{ >>> Button[" Yes ", score[[n]]++; next], >>> Button["Class", classFlag = ! classFlag], >>> Button[" No ", next]}]; >>> percent := >>> If[called[[n]] == 0, 0, >>> IntegerPart[100*score[[n]]/called[[n]]]/100.]; >>> studentInfo := >>> Panel[Grid[ >>> {{"Name", names[[n]]}, >>> {"Times called", called[[n]]}, >>> {"# of correct answers", score[[n]]}, >>> {"Your % ", percent}}, >>> Alignment -> Left]]; >>> bpanel[] := >>> Dynamic@Panel[Column[{ >>> studentInfo, >>> text, >>> buttons, >>> class >>> }]]]; >>> >>> The way to use: first call the makeScorePanel[] with your actual list >>> of >>> names, then call bpanel[]: >>> >>> makeScorePanel[{"apple", "bob", "cat", "dog", "ear", "frog", "greg", >>> "hippo", "i9", "joe"}] >>> >>> bpanel[] >>> >>> You stop when you feel like it. You can also call getScores[], >>> getCalled[] >>> , getPrcntp[] at any time to get the current state of these variables >>> (if >>> you need that for further processing). >>> >>> Regards, >>> Leonid >>> >>> >>> >>> On Thu, Jan 21, 2010 at 12:55 PM, glenn kuhaneck <mcguyver128 at yahoo.com >>> >wrote: >>> >>> this code is supposed to randomly select a student from a list, keep >>>> track >>>> of how many times he/she has been called, and how many answers they >>>> have >>>> gotten correct. >>>> >>>> I am having problems getting the following code to repeat on request: >>>> i >>>> have tried do loops, while loops, and labels none have worked. >>>> please >>>> help >>>> >>>> These are the sample lists I am using for the code below >>>> name = ( { >>>> {"apple"}, >>>> {"bob"}, >>>> {"cat"}, >>>> {"dog"}, >>>> {"ear"}, >>>> {"frog"}, >>>> {"greg"}, >>>> {"hippo"}, >>>> {"i9"}, >>>> {"joe"} >>>> }); score = ({ >>>> {0}, >>>> {0}, >>>> {0}, >>>> {0}, >>>> {0}, >>>> {0}, >>>> {0}, >>>> {0}, >>>> {0}, >>>> {0} >>>> }); called = ({ >>>> {0}, >>>> {0}, >>>> {0}, >>>> {0}, >>>> {0}, >>>> {0}, >>>> {0}, >>>> {0}, >>>> {0}, >>>> {0} >>>> }); prcnt = ( { >>>> {0}, >>>> {0}, >>>> {0}, >>>> {0}, >>>> {0}, >>>> {0}, >>>> {0}, >>>> {0}, >>>> {0}, >>>> {0} >>>> } ); >>>> >>>> >>>> >>>> >>>> this is the code to manipulate the lists created above >>>> repeat = "yes"; >>>> c = "wrong"; >>>> l = Length[name]; >>>> n = RandomInteger[l - 1] + 1; >>>> >>>> >>>> Label[begin] >>>> "Student #" >>>> n >>>> name[[n]] >>>> called[[n]] += 1; >>>> "# times called" >>>> called >>>> "Old Score" >>>> score >>>> Input["Was the answer correct?", Button["Yes", c = "Right"]]; >>>> If[c == "Right", score[[n]] += 1]; c >>>> "New Score" >>>> score >>>> "Your # of Correct Answers" >>>> score[[n]] >>>> "Your %" >>>> prcnt[[n]] = score[[n]]/called[[n]] >>>> "Class %" >>>> prcnt >>>> Input["Another ?", Button["No", repeat = "no"]]; >>>> If[repeat == "yes", Goto[begin], Goto[end]]; >>>> Label[end]; >>>> prcnt[[n]] >>>> >>>> >>>> >>>> thank you for your assistance, >>>> Mr. Glenn J. Kuhaneck >>>> >>>> >>>> >>> >>> >> >> -- >> DrMajorBob at yahoo.com >> -- DrMajorBob at yahoo.com
- References:
- looping
- From: glenn kuhaneck <mcguyver128@yahoo.com>
- looping