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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.02.2013, 19:48   #1
мацак
Пользователь
 
Регистрация: 24.01.2013
Сообщений: 20
По умолчанию midlet pascal программку довести до ума

сделал сырую викторину на мидлет паскаль. моя программка не может выдавать вопросы без повторов вопросов. я в тхт файле сделал пока 5 и файл должен заканчиваться на цифру и последняя строчка в тхт файле дб пустой
вот текст ресурсного data.txt файла:

okno|window
dver|door
stena|woll
kniga|book
voda|woter
1


вот сама программка:
Код:
program pr;//
var data: resource;//наш ресурс 
i,x,y,z,o,fName,fl,fm,fm2,r,q,v: integer; 
A: array[0..4] of string;
B,C,E: array[0..30] of string;
t,f,n,d,otv,w,g1,g2,g3,j,l,m: string;
cmd,cmd2: Command;
begin
i:=0;
data:= OpenResource('/data.txt');//открытие ресурса
if (resourceAvailable(data)) then // Если файл существует
begin 
repeat
t:=ReadLine(data);
x:=length(t);
if x>1 then
begin 
A[i]:=t;
i:=i+1;
end;
repaint;
until x<2;
CloseResource(data);
end;
repeat 
begin
y:=random(5);
n:=A[y];
z:=Pos(n,'|');
f:=Copy(n,0,z);
o:=length(n);
d:=Copy(n,z+1,o);
q:=length(d);
fl:=1;
for r:=0 to (q-1) do
begin 
C[r]:='*'; 
end;
repeat
showForm; 
cmd:=createCommand('enter',CM_OK,1) ;// Создаем
команду "ввод"
cmd2:=createCommand('exit',CM_STOP ,2);
addCommand(cmd);
addCommand(cmd2); 
fName:= formAddTextField(f,'',15,TF_ANY);
fl:=0;
for r:=0 to (q-1) do
begin
B[r]:=Copy(d,fl,fl+1);
fl:=fl+1;
end;
v:=random(q);
C[v]:=B[v]; 
l:=c[0]+c[1]+c[2]+c[3]+c[4]+c[5]+c[6]+c[7]+c[8]+c[9]+c[10]+c[11]+c[12]+c[13]+c[14]+c[15]+c[16]+c[17]+c[18]+c[19]+c[20]; 
fm:=formaddstring(l); 
while (getClickedCommand <> Cmd) do 
delay(100);//Ждем нажатия на кнопку enter 
otv:= formGetText(fName); // Помещаем в переменную otv значение, введенное в редактируемое
clearform;
until otv=d;
for r:=0 to (20) do
begin 
C[r]:=''; 
end;
clearform;
end; 
until otv='t'; 
Delay(5000);//задержка 
end.


