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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.05.2018, 19:54   #1
Topse
Пользователь
 
Регистрация: 24.10.2017
Сообщений: 10
По умолчанию Списки. Поправить процедуру

Код:
Type
  rec=record
   FIO:string[30];
   Vozr:integer;
   adress:string[30];
  end;
Type
  position = ^celltype;                       
  celltype = record                              
  element: rec;                              
  next: position;                         
  end;
  LIST = ^celltype;
var
  L: LIST;                                       
  p: position;                              
  ylica:string;
  sred_vozr:real;
  name:string;
procedure Ins_SingleList(x: rec; var L: LIST; var p: position);
var  q: position;
begin
 New(q);   q^.element := x;
  if L = nil then begin
    q^.next := nil;
    L := q;
  end else begin  
    q^.next := p^.next;
    p^.next := q;
  end;
  p := q;
end;
 
//ЭТА ПРОЦЕДУРА УДАЛЕНИЯ ПРАВИЛЬНАЯ
procedure Del_SingleList(var L: LIST; var p: position);
var q:position;
begin
  if p <> nil then begin 
    if p = L then begin   
      L := L^.next;
      dispose(p);
      p := L;
    end else begin
        q := L;
        while q^.next <> p do
          q := q^.next;
      q^.next := p^.next;
        dispose(p);
        p := q;
    end;
  end;
end;    
 
procedure input(var l:list);
var f:text;
    el:rec;
begin
Assign(f,'file.txt');
Reset(f);
  while not eof(f) do
    begin
      readln(f, el.FIO);
      readln(f, el.Vozr);
      readln(f, el.adress);
      Ins_SingleList(el, l, p);      
    end;
Close(f);
end;
 
procedure output(l:list);
var q:position;
begin
  q:=l;
  writeln('                Ф.И.О             Возраст          Адрес');
  writeln;
  while q <> nil do
  begin
    with q^.element do 
    Writeln(FIO:30,Vozr:9,adress:25);
    q :=q^.next;
  end;
end;
 
 procedure scaningPRYAKOL(l:list; ylica:string; var sred_vozr:real);
var
  q: position; {вспомогательный указатель}   
  a:integer;
begin
  q:=L;
  a:=0;
  while q <> nil do begin  {пока не конец списка}
  if q^.element.adress = ylica then begin
  sred_vozr:= sred_vozr+q^.element.Vozr;
  a:=a+1;
  end;
    q := q^.next;
  end;
  if a<>0 then
  sred_vozr:=sred_vozr/a;  
end; 
 
//ТУТ ПРОБЛЕМА
procedure Scan_SingleList(L: LIST; var p: position; name: string);
var
  q: position;  
begin
  q := L;
  while q <> nil do begin 
  if (q^.element.FIO = name) then begin
        writeln(q^.element.Vozr:19,q^.element.Vozr:9,q^.element.adress:11);  
        p:=q;
        Del_SingleList(l,p);
        end;
    q := q^.next;
  end;
  end;
 
procedure vyvod(sred_vozr:real);
begin
if sred_vozr>0 then
begin
writeln;
writeln('Средний возраст по улице - ', sred_vozr);
end
else
writeln('Введена несуществующая улица');
end;    
begin
writeln('Исходная таблица');
input(l);
writeln('Введите элемент, после которого всё будет удалено(Вводить Ф.И.О.): ');
output(l);
readln(ylica);
// scaningPRYAKOL(l,ylica,sred_vozr);
// vyvod(sred_vozr);
// readln(name);
//Del
 
Scan_SingleList(l,p,name);
output(l);
dispose(l);
end.
Дело такое, мне нужно удалить всё, после указанного элемента, т.е. я ввожу Фамилию Имя Отчество, после этого должно быть всё удалено, а то что вверху, вывестись на экран, процедура "Del_SingleList" - она выполняет правильно свою работу, а вот Scan_SingleList что-то пошло не по плану..
Выручайте)file.txt
Topse вне форума Ответить с цитированием
Старый 31.05.2018, 09:25   #2
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,304
По умолчанию

Подозреваю, что дело в передаче параметров.
Тут:
Код:
procedure Scan_SingleList(L: LIST; var p: position; name: string);
Затем, в этой процедуре, следует вызов:
Код:
Del_SingleList(l,p);
Но в вызове процедуры удаления:
Код:
procedure Del_SingleList(var L: LIST; var p: position);
В тех случаях, когда в процедуру передаются структуры (массивы и списки), которые не должны быть разрушены в этой процедуре, лучше использовать тип параметра const. В этом случае передаётся адрес структуры, но изменить значения компонента структуры не получится: контролирует компилятор.
Вместе с тем, при внутреннем вызове новой процедуры, в неё может быть передан адрес структуры и в вызываемой процедуре могут выполняться изменения.
PS: Но я этого не проверял
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 31.05.2018, 19:37   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от Topse Посмотреть сообщение
т.е. я ввожу Фамилию Имя Отчество,
это где?

вот тут?

Цитата:
Сообщение от Topse Посмотреть сообщение
Код:
writeln('Введите элемент, после которого всё будет удалено(Вводить Ф.И.О.): ');
output(l);
readln(ylica);
В переменную ylica?
Ну, допустим.
А передаёте в процедуру SingleList что?

Цитата:
Сообщение от Topse Посмотреть сообщение
Код:
Scan_SingleList(l,p,name);
name?

я уже молчу про крайне неудачное название и вложенность процедур.
Почему процедура удаления вызывается из Scan_SingleList ? что вообще означает название процедуры? Отсканировать одиничный список?

Последний раз редактировалось Serge_Bliznykov; 31.05.2018 в 19:46.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 31.05.2018, 22:58   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

да, если что, после исправления, Ваш код работает.
Только учтите, что ваша процедура
Цитата:
Код:
procedure Del_SingleList(var L: LIST; var p: position);
удаляет не
Цитата:
Сообщение от Topse Посмотреть сообщение
после которого всё будет удалено
Она из списка L удаляет один элемент, на который показывает указатель p

если Вы посмотрите в код, где
Цитата:
Код:
  if (q^.element.FIO = name) then begin
        writeln(q^.element.Vozr:19,q^.element.Vozr:9,q^.element.adress:11);
        p:=q;
        Del_SingleList(l,p);
        end;
то поймете, что из списка будут удалены только те записи, у которых FIO совпадёт с переданным значением.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 01.06.2018, 09:48   #5
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,534
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
что вообще означает название процедуры? Отсканировать одиничный список?
Ну что поделать, если в источнике копипаста так оно называлось ?
"Вопрос: творчество Некрасова. Итак, Ф.М. Достоевский..."
Хорошо хоть нонешнее поколение юзверей научилось виртуозно использовать дуплет Ctrl/C Ctrl/V
digitalis вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как вынести процедуру сортировки в отдельную процедуру Гоша00 Общие вопросы Delphi 3 31.05.2018 14:35
Поправить программу - поправить процедуры и сделать из глобальных переменных - локальные Topse Паскаль, Turbo Pascal, PascalABC.NET 10 16.03.2018 09:30
Поправить функцию helper999999 Общие вопросы Delphi 1 31.08.2015 08:30
Написать процедуру, заменяющую стандартную процедуру Insert Andi5 Паскаль, Turbo Pascal, PascalABC.NET 2 24.11.2011 17:57