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

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

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

 
 Ответить  Открыть новую тему 
> Однонаправленные списки.
NTL
сообщение 10.04.2007 0:58
Сообщение #1


Фанат Delphi
**

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

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


Задача. В слове, состоящем из букв и цифр и заканчивающемся точкой, продублировать каждый нецифровой символ.
Помогите с процедурой Finish, хотя ошибка вознкает в Insert_before.
Код

uses crt;
Type
    point = ^MyWord;
    MyWord = record
           ch: char;
         next: point
  end;
var
   digits: set of ord('0')..ord('9');
   slovo:point;
   c:char;
   i:integer;
{---------------------------------------------------------------------------}
procedure Print (first: point);
Var r: point;
begin
    R:= first;
    While r<>nil do
       begin
           Write (r^.ch);
           R:=r^.Next
       end;
  writeln
end;
{---------------------------------------------------------------------------}
procedure Vvod(var first:point);
var r, last:point;
begin
    first:= nil; last := nil;

    writeln('HA6EPuTE 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;
{----------------------------------------------------------------------------}
Procedure insert_before (Var q: point; x: char);
Var r: point;
Begin
  New(r);
  r^.Next:=q^.Next;
  q^.Next:=r;
  r^.ch:=q^.ch;
  q^.ch:=x
end;
{----------------------------------------------------------------------------}
Procedure Finish(first:point);
var r,temp:point;

begin
    r := first;
    repeat
        case r^.ch of
           'a'..'z', 'A'..'Z':insert_before(r,r^.ch);
        else   r:=r^.next;
        end;
    until r = nil
end;

begin
    clrscr;
    vvod(slovo);
    writeln('Start word:');
    print(slovo);
    Finish(slovo);
    writeln('Finish word:');
    print(slovo);
    readkey
end.


--------------------
ICQ (384-043-857)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 10.04.2007 1:03
Сообщение #2


Гость






Цитата
хотя ошибка вознкает в Insert_before
Ты так думаешь? Ошибка у тебя возникает еще при вводе слова, ПЕРЕД вводом первого символа, потому что вот тут:
procedure Vvod(var first:point);
var r, last:point;
begin
first:= nil; last := nil;

writeln('HA6EPuTE C/\OBO C "." HA KOHCE ');
while r^.ch <> '.' do { <--- Именно в этом месте !!! }
...

вероятнее всего произойдет переход по nil-овому указателю...
 К началу страницы 
+ Ответить 
NTL
сообщение 10.04.2007 14:14
Сообщение #3


Фанат Delphi
**

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

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


Вроде испрвил, но все равно выдает ошибку:"Heap overflow error" и курсор переходит на строчку
Код

Procedure insert_before (Var q: point; x: char);
Var r: point;
Begin
  New(r);{здесь ошибка Heap overflow error}
-----------------------

Код

procedure Vvod(var first:point);{исправленный вариант ввода}
var r, last:point;
begin
    first:= nil; last := nil;

    writeln('HABEPuTE C/\OBO C "." HA KOHCE ');
  repeat
      new( r );
      r^.next := nil;
      read(r^.ch);

      if first = nil then first := r
      else last^.next := r;

      last := r;
  until r^.ch = '.';

end;


Сообщение отредактировано: NTL - 10.04.2007 14:26


--------------------
ICQ (384-043-857)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
NTL
сообщение 10.04.2007 14:58
Сообщение #4


Фанат Delphi
**

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

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


Что-то мне подсказывает, что у меня неправильный вызов процедуры Insert_before !help.gif


--------------------
ICQ (384-043-857)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
NTL
сообщение 10.04.2007 16:02
Сообщение #5


Фанат Delphi
**

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

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


Сам решил проблему smile.gif
Код
Procedure Finish(first:point);
var r,temp:point;
begin
     r := first;
     repeat
         temp:=r;
         case r^.ch of
               'a'..'z','A'..'Z': begin insert(r,r^.ch); r:=r^.next^.next end;
        else  
                r:=r^.next;
        end;
    until r = nil;
end;


--------------------
ICQ (384-043-857)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 



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