Форум «Всё о Паскале» _ Задачи _ Однонаправленные списки
Автор: }0pa 29.10.2006 16:54
Помогите, пожалуйста, исправить функцию
Код
Poisk
... Задача. Использовав, однонаправленные списки, подсчитать кол-во вхождений в слово, заканчивающимся точкой, подстроки, вводимой с клавиатуры...Фукнция поиска таких слов работает лишь для длины подстроки = 1
Код
uses crt; const n=20; Type point = ^MyWord; MyWord = record ch: char; next: point end; Type massiv = array[1..n] of char; var slovo:point; c:char; M:massiv; stroka: string[100]; i:integer; {---------------------------------------------------------------------------} Procedure VvodEl; var i:integer; begin for i:=1 to length(stroka) do begin M[i]:=stroka[i]; end; end; {---------------------------------------------------------------------------} procedure Print (first: point); Var r: point; begin R:= first; write('CLOBO = '); While r<>nil do begin Write (r^.ch); R:=r^.Next; end; writeln; end; {---------------------------------------------------------------------------} procedure Vvod(first:point); var r:point; begin first:= nil; writeln('HABEPITE C/\OBO C "." HA KOHCE '); while r^.ch<>'.' do begin new(r); r^.Next:=slovo; read(r^.ch); slovo:=r; end; end; {---------------------------------------------------------------------------}
function Poisk(first:point;C:massiv):integer; var r:point; k,j,z:integer; begin k:=0; r:=first; j:=1; while (r<>nil) do begin if (r^.ch=c[j]) then begin if j=length(stroka) then begin k:=k+1; j:=1; r:=r^.next end else begin r:=r^.next; j:=j+1; if j>length(stroka) then j:=1; end end else begin r:=r^.next; j:=1; end; end; poisk:=k; end;
begin clrscr; write('BBEDuTE TEKCT: '); readln(stroka); VvodEl;
Проблема, кстати, не только с функцией поиска, но и с заполнением слова (а именно - работа со списком... Почему у тебя символы в слове хранятся в обратной последовательности?)
procedure Vvod(var first:point); var r, last:point; begin first:= nil; last := nil;
writeln('HABEPITE C/\OBO C "." HA KOHCE '); while r^.ch <> '.' do begin new( r ); r^.next := nil; read(r^.ch);
if first = nil then first := r else last^.next := r;
last := r; end; end;
и
function Poisk(first:point;C:massiv):integer; var r:point; k,j,z:integer;
bad: boolean; begin k := 0; i := 1; repeat r := first; while (i <= length(stroka)) and (C[i] <> r^.ch) do inc(i); if i <= length(stroka) then begin j := i; bad := false; while (r^.ch <> '.') and (not bad) do begin bad := (r^.ch) <> C[j]; r := r^.next; inc(j); end;
if bad then inc(i) else begin inc(k); // counter i := j; end;
end; until i > length(stroka); poisk:=k; end;
Так лучше работает?
P.S. Измени вывод: у тебя СЛОВО ищется с строке, а не СТРОКА в слове...
Автор: }0pa 30.10.2006 4:59
У меня твой вариант фукнции Поиск не работает, к сожалению. Что-то никак не могу разобрать твою функцию. Может в кратце объяснишь? Пожалуйста
Автор: volvo 30.10.2006 12:56
Цитата
У меня твой вариант фукнции Поиск не работает, к сожалению.
Я тысячу раз сказал: "У меня не работает" к рассмотрению НЕ принимается... На каких входных данных не работает?
Смотри:
Что именно не работает здесь?
Автор: }0pa 31.10.2006 5:43
Я не знаю, кто это недопонял, но я знаю точно, что искать нужно в слове, оканчивающимся точкой. А то ЧТО искать, вводим с клавиатуры изначально, можно и потом. А вариант твой выше конечно правильный,но...
Автор: lapp 31.10.2006 8:56
Цитата(}0pa @ 31.10.2006 2:43)
А вариант твой выше конечно правильный,но...
.. но - что? Похоже, автор уснул на полуслове. Да и то - поздно уже.. спи, автор. To be continued...
Автор: }0pa 2.11.2006 5:59
Использовав, однонаправленные списки, подсчитать кол-во вхождений в слово, заканчивающимся точкой, подстроки, вводимой с клавиатуры///Т.е. слово, в котором нужно найти как раз и состоит из букв-звеньев списка. Если не трудно, помогите
Автор: }0pa 2.11.2006 21:25
Пожалуйста, завтра уже сдавать. Т.е. в слове, заканч. точкой, найти подслово и подсчитать кол-во
Автор: мисс_граффити 2.11.2006 22:52
тебе же дали готовые функции...
Автор: }0pa 3.11.2006 2:14
Да, я же говорю, что это фукнция, написанная вольво, не на нужно мне условие
Автор: }0pa 3.11.2006 20:21
Вот я исправил функцию. Алгоритм вроде верный, но результат неверный. Помогите немного исправить ее.
Код
function Poisk(first:point;C:massiv):integer; var r:point; k,j,z:integer;
bad: boolean; begin k := 0; i := 1; repeat r := first; while (r<>nil) and (C[i] <> r^.ch) do r:=r^.next; if r<>nil then begin j := i; bad := false; while (r^.ch <> '.') and (not bad) do begin
bad := (r^.ch) <> C[j]; r := r^.next; inc(j); end;
if bad then r:=r^.next; else begin inc(k); i := j; end;
end; until r<>nil; poisk:=k; end;
Автор: volvo 4.11.2006 6:43
Неужели было настолько сложно просто зеркально поменять ту функцию, которую я тебе предложил?
function Poisk(first:point;C:massiv):integer; var p, r:point; k,j,z:integer;
bad: boolean; begin k := 0; i := 1;
r := first; repeat
while (r <> nil) and (C[1] <> r^.ch) do r := r^.next; if r <> nil then begin
j := 1; p := r; bad := false; while (p^.ch <> '.') and (not bad) do begin
bad := (p^.ch) <> C[j];
if not bad then begin p := p^.next; inc(j); end; end;
if C[j] <> #0 then r := r^.next else begin inc(k); r := p; end;
end;
until r = nil; poisk:=k; end;
Моя функция Vvod из поста №2 остается в силе...
Вот результат прогона программы:
Это тебе нужно, или опять что-то не так?
Автор: }0pa 5.11.2006 4:25
Благодарствую...С меня два плюсика (конечно,когда будет возможность их ставить). Все работает... Последний вопрос: