IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Однонаправленные списки
сообщение
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 75
Пол: Мужской

Репутация: -  0  +


Помогите, пожалуйста, исправить функцию
Код
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;

for i:= 1 to length(stroka) do write(M[i]);

  writeln;
  vvod(slovo);
  print(slovo);
  writeln(stroka,' BCTPE4AETCYA B C/\OBE ',poisk(slovo,M),' PA3');
  readkey;
  end.


--------------------
Ну, а почему бы в свободное время не позаниматься программированием?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 12)
сообщение
Сообщение #2


Гость






Проблема, кстати, не только с функцией поиска, но и с заполнением слова (а именно - работа со списком... Почему у тебя символы в слове хранятся в обратной последовательности?)

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. Измени вывод: у тебя СЛОВО ищется с строке, а не СТРОКА в слове...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Пионер
**

Группа: Пользователи
Сообщений: 75
Пол: Мужской

Репутация: -  0  +


У меня твой вариант фукнции Поиск не работает, к сожалению. Что-то никак не могу разобрать твою функцию. Может в кратце объяснишь? Пожалуйста


--------------------
Ну, а почему бы в свободное время не позаниматься программированием?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Цитата
У меня твой вариант фукнции Поиск не работает, к сожалению.
Я тысячу раз сказал: "У меня не работает" к рассмотрению НЕ принимается... На каких входных данных не работает?

Смотри:
Прикрепленное изображение

Что именно не работает здесь?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Пионер
**

Группа: Пользователи
Сообщений: 75
Пол: Мужской

Репутация: -  0  +


Я не знаю, кто это недопонял, но я знаю точно, что искать нужно в слове, оканчивающимся точкой. А то ЧТО искать, вводим с клавиатуры изначально, можно и потом. А вариант твой выше конечно правильный,но...


--------------------
Ну, а почему бы в свободное время не позаниматься программированием?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(}0pa @ 31.10.2006 2:43) *

А вариант твой выше конечно правильный,но...

.. но - что? blink.gif
Похоже, автор уснул на полуслове. Да и то - поздно уже.. спи, автор.
To be continued...


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Пионер
**

Группа: Пользователи
Сообщений: 75
Пол: Мужской

Репутация: -  0  +


Использовав, однонаправленные списки, подсчитать кол-во вхождений в слово, заканчивающимся точкой, подстроки, вводимой с клавиатуры///Т.е. слово, в котором нужно найти как раз и состоит из букв-звеньев списка. Если не трудно, помогите

Сообщение отредактировано: }0pa -


--------------------
Ну, а почему бы в свободное время не позаниматься программированием?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Пионер
**

Группа: Пользователи
Сообщений: 75
Пол: Мужской

Репутация: -  0  +


Пожалуйста, завтра уже сдавать. mega_chok.gifТ.е. в слове, заканч. точкой, найти подслово и подсчитать кол-во

Сообщение отредактировано: }0pa -


--------------------
Ну, а почему бы в свободное время не позаниматься программированием?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


просто человек
******

Группа: Пользователи
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


тебе же дали готовые функции...


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Пионер
**

Группа: Пользователи
Сообщений: 75
Пол: Мужской

Репутация: -  0  +


Да, я же говорю, что это фукнция, написанная вольво, не на нужно мне условие no1.gif


--------------------
Ну, а почему бы в свободное время не позаниматься программированием?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Пионер
**

Группа: Пользователи
Сообщений: 75
Пол: Мужской

Репутация: -  0  +


Вот я исправил функцию. Алгоритм вроде верный, но результат неверный. Помогите немного исправить ее. wacko.gif
Код

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;



--------------------
Ну, а почему бы в свободное время не позаниматься программированием?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Гость






Неужели было настолько сложно просто зеркально поменять ту функцию, которую я тебе предложил?

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 остается в силе...

Вот результат прогона программы:
Прикрепленное изображение

Это тебе нужно, или опять что-то не так? dry.gif
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Пионер
**

Группа: Пользователи
Сообщений: 75
Пол: Мужской

Репутация: -  0  +


Благодарствую...С меня два плюсика (конечно,когда будет возможность их ставить). Все работает...
Последний вопрос:
Код

if not bad then begin

В этом случае bad есть true?


--------------------
Ну, а почему бы в свободное время не позаниматься программированием?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 19.04.2024 4:04
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name