Re: Re: looping
- To: mathgroup at smc.vnet.net
- Subject: [mg106832] Re: [mg106766] Re: [mg106704] looping
- From: Leonid Shifrin <lshifr at gmail.com>
- Date: Sun, 24 Jan 2010 05:43:44 -0500 (EST)
- References: <201001210955.EAA16523@smc.vnet.net>
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 >
- References:
- looping
- From: glenn kuhaneck <mcguyver128@yahoo.com>
- looping