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

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

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

 
 Ответить  Открыть новую тему 
> Однонаправленные списки
}0pa
сообщение 29.10.2006 12:54
Сообщение #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 
 К началу страницы 
+ Ответить 
volvo
сообщение 29.10.2006 15:19
Сообщение #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. Измени вывод: у тебя СЛОВО ищется с строке, а не СТРОКА в слове...
 К началу страницы 
+ Ответить 
}0pa
сообщение 30.10.2006 0:59
Сообщение #3


Пионер
**

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

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


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


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


Гость






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

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

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


Пионер
**

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

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


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


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


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

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

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


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

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

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


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


Пионер
**

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

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


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

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


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


Пионер
**

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

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


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

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


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


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

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

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


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


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


Пионер
**

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

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


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


--------------------
Ну, а почему бы в свободное время не позаниматься программированием?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
}0pa
сообщение 3.11.2006 16:21
Сообщение #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 
 К началу страницы 
+ Ответить 
volvo
сообщение 4.11.2006 2:43
Сообщение #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
 К началу страницы 
+ Ответить 
}0pa
сообщение 5.11.2006 0:25
Сообщение #13


Пионер
**

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

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


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

if not bad then begin

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


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

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

 



- Текстовая версия 21.05.2024 4:01
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"