Tillbaka till svenska Fidonet
English   Information   Debug  
TUB   0/290
UFO   0/40
UNIX   0/1316
USA_EURLINK   0/102
USR_MODEMS   0/1
VATICAN   0/2740
VIETNAM_VETS   0/14
VIRUS   0/378
VIRUS_INFO   0/201
VISUAL_BASIC   0/473
WHITEHOUSE   0/5187
WIN2000   0/101
WIN32   0/30
WIN95   0/4288
WIN95_OLD1   0/70272
WINDOWS   0/1517
WWB_SYSOP   0/419
WWB_TECH   0/810
ZCC-PUBLIC   0/1
ZEC   4

 
4DOS   0/134
ABORTION   0/7
ALASKA_CHAT   0/506
ALLFIX_FILE   0/1313
ALLFIX_FILE_OLD1   0/7997
ALT_DOS   0/152
AMATEUR_RADIO   0/1039
AMIGASALE   0/14
AMIGA   0/331
AMIGA_INT   0/1
AMIGA_PROG   0/20
AMIGA_SYSOP   0/26
ANIME   0/15
ARGUS   0/924
ASCII_ART   0/340
ASIAN_LINK   0/651
ASTRONOMY   0/417
AUDIO   0/92
AUTOMOBILE_RACING   0/105
BABYLON5   0/17862
BAG   135
BATPOWER   0/361
BBBS.ENGLISH   0/382
BBSLAW   0/109
BBS_ADS   0/5290
BBS_INTERNET   0/507
BIBLE   0/3563
BINKD   0/1119
BINKLEY   0/215
BLUEWAVE   0/2173
CABLE_MODEMS   0/25
CBM   0/46
CDRECORD   0/66
CDROM   0/20
CLASSIC_COMPUTER   0/378
COMICS   0/15
CONSPRCY   0/899
COOKING   32896
COOKING_OLD1   0/24719
COOKING_OLD2   0/40862
COOKING_OLD3   0/37489
COOKING_OLD4   0/35496
COOKING_OLD5   9370
C_ECHO   0/189
C_PLUSPLUS   0/31
DIRTY_DOZEN   0/201
DOORGAMES   0/2056
DOS_INTERNET   0/196
duplikat   6002
ECHOLIST   0/18295
EC_SUPPORT   0/318
ELECTRONICS   0/359
ELEKTRONIK.GER   1534
ENET.LINGUISTIC   0/13
ENET.POLITICS   0/4
ENET.SOFT   0/11701
ENET.SYSOP   33903
ENET.TALKS   0/32
ENGLISH_TUTOR   0/2000
EVOLUTION   0/1335
FDECHO   0/217
FDN_ANNOUNCE   0/7068
FIDONEWS   24125
FIDONEWS_OLD1   0/49742
FIDONEWS_OLD2   0/35949
FIDONEWS_OLD3   0/30874
FIDONEWS_OLD4   0/37224
FIDO_SYSOP   12852
FIDO_UTIL   0/180
FILEFIND   0/209
FILEGATE   0/212
FILM   0/18
FNEWS_PUBLISH   4408
FN_SYSOP   41678
FN_SYSOP_OLD1   71952
FTP_FIDO   0/2
FTSC_PUBLIC   0/13599
FUNNY   0/4886
GENEALOGY.EUR   0/71
GET_INFO   105
GOLDED   0/408
HAM   0/16070
HOLYSMOKE   0/6791
HOT_SITES   0/1
HTMLEDIT   0/71
HUB203   466
HUB_100   264
HUB_400   39
HUMOR   0/29
IC   0/2851
INTERNET   0/424
INTERUSER   0/3
IP_CONNECT   719
JAMNNTPD   0/233
JAMTLAND   0/47
KATTY_KORNER   0/41
LAN   0/16
LINUX-USER   0/19
LINUXHELP   0/1155
LINUX   0/22092
LINUX_BBS   0/957
mail   18.68
mail_fore_ok   249
MENSA   0/341
MODERATOR   0/102
MONTE   0/992
MOSCOW_OKLAHOMA   0/1245
MUFFIN   0/783
MUSIC   0/321
N203_STAT   926
N203_SYSCHAT   313
NET203   321
NET204   69
NET_DEV   0/10
NORD.ADMIN   0/101
NORD.CHAT   0/2572
NORD.FIDONET   189
NORD.HARDWARE   0/28
NORD.KULTUR   0/114
NORD.PROG   0/32
NORD.SOFTWARE   0/88
NORD.TEKNIK   0/58
NORD   0/453
OCCULT_CHAT   0/93
OS2BBS   0/787
OS2DOSBBS   0/580
OS2HW   0/42
OS2INET   0/37
OS2LAN   0/134
OS2PROG   0/36
OS2REXX   0/113
OS2USER-L   207
OS2   0/4786
OSDEBATE   0/18996
PASCAL   0/490
PERL   0/457
PHP   0/45
POINTS   0/405
POLITICS   0/29554
POL_INC   0/14731
PSION   103
R20_ADMIN   1121
R20_AMATORRADIO   0/2
R20_BEST_OF_FIDONET   13
R20_CHAT   0/893
R20_DEPP   0/3
R20_DEV   399
R20_ECHO2   1379
R20_ECHOPRES   0/35
R20_ESTAT   0/719
R20_FIDONETPROG...
...RAM.MYPOINT
  0/2
