- •Тема 1. Арифметика действительных чисел. Вычисления по формулам Задача 11 в
- •Тема 2. Разветвления
- •Задача 27б
- •Тема 3. Простейшая целочисленная арифметика
- •Задача 14в
- •Тема 4. Простейшие циклы Задача 11
- •Тема 5. Простейшие графические построения Задача 15
- •Тема 6. Пошаговый ввод данных и вывод результатов
- •Тема 7. Сочетания цикла и разветвления
- •Тема 8. Обработка последовательностей символов
- •Тема 9. Вычисления с сохранением последовательности значений
- •Тема 10. Вложенные циклы
- •Тема 11. Вложенные циклы в матричных задачах
- •Тема 12. Использование процедур
- •Тема 13.Файлы
- •Тема 14. Списки
Тема 14. Списки
Задача 3 б
Задание:Даны натуральное число n, действительные числа x1, ..., x[n]. Вычислить:
б) (x1+x[n])(x2+x[n-1])...(x[n]+x1);
Для решения этой задачи полезен список, изображенный на рис.27.
Алгоритм:
Вводим новый тип данных – запись из трех полей : поля, где содержится число, указатель на предыдущий элемент, указатель на следующий элемент.
Вводим натуральное n – число элементов массива
В цикле создаем список, изображенный на рис 27
С помощью двух указателей передвигаемся по списку одновременно с его начала и с его конца, полученные значения подставляем в формулу б)
Выводим результат на экран
Уничтожаем полученный список
Реализация:
program t14_num3b;
type
Pel=^Tel;
Tel=record
x:real;
p1,p2:Pel; {указатели на предыдущий и следующий элементы соответственно}
end;
var
n:integer;
x:real;
beg_,end_:Pel;
{процедура добавления в список нового элемента}
procedure new_el(x:real);
var new_:Pel;
begin
new(new_);
new_^.x:=x;
new_^.p1:=end_;
new_^.p2:=nil;
end_^.p2:=new_;
end_:=new_;
end;
{процедура построения списка}
procedure build(n:integer);
var i:integer;
begin
new(beg_);
Write('x[1]=');
Readln(x);
beg_^.x:=x;
beg_^.p1:=nil;
beg_^.p2:=nil;
end_:=beg_;
for i:=2 to n do
begin
Write('x[',i,']=');
Readln(x);
new_el(x);
end;
end;
{функция расчета (x[1]+x[n])*(x[2]+x[n-1])*...*(x[n]+x[1])}
function raschet(n:integer):real;
var
i:integer;
s:real;
n1,n2:Pel;
begin
n1:=beg_;
n2:=end_;
s:=1;
for i:=1 to n do
begin
s:=s*(n1^.x+n2^.x);
n1:=n1^.p2; {}
n2:=n2^.p1;
end;
raschet:=s;
end;
{процедура удаления списка}
procedure Delete_sp(n:integer);
var
new_:Pel;
i:integer;
begin
While beg_<>end_ do
begin
new_:=beg_;
beg_:=new_^.p2;
dispose(new_);
new_:=nil;
end;
dispose(beg_);
beg_:=nil;
end_:=nil;
end;
{основная программа}
begin
Writeln('Введите натуральное n');
Readln(n);
Build(n);
Writeln('Ответ :',raschet(n):8:4);
Delete_sp(n);
Readln;
end.
Блок-схема:
Основная программа: Функция вычисления :
Протокол:
В процессе диалога вводим n=2
x[1]=1,x[2]=2, получаем список:
Печать «Ответ:»
Передаем управление функции raschet, при этом формальному параметру n передается значение 2
4.1 s:=1, n1:=beg_, n2:=end_
4.2 I=1
4.3 s=1*(1+2)=3
4.4 I=2
4.5 s=3*(2+1)=9
4.6 raschet:=s=9
Печать «9.0000»
Удаление списка