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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.03.2011, 13:33   #1
biowoooooolf
 
Регистрация: 04.03.2011
Сообщений: 6
По умолчанию Поиск номера телефона в текстовом файле

Всем доброго времени суток
Помогите пожалуйста разобраться или хотя бы подскажите каких операторов нужно использовать?
Программа поиска номера телефона:
Код:
program Project3;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
	f:text;
  i:byte;
  m,x,k:integer;
	b,s,ss,s1:string;
  poisk:boolean;
begin
	assign (f,'D:\f.txt');
Reset  (f);
readln(k);
poisk:=false;
    b:='-' ;
    s1:=inttostr(k);
    while not eof(f) do
    Begin
     readln(f,s);
     m:=pos (b,s);
     x:=length(s);
     ss:=copy(s,m+1,x-m);
     if (pos(s1,s)>0) then
     begin writeln (s); poisk:=true end;
    End;
    if poisk=false then writeln ('Nomer ne naiden') ;
    Readln;
  Close (f);
End.
Нужно сделать так чтобы она искала по полному совпадению числа а не по одной совпавшее цифре (то есть например если вводишь 1 он находит все числа где есть 1 а нужно что бы искал по полному совпадению )
Если нужно, поиск проводиться в тексте созданном этой программой:
Код:
uses
SysUtils;

Var
F:text;
i:byte;
k:integer;
j:string;

begin
assign
(f,'D:\f.txt');
Rewrite (f);
For i:=1 to 3 do
Begin
Writeln ('neam');
Readln(j);
Writeln('# tel');
Readln (k);
writeln (f,j,'-',k);
End;
Close (f);
End.

На случай если там все совеем плохо вот текст задания (Записать в файл информацию о знакомых, имеющих телефоны. Определить, есть ли в файле сведения о знакомом, имеющем телефон NNNNN.)
Заранее спасибо.



________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!
Модератор.

Последний раз редактировалось Serge_Bliznykov; 04.03.2011 в 14:22.
biowoooooolf вне форума Ответить с цитированием
Старый 04.03.2011, 13:46   #2
Vanta11a
Lawful Evil
Участник клуба
 
Аватар для Vanta11a
 
Регистрация: 13.05.2008
Сообщений: 1,208
По умолчанию

Считываешь номер в строковую переменную.
Копируешь строку с позиции первого числа номера по последние и смотришь, совпадает ли она с веденной строкой.
Если совпадает - выводишь.
Алгоритм - бесплатен. Поиск багов - бесплатен. Реализация алгоритма - за отдельную плату.
На форуме помогают советами и объясняют, а не пишут на халяву программы, лабы, курсачи и т.д. (c)
Vanta11a вне форума Ответить с цитированием
Старый 04.03.2011, 13:58   #3
Летучий_СкилетиК
Форумчанин
 
Аватар для Летучий_СкилетиК
 
Регистрация: 04.02.2011
Сообщений: 260
По умолчанию

Код:
...
while not eof(f) do
Begin
     readln(f,s);
     for i:=1 to length(s) do
         if s [i] = '-' then break;

if (k = StrToInt(Copy(s,i+1,k))) then
begin writeln (s); poisk:=true end;
End;
...
Летучий_СкилетиК вне форума Ответить с цитированием
Старый 04.03.2011, 14:30   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

1) у Вас ошибка в коде. Почему Вы позицию ищете в строке S
когда только получили подстроку SS ?!

2) для полного совпадаения замените код
Код:
        ss:=copy(s,m+1,x-m);
  if (pos(s1,s)>0) then
     begin writeln (s); poisk:=true end;
на такой код:
Код:
     ss:=copy(s,m+1,x-m+1);
    if s1=ss then
     begin writeln (s); poisk:=true end;
3) я не знаю, удивлю ли Вас, но написанная у Вас программа не на языке Pascal, а на языке Delphi (это так переименован бывший ObjectPascal)...

4) в данном решении есть ещё косяки. Попробуй ввести телефончик для "Петрова-Водкина" или для "Бонч-Бруевича"
Serge_Bliznykov вне форума Ответить с цитированием
Старый 04.03.2011, 14:55   #5
biowoooooolf
 
Регистрация: 04.03.2011
Сообщений: 6
По умолчанию

Извиняюсь за не правильное оформление в следующий раз не повториться
Serge_Bliznykov спасибо за помощь!!! Не сочти за наглость если не трудно объясни пожалуйста что делают эти операторы
Код:
poisk:=false;
    b:='-' ;
    s1:=inttostr(k);
    while not eof(f) do
    Begin
     readln(f,s);
     m:=pos (b,s);
     x:=length(s);
      ss:=copy(s,m+1,x-m+1);
    if s1=ss then
biowoooooolf вне форума Ответить с цитированием
Старый 04.03.2011, 15:11   #6
Vanta11a
Lawful Evil
Участник клуба
 
Аватар для Vanta11a
 
Регистрация: 13.05.2008
Сообщений: 1,208
По умолчанию

Код:
poisk:=false; //сбрасывается переменная найденного номера, т.е. номер не найден
    b:='-' ; //устанавливается тип разделителя
    s1:=inttostr(k); //перевод s1 в строку
    while not eof(f) do //пока не конец файла
    Begin
     readln(f,s); //считать строку из файла
     m:=pos (b,s); //получить позицию разделителя
     x:=length(s); //получить длину строки
      ss:=copy(s,m+1,x-m+1); //скопировать строку с позиции разделителя до конца
    if s1=ss then //если строка и введенный номер совпали, то...
Алгоритм - бесплатен. Поиск багов - бесплатен. Реализация алгоритма - за отдельную плату.
На форуме помогают советами и объясняют, а не пишут на халяву программы, лабы, курсачи и т.д. (c)
Vanta11a вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск данных в текстовом файле (в самом файле! а не в Memo и не загружая всю инфу из файла в одну строку glagoff Помощь студентам 1 05.05.2010 13:00
Поиск в текстовом файле! Straiker Паскаль, Turbo Pascal, PascalABC.NET 2 18.01.2009 10:07
Поиск в текстовом файле KaimaS Общие вопросы C/C++ 0 12.11.2008 17:39