R20_FIDONETPROGRAM   0/22
R20_FIDONET   0/248
R20_FILEFIND   0/24
R20_FILEFOUND   0/22
R20_HIFI   0/3
R20_INFO2   3218
R20_INTERNET   0/12940
R20_INTRESSE   0/60
R20_INTR_KOM   0/99
R20_KANDIDAT.CHAT   42
R20_KANDIDAT   28
R20_KOM_DEV   112
R20_KONTROLL   0/13270
R20_KORSET   0/18
R20_LOKALTRAFIK   0/24
R20_MODERATOR   0/1852
R20_NC   76
R20_NET200   245
R20_NETWORK.OTH...
...ERNETS
  0/13
R20_OPERATIVSYS...
...TEM.LINUX
  0/44
R20_PROGRAMVAROR   0/1
R20_REC2NEC   534
R20_SFOSM   0/340
R20_SF   0/108
R20_SPRAK.ENGLISH   0/1
R20_SQUISH   107
R20_TEST   2
R20_WORST_OF_FIDONET   12
RAR   0/9
RA_MULTI   106
RA_UTIL   0/162
REGCON.EUR   0/2056
REGCON   0/13
SCIENCE   0/1206
SF   0/239
SHAREWARE_SUPPORT   0/5146
SHAREWRE   0/14
SIMPSONS   0/169
STATS_OLD1   0/2539.065
STATS_OLD2   0/2530
STATS_OLD3   0/2395.095
STATS_OLD4   0/1692.25
SURVIVOR   0/495
SYSOPS_CORNER   0/3
SYSOP   0/84
TAGLINES   0/112
TEAMOS2   0/4530
TECH   0/2617
TEST.444   0/105
TRAPDOOR   0/19
TREK   0/755
Möte VISUAL_BASIC, 473 texter
 lista första sista föregående nästa
Text 9, 479 rader
Skriven 2004-11-03 06:06:00 av Randy Birch (1:278/230)
Ärende: Re: Newbie Question Conti
=================================


I had twenty minutes so some comments and code ... first, a few things wrong
....

1) there is no need to set the values of declared variables to 0 in the form
load -- this occurs naturally on the Dim'ming of the variable.

2) there is never a need to call form_load from another event

3) randomize should only be called once per running of the application (from
form_load). This seeds the random number generator; subsequent re-calling
provides no benefit

4) right now go to Tools > Options and check the option "require variable
declaration".  This places an Option Explicit statement at the head of each
new form or module, and will prevent your use of variables that have not
been defined (such as the 'question' variable in the QGen routine). Do it!

