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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.05.2018, 17:56   #1
Mishka_M
Пользователь
 
Регистрация: 11.05.2018
Сообщений: 32
По умолчанию [РЕШЕНО][Pascal] поменять местами найденный максимальный элемент в очереди и первый элемент очереди

Добрый день . Заранее благодарен откликнувшимся.
В данной программе необходимо поменять местами найденный максимальный элемент в очереди и первый элемент очереди.
Код:
program Ochered2_2;
uses crt;
type
  Element = Integer; {Тип основных данных.}
  T_adres = ^TElem;  {Тип указателя на элемент очереди.}
  TElem = record     {Тип элемента очереди.}
    Data : Element;   {Основные данные.}
    P_Sled : T_adres; {Указатель на следующий элемент очереди.}
          end;
  {Тип, определяющий очередь.}
  Ochered = record
    P_perv, P_posl : T_adres; {Указатели на первый и на последний элементы очереди.}
           end;
 
{Начальная инициализация очереди.  Эту процедуру можно выполнять
только в отношении пустой очереди. Иначе будут утечки памяти.}
procedure Inicializacia(var z : ochered);
  begin
    z.P_perv := nil;
    z.P_posl := nil;
  end;
 
{Добавление элемента в конец очереди.}
procedure Dobavlenie (var z : ochered; const znach1 : Element);
var
  D_Elem : T_adres;
  begin
    New(D_Elem);           {Выделение памяти для элемента.}
    D_Elem^.Data := znach1; {Записываем основные данные.}
    D_Elem^.P_Sled := nil;  {Т. к., элемент добавляется в конец очереди,
    то указатель на следующий элемент = NIL.}
    if z.P_perv = nil then {Если очередь пуста, то новый элемент становится первым элементом очереди.}
    z.P_perv := D_Elem
  else                    {Если очередь непустая, то новый элемент прикрепляем к последнему элементу очереди.}
    z.P_posl^.P_Sled := D_Elem;
    z.P_posl := D_Elem; {Добавленный элемент становится последним элементом очереди.}
  end;
 
{Изъятие элемента из начала очереди}
function Ubrat(var z : ochered; var aData : Element) : Boolean;
  var
  U_Elem : T_adres;
  begin
  Result := False;
    U_Elem := z.P_perv;
    if U_Elem <> nil then
      begin
        aData := U_Elem^.Data;      {Читаем данные первого элемента очереди.}
        z.P_perv := U_Elem^.P_Sled; {Первым элементом очереди становится тот элемент, который раньше был вторым.}
      if z.P_perv = nil then    {Если очередь оказалась пустой, то инициализируем её.}
        Inicializacia(z);
      Dispose(U_Elem); {Освобождаем память, занятую для элемента.}
      Result := True;
      end;
  end;
 
{очистка очереди}
procedure ochistka(var z : ochered);
var
  Data : Element;
begin
  while Ubrat(z, Data) do;
end;
 
{Распечатка очереди в направлении: начало - конец.}
procedure Pechat(const z: ochered);
var
  P_Elem : T_adres;
begin
  P_Elem := z.P_perv;
  if P_Elem <> nil then
  repeat
    if P_Elem <> z.P_perv then {Если это не первый элемент очереди, то ставим перед ним запятую.}
      Write(', ');
    Write(P_Elem^.Data);    {Распечатка основных данных элемента.}
    P_Elem := P_Elem^.P_Sled; {Указатель на следующий элемент.}
  until P_Elem = nil
  else
    Write('Очередь пуста.');
  Writeln;
end;
 
{основная программа}
var
  max,FindMax:integer;
  tmp_max,k,l:t_adres;
  och1: ochered;
  Data, DFind, DNew : Element;
  i,M : Integer;
  S : String;