__________________
Исходный код по правилам форума нужно форматировать тегами [CODE] [ /CODE]
(это кнопочка на панели форматирования с "решёточкой" - # )

Модератор

Последний раз редактировалось Serge_Bliznykov; 27.02.2013 в 22:44.
мацак вне форума Ответить с цитированием
Старый 27.02.2013, 19:53   #2
мацак
Пользователь
 
Регистрация: 24.01.2013
Сообщений: 20
По умолчанию

я не программист, программка мне очень нужна. помогите доделать, чтоб вопросы неповторяла. тхт файл с 1000 вопросами я сам сделаю
мацак вне форума Ответить с цитированием
Старый 27.02.2013, 20:15   #3
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,309
По умолчанию

Так понимаю, что повторы вызваны тем, что генератор случайных чисел повторно генерирует число для очередного вопроса.
Предлагаю, например,
1. ограничить размер массива, ограничив размер строки, если это возможно в таком Паскале (у меня его нет) :
Код:
A: array[0..4] of string[20];
2. Использовать 1-ю позицию строки, или к примеру 20-ю, как признак того, что строка вызывалась.
Например, если строка не вызывалась, то в этой позиции пробел, а иначе - Х.
После генерации номера очередного вопроса проверяем, вызывался ли вопрос ранее. Если да, то генерируем следующее число, а иначе - забиваем в позицию Х и обрабатываем строку ...

Как-то так ...
Как понял вопрос, так и ...
PS: Форматируй код. При вводе кода программы выдели его и нажми символ решотки (#) в верхней части окна ввода.
Как-то так, ...

Последний раз редактировалось ViktorR; 27.02.2013 в 20:19.
ViktorR вне форума Ответить с цитированием
Старый 27.02.2013, 21:28   #4
мацак
Пользователь
 
Регистрация: 24.01.2013
Сообщений: 20
По умолчанию

спасибо за ответ, реализовать твой вариант в мпаскале не смогу(не умею). как это уменьшить размер массива? я собираюсь в викторине использовать 1000 слов, те 1000 строчек и массив будет a[0...1000] как я уменьшу? текстовый файл из 6 строк я сделал для отладки программы, когда прогр заработает - сделаю тхт файл из 1000 строк. в обычном паскале генератор без повторов делают через case. в мидлете нет такой функции
мацак вне форума Ответить с цитированием
Старый 27.02.2013, 21:44   #5
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Не смотрел код (он меня малясь пугает ). Но всё-таки позволю себе влезть в тему. И так Вам надо задать пользователю 1000 вопросов пользователю без повторений так?

Хорошо.. Поехали..
Берем и читаем ВСЕ вопросы и заносим их в массив. Теперь перемешиваем массив..
тоесть Swap (a[k1], a[k2]). Где Swap - процедурка, меняющая числа. (Было 3, 2. Стало 2,3). А потом выводим вопросы.. Главное правильно найти k1/k2, чтобы бедному пользователю не пришлось догадываться что всё-таки означает пустой вопрос?
Poma][a вне форума Ответить с цитированием
Старый 27.02.2013, 21:46   #6
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Правильный метод получения последовательности неповторяющихся элементов:
1. Заполнить массив по порядку.
2. Один раз пройтись по массиву циклом, меняя очередной элемент со случайным.

Цитата:
Сообщение от 'Poma
Главное правильно найти k1/k2, чтобы бедному пользователю не пришлось догадываться что всё-таки означает пустой вопрос?
Правильно:
k1 - счетчик цикла,
k2 - случайное число в диапазоне размера массива.

Последний раз редактировалось Stilet; 28.02.2013 в 19:01.
s-andriano вне форума Ответить с цитированием
Старый 27.02.2013, 21:53   #7
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

s-andriano, ага

Интересно, а какова вероятность того что массив перемешанный таким образом останется прежним?
Poma][a вне форума Ответить с цитированием
Старый 27.02.2013, 21:55   #8
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

А вот и алгоритм перемешивания массива от меня

Кстати:
Стена - Wall
Вода: Water
Вадим Мошев вне форума Ответить с цитированием
Старый 27.02.2013, 21:56   #9
мацак
Пользователь
 
Регистрация: 24.01.2013
Сообщений: 20
По умолчанию

вы мне про обычный паскаль говорите или про мидлет паскаль? в нем тоже свап есть?
под неповторяющимися вопросами я имею ввиду - вопросы ниразу не должны повториться пока не закончатся все 1000 вопросов
мацак вне форума Ответить с цитированием
Старый 27.02.2013, 21:58   #10
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

Цитата:
Сообщение от мацак Посмотреть сообщение
вы мне про обычный паскаль говорите или про мидлет паскаль? в нем тоже свап есть?
под неповторяющимися вопросами я имею ввиду - вопросы ниразу не должны повториться пока не закончатся все 1000 вопросов
Вы к кому обращаетесь? Я говорю про обычный Паскаль, там своп не нужен, его самому можно написать.
Вадим Мошев вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Tasm, не могу довести до ума Andi3z Помощь студентам 1 26.06.2011 18:39
Довести до ума БД в delphi Харламов Юрий Помощь студентам 6 28.12.2010 02:34
Циклы. Не могу довести до ума man-utd- Помощь студентам 2 21.12.2010 20:05
Помогите довести до ума andresan Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 27.11.2009 07:46