5) if you do not define the data type of a variable (called type declaring)
VB's default is to use the variant data type. Variants are take much more
space than regular variables adding to overhead in your application, as well
as (often) to errors due to what is called "evil type casting".  For
example, if you declare and use:

   Dim x, y
   x = 10
   y = x + "20"
   Print y

.... what should you get as the result?  What if the code was:

  Dim x
   x = "10"
   y = x + "20"
   Print y

I can guarantee the results are not the same.


Now, to your questions.

The first thing to do is offload the production of your random number to
function you design specifically for this purpose. This allows you to refine
the code generating the random number as you develop the app within its own
routine, as well as prevent duplication of code - e.g. you may want or need
to generate a random number from more than once place.

Therefore, for example, instead of:

   Dim A
   A = Int((5 - 1 + 1) * Rnd + 1)
   question = A

.... you can delete that code and instead use:

   question = GetRandomNumber(1, 5)

.... where the GetRandomNumber function is defined as:

Private Function GetRandomNumber(lower As Long, upper As Long) As Long

  'check to assure the input is valid
   If (IsNumeric(lower) And _
       IsNumeric(upper)) And _
      (lower < upper) Then

     'get a random number between lower and upper
      GetRandomNumber = Int((upper - lower + 1) _
                        * Rnd(1) + lower)
   End If

End Function


This does not address the second part of your request -- preventing the
duplication of numbers.

The gist of dupe checking is to

a) track the numbers generated thus far
b) generate a new number
c) see if the number from b has been used
d) if it has, go back to b
e) continue until c = false
f) check to see if all are used, in which case we're done

Here's some code you can play with for this purpose. I recommend that to see
what's going on you start a new project and add 1 list box (List1) and 1
command button (Command1) with the code below. Once you see what the code
doing you can easily move it to your project. More info on this follows the
code:

Option Explicit

Private questionsAsked(1 To 5) As Boolean

Private Sub Form_Load()

   Randomize

End Sub

Private Sub Command1_Click()

   Dim question As Long

   question = GetRandomUnusedNumber(1, 5)

   If question <> -999 Then

      List1.AddItem question
   Else

      List1.AddItem "all questions asked"

     'reset to allow new questions
      Erase questionsAsked()

   End If

End Sub

Private Function GetRandomNumber(lower As Long, upper As Long) As Long

  'check to assure the input is valid
   If (IsNumeric(lower) And _
       IsNumeric(upper)) And _
      (lower < upper) Then

     'get a random number between lower and upper
      GetRandomNumber = Int((upper - lower + 1) _
                        * Rnd(1) + lower)

   End If

End Function

Private Function GetRandomUnusedNumber(lower As Long, upper As Long) As Long

   Dim tmp As Integer
   Dim cnt As Integer
   Dim bAllNumbersUsed As Boolean

   Do

      tmp = GetRandomNumber(lower, upper)

     'has it already been used?
      If questionsAsked(tmp) = False Then

        'the number is unused, so
        'set the flag indicating it
        'has been used, and return
        'the number selected
         questionsAsked(tmp) = True
         GetRandomUnusedNumber = tmp
         Exit Do

      End If

     'if this far there is the possibility
     'that all the numbers have been used,
     'so that needs to be tested too

      For cnt = lower To upper
         If questionsAsked(cnt) = False Then
            bAllNumbersUsed = True
            Exit For
         End If
      Next

      If bAllNumbersUsed = False Then
        'all have been used, so return
        'a unique number indicating so
         GetRandomUnusedNumber = -999
         Exit Do
      End If

   Loop

End Function


Now, to get that into your code you want to do three things:

1) delete your current random number code from the top of your QGen routine

2) add this code to the top instead ...

question = GetRandomUnusedNumber(1, 5)

