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

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

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

> нетипичная задача на списки, сложение и умножение чисел
сообщение
Сообщение #1


Гость






Условие: вводится последовательность натуральных чисел и создаётся из неё список. Длина последовательности n. Обеспечить с помощью списка вычисление сумм и произведений вида:

1) x1*xn + x2*xn-1 + ... + xn*x1

2)(x1+xn)*(x2+xn-1)* ... *(xn+x1)

собственно, идея у меня такая: создается еще один список(такой же, как первый), и в цикле перемножаются 1,2,3...(пока не дойдет до nil) X из первого списка на последний X из второго списка(каждый раз последний Х удаляется соответственно). все вспомогательные процедуры вроде работают, но вот сумму никак не могу посчитать! если кого-то заинтересует, подскажите, пожалуйста! заранее спасибо.
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 5)
сообщение
Сообщение #2


Гость






alex-it,
списки односвязные, или двухсвязные... И, если можно, покажи, как ты пытался делать, вместе с реализацией списков...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Гость






вроде в условии не оговаривается, так что по идее можно делать как угодно... я пытался делать с односвязными

Код
type
    pn=^mark;
  mark=record
   a:integer;
   next:pn;
   end;
  mas_i=array[1..100] of integer;

{Здесь создается простой массив из натуральных чисел}
procedure input(var n:integer; var mas:mas_i);
 var
  i:integer;
 begin
  Write('Input the size of massive: ');
   readln(n);
    for i:=1 to n do
     begin
      mas[i]:=Random(5)+1;
         end;
   write('Ishodnaya posledovatelnost: ');
   for i:=1 to n do write(mas[i], ' ');
   writeln('');
   end;

 {Здесь создается список}
 procedure add(var lp:pn; n:integer; mas:mas_i);
  var
   p:pn;
   i:integer;
   begin
    for i:=1 to n do
     if mas[i]<>0 then
       begin
         new(p);
           p^.a:=mas[i];
          p^.next:=lp;
        lp:=p;
        end;
       end;

 {Функция возвращает последний элемент списка}
 function getlast(p:pn):pn;
  begin
 if (p<>nil) then
  begin
 while (p^.next<>nil) do
  p:=p^.next;
 getlast:=p;
   end
   else
  getlast:=nil;
  end;

  {Функция возвращает предпоследний элемент списка}
 function getprelast(p:pn):pn;
  var
  p1:pn;
   begin
    if (p<>nil) then
     begin
    p1:=p;
     repeat
       p:=p1;
        if (p^.next<>nil) then
     p1:=p^.next;
    until (p1^.next=nil);
   getprelast:=p;
    end
     else
      getprelast:=nil;
  end;

 {В этой процедуре происходит удаление последнего элемента списка}
 procedure getdell(var p:pn);
  var
   p1:pn;
  begin
     if (p<>nil) then
    if (p^.next=nil) then
      begin
       p1:=p;
        p:=p^.next;
       dispose(p1);
      end
       else
       begin
     p1:=getprelast(p);
      dispose(p1^.next);
       p1^.next:=nil;
     end;
  end;

 {Здесь происходит вычисление суммы(1). Собственно, здесь и проблема. При таком варианте программа просто вылетает.}
 procedure summ(lp:pn; sum:integer);
   var ls,p:pn;
   begin
       new(ls);
       ls:=lp;
       sum:=0;
    while (lp<>nil) do
     begin
       p:=getlast(ls);
        sum:=sum+(lp^.a)*(p^.a);
          lp:=lp^.next;
            getdell(ls);
           end;
      writeln('Summa ravna ', sum);
   end;

 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Бывалый
***

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

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


alex-it, зачем здесь эта строка?
Код

ls:=lp;

Наверно ты хотел сделать так: ls^:=lp^;


--------------------
Доброго времени суток.
:nnn:
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Гость






alex-it,
Ну, а вот так первое задание реализуется с двухсвязными списками:
type
pn=^mark;
mark=record
data: integer;
prev, next:pn;
end;

mas_i=array[1..100] of integer;


procedure input(var n:integer; var mas:mas_i);
var
i:integer;
begin
write('Input the size of array: '); readln(n);
write('initial sequence: ');
for i:=1 to n do begin
mas[i]:=Random(5)+1;
write(mas[i]:4);
end;
writeln;
end;

procedure print_list(first: pn);
begin
while first <> nil do begin
write(first^.data:4);
first := first^.next
end;
writeln;
end;

procedure make_list(var mas: mas_i;
var first, last: pn);
var
i: integer;
p: pn;
begin
first := nil; last := nil;

i := 1;
while mas[i] <> 0 do begin

new(p);
p^.data := mas[i];
p^.next := nil;
p^.prev := last;

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

last := p;
inc(i);
end;
end;


function get_s(first, last: pn): integer;
var s: integer;
begin
s := 0;
while (first <> nil) and (last <> nil) do begin
s := s + first^.data * last^.data;

first := first^.next;
last := last^.prev;
end;
get_s := s;
end;

var
first, last: pn;
n: integer;
arr: mas_i;

begin
fillchar(arr, sizeof(arr), 0);
input(n, arr);
make_list(arr, first, last);

print_list(first);

writeln('sum = ', get_s(first, last));
end.

Выбирай, изобретать велосипед дальше, или решать саму задачу...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






спасибо за помощь! действительно, так гораздо проще.
 К началу страницы 
+ Ответить 

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

 





- Текстовая версия 7.09.2025 9:01
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name