Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.07.2010, 00:30   #1
Artempokrowski
Пользователь
 
Регистрация: 06.07.2010
Сообщений: 31
По умолчанию работа с текстовым файлом. Создаем тест.

В общем я пишу программу тесты. Данная программа берет вопросы и ответы а также информацию по вопросу из файла с определенной структурой.
Код:
Код:
test=record

  nomer:integer; // номер записи
  vopros:string; // сам вопрос
  ot1:string; // первый ответ
  ot2:string; // второй ответ
  ot3:string; // третий ответ
  ot4:string; // четвертый ответ
  pot:string; // правильный ответ
  teor:string; // информация по вопросу
  end;
файл уже сфомирован вот его пример

1
Сколько человек у нас в группе???
12
23
13
20
13
13 человек
2
Если да то ...
да
неи
не знаю
подумаю еще
да
да
3
Просто мне так захотелось
1
2
3
6
1
Многгоооооооооооооооооооооооооооооо ооооооооооооооооооооооооооооооооооо ооооо



смысл моей же программы в том что при открытии очередного такого теста она должна брать рандомно все эти вопросы и ответы но в правильной последовательности. Чтобы брал не фиг пойми как а вопросы совпадали с ответами. Пример
Если да то ...
да
неи
не знаю
подумаю еще
да
да


но возникает проблема что seek не используется в текстовых файлах.

При использовании функции windows Api SetFilePointer(TTextRec(f).Handle, Pos, nil, File_Begin); в дальнейшем на readln(f,vizov.nomer) и т.д. выдает ошибку EinOutError с сообщением invalid input error. Такое сообщение он выдает если рандомное значение равно 1. И значение 2 он не показывал ни разу хотя записи 3.


Вот сам код программы:

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Menus, ExtCtrls, jpeg;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Button1: TButton;
    Button2: TButton;
    OpenDialog1: TOpenDialog;
    MainMenu1: TMainMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    N3: TMenuItem;
    N4: TMenuItem;
    N5: TMenuItem;
    N6: TMenuItem;
    RadioGroup1: TRadioGroup;
    Image1: TImage;
    procedure Button2Click(Sender: TObject);
    procedure N5Click(Sender: TObject);
    procedure N2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  test=record

  nomer:integer;
  vopros:string;
  ot1:string;
  ot2:string;
  ot3:string;
  ot4:string;
  pot:string;
  teor:string;
  end;

  var
  Form1: TForm1;
  f:textfile;
  vizov:test;
  pravotvet:integer;
  implementation

{$R *.dfm}


procedure TForm1.Button2Click(Sender: TObject);
begin
closefile (f);
form1.Close;

end;


procedure TForm1.N5Click(Sender: TObject);
begin
label1.Visible:=false;
label2.Visible:=false;
radiogroup1.visible:=false;
button1.Visible:=false;
image1.Visible:=true;
closefile (f);
end;

procedure TForm1.N2Click(Sender: TObject);
var
f:textfile;
slu4:integer;
pos:longint;
begin
opendialog1.Execute;
opendialog1.FileName;
n5.Visible:=true;
n3.Visible:=true;
radiogroup1.Visible:=true;
radiogroup1.Items.Clear;
image1.Visible:=false;
button1.Visible:=true;
label1.visible:=true;
label2.visible:=true;
pravotvet:=0;
randomize;
assignfile (f,opendialog1.FileName);
FileMode := fmOpenRead;
reset (f);

pos:=random(filesize (f));
SetFilePointer(TTextRec(f).Handle, Pos, nil, File_Begin);
readln (f,vizov.nomer); // ошибка если pos=1 и pos никогда не бывает 2 либо 0 (либо 1 проверял)
readln (f,vizov.vopros);
readln (f,vizov.ot1);
readln (f,vizov.ot2);
readln (f,vizov.ot3);
readln (f,vizov.ot4);
readln (f,vizov.pot);
readln (f,vizov.teor);

label2.Caption:=vizov.vopros;
randomize;
slu4:=random(3)+1;

case slu4 of
1: begin radiogroup1.Items.add (vizov.ot1);
    radiogroup1.Items.add (vizov.ot2);
    radiogroup1.Items.add (vizov.ot3);
    radiogroup1.Items.add (vizov.ot4);
   end;
2: begin radiogroup1.Items.add (vizov.ot2);
    radiogroup1.Items.add (vizov.ot4);
    radiogroup1.Items.add (vizov.ot3);
    radiogroup1.Items.add (vizov.ot1);
   end;
3: begin radiogroup1.Items.add (vizov.ot3);
    radiogroup1.Items.add (vizov.ot1);
    radiogroup1.Items.add (vizov.ot2);
    radiogroup1.Items.add (vizov.ot4);
   end;

4: begin radiogroup1.Items.add (vizov.ot4);
    radiogroup1.Items.add (vizov.ot2);
    radiogroup1.Items.add (vizov.ot1);
    radiogroup1.Items.add (vizov.ot3);
   end;
end;
end;

end.
А в дальнейшем надо будет чтобы при выборе следующего вопроса бегал по файлу и читал эти записи. Народ подскажите в чём ошибка. И как мне реализовать всё это. Срочняк надо. Могу выложить ещё редактор теста для создания этих тестов чтобы эксперементировать. И учтите я дельфи только начал учить.

