Помощь - Поиск - Пользователи - Календарь
Полная версия: Как сделать выборку
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
conqu
Всем доброго времени суток,
Ситуация: есть текстовый файл, в нём записан каталог товаров в виде: строка (несколько слов) - название, на следующей строке - цена, ниже пустая строка и следующий товар в том же формате.
Нужно реализовать такую вещь: пользователь вводит слово, по нему осуществляется поиск и делается выборка тех товаров, в названии которых встречается искомое слово.
Вопрос: подскажите плз, как это сделать, у меня проблема с тем, что названия товаров состаят из 3-7 слов, везде по разному + не знаю, как организовать разделение товаров для скрипта, как вообще осуществляется перемещение указателя на следующую строчку, при чтении из файла. Иными словами: как сделать так, чтобы если в строке встречается заданное слово, скрипт её выводил + следующую, потом проскакивал пустую и делал поиск в следующей строке.
Заранее благодарен.
volvo
Читать всю строку полностью (неважно, сколько в ней слов, главное - чтоб было меньше 256 символов) через ReadLN(f, s), искать в ней подстроку через Pos, и проверять результат... Ну, а "проскочить" пустую строку - пустым ReadLN(f) ...
conqu
спасибо, приведи пожалуйста кусок кода..
для базы:
ААА ПП
22

ЕЕ ПП
55

Если не трудно, конечно..
volvo
В чем сложность?

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
Большое спасибо, проблема решена!
conqu
Вероятно я туплю жутко, но у меня не работает, Error 113: Error in statment , после else. Не понимаю, без else всё работает, а с ним не хочет, в чём может быть ошибка?

__
добавлено: если убрать ; после end перед else - работет, но выводит только одну запись, первую, где встретится нужное слово, а не все..
volvo
Там точка с запятой (перед Else) не нужна просто... Убери ее, и все заработает.
conqu
если убрать ; после end перед else - работет, но выводит только одну запись, первую, где встретится нужное слово, а не все..
volvo
Не может быть... Тогда показывай программу ПОЛНОСТЬЮ. Чего-то ты намудрил...
conqu

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

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
Заработало, нашёл ошибку. Спасибо за помощь, сорри за тупизм )
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.