Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Как сделать выборку

Автор: conqu 11.12.2006 21:39

Всем доброго времени суток,
Ситуация: есть текстовый файл, в нём записан каталог товаров в виде: строка (несколько слов) - название, на следующей строке - цена, ниже пустая строка и следующий товар в том же формате.
Нужно реализовать такую вещь: пользователь вводит слово, по нему осуществляется поиск и делается выборка тех товаров, в названии которых встречается искомое слово.
Вопрос: подскажите плз, как это сделать, у меня проблема с тем, что названия товаров состаят из 3-7 слов, везде по разному + не знаю, как организовать разделение товаров для скрипта, как вообще осуществляется перемещение указателя на следующую строчку, при чтении из файла. Иными словами: как сделать так, чтобы если в строке встречается заданное слово, скрипт её выводил + следующую, потом проскакивал пустую и делал поиск в следующей строке.
Заранее благодарен.

Автор: volvo 11.12.2006 21:43

Читать всю строку полностью (неважно, сколько в ней слов, главное - чтоб было меньше 256 символов) через ReadLN(f, s), искать в ней подстроку через Pos, и проверять результат... Ну, а "проскочить" пустую строку - пустым ReadLN(f) ...

Автор: conqu 11.12.2006 22:39

спасибо, приведи пожалуйста кусок кода..
для базы:
ААА ПП
22

ЕЕ ПП
55

Если не трудно, конечно..

Автор: volvo 11.12.2006 23:08

В чем сложность?

Write('query = '); ReadLn(query);
while not eof(f) do begin
readln(f, s);
if pos(query, s) > 0 then begin
readln(f, price) { <--- если название совпало - читаем цену }
writeln('found: ', s, ' -> ', price); { <--- и выводим на печать ... }
end;
else readln(f); { <--- иначе - пропускаем строку с ценой }

readln(f); { <--- Пустую строку пропускаем в любом случае }
end;

Автор: conqu 11.12.2006 23:24

Большое спасибо, проблема решена!

Автор: conqu 12.12.2006 1:10

Вероятно я туплю жутко, но у меня не работает, Error 113: Error in statment , после else. Не понимаю, без else всё работает, а с ним не хочет, в чём может быть ошибка?

__
добавлено: если убрать ; после end перед else - работет, но выводит только одну запись, первую, где встретится нужное слово, а не все..

Автор: volvo 12.12.2006 1:12

Там точка с запятой (перед Else) не нужна просто... Убери ее, и все заработает.

Автор: conqu 12.12.2006 1:19

если убрать ; после end перед else - работет, но выводит только одну запись, первую, где встретится нужное слово, а не все..

Автор: volvo 12.12.2006 1:21

Не может быть... Тогда показывай программу ПОЛНОСТЬЮ. Чего-то ты намудрил...

Автор: conqu 12.12.2006 1:32


Programm test;

USES CRT;

var
f:text;
name,s,query,price: string[80];

BEGIN
assign(f,'n:\base.txt');
reset (f);

Write('query=');
Readln(query);

while not eof(f) do
begin

readln(f,s);
if pos(query,s) > 0 then
begin
readln(f,price);
writeln ('found:',s,'->',price);
end
else readln(f);

readln(f);
end;
end.


Автор: volvo 12.12.2006 1:35

Ты это здесь набирал? Тогда меня ЭТО не интересует, ты уже внес ошибки при наборе... Я в "глухие телефоны" не играю. Присоединяй аттачем ТВОЙ файл, который у тебя не работал, ибо то, что есть в предыдущем посте ДАЖЕ не скомпилируется!

Автор: conqu 12.12.2006 1:42

Нет, я оттуда брал, может случайно что-то менял, вот копия из бэкапа, работает, проверял.


Program TTP;

USES CRT;

var
f: text;
name,s,query,price: string[80];



BEGIN
assign(f,'n:\ttp.txt');
reset (f);

Write('query=');
Readln(query);

while not EoF(f) do
begin

readln(f,s);
if pos(query, s) > 0 then
begin
readln(f,price);
writeln ('found:',s,'->',price);
end
else readln(f);

readln(f);
end;

end.



База(кусок):
ttp.txt :
Macromedia Flash 8 работа с анимацией и графикой
470

Macromedia Flash 8 Action Script официальное руководство
709

PHP 5 самое полное руководство
402

Л.Н. Толстой Война и мир
660

Л.Н. Толстой Анна Каренина
760

М. Булгаков Собачье сердце
350

М. Булгаков Мастер и Маргарита
350

А.П. Чехов Собрание сочинений
350

М. Горький Собрание сочинений
350

А.Н. Толстой Собрание сочинений
350



Автор: conqu 12.12.2006 2:23

Заработало, нашёл ошибку. Спасибо за помощь, сорри за тупизм )