Последний раз редактировалось Stilet; 06.07.2010 в 09:05.
Artempokrowski вне форума Ответить с цитированием
Старый 06.07.2010, 01:13   #2
Don Karleone
Форумчанин
 
Регистрация: 05.04.2010
Сообщений: 410
По умолчанию

Немного не понял
Есть файл с тремя вопросами. Что программа должна брать случайно?
Вопрос из этих трех?
ICQ: 593-013-807
Don Karleone вне форума Ответить с цитированием
Старый 06.07.2010, 01:28   #3
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

Цитата:
в том что при открытии очередного такого теста она должна брать рандомно все эти вопросы и ответы но в правильной последовательности.
загрузите данные в массив вопросов и ответов, далее генерируйте правильную случайную последовательность и всё. Если нужны случайные вопросы, то, чтобы они не повторялись, можно перетасовать массив с вопросами и ответами.
NiCola999 вне форума Ответить с цитированием
Старый 06.07.2010, 11:48   #4
VektorAB
Пользователь
 
Регистрация: 13.05.2010
Сообщений: 29
По умолчанию

А почему бы не создать типизированный файл?
Либо создать запись того же типа, и следующим образом перейти к нужной компоненте файла:
Код:
Reset(file);
for i:=1 to n do
    Read(zapis);
close(file);
Таким образом в случае если n нужная компонента файла, в zapis будет лежать эта компонента файла.
"Сегодня, в завтрашний день не все могут смотреть, вернее не только лишь все, мало кто может это сделать"

Последний раз редактировалось VektorAB; 06.07.2010 в 11:55.
VektorAB вне форума Ответить с цитированием
Старый 06.07.2010, 13:09   #5
Artempokrowski
Пользователь
 
Регистрация: 06.07.2010
Сообщений: 31
По умолчанию

Цитата:
Сообщение от Don Karleone Посмотреть сообщение
Немного не понял
Есть файл с тремя вопросами. Что программа должна брать случайно?
Вопрос из этих трех?
Да программа должна брать случайно один из этих трёх вопросов и ответы к нему. как это реализовать??? И еще где находится компонент Stringlist???

Последний раз редактировалось Artempokrowski; 06.07.2010 в 13:48.
Artempokrowski вне форума Ответить с цитированием
Старый 06.07.2010, 13:14   #6
ZaRDaK
Форумчанин
 
Регистрация: 01.09.2009
Сообщений: 197
По умолчанию

Stringlist это не компонент, а тип.
Код:
var sl: TStringlist
begin
sl := Tstringlist.Create;
...
sl.Destroy;
ZaRDaK вне форума Ответить с цитированием
Старый 06.07.2010, 13:47   #7
Artempokrowski
Пользователь
 
Регистрация: 06.07.2010
Сообщений: 31
По умолчанию

Цитата:
Сообщение от NiCola999 Посмотреть сообщение
загрузите данные в массив вопросов и ответов, далее генерируйте правильную случайную последовательность и всё. Если нужны случайные вопросы, то, чтобы они не повторялись, можно перетасовать массив с вопросами и ответами.
Подскажи поподробнее а то я чё то не въехал. Надо создавать 2 массива или один? Если можно то покажи примерный код.

Цитата:
Сообщение от ZaRDaK Посмотреть сообщение
Stringlist это не компонент, а тип.
Код:
var sl: TStringlist
begin
sl := Tstringlist.Create;
...
sl.Destroy;
Что ещё должно помимо создания и уничтожения этого типа? что еще туда нужно добавить??? Чтобы туда загружался весь файл???

Последний раз редактировалось Stilet; 06.07.2010 в 13:55.
Artempokrowski вне форума Ответить с цитированием
Старый 06.07.2010, 13:52   #8
apromix
PHP, Delphi
Форумчанин
 
Аватар для apromix
 
Регистрация: 07.05.2008
Сообщений: 388
По умолчанию

Создайте новый класс из нескольких полей типа TStringList и одного поля типа Integer (индекс правильного ответа) и тогда у вас будет безконечно вопросов
Мыши плакали, кололись, но продолжали жрать кактус...
мои проекты
apromix вне форума Ответить с цитированием
Старый 06.07.2010, 13:57   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Чтобы туда загружался весь файл???
sl.LoadFromFile(Имя файла);

теперь sl можно использовать как массив строк т.е.
sl[5] даст 6-ю строку (нумерация с 0 начинается)
а sl.Count даст общее число всех строк.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 06.07.2010, 20:18   #10
Artempokrowski
Пользователь
 
Регистрация: 06.07.2010
Сообщений: 31
Счастье

Народ всем большое спасибо за помощь)))) но ждать не стал до всего допёр сам))) Всё равно биг спс.

Последний раз редактировалось Artempokrowski; 06.07.2010 в 20:21.
Artempokrowski вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с текстовым файлом в Си Eovin Помощь студентам 0 19.05.2010 13:47
Работа с текстовым файлом. annosinceva Общие вопросы C/C++ 0 25.04.2010 08:54
Работа с текстовым файлом Mashul'ka Помощь студентам 1 03.06.2009 23:26
Работа с текстовым файлом simka007 Помощь студентам 7 06.02.2009 14:21
Работа с текстовым файлом nataly_ukr БД в Delphi 23 07.12.2007 22:13