Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.09.2012, 15:42   #1
Mcdimas93
Новичок
Джуниор
 
Регистрация: 18.09.2012
Сообщений: 5
Печаль Задача о левых поворотах Pascal, ошибка.

Возникла проблема с задачей о левых поворотах. Вроде бы уже почти все готово, но выскакивает ошибка "Попытка разыменовать нулевой указатель" в 82 строке, где bx присваивается значение.
Пробовал разобраться, сам не могу найти ошибку.
Задача, в принципе, решается так:
при общей начальной точке двух векторов их векторное произведение больше нуля, если второй вектор направлен влево от первого, и меньше нуля, если вправо.

Но меня интересует именно моя ошибка со списком. Если ее решить, то, я думаю, программа прекрасно будет работать.

Маршрут движения автомобиля задан в виде координат вершин ломаной.
Необходимо определить количество левых поворотов (смежные участки ломаной не лежат на одной прямой). Автомобиль начинает движение с любой точки (!!!Здесь уточнение от меня - автомобиль начинает движение из первой вершины ломаной, а вот ее координаты любые!!!).
Формат входных данных:
Первая строка входного файла input.txt сомстоит из одного числа, количества звеньев ломаной; в последующих строках - пары натуральных чисел, координаты вершин ломаной.

Код:
type
  itog = record
    x, y: integer;
  end;
  
  list = ^elem;
  elem = record
    info: itog;
    next: list;
  end;
  
  function vector(ax, ay, bx, by:integer):integer;
  begin
  vector:=ax*by-bx*ay;
  end;

var
  input, output: text;
  ax, ay, bx, by,z, m1, m, f, f1, k, j: integer;
  l, p, q: list;
  s, d: string;
  a: itog;

begin
  
  new(l);
  l^.info.x := 0;
  l^.info.y := 0;
  p := l;
  
  
  assign(input, 'input.txt');
  reset(input);
  assign(output, 'output.txt');
  
  read(input, s);
  
  while not seekeof(input) do
  begin
    
    readln(input, s);
    j := 1;
    s := s + ' ';
    while length(s) <> 0 do
      if s[j] = ' ' then
      begin
        d := copy(s, 1, j - 1);
        val(d, f, z);
        
        a.x := f;
        delete(s, 1, j);
        
        d := copy(s, 1, (pos(' ', s) - 1));
        val(d, f1, z);
        a.y := f1;
        delete(s, 1, pos(' ', s));
        
      end else j := j + 1;
    
    new(q);
    q^.info := a;
    p^.next := q;
    p := q;
    
  end;
  p^.next := nil;
  l := l^.next;
  close(input);
  
  k := 0;
  
  p := l;

  while p^.next <> nil do
  begin
  ax:=p^.next^.info.x-p^.info.x;
  ay:=p^.next^.info.y-p^.info.y;
  p:=p^.next;
  bx:=p^.next^.info.x-p^.info.x;  //ошибку выдает здесь
  by:=p^.next^.info.y-p^.info.y;
  if vector(ax, ay, bx, by)>0 then
  k:=k+1 else p:=p^.next;
  end;
  rewrite(output);
  write(output, k);
  close(output);
  write(k);
  
end.


___________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!
Модератор.
Вложения
Тип файла: txt input.txt (31 байт, 130 просмотров)
Тип файла: txt output.txt (1 байт, 126 просмотров)

Последний раз редактировалось Serge_Bliznykov; 18.09.2012 в 15:56.
Mcdimas93 вне форума Ответить с цитированием
Старый 18.09.2012, 16:07   #2
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Код:
p:=p^.next;
У Вас в этом месте может Nil организоваться независимо от условий цикла, так как эти условия отработают только в начале следующей итерации
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 18.09.2012, 16:10   #3
Mcdimas93
Новичок
Джуниор
 
Регистрация: 18.09.2012
Сообщений: 5
По умолчанию

Цитата:
Сообщение от Sciv Посмотреть сообщение
Код:
p:=p^.next;
У Вас в этом месте может Nil организоваться независимо от условий цикла, так как эти условия отработают только в начале следующей итерации
это я видел, да, сегодня одногруппник объяснял и показал в отладчике. но как решить эту проблему?
Mcdimas93 вне форума Ответить с цитированием
Старый 18.09.2012, 16:28   #4
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Код:
  p:=p^.next;
  if p<> nil then begin
  bx:=p^.next^.info.x-p^.info.x;  //ошибку выдает здесь
  by:=p^.next^.info.y-p^.info.y; 
