Необходимо реализовать на c++ dynamic 12. (dynamic 11 для дополнения к 12)
dynamic11◦. дан указатель p1 на вершину стека (если стек пуст, то p1 = nil).
также дано число n (> 0) и набор из n чисел. описать тип tstack —
запись с одним полем top типа pnode (поле указывает на вершину стека)
— и процедуру push(s, d), которая добавляет в стек s новый элемент
со значением d (s — входной и выходной параметр типа tstack, d —
входной параметр целого типа). с процедуры push добавить
в исходный стек данный набор чисел (последнее число будет вершиной
стека) и вывести адрес новой вершины стека.
dynamic12. дан указатель p1 на вершину стека, содержащего не менее пяти
элементов. используя тип tstack (см. dynamic11), описать функцию pop(s) целого типа, которая извлекает из стека s первый (верхний)
элемент, возвращает его значение и освобождает память, которую занимал
извлеченный элемент (s — входной и выходной параметр типа tstack). с
функции pop извлечь из исходного стека пять элементов и вывести их значения. вывести также указатель на новую вершину стека (если
результирующий стек окажется пустым, то этот указатель должен быть
равен nil).
begin
var a:=ReadLines('m17.txt').JoinIntoString.ToIntegers;
a.Println;
var b:=a.Select((x,i)->Rec(x,i)).Where(x->x.Item1<0)
.Select(x->x.Item2).ToArray;
if b.Count<>2 then
Writeln('Количество отрицательных элементов не равно двум')
else begin
a:=SeqFill(b[0],0).Concat(a.Skip(b[0]).Take(b[1]-b[0]+1))
.Concat(SeqFill(a.Length-b[1]-1,0)).ToArray;
a.Println
end
end.
Тестовое решение:
23 14 7 15 0 13 -6 41 18 13 8 42 27 -11 3 19 10
0 0 0 0 0 0 -6 41 18 13 8 42 27 -11 0 0 0
Файл с исходными данными имеет имя m17.txt. Тестовый файл находится во вложении. Разбивка на строки сделана по 5 значений, но может быть совершенно произвольной. Также нет привязки именно к 17 числам, главное - чтобы отрицательных чисел было ровно два, иначе будет выдано сообщение о их неверном количестве.
2+4+6+...+198+200.
1. Самый короткий вариант
// PascalABC.NET 3.1, сборка 1219 от 16.04.2016
begin
Writeln(Range(2,200,2).Sum)
end.
Результат:
10100
2. Более длинный и более "школьный" вариант
// PascalABC.NET 3.1, сборка 1219 от 16.04.2016
begin
var s:=0;
var i:=2;
while i<=200 do begin
s:=s+i;
i:=i+2
end;
Writeln(s)
end.
3. Совсем "тупой школьный" вариант (решение "в лоб")
// PascalABC.NET 3.1, сборка 1219 от 16.04.2016
var
i,s:integer;
begin
s:=0;
for i:=1 to 200 do
if i mod 2 =0 then s:=s+i;
Writeln(s)
end.
4. Улучшенный "школьный" вариант
// PascalABC.NET 3.1, сборка 1219 от 16.04.2016
var
i,s:integer;
begin
s:=0;
for i:=1 to 100 do s:=s+2*i;
Writeln(s)
end.