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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.05.2011, 09:11   #1
aleks_m
 
Регистрация: 23.12.2010
Сообщений: 3
По умолчанию Запись из файла txt в массив

Здравствуйте.
Возникла небольшая проблема, при написании теста, возникла необходимость рандомного вывода вопросов из текстового файла, почитав форум понял что проще это будет сделать через массив вопросов и ответов, начал пробовать но не получается...
Может быть пример есть, или посмотрите мою программу и поправьте
Заранее спасибо...

Здесь код чтения и вывода Вопросов и ответов из файла
Код:
Procedure TForm3.VoprosToScr;
var
i:integer;
s,buf:string;
begin
vopros:=vopros+1;
caption:='Вопрос ' + IntToStr(vopros);
buf:='';
repeat
readln(f,s);
if (s[1] <> '.') and (s[1] <> '\')
then buf:=buf+s+' ';
until (s[1] ='.') or (s[1] ='\');
Label5.caption:=buf;
i:=1;
repeat
buf:='';
repeat 
readln(f,s);
if (s[1]<>'.') and (s[1] <> ',')
then buf:=buf+s+' ';
until (s[1]=',')or(s[1]='.');
score[i]:= StrToInt(s[2]);
case i of
1: Label1.caption:=buf;
2: Label2.caption:=buf;
3: Label3.caption:=buf;
4: Label4.caption:=buf;
end;
i:=i+1;
until s[1]='.';
if Form3.Label1.Caption <> ''
then begin
RadioButton1.top:=Label1.top;
Label1.visible:=TRUE;
RadioButton1.visible:=TRUE;
end;

if Form3.Label2.Caption <> ''
then begin
Label2.top:=Label1.top+ Label1.height+10;
RadioButton2.top:=Label2.top;
Label2.visible:=TRUE;
RadioButton2.visible:=TRUE;
end;

if Form3.Label3.Caption <> ''
then begin
Label3.top:=Label2.top+ Label2.height+10;
RadioButton3.top:=Label3.top;
Label3.visible:=TRUE;
RadioButton3.visible:=TRUE;
end;

if Form3.Label4.Caption <> ''
then begin
Label4.top:=Label3.top+ Label3.height+10;
RadioButton4.top:=Label4.top;
Label4.visible:=TRUE;
RadioButton4.visible:=TRUE;
end;
end;
Вложения
Тип файла: rar test.rar (259.8 Кб, 8 просмотров)
aleks_m вне форума Ответить с цитированием
Старый 05.05.2011, 21:58   #2
BingoBongo
Пользователь
 
Регистрация: 29.04.2011
Сообщений: 51
По умолчанию

Простите конечно - но это кошмар какой код!!!
BingoBongo вне форума Ответить с цитированием
Старый 05.05.2011, 23:31   #3
art-programs
Пользователь
 
Регистрация: 04.07.2009
Сообщений: 61
По умолчанию

да уж, глядя на код плакать хочется)
для начала посмотрите в интернетах зачем например существует процедура inc
и зачем городите двойную проверку в цикле
Код:
repeat
readln(f,s);
if (s[1] <> '.') and (s[1] <> '\')
then buf:=buf+s+' ';
until (s[1] ='.') or (s[1] ='\');
используйте while do
а вообще удалите все эти пакости)

если в тхт у вас пара вопрос-ответ (т.е. не тест с вариантами), то не проще ли
хранить их так:
Вопрос номер 1 | ответ №1 , где | - разделитель
а потом тхт подгружать в Tstringlist или ListView
потом вызывать рандом для индекса в Tstringlist
Код:
i:=ramdom(stringlist.count-1);
s:=stringlist.strings[i];
и теперь распарсить строку на вопрос и ответ
чем вариант?
art-programs вне форума Ответить с цитированием
Старый 06.05.2011, 09:22   #4
aleks_m
 
Регистрация: 23.12.2010
Сообщений: 3
По умолчанию

Код:
repeat
readln(f,s);
if (s[1] <> '.')
then buf:=buf+s+' ';
until (s[1] ='.');
Двойная проверка была для того что бы искать картинку к вопросу если она присутствует. Но потом я убрал все картинки, а проверку забыл выкинуть...
На счет while do это да можно сделать, как-то не подумал изначально...
Код:
Каких лидеров называют парциальными?
.
Лидеры коллектива 
,0
Лидеры групп 
,0
Лидеры руководителей 
,0
Лидеры микрогрупп 
.1
Вот у меня как выглядит файл с вопросами сам вопрос потом точка для определения конца вопроса, и дальше 4 варианта ответа как аз сверяю по точке конец вариантов ответов...
aleks_m вне форума Ответить с цитированием
Старый 06.05.2011, 13:38   #5
art-programs
Пользователь
 
Регистрация: 04.07.2009
Сообщений: 61
По умолчанию

лучше использовать однострочное представление:
Код:
Каких лидеров называют парциальными?
Лидеры коллектива 
Лидеры групп 
Лидеры руководителей 
Лидеры микрогрупп
2
2- это номер прав. варианта
для хранения в проге во время работы и вывода рандомно использовать массивы
Код:
type  Tvopros=record
          vop,otv1,otv2,otv3,otv4:string;
          true_otv:integer;
end;
.....
m:array[1..мульён] of  Tvopros;
....
i:=0; j:=1;
while i<=stringlist.count-1 do
begin
m[j].vop:=stringlist.strings[i];  inc(i);
m[j].otv1:=stringlist.strings[i];  inc(i);
m[j].otv2:=stringlist.strings[i];  inc(i);
m[j].otv3:=stringlist.strings[i];  inc(i);
m[j]. true_otv:=inttostr(stringlist.strings[i]);  inc(i);
inc(j);
end;
и рандомно эти вопросы вызывать по индексу

вобщем что-то типа того

код индийский, потому что правильнее пожалуй использовать базы данных
art-programs вне форума Ответить с цитированием
Старый 06.05.2011, 15:04   #6
aleks_m
 
Регистрация: 23.12.2010
Сообщений: 3
По умолчанию

Спасибо за помощь, попробую исправить...
aleks_m вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как скопировать текст с файла 1.txt и записать в 2.txt Kasper1 Общие вопросы по Java, Java SE, Kotlin 1 14.12.2010 05:56
запись с файла в массив darkmonk Общие вопросы C/C++ 2 29.11.2009 20:21
Запись массива в txt yura-cat Помощь студентам 5 20.10.2008 23:54
Запись из файла txt или mdb в базу данных DerSky БД в Delphi 6 09.06.2008 12:50