Страница 1 из 1

Delphi консоль

Добавлено: 19 апр 2009, 10:13
котя
Нашела на вашем сайте програумму в точности как у меня. Задание было такое :
1. Создайте консольное приложение...В строке а удалить все подстроки не совпоадающие со строкой b, после чего вывести строку а или сообщение об отсутвствии совпадений..
Нашла вот эту программу:
[syntax=pascal]
program Project2;
{$APPTYPE CONSOLE}
uses SysUtils;

var
a,b:string;
p,l:integer;
begin
write('input A:'); readln(a);
write('input B:'); readln(b);
p:=pos(b,a);
if p=0 then
begin
writeln('No matches found!');
end
else
begin
l :=length(a);
repeat
delete(b,p,l);
p:=pos(b,a);
until p=0;
writeln('A=',a);
end;
writeln('Press ENTER');
readln;
end.
[/syntax]
Преподаватель сказал:"Для строки abc и подстроки ab получается результат abc, хотя должен быть ab." Не понимаю что он хочет?! :confused: Помогите, пожалйста, кто поймет!!! Заранее большое спасибо!!!!!

Re: Delphi консоль

Добавлено: 19 апр 2009, 19:29
demon416
Найденная вами программа программа к сожалению является бредом.
особенно это заметно если сделать коментарии
котя писал(а):

Код: Выделить всё

program Project2;
{$APPTYPE CONSOLE}
uses SysUtils;

var
  a,b:string;
  p,l:integer;
begin
  write('input A:'); readln(a); //Считываем строку
  write('input B:'); readln(b); // Считываем подстроку
  p:=pos(b,a);                    //Записываем в p позицию первого символа вхождения 
                                       // b в a 
  if p=0 then begin              // если вхождений нет 
    writeln('No matches found!');//выводим соответствующее сообщение
  end else begin                 //если вхождение есть
    l:=length(a);                 //записываем в l длинну строки a
    repeat                         //В цикле пока есть вхождения b в a 
      delete(b,p,l);              //удаляем из строки b !!!!! с позиции вхождения b в a количество символов равное длинне строки a 
      p:=pos(b,a);              // снова ищем вхождения b в a 
    until p=0;
    writeln('A=',a);
  end;
  writeln('Press ENTER');
  readln;
end.
Правильно было бы примерно так

Код: Выделить всё

program Project2;
{$APPTYPE CONSOLE}
uses SysUtils;

var
  a,b,s:string;
  p,l:integer;
begin
s:='';                                 //очищаем s 
write('input A:'); readln(a); //Считываем строку
write('input B:'); readln(b); // Считываем подстроку
if pos(b,a)=0 then             // если вхождений нет
  writeln('No matches found!')//выводим соответствующее сообщение
else                               //если же вхождения есть
begin                               //для первого вхождения
  delete(a,1,pos(b,a));           //удаляем из строки a весь текст до первой буквы вхождения b  включительно
  s:=s+b;                             // добавляем к строке s подстроку b
  while pos(b,a)>0  do              //пока есть вхождения
  begin
    if pos(b,a)<(length(b)) then// если вхождения перекрываются
      begin
      s:=s+copy(b,pos(b,a),length(b));// добавляем к  строке s неперекрывающуюся часть вхождения b в a
      delete(a,1,pos(b,a));           //удаляем из строки a весь текст до первой буквы вхождения b  включительно
      end                                  //если не перекрываются
    else
      begin
      s:=s+b;                             // добавляем к строке s подстроку b
      delete(a,1,pos(b,a));           //удаляем из строки a весь текст до первой буквы вхождения b  включительно
      end;
  end;
end;
s:='A='+s;
writeln(s);
writeln('Press ENTER');
  readln;
end.