begin
  Write('Введите количество элементов очереди :    ');
  Read(M);
  Writeln;
  {Начальная инициализация очереди.}
  Inicializacia(och1);
 
 
  repeat
    {Добавление элементов в очередь.}
    Randomize;
    for i := 1 to M do
      Dobavlenie(och1, Random(100)-50); {Целые числа из диапазона -50..50.}
    Writeln('Составлена исходная очередь (начало - конец):');
    Pechat(och1);
    
    {находим максимальный элемент}
    tmp_max:=och1.P_perv;
    Max:=tmp_max^.Data;
    while tmp_max<>nil do
      begin
        if tmp_max^.data>Max then Max:=tmp_max^.data;
        tmp_max:=tmp_max^.P_Sled;
      end;
    FindMax:=Max;
    writeln;
    writeln ('максимальный элемент = ',findmax);
    writeln;
    
    {меняем местами максимальный элемент и первый элемент}
   { k:=och1.P_perv;
    l:=tmp_max;
    och1.P_perv:=l;
    tmp_max:=k;}

    {Ответ.}
    Writeln('Очередь после замены максимального на первый (начало - конец):');
    Pechat(och1);
 
    {Освобождение памяти, выделенной для элементов очередей.}
    ochistka(och1);
    Writeln('Память, выделенная для очередей, освобождена.');
 
    Writeln('Повторить - Enter, выход - любой символ + Enter.');
    readln;
    Readln(S);
  until S <> '';
end.
Решение:
http://www.programmersforum.ru/showp...69&postcount=2
с оговоркой http://www.programmersforum.ru/showp...89&postcount=4

Последний раз редактировалось Вадим Мошев; 16.05.2018 в 15:49.
Mishka_M вне форума Ответить с цитированием
Старый 15.05.2018, 18:11   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Mishka_M Посмотреть сообщение
В данной программе необходимо поменять местами найденный максимальный элемент в очереди и первый элемент очереди.
тут есть два варианта решения.
1) быстрый и не очень "честный" - не трогать ссылки, а поменять местами только информационную часть.
это будет как-то так:
Код:

    if och1.P_perv<>nil then begin
      {находим максимальный элемент}

      p_max:=och1.P_perv;
      k :=  och1.P_perv;
      while k<>nil do
        begin
          if p_max^.data>k^.data then p_max := k;
          k:=k^.P_Sled; {Указатель на следующий элемент.}
        end;
      writeln ('максимальный элемент = ', p_max^.data);
      writeln;

      {меняем местами информационную часть у максимального элемента и первого элемента}
      if p_max <> och1.P_perv then begin
        M := p_max^.data;
        p_max^.data := och1.P_perv^.data ;
        och1.P_perv^.data := M
      end;

      {Ответ.}
      Writeln('Очередь после замены максимального на первый (начало - конец):');
      Pechat(och1);      
      
   end
   else
     WriteLn('Очередь Пуста!');
2) поиск максимального производится точно так же.
но замена элементов осуществляется как положено - с корректировкой ссылок.
Это намного сложнее.
Но, разумеется, при желании и необходимости можно и это реализовать.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 15.05.2018, 18:43   #3
Mishka_M
Пользователь
 
Регистрация: 11.05.2018
Сообщений: 32
По умолчанию

Спасибо, вроде бы как замена работает отлично , подойдет и первый вариант ) , я и пытался просто поменять местами значения .
Эмм... только как то поиск максимального значения в очереди как то не совсем корректно работает ...
Изображения
Тип файла: jpg grgdrgd.jpg (105.1 Кб, 96 просмотров)
Mishka_M вне форума Ответить с цитированием
Старый 15.05.2018, 19:30   #4
Mishka_M
Пользователь
 
Регистрация: 11.05.2018
Сообщений: 32
По умолчанию

Поменял знак > в
Код:
if p_max^.data>k^.data then p_max := k;
и , как ни странно , все заработало )
почему так , только не могу понять ...
в любом случае , очень признателен за помощь , оперативность у вас просто невероятная )

Последний раз редактировалось Mishka_M; 15.05.2018 в 19:34.
Mishka_M вне форума Ответить с цитированием
Старый 16.05.2018, 00:06   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ну и правильно поменяли.

так
Цитата:
Сообщение от Mishka_M Посмотреть сообщение
f p_max^.data>k^.data then p_max := k;
это поиск МИНИМУМА.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[C++] Максимальный элемент поменять местами со вторым нулевым. Shved2298 Помощь студентам 9 16.05.2017 07:26
Поменять местами минимальный и максимальный элемент массива Лераа Паскаль, Turbo Pascal, PascalABC.NET 3 19.12.2012 00:32
двумерный массив целых чисел А размером N на M. найти максимальный элемент и поменять его местами с A[1,1]. Задача в Pascal flo90 Помощь студентам 4 19.05.2012 20:00
Паскаль! поменять местами максимальный и минимальный элемент матрицы. wrmarw Помощь студентам 4 08.05.2010 13:06
Максимальный элемент массива поменять местами с четвертым. Katie Помощь студентам 2 13.01.2010 05:59