end
else begin
  bx:=ax;by:=ay;
end;
Я полагаю, что в конечной точке равенство a и b некритично?
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 18.09.2012, 16:38   #5
Mcdimas93
Новичок
Джуниор
 
Регистрация: 18.09.2012
Сообщений: 5
По умолчанию

Цитата:
Сообщение от Sciv Посмотреть сообщение
Код:
  p:=p^.next;
  if p<> nil then begin
  bx:=p^.next^.info.x-p^.info.x;  //ошибку выдает здесь
  by:=p^.next^.info.y-p^.info.y; 
end
else begin
  bx:=ax;by:=ay;
end;
Я полагаю, что в конечной точке равенство a и b некритично?
Думаю, некритично. Попробовал исправить код

Код:
while p^.next <> nil do
  begin
  ax:=p^.next^.info.x-p^.info.x;
  ay:=p^.next^.info.y-p^.info.y;
  p:=p^.next;
  if p<> nil then
  begin
  bx:=p^.next^.info.x-p^.info.x;  //ошибка все тут же
  by:=p^.next^.info.y-p^.info.y;
end
else begin
  bx:=ax;
  by:=ay;
end;
  if vector(ax, ay, bx, by)>0 then
  k:=k+1 else p:=p^.next;
  end;
Но ошибку выдает все в том же месте. Видимо, делаю что-то не так...
Mcdimas93 вне форума Ответить с цитированием
Старый 18.09.2012, 16:46   #6
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

А если так?

Код:
if (p<>nil) and (p^.next<>nil) then
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 18.09.2012, 16:51   #7
Mcdimas93
Новичок
Джуниор
 
Регистрация: 18.09.2012
Сообщений: 5
По умолчанию

Цитата:
Сообщение от Sciv Посмотреть сообщение
А если так?

Код:
if (p<>nil) and (p^.next<>nil) then
Тогда выдает ту же ошибку, но уже в нулевой строке)

Плюс я думаю, что тут напутал с эндами, всегда была эта проблема у меня...

Код:
while p^.next <> nil do
  begin
  ax:=p^.next^.info.x-p^.info.x;
  ay:=p^.next^.info.y-p^.info.y;
  p:=p^.next;
  if (p<>nil) and (p^.next<>nil) then
  begin
  bx:=p^.next^.info.x-p^.info.x;  //îøèáêó âûäàåò çäåñü
  by:=p^.next^.info.y-p^.info.y;
end
else begin
  bx:=ax;
  by:=ay;
end;
  if vector(ax, ay, bx, by)>0 then
  k:=k+1 else p:=p^.next;
  end;
Mcdimas93 вне форума Ответить с цитированием
Старый 18.09.2012, 18:18   #8
Mcdimas93
Новичок
Джуниор
 
Регистрация: 18.09.2012
Сообщений: 5
По умолчанию

Все, спасибо, решил проблему. Можно закрывать)

Код:
while p<> nil do
  begin
  if p^.next<>nil then begin
  ax:=p^.next^.info.x-p^.info.x;
  ay:=p^.next^.info.y-p^.info.y;
  end;
  p:=p^.next;
  if (p<>nil) and (p^.next<>nil) then
  begin
  bx:=p^.next^.info.x-p^.info.x;  //îøèáêó âûäàåò çäåñü
  by:=p^.next^.info.y-p^.info.y;
end
else begin
  bx:=ax;
  by:=by;
end;

  if vector(ax, ay, bx, by)>0 then
  k:=k+1;

  end;
Mcdimas93 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
метод левых и правых прямоугольников(паскаль) марточка Помощь студентам 0 02.05.2012 20:30
Вычисление интеграла методом левых прямоугольников. Ce4kok Общие вопросы Delphi 3 24.05.2011 20:35
Интеграл методом левых прямоугольников murzic28 Помощь студентам 1 17.05.2010 10:17
Отнять N правых/левых знаков 0mega Microsoft Office Excel 3 30.04.2010 22:30