3) wrap the remaining code in that routine within an If .. Then test as per
the demo code, so the Else part executes when all the numbers have been
used, e.g. ...

   question = GetRandomUnusedNumber(1, 5)

   If question <> -999 Then

      Select Case question

         Case 1

            txtQuestion.Text = "For _____ so loved the ...
            ans1.Caption = "James"
            ans2.Caption = "Peter"
            ans3.Caption = "God"
            ans4.Caption = "Jesus"
            QNum = 1

          Case 2 .... and so on

       End Select

   else
      Msgbox "all questions asked"
   end if


Now, with all that said there is an easier way for you to handle the select
case part.  VB provides a special data type called a User-Defined Type (or
UDT) which can hold a combination of other data types and be referred to
using a common name.  In your case your question, possible answers, qnumber
and the correct answer number coudl be defined in a pair of UDTs (in the
general declarations section of the form) as thus:

private type Answers
   choices(1 to 4) as string
end type

private type QuestionSets
    qNumber as long
    correctAnswerNo as long
    sQuestion as string
    ans as Answers
end type

Private qset(1 to 5) as QuestionSets

Now, instead of coding the app's select case etc with hard-coded strings,
you would assign those in the form load (or a 'Reset' routine you
developed), eg...

   qset(1).qnumber = 1
   qset(1).correctAnswerNo = 3
   qset(1).sQuestion = "For _____ so loved the world ..."
   qset(1).ans.choices(1) = "James"
   qset(1).ans.choices(2) = "Peter"
   qset(1).ans.choices(3) = "God"
   qset(1).ans.choices(4) = "Jesus"

.... and so on for questions 2 through 5. The first number in the variable
(qset(xx)) is the question number; the 1-4 in choices are the possible
answers.  Now, armed with the question random number from the code above all
you need to do is directly reference the type without the UDT to achieve the
same results, e.g.

   question = GetRandomUnusedNumber(1, 5)

   If question <> -999 Then

            txtQuestion.Text = qset(question).sQuestion
            ans1.Caption = qset(question).ans.choices(1)
            ans2.Caption = qset(question).ans.choices(2)
            ans3.Caption = qset(question).ans.choices(3)
            ans4.Caption = qset(question).ans.choices(4)

   else
      msgbox "all questions asked
   end if

As the question number changes, those four lines of code take care of
displaying the appropriate data.

What's more, because you are also saving the correct answer number with the
UDT, your routine to check for the correct answers can also be significantly
reduced.

As it is now, you use multiple If Then statements for the answer checking
routine (AnswerGen).  If you use option buttons to allow the user to select
the correct answer, make these changes ...

- delete your current ans1 through ans4 controls

- instead of individually-name controls (ans1, ans2 etc), create a control
array of option buttons by placing one option control on the form and
setting its index property to 0.  Change its name to Ans, then copy and
paste four additional copies of that control to create a control array named
ans(0), ans(1), ans(2) through ans(4). Delete ans(0) since there is no "0"
question.

Now, in the code above that sets the question you need to change each line
like:

            ans1.Caption = qset(question).ans.choices(1)
.... to ...

            ans(1).Caption = qset(question).ans.choices(1)

In your answergen routine you can now drop all the code for testing the
response and simply do a loop from 1 to 5 to test the selected option button
using this:

    TheyGotItRightIf = ans(qset(x).correctAnswerNo) = True

In other words, they got a particular question right if the value of the
ans() control array option button is True (selected) for a given question
number (x).

-- 


Randy Birch
MS MVP Visual Basic
http://vbnet.mvps.org/


"Uncle Whiplash" <N/A> wrote in message
news:cm74j101rvv@enews2.newsguy.com...
: To be more specific with my question:
:
:
: I'm creating a bible trivia program, with a very simple gui.  Here is the
code I am working on.  Anyone got any tips to point me in the right
direction of better code?    Now I'm trying to figure out how to randomly
call the questions, but not call them twice in a row.
:
: TIA
:
: Uncle
:
: Dim QNum
: Dim QCorrect
: Dim QIncorrect
: Dim NumCorrect
: Dim NumIncorrect
: Private Sub AnswerGen()
:
: If QNum = 1 Then
:    If Ans3.Value = True Then
:       NumCorrect = NumCorrect + 1
:    Else
:       NumIncorrect = NumIncorrect + 1
:    End If
: End If
:
: If QNum = 2 Then
:    If Ans1.Value = True Then
:      NumCorrect = NumCorrect + 1
:    Else
:        NumIncorrect = NumIncorrect + 1
:    End If
: End If
:
: If QNum = 3 Then
:    If Ans1.Value = True Then
:       NumCorrect = NumCorrect + 1
:    Else
:        NumIncorrect = NumIncorrect + 1
:      End If
: End If
:
: If QNum = 4 Then
:    If Ans4.Value = True Then
:       NumCorrect = NumCorrect + 1
:    Else
:        NumIncorrect = NumIncorrect + 1
:    End If
: End If
:
: If QNum = 5 Then
:    If Ans4.Value = True Then
:      NumCorrect = NumCorrect + 1
: Else
:       NumIncorrect = NumIncorrect + 1
:    End If
: End If
:
: Ans1.Value = False
: Ans2.Value = False
: Ans3.Value = False
: Ans4.Value = False
:
:
: TCorrect.Caption = NumCorrect
: TIncorrect.Caption = NumIncorrect
:
: QGen
:
: End Sub
:
: Private Sub cmdGo_Click()
: AnswerGen
: End Sub
:
: Private Sub Command1_Click()
: Form_Load
: TCorrect.Caption = "0"
: TIncorrect.Caption = "0"
: GamePercent.Caption = "00%"
: End Sub
:
: Private Sub Form_Load()
: QGen
: NumCorrect = 0
: NumIncorrect = 0
: End Sub
:
: Private Sub QGen()
:
: Randomize
:    Dim A
:    A = Int((5 - 1 + 1) * Rnd + 1)
:    Question = A
:    Select Case Question
:
:    Case 1
:
:    txtQuestion.Text = "For _____ so loved the world that he gave his only
begotten son that whosoever believeth on him should not perish but have
everlasting life."
:    Ans1.Caption = "James"
:    Ans2.Caption = "Peter"
:    Ans3.Caption = "God"
:    Ans4.Caption = "Jesus"
:    QNum = 1
:
:    Case 2
:
:    txtQuestion.Text = "According to the Old Testament, who was the wisest
person to ever live?"
:    Ans1.Caption = "Solomon"
:    Ans2.Caption = "Methusela"
:    Ans3.Caption = "Moses"
:    Ans4.Caption = "David"
:
:    QNum = 2
:
:    Case 3
:
:    txtQuestion.Text = "What was Saul's wife's name?"
:    Ans1.Caption = "Ahinoam"
:    Ans2.Caption = "Ruth"
:    Ans3.Caption = "Sarah"
:    Ans4.Caption = "Sarai"
:
:    QNum = 3
:
:    Case 4
:    QNum = 4
:    txtQuestion.Text = "Who wrote the book of Ruth?"
:    Ans1.Caption = "Boaz"
:    Ans2.Caption = "Ruth"
:    Ans3.Caption = "Naomi"
:    Ans4.Caption = "Samuel"
:
:    QNum = 4
:
:    Case 5
:    QNum = 5
:    txtQuestion.Text = "Who cursed a fig tree for not bearing fruit?"
:    Ans1.Caption = "Peter"
:    Ans2.Caption = "Paul"
:    Ans3.Caption = "Hezekiah"
:    Ans4.Caption = "Jesus"
:
:    QNum = 5
:
:    End Select
:
: End Sub
---
ū RIMEGate(tm)/RGXPost V1.14 at BBSWORLD * Info@bbsworld.com

---
 * RIMEGate(tm)V10.2á˙* RelayNet(tm) NNTP Gateway * MoonDog BBS
 * RgateImp.MoonDog.BBS at 11/3/04 6:06:10 AM
 * Origin: MoonDog BBS, Brooklyn,NY, 718 692-2498, 1:278/230 (1:278/230)