•
•
•
•
What is DaniWeb IT Discussion Community?
You're currently browsing the Pascal and Delphi section within the Software Development category of DaniWeb, a massive community of 426,194 software developers, web developers, Internet marketers, and tech gurus who are all enthusiastic about making contacts, networking, and learning from each other. In fact, there are 1,846 IT professionals currently interacting right now! Registration is free, only takes a minute and lets you enjoy all of the interactive features of the site.
Please support our Pascal and Delphi advertiser: Programming Forums
Views: 3331 | Replies: 15
![]() |
So far as you can see below Ive got the program accessing the file and just reading the lines; Ive got the file set up like so...
What is the Answers?
A Do this
B Do that
C Dont do that
D Definitely this
A
So this method is set up that ive got 12 questions in this format stored in the file to display to the user....
BUT the requirements of what I need to do are to display 12 questions randomly each time from a block of say 100 questions which would be stored on the file. Ive a rough idea Id use the Random function in Pascal but am so far baffled.
(Obviously this section is a procedure ive lifted from a much bigger program so the recordtype isnt shown in case anyone was wondering)
Any help would be greatly appreciated!
What is the Answers?
A Do this
B Do that
C Dont do that
D Definitely this
A
So this method is set up that ive got 12 questions in this format stored in the file to display to the user....
BUT the requirements of what I need to do are to display 12 questions randomly each time from a block of say 100 questions which would be stored on the file. Ive a rough idea Id use the Random function in Pascal but am so far baffled.
(Obviously this section is a procedure ive lifted from a much bigger program so the recordtype isnt shown in case anyone was wondering)
Any help would be greatly appreciated!
Assign(Quizfile, 'S:\quizfile.dat');
Reset(Quizfile);
While not EOF (Quizfile) DO
Begin
For J:= 1 TO 5 DO
Begin
Readln(Quizfile, line);
Writeln(line);
End;
Readln(Quizfile, line);
Writeln('Please enter the letter you think is correct');
Readln(answer);
Writeln;
IF UPCASE(answer) = line THEN
Begin
Writeln('Correct');
Writeln;
UserList.List[i].Money := UserList.List[i].Money + 5;
UserList.List[i].Score := UserList.List[i].Score +1;
End
ELSE
Begin
Writeln('Wrong');
Writeln;
UserList.List[i].Money := UserList.List[i].Money - 5;
UserList.List[i].Score := 0+UserList.List[i].Score;
End;
End;
Close(Quizfile);
End;
End; I might as well post the whole program to assist anyone reading this.... also I forsee a problem with the later procedure where I append the file with user created questions....
Again thanks to anyone who can help me...
Again thanks to anyone who can help me...
Program PubQuiz;
Uses Crt;
CONST
LIM =20;
Type
UserRecordType = RECORD
Firstname, Surname : STRING;
Money, Score : Integer;
End;
UserListType = Record
List : Array[1..LIM] OF UserRecordType;
MAX : Integer;
End;
Procedure Display_Menu(Var choice : Integer);
Begin
Writeln('**********************************');
Writeln('* "Pub Quiz Game" *');
Writeln('* A Production *');
Writeln('* by The Usual Suspects *');
Writeln('* Copyright 2007 *');
Writeln('**********************************');
Writeln('* 1). New Question *');
Writeln('* 2). Play Game *');
Writeln('* 3). Display Results *');
Writeln('* 4). Exit Game *');
Writeln('**********************************');
Writeln;
Write('Please enter your choice : ');
Readln(choice);
End;
Procedure CreateQuiz;
VAR
Reply : CHAR;
Quiz, ans, ansA, ansB, ansC, ansD, line : string;
QuizFile : Text;
I : Integer;
BEGIN
CLRSCR;
ASSIGN( QuizFile, 'E:quizfile.DAT' );
APPEND( QuizFile );
REPEAT
WRITELN('Please first type Bonus followed by a space then the Quiz question : ');
READLN(Quiz);
WRITELN('Please first type A followed by a space then Answer option : ');
READLN(ansA);
WRITELN('Please first type B followed by a space then Answer option : ');
READLN(ansB);
WRITELN('Please first type C followed by a space then Answer option : ');
READLN(ansC);
WRITELN('Please first type D followed by a space then Answer option : ');
READLN(ansD);
WRITELN('Please type the letter (in capitals) which contains the correct Answer : ');
READLN(ans);
WRITELN(QuizFile, Quiz);
WRITELN(QuizFile, ansA);
WRITELN(Quizfile, ansB);
WRITELN(Quizfile, ansC);
WRITELN(Quizfile, ansD);
WRITELN(Quizfile, ans);
WRITELN('Do you want to enter another question? Y or N');
READLN(Reply);
UNTIL ( (Reply = 'n') OR (Reply = 'N'));
CLOSE(QuizFile);
END;
Procedure GetUserData(VAR UserList : UserListType);
Var
Quizfile : Text;
Line : String;
answer, Ch,Ch2, option : Char;
Money, Score, Ch_code, I, J : Integer;
Firstname, Surname : String[20];
Begin
clrscr;
Money := 0;
Score := 0;
Writeln('Please enter number of users (numerical response) ');
Readln(UserList.MAX);
FOR I := 1 TO UserList.MAX DO
Begin
Write('Type in your firstname : ');
Readln(UserList.List[i].Firstname);
Write('Type in your surname : ');
Readln(UserList.List[i].Surname);
Ch2 := UserList.List[i].Firstname[1];
IF (Ch2 >= 'a') AND (Ch2 <= 'z') THEN
Ch2 := CHR(ORD(Ch2) - 32);
UserList.List[i].Firstname[1] := Ch2;
Ch := UserList.List[i].Surname[1];
IF (Ch >= 'a') AND (Ch <= 'z') THEN
Ch := CHR(ORD(Ch) - 32);
UserList.List[i].Surname[1] := Ch;
Writeln;
Readln;
Assign(Quizfile, 'E:\quizfile.dat');
Reset(Quizfile);
While not EOF (Quizfile) DO
Begin
For J:= 1 TO 5 DO
Begin
Readln(Quizfile, line);
Writeln(line);
End;
Readln(Quizfile, line);
Writeln('Please enter the letter you think is correct');
Readln(answer);
Writeln;
IF UPCASE(answer) = line THEN
Begin
Writeln('Correct');
Writeln;
UserList.List[i].Money := UserList.List[i].Money + 5;
UserList.List[i].Score := UserList.List[i].Score +1;
End
ELSE
Begin
Writeln('Wrong');
Writeln;
UserList.List[i].Money := UserList.List[i].Money - 5;
UserList.List[i].Score := 0+UserList.List[i].Score;
End;
End;
Close(Quizfile);
End;
End;
Procedure DisplayUserRes(UserList : UserListType);
Var
I : Integer;
ResultFile : Text;
Begin
ASSIGN(ResultFile, 'E:\User.bin');
REWRITE(ResultFile);
For I := 1 to UserList.MAX DO
Begin
Writeln('Player Name :: ',UserList.List[i].Firstname,' ',UserList.List[i].Surname);
Writeln('Money Won is £', UserList.List[i].Money);
Writeln('Score is (inclusive of Bonus Questions Created) ', UserList.List[i].Score);
Writeln(ResultFile, UserList.List[i].Firstname,' ',UserList.List[i].Surname);
Writeln(ResultFile, UserList.List[i].Money);
Writeln(ResultFile, UserList.List[i].Score);
Readln;
clrscr;
End;
CLOSE(ResultFile);
End;
VAR
UserList : UserListType;
Choice : Integer;
Begin
Repeat
Clrscr;
Display_Menu(choice);
Case (choice) Of
1 : CreateQuiz;
2 : GetUserData(UserList);
3 : DisplayUserRes(UserList);
End;
Until (choice=4);
readln;
End.
•
•
Join Date: Dec 2006
Location: Romania
Posts: 171
Reputation:
Rep Power: 2
Solved Threads: 16
i haven't read your entire program because i'm in a hurry, but from what i figure it out , you only read from file the question. try to design a record structure for the question and answers. in this way you can read all from file into a array of records, and from there to randomize is not so dificult
best regards,
best regards,
•
•
Join Date: Dec 2006
Location: Romania
Posts: 171
Reputation:
Rep Power: 2
Solved Threads: 16
•
•
•
•
Thats a great idea, thanks. Really my problem is realising how to use the random function in pascal. I know you declare randomize near the start then use Random but have only seen examples using integers, would I have to link a number to each record or something like that?
if you have an array, e.g:
ado array[1..100]of yourrecord then ado[1],ado[2] are elements of your array. i think it's obvious from now....
best regards,
So far Ive got this for the random section...hopefully assigning each element of the array within this will work...
program random;
uses crt;
var a,b, i:integer;
begin
clrscr;
randomize;
for i:= 1 to 12 DO
begin
b:=random(100)+1; {this makes "b" a random number from 1 to 100}
writeln(b);
readln;
end;
end.
Last edited by adotl : Apr 21st, 2007 at 9:03 am.
This what ive got so far with the questions in record form....
PROGRAM Quiz questions
USES CRT,DOS;
TYPE
QuizType = STRING;
QuizFileType = FILE OF QuizType;
QuizDetailsType =
RECORD
Question : STRING;
OptionA : STRING;
OptionB : STRING;
OptionC : STRING;
OptionD : STRING;
Answer : STRING;
END;
QuizDetailsTableType =
ARRAY [1..6] OF QuizDetailsType;
QuizDetailsListType =
RECORD
Length : INTEGER;
Table : QuizDetailsTableType;
END;
VAR
QuizFile : QuizFileType;
a,b, i, Count,Money, Score, J : INTEGER;
Question : QuizType;
OptionA : QuizType;
OptionB : QuizType;
OptionC : QuizType;
OptionD : QuizType;
Answer : QuizType;
Quizfile : Text;
Line : String;
answer : Char;
BEGIN
Count := 0;
ASSIGN( QuizFile, 'E:quizupdate.DAT' );
RESET( QuizFile );
WHILE( ( NOT EOF( QuizFile ) ) AND ( Count < 6 ) ) DO
BEGIN
Count := Count + 1;
READ( QuizFile, Question );
READ( QuizFile, OptionA );
READ( QuizFile, OptionB );
READ( QuizFile, OptionC );
READ( QuizFile, OptionD );
READ( QuizFile, Answer );
Writeln(Question);
Writeln(OptionA);
Writeln(OptionB);
Writeln(OptionC);
Writeln(OptionD);
Writeln('Please enter the letter you think is correct');
Readln(answer);
IF UPCASE(answer) = line THEN
Begin
Writeln('Correct');
Money := Money + 5;
Score := Score +1;
End
ELSE
Begin
Writeln('Wrong');
Writeln;
Money := Money - 5;
Score := 0+Score;
End;
Writeln('Money Won is £', money);
Writeln('Score out of 12 questions is ', score);
Readln;
clrscr;
End;
BEGIN
Success := FALSE;
EXIT;
END;
QuizDetailsList.Table[Count].Question := Question
QuizDetailsList.Table[Count].OptionA := OptionA
QuizDetailsList.Table[Count].OptionB := OptionB
QuizDetailsList.Table[Count].OptionC := OptionC
QuizDetailsList.Table[Count].OptionD := OptionD
QuizDetailsList.Table[Count].Answer := Answer
END;
BEGIN
Success := FALSE;
EXIT;
END;
QuizDetailsList.Table[Count].Question := Question
QuizDetailsList.Table[Count].OptionA := OptionA
QuizDetailsList.Table[Count].OptionB := OptionB
QuizDetailsList.Table[Count].OptionC := OptionC
QuizDetailsList.Table[Count].OptionD := OptionD
QuizDetailsList.Table[Count].Answer := Answer
END;
IF Count = 6 THEN
BEGIN
Success := FALSE;
EXIT;
END;
Success := TRUE;
QuizDetailsList.Length := Count;
CLOSE( QuizFile );
END; Last edited by adotl : Apr 21st, 2007 at 9:47 am.
And also Ive done the create question program...really just the Random part being inserted Im stuck on...
PROGRAM CreateQuiz;
USES CRT;
TYPE
QuizType = STRING;
QuizFileType = FILE OF QuizType;
VAR
Reply : CHAR;
Question : QuizType;
OptionA : QuizType;
OptionB : QuizType;
OptionC : QuizType;
OptionD : QuizType;
Answer : QuizType;
QuizFile : QuizFileType;
BEGIN
CLRSCR;
ASSIGN( QuizFile, 'E:quizupdate.DAT' );
REWRITE( QuizFile );
REPEAT
WRITELN( 'Enter question' );
READLN( Question );
WRITE( QuizFile, Question );
WRITELN( 'Enter Option A' );
READLN( OptionA );
WRITE( QuizFile, OptionA );
WRITELN( 'Enter Option B' );
READLN( OptionB );
WRITE( QuizFile, OptionB );
WRITELN( 'Enter Option C' );
READLN( OptionC );
WRITE( QuizFile, OptionC );
WRITELN( 'Enter Option D' );
READLN( OptionD );
WRITE( QuizFile, OptionD );
WRITELN( 'Enter Answer' );
READLN( Answer );
WRITE( QuizFile, Answer );
WRITELN( 'Do you want to enter another question?' );
READLN( Reply );
UNTIL( (Reply = 'n') OR (Reply = 'N') ;
CLOSE( QuizFile );
END. Last edited by adotl : Apr 21st, 2007 at 10:01 am.
Re: Pascal : Access a file of 100 Quiz questions so 12 Random ones are displayed?
#10
Apr 21st, 2007
Arghhhhhhhh Im really stuck with this damn Random function...
Ive a rough idea that I would use the concept below...
........and link the b to the counter for my array of the quiz questions, so that a random quiz question is displayed 12 times.
Seriously if anyone can give me that final push for this I would be eternally grateful. As you can see Ive done a lot of work.
Its for a project and even tho my original program does what is asked I just thought Id be clever with the Random thing but have zero experience with it so what may be obvious to someone isnt to me.
Cheers anyway.
Ive a rough idea that I would use the concept below...
program random;
uses crt;
var a,b, i:integer;
begin
clrscr;
randomize;
for i:= 1 to 12 DO
begin
b:=random(100)+1; {this makes "b" a random number from 1 to 100}
writeln(b);
readln;
end;
end. ........and link the b to the counter for my array of the quiz questions, so that a random quiz question is displayed 12 times.
Seriously if anyone can give me that final push for this I would be eternally grateful. As you can see Ive done a lot of work.
Its for a project and even tho my original program does what is asked I just thought Id be clever with the Random thing but have zero experience with it so what may be obvious to someone isnt to me.
Cheers anyway.
Last edited by adotl : Apr 21st, 2007 at 12:45 pm.
![]() |
•
•
•
•
•
•
•
•
DaniWeb Pascal and Delphi Marketplace
•
•
•
•
Currently Active Users Viewing This Thread: 1 (0 members and 1 guests)
Other Threads in the Pascal and Delphi Forum
- Previous Thread: EOleSysError
- Next Thread: Pascal : Variable for both integer & string?


Linear Mode