Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Делфи _ сумма элементов списка

Автор: Mapина 28.06.2007 17:25

Необходима только правильная функция обработки( function obrab), остальное есть!

Вычислите сумму тех элементов списка, значения которых меньше значений всех элементов, непосредственно следующих за ним.

Код
program un_list;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  Windows;

type
  TElem = byte;
  TList = ^Zveno;
  Zveno = record
              inf :  Telem;
              next : TList;
          end;
var
  list: TList;

   procedure initList (var A : TList);
   begin
     A:=nil;
   end;

   procedure V_konev (var A : TList; el : TElem);
   var
     tmp : TList;
     p : TList;
   begin
     new(tmp);
     tmp^.inf:=el;
     tmp^.next:=nil;
     if A=nil then A:=tmp
     else
       begin
         p:=A;
         while p^.next<>nil do
           p:=p^.next;
         p^.next:=tmp;
       end;
   end;

   procedure Input(var A : TList);
   var
     tmp : TElem;
   begin
     write('Вводи элементы: ');
     initList(A);
     while not eoln do
     begin
       read(tmp);
       V_konev(A, tmp);
     end;
     readln;
   end;

   procedure clearList (var A : TList);
   var
     temp : TList;
   begin
     while A<>nil do
     begin
       temp:=A;
       A:=A^.next;
       dispose(temp);
     end;
   end;

   function obrab(A:Tlist) : integer;                      {неверная функция обработки}
   begin
     result := 0;
     if a <> nil then
       while a^.next <> nil do
       begin
         if a^.inf < a^.next^.inf then result := result + a^.inf;
         a := a^.next;
       end;
   end;

begin
  setConsoleCP(1251);
  setConsoleOutputCP(1251);
  Input(list);
  writeln('Сумма требуемых эл-ов : ',obrab(list));
  clearList(list);
  readln;
end.

Автор: volvo 28.06.2007 17:34

function obrab(A:Tlist) : integer;
var p: tlist;
begin
result := 0;
while a <> nil do begin

good := true;
p := a^.next;
while (p <> nil) and good do begin
if p^.inf <= a^.inf then good := false;
else p := p^.next;
end;

if good then result := result + a^.inf;
a := a^.next;
end;
end;

Набирал прямо здесь - могут быть глюки, но идея именно такая... Последний элемент списка будет суммироваться, если не нужно - надо ставить доп. условие...

Автор: Mapина 28.06.2007 17:40

function obrab(A:Tlist) : integer;
var p: tlist;
begin


надо кажется ещё в var
good: boolean;
да?

Автор: volvo 28.06.2007 18:06

Да, это тоже надо добавить... Я же говорю - не компилировал.

Автор: Mapина 28.06.2007 18:12

спасиб smile.gif

Автор: Mapина 28.06.2007 19:11

начала пробовать всякие варианты.....оказывается не верно,например, 2 3 4 1 5.....выводит результат 6(2+3+1), а должен 1, потому как после 2 и 3 есть 1, элемент, который меньше их!

program un_list;

{$APPTYPE CONSOLE}

uses
SysUtils,
Windows;

type
TElem = byte;
TList = ^Zveno;
Zveno = record
inf : Telem;
next : TList;
end;
var
list: TList;

procedure initList (var A : TList);
begin
A:=nil;
end;

procedure V_konev (var A : TList; el : TElem);
var
tmp : TList;
p : TList;
begin
new(tmp);
tmp^.inf:=el;
tmp^.next:=nil;
if A=nil then A:=tmp
else
begin
p:=A;
while p^.next<>nil do
p:=p^.next;
p^.next:=tmp;
end;
end;

procedure Input(var A : TList);
var
tmp : TElem;
begin
write('Вводи элементы: ');
initList(A);
while not eoln do
begin
read(tmp);
V_konev(A, tmp);
end;
readln;
end;

procedure clearList (var A : TList);
var
temp : TList;
begin
while A<>nil do
begin
temp:=A;
A:=A^.next;
dispose(temp);
end;
end;

function obrab(A:Tlist) : integer;
var p: tlist;
good: boolean;
begin
result := 0;
while a <> nil do
begin
good := true;
p := a^.next;
while (p <> nil) and good do
begin
if p^.inf <= a^.inf then good := false
else p := p^.next;
end;

if good then result := result + a^.inf;
a := a^.next;
end;
end;


begin
setConsoleCP(1251);
setConsoleOutputCP(1251);
Input(list);
writeln('Сумма: ',obrab(list));
clearList(list);
readln;
end.


Автор: volvo 28.06.2007 19:32

Mapина, давай договоримся, что ты будешь ЧИТАТЬ то, что тебе пишут! Я предупреждал, что:

Цитата
Последний элемент списка будет суммироваться, если не нужно - надо ставить доп. условие...


Сделай вот так:

  function obrab(A:Tlist) : integer;
var p: tlist;
good: boolean;
begin
result := 0;
while a <> nil do
begin
p := a^.next;
good := (p <> nil);
while (p <> nil) and good do
begin
if p^.inf <= a^.inf then good := false
else p := p^.next;
end;

if good then result := result + a^.inf;
a := a^.next;
end;
end;

- не будет считать последний элемент...

Автор: Mapина 28.06.2007 21:32

женщины глупые создания, особенно когда у них в руках техника, которую придумали мужчины! а я типичная женщина...

спасибо, очень тебе благодарна!

Автор: мисс_граффити 28.06.2007 22:40

Цитата
женщины глупые создания, особенно когда у них в руках техника, которую придумали мужчины!

бедная Ада Лавлейс...

Автор: how long does it take lasix to w 15.09.2021 16:32

Lupin Keflex

Автор: lasix for dog without prescripti 1.11.2021 6:03

Urolosin Y Propecia

Автор: how long does it take for gabape 5.12.2021 3:59

flomax cialis

Автор: azithromycin over the counter ca 19.12.2021 3:32

Rhinc Inc

Автор: nishaknapp 16.01.2023 6:24

Why not settling on games that is fun and at the same time your earning. Well it'll make suspense because the game is well but dude just try it and it gave me hope while pandemic is real rn. https://iwatchmarkets.com/21/5-positive-effects-of-playing-online-casino-games/