Стандартные задачи на циклы: различия между версиями

Материал из Вики проекта PascalABC.NET
Перейти к навигацииПерейти к поиску
Нет описания правки
 
(не показано 56 промежуточных версий 3 участников)
Строка 1: Строка 1:
__NOTOC__
== Простейшие алгоритмы ==
== Простейшие алгоритмы ==


'''№1. Сумма вводимых целых чисел'''
=== №1. Сумма вводимых целых чисел ===
<source lang="pascal">
<source lang="pascal">
begin
begin
   var x , n : integer;
   var n := ReadInteger('Введите число слагаемых:');  
  var s := 0;
 
  writeln('Введите число слагаемых');
   var s := 0.0;  
   readln(n);
   for var i:=1 to n do
   for var i:=1 to n do
   begin  
   begin  
     writeln('Введите слагаемое');
     var x := ReadReal($'Введите слагаемое №{i}:');  
    readln(x);
     s += x;
     s += x;
   end;
   end;
   writeln('Сумма слагаемых равна ',s);
 
   Println($'Сумма равна {s}');
end.
end.
</source>
</source>


[http://pascalabc.net/WDE/?shared=UnREAL/Algoritm_01_Kazik.pas Ссылка на алгоритм в среде WDE]
В алгоритме используются ''интерполированные'' строки вида $'Сумма равна {s}'.
Они начинаются с $. Выражение в фигурных скобках, расположенное в такой строке, заменяется на его значение.


 
=== №2. Произведение целых чисел ===
'''№2. Произведение целых чисел'''
<source lang="pascal">
<source lang="pascal">
begin
begin
   var x , n : integer;
   var n := ReadInteger('Введите число множителей: ');
  var p := 1;
 
  writeln('Введите число множителей');
   var p := 1.0;
   readln(n);
   for var i:=1 to n do
   for var i:=1 to n do
    begin
  begin
      writeln('Введите множитель');
    var x := ReadReal('Введите множитель: ');
      readln(x);
    p *= x;
      p *= x;
  end;
    end;
 
   writeln('Произведение равно ', p);
   Println($'Произведение равно {p}');
end.
end.
</source>
</source>


[http://pascalabc.net/WDE/?shared=UnREAL/Algoritm_02_Kazik.pas Ссылка на алгоритм в среде WDE]
=== №3. Двойной факториал n!!=n*(n-2)*(n-4)*...*2 (или 1) ===
 
 
'''№3. Двойной факториал n!!=n*(n-2)*(n-4)*...*2 (или 1)'''
<source lang="pascal">
<source lang="pascal">
begin
begin
  var x := ReadInteger('Введите x: ');
   var p := 1;
   var p := 1;
  var x , n : integer;
  writeln('Введите n');
  readln(x);
   while x>=2 do
   while x>=2 do
   begin
   begin
Строка 53: Строка 48:
     x -= 2;
     x -= 2;
   end;
   end;
   writeln('Двойной факториал равен ', p);
 
   Println($'Двойной факториал равен {p}');
end.
end.
</source>
</source>


[http://pascalabc.net/WDE/?shared=UnREAL/Algoritm_03_Kazik.pas Ссылка на алгоритм в среде WDE]
=== №4. Сколько нечетных среди n введенных ===
 
'''№4. Сколько нечетных среди n введенных'''
<source lang="pascal">
<source lang="pascal">
begin
begin
   var x , n : integer;
   var n := ReadInteger('Введите n: ');
 
   var c := 0;
   var c := 0;
  writeln('Введите n');
  readln(n);
   for var i:=1 to n do
   for var i:=1 to n do
   begin
   begin
     writeln('Введите целое число');
     var x := ReadInteger('Введите целое число: ');
    readln(x);
     if x mod 2 <> 0 then
     if x mod 2 <> 0 then
       c += 1;
       c += 1;
   end;
   end;
   writeln('Количество нечетных равно ', c);
 
   println($'Количество нечетных равно {c}');
end.
end.
</source>
</source>


[http://pascalabc.net/WDE/?shared=UnREAL/Algoritm_04_Kazik.pas Ссылка на алгоритм в среде WDE]
=== №5. Защита от неверного ввода ===
 
 
'''№5. Защита от неверного ввода'''
<source lang="pascal">
<source lang="pascal">
begin
begin
var x : real;
  var x: real;
repeat
  repeat
  write('Введите x>0 ');
    x := ReadReal('Введите x>0: ');
  read(x);
    if x<=0 then
  if x<=0 then
      Println('Неверный ввод');
    writeln('Неверный ввод');
   until x>0;
   until x>0;
end.
end.
</source>
</source>


[http://pascalabc.net/WDE/?shared=UnREAL/Algoritm_05_Kazik.pas Ссылка на алгоритм в среде WDE]
=== №6. Табулирование функции f(x) на отрезке в точках, разбивающих отрезок на N частей ===
 
Дан отрезок [a,b]
 
'''№6. Табулирование функции f(x) на [a,b] в точках, разбивающих [a,b] на N частей'''
<source lang="pascal">
<source lang="pascal">
function f(x : real): real;
function f(x: real) := sin(x)*x;
begin
//Введите любую функцию
  result := sin(x);
end;


begin
begin
   var N : integer;
   var N := ReadInteger('Введите N: ');
  var a , b : real;
  writeln('Введите N');
  readln(N);
  writeln('Введите a и b');
  read(a,b);
   Assert(N>0);
   Assert(N>0);
  var (a,b) := ReadReal2('Введите a и b: ');
   var h := (b-a)/N;
   var h := (b-a)/N;
   var x := a;
   var x := a;
   for var i:=0 to N do
   loop N+1 do
   begin
   begin
     writeln('Значение икса равно ',x);
     Writeln(x:5:2,f(x):10:4);
    writeln('Значение функции равно ', f(x):10:4);
     x += h;
     x += h;
   end;
   end;
Строка 123: Строка 102:
</source>
</source>


[http://pascalabc.net/WDE/?shared=UnREAL/Algoritm_06_Kazik.pas Ссылка на алгоритм в среде WDE]
=== №6a. Решение, использующее while. Погрешность округления и вычислительная погрешность ===
 
 
'''№6a. Решение, использующее while. Погрешность округления и вычислительная погрешность'''
<source lang="pascal">
<source lang="pascal">
function f(x : real): real;
function f(x: real): real:= sin(x)*x;
begin
//Введите любую функцию
  result := sin(x);
end;


begin
begin
   var N : integer;
   var N:=ReadInteger('Введите N: ');
  var a , b : real;
  writeln('Введите N');
  readln(N);
  writeln('Введите a и b');
  read(a,b);
   Assert(N>0);
   Assert(N>0);
  var (a,b):=ReadReal2('Введите a и b: ');
   var h := (b-a)/N;
   var h := (b-a)/N;
   var x := a;
   var x := a;
   while x <= b+h/2 do
   while x <= b+h/2 do
   begin
   begin
     writeln('Значение икса равно ',x:5:2,' Значение функции ', f(x):10:4);
     writeln(x:5:2,f(x):10:4);
     x += h;
     x += h;
   end;
   end;
end.
end.
</source>
</source>
[http://pascalabc.net/WDE/?shared=UnREAL/Algoritm_06a_Kazik.pas Ссылка на алгоритм в среде WDE]


== Рекуррентные соотношения ==
== Рекуррентные соотношения ==


'''№7. Вывод 10 первых степеней двойки'''
=== №7. Вывод 10 первых степеней двойки ===
<source lang="pascal">
<source lang="pascal">
begin
begin
Строка 169: Строка 135:
</source>
</source>


[http://pascalabc.net/WDE/?shared=UnREAL/Algoritm_07.pas Ссылка на алгоритм в среде WDE]
=== №8. Вывод всех двухзначных чисел, кратных 5 ===
 
 
'''№8. Вывод всех двухзначных чисел, кратных 5'''
<source lang="pascal">
<source lang="pascal">
begin
begin
Строка 184: Строка 147:
</source>
</source>


[http://pascalabc.net/WDE/?shared=UnREAL/Algoritm_08.pas Ссылка на алгоритм в среде WDE]
=== №9. Вывод n первых чисел Фибоначчи ===
 
 
'''№9. Вывод n первых чисел Фибоначчи'''
<source lang="pascal">
<source lang="pascal">
begin
begin
   write('Введите целое число n (n > 1): ');
   var n := ReadInteger('Введите целое число n (n > 1): ');
   var n : integer;
   Assert(n>1);
  readln(n);
   var (a,b) := (1,1);
   var a := 1;
   Print(a,b);
  var b := 1;
   loop n-2 do
   write(1, ' ', 1, ' ');
   for var i := 3 to n do
   begin
   begin
     var c := a + b;
     (a,b):=(b,a+b);
     write(c, ' ');
     Print(b);
    a := b;
    b := c;
   end;
   end;
end.
end.
</source>
</source>


[http://pascalabc.net/WDE/?shared=UnREAL/Algoritm_09.pas Ссылка на алгоритм в среде WDE]
В алгоритме используются кортежи. В момент переприсваивания в цикле создаются буферные переменные, что позволяет нам избежать их объявления вручную.
 


'''№10. Найти НОД(A,B), используя алгоритм Евклида:'''
=== №10. Найти НОД(A,B), используя алгоритм Евклида: ===


НОД(A,B) = НОД(B,A mod B);    НОД(A,0) = A
НОД(A,B) = НОД(B,A mod B);    НОД(A,0) = A
<source lang="pascal">
<source lang="pascal">
begin
begin
   write('Введите целые числа A и B: ');
   var (a,b):=ReadInteger2('Введите целые числа A и B: ');
   var A,B,C : integer;
   while b<>0 do
  readln(A,B);
    (A,B):=(B,A mod B);
  repeat
   println($'НОД(A,B) = {A}');
    C := A mod B;
    A := B;
    B := C;
   until C = 0;
  write('НОД(A,B) = ', A);
end.
end.
</source>
</source>


[http://pascalabc.net/WDE/?shared=UnREAL/Algoritm_10.pas Ссылка на алгоритм в среде WDE]
=== №11. Найти сумму цифр целого числа m ===
 
 
'''№11. Найти сумму цифр целого положительного числа m'''
<source lang="pascal">
<source lang="pascal">
begin
begin
   write('Введите целое положительное число m: ');
   var m := ReadInteger('Введите целое число m: ');
   var m : integer;
  readln(m);
   var (s,m1) := (0,abs(m));
  assert(m > 0);
   while m1 > 0 do
  var s := 0;
   while m > 0 do
   begin
   begin
     s += m mod 10;
     s += m1 mod 10;
     m := m div 10;
     m1 := m1 div 10;
   end;
   end;
   writeln('Сумма цифр числа m равна ', s);
   println($'Сумма цифр числа {m} равна {s}');
end.
end.
</source>
</source>


[http://pascalabc.net/WDE/?shared=UnREAL/Algoritm_11.pas Ссылка на алгоритм в среде WDE]
Для работы с отрицательными числами в алгоритме используется стандартная функция abs(x) возвращающая модуль от x.
 


== Максимумы и минимумы ==
== Максимумы и минимумы ==


'''№12. Найти max из введенных чисел'''
=== №12. Найти max из введенных чисел ===
<source lang="pascal">
<source lang="pascal">
begin
begin
   write('Введите целое число n (n>0): ');
   var n := ReadInteger('Введите целое число n (n>0): ');
  var n : integer;
  readln(n);
   assert(n>0);
   assert(n>0);
   write('Введите 1 число: ');
  var x : real;
   var x := ReadReal('Введите 1 число: ');
  readln(x);
   var max := x;
   var max := x;
   for var i := 2 to n do
   for var i := 2 to n do
   begin
   begin
     write('Введите ', i, ' число: ');
     x := ReadReal($'Введите {i} число: ');
    readln(x);
     if max < x then
     if max < x then
       max := x;
       max := x;
   end;
   end;
   writeln('Максимальное из введенных чисел: ', max);
   Println($'Максимальное из введенных чисел: {max}');
end.
end.
</source>
</source>


[http://pascalabc.net/WDE/?shared=UnREAL/Algoritm_12.pas Ссылка на алгоритм в среде WDE]
=== №12a. Найти min, удовлетворяющее условию p(x) ===
 
 
'''№12a. Найти min, удовлетворяющее условию p(x)'''
<source lang="pascal">
<source lang="pascal">
// Условие взятое как пример (Если число положительное, то условие p(x) возвращает true, иначе false)
// Условие взятое как пример (Если число положительное, то условие p(x) возвращает true, иначе false)
function p(x : real) : boolean;
function p(x: real): boolean:=x > 0;
begin
  if x > 0 then
    Result := true
  else
    Result := false;
end;
 
begin
begin
   write('Введите целое число n (n>0): ');
   var n := ReadInteger('Введите целое число n (n>0): ');
  var n : integer;
  readln(n);
   assert(n>0);
   assert(n>0);
   var min := real.MaxValue;
   var min := real.MaxValue;
   for var i := 1 to n do
   for var i := 1 to n do
   begin
   begin
     var x : real;
     var x := ReadReal($'Введите {i} число: ');
    write('Введите ', i, ' число: ');
    readln(x);
     if (x < min) and p(x) then
     if (x < min) and p(x) then
       min := x;
       min := x;
   end;
   end;
   if min = real.MaxValue then
   if min = real.MaxValue then
     writeln('Нет чисел удовлетворяющих условию (являющихся положительными)')
     println('Нет чисел, удовлетворяющих условию')
   else
   else println($'Минимальное из введенных чисел, удовлетворяющее условию: {min}');
    writeln('Минимальное из введенных чисел и удовлетворяющее условию (являющееся положительным): ', min);
end.
end.
</source>
</source>
[http://pascalabc.net/WDE/?shared=UnREAL/Algoritm_12a.pas Ссылка на алгоритм в среде WDE]


== Суммирование рядов (конечных и бесконечных) ==
== Суммирование рядов (конечных и бесконечных) ==


'''№13. Вычислить Σ(i=1..n) a^i/i! '''
=== №13. Вычислить Σ(i=1..n) a^i/i! ===
<source lang="pascal">
<source lang="pascal">
begin
begin
   write('Введите число a и n (n>0): ');
   var a:=ReadReal('Введите a: ');
   var a : real;
   var n:=ReadInteger('Введите n (n>0): ');
  var n : integer;
  readln(a,n);
   assert(n>0);
   assert(n>0);
   var x := a;
   var x := a;
Строка 328: Строка 253:
     s += x;
     s += x;
   end;
   end;
   writeln('Сумма ',chrunicode(931),'(i=1..n) a^i/i! равна ', s);
   Println($'Сумма = {s}');
end.
end.
</source>
</source>


[http://pascalabc.net/WDE/?shared=UnREAL/Algoritm_13.pas Ссылка на алгоритм в среде WDE]
=== №13a. Вычислить Σ(i=1..∞) (-1)^i * a^i/i! ===
 
 
'''№13a. Вычислить Σ(i=1..∞) (-1)^i * a^i/i! '''
<source lang="pascal">
<source lang="pascal">
begin
begin
   write('Введите число a (0 < a < 1): ');
   var a:=ReadReal('Введите a (0 < a < 1): ');
  var a : real;
  readln(a);
   assert((a>0) and (a<1));
   assert((a>0) and (a<1));
   var eps := 0.0001;
   var eps := 0.0001;
   var i := 1;
   var i := 1;
Строка 351: Строка 272:
     y *= -a;
     y *= -a;
   until abs(y/i) < eps;
   until abs(y/i) < eps;
   writeln('Сумма ',chrunicode(931),'(i=1..',chrunicode(8734),') (-1)^i * a^i/i! равна ', s);   
   Println($'Сумма = {s}');   
end.
end.
</source>
</source>
[http://pascalabc.net/WDE/?shared=UnREAL/Algoritm_13a.pas Ссылка на алгоритм в среде WDE]


== Поиск значения ==
== Поиск значения ==


'''№14. Есть ли среди введенных число k? '''
=== №14. Есть ли среди введенных число k? ===
<source lang="pascal">
<source lang="pascal">
var n,k: integer;
begin
begin
   write('Введите целые числа n (n>0) и k: ');
   write('Введите целые числа n (n>0) и k: ');
  var n,k : integer;
   readln(n,k);
   readln(n,k);
   assert(n>0);
   assert(n>0);
  var Exists := false;
  for var i := 1 to n do
  begin
    write('Введите ', i, ' целое число: ');
    var x : integer;
    readln(x);
    if x = k then
      Exists := true;
  end;
  if Exists then
    writeln('Число ', k, ' было введено')
  else
    writeln('Число ', k, ' не было введено');
end.
</source>


[http://pascalabc.net/WDE/?shared=UnREAL/Algoritm_14.pas Ссылка на алгоритм в среде WDE]
'''№14a. Есть ли среди введенных число k? (то же с использованием break) '''
<source lang="pascal">
begin
  write('Введите целые числа n (n>0) и k: ');
  var n,k : integer;
  readln(n,k);
  assert(n>0);
   var Exists := false;
   var Exists := false;
   for var i := 1 to n do
   for var i := 1 to n do
   begin
   begin
     write('Введите ', i, ' целое число: ');
     write('Введите ', i, ' целое число: ');
     var x : integer;
     var x := ReadInteger;
    readln(x);
     if x = k then
     if x = k then
     begin
     begin
Строка 405: Строка 298:
     end;
     end;
   end;
   end;
   if Exists then
   if Exists then
     writeln('Число ', k, ' было введено')
     writeln('Число ', k, ' было введено')
   else
   else writeln('Число ', k, ' не было введено');
    writeln('Число ', k, ' не было введено');
end.
end.
</source>
</source>


[http://pascalabc.net/WDE/?shared=UnREAL/Algoritm_14a.pas Ссылка на алгоритм в среде WDE]
=== №14b. Есть ли среди введенных число k? (то же с использованием while) ===
 
 
'''№14b. Есть ли среди введенных число k? (то же с использованием while) '''
<source lang="pascal">
<source lang="pascal">
var n,k: integer;
begin
begin
   write('Введите целые числа n (n>0) и k: ');
   write('Введите целые числа n (n>0) и k: ');
  var n,k : integer;
   readln(n,k);
   readln(n,k);
   assert(n>0);
   assert(n>0);
   var Exists := false;
   var Exists := false;
   var i := 1;
   var i := 1;
Строка 427: Строка 318:
   begin
   begin
     write('Введите ', i, ' целое число: ');
     write('Введите ', i, ' целое число: ');
     var x : integer;
     var x := ReadInteger;
    readln(x);
     i += 1;
     i += 1;
     if x = k then
     if x = k then
       Exists := true;
       Exists := true;
   end;
   end;
   if Exists then
   if Exists then
     writeln('Число ', k, ' было введено')
     writeln('Число ', k, ' было введено')
   else
   else writeln('Число ', k, ' не было введено');
    writeln('Число ', k, ' не было введено');
end.
end.
</source>
</source>


[http://pascalabc.net/WDE/?shared=UnREAL/Algoritm_14b.pas Ссылка на алгоритм в среде WDE]
=== №15. Является ли число N>1 простым? ===
 
 
'''№15. Является ли число N>0 простым? '''
<source lang="pascal">
<source lang="pascal">
begin
begin
   write('Введите целое число N (N>0): ');
   write('Введите целое число N (N>1): ');
   var N : integer;
   var N := ReadInteger;
  readln(N);
   assert(N>1);
   assert(N>0);
 
   var IsSimple := true;
   var IsPrime := True;
  // for var i := 2 to N-1 do
   for var i := 2 to round(sqrt(N)) do
   for var i := 2 to round(sqrt(N)) do
     if N mod i = 0 then
     if N mod i = 0 then
     begin
     begin
       IsSimple := false;
       IsPrime := False;
       break;
       break;
     end;
     end;
   if IsSimple then
 
   if IsPrime then
     writeln('Число ', N, ' является простым')
     writeln('Число ', N, ' является простым')
   else
   else writeln('Число ', N, ' является составным');
    writeln('Число ', N, ' не является простым');
end.
end.
</source>
</source>
[http://pascalabc.net/WDE/?shared=UnREAL/Algoritm_15.pas Ссылка на алгоритм в среде WDE]


== Другие алгоритмы ==
== Другие алгоритмы ==


'''№16. Разложение числа на простые множители '''
=== №16. Разложение числа на простые множители ===
<source lang="pascal">
<source lang="pascal">
begin
begin
   write('Введите целое число x (x>1): ');
   var x := ReadInteger('Введите целое число x (x>1): ');
  var x : integer;
  readln(x);
   assert(x>1);
   assert(x>1);
   var i := 2;
   var i := 2;
   write(x, ' = 1');
   write(x, ' = 1');
Строка 482: Строка 364:
     if x mod i = 0 then
     if x mod i = 0 then
     begin
     begin
       write(' * ', i);
       Print('*', i);
       x := x div i;
       x := x div i;
     end
     end
     else
     else i += 1;
      i += 1;
   until x = 1;
   until x = 1;
end.
end.
</source>
</source>


[http://pascalabc.net/WDE/?shared=UnREAL/Algoritm_16.pas Ссылка на алгоритм в среде WDE]
=== №17. Вычисление значения многочлена в точке x по схеме Горнера ===
 
 
'''№17. Вычисление значения многочлена в точке x по схеме Горнера '''
<source lang="pascal">
<source lang="pascal">
var
  x,a: real;
  n: integer;
begin
begin
   write('Введите значение x, значение старшей степени x - n (n>=0) и коэффициент при старшей степени x - a_{1}: ');
   write('Введите x: ');
   var x,a : real;
   readln(x);
   var n : integer;
   write('Введите степень многочлена n (n>0): ');
   readln(x,n,a);
   readln(n);
   assert(n>=0);
   assert(n>=0);
  write('Введите коэффициенты: ');
  readln(a);
   var s := a;
   var s := a;
   for var i := 1 to n do
   for var i := 1 to n do
Строка 509: Строка 393:
     s := s*x + a;
     s := s*x + a;
   end;
   end;
   writeln('Значение многочлена p(x) = a_{1}*x^n + a_{2}*x^(n-1) + ... + a_{n}*x + a_{n+1} в точке x = ', x, ' равно ', s);
   writeln('Значение многочлена p(x) = a_{1}*x^n + a_{2}*x^(n-1) + ... + a_{n}*x + a_{n+1} в точке x = ', x, ' равно ', s);
end.
end.
</source>
</source>


[http://pascalabc.net/WDE/?shared=UnREAL/Algoritm_17.pas Ссылка на алгоритм в среде WDE]
=== №18. Дана непрерывная на отрезке функция f(x), имеющая на отрезке ровно один корень. Найти его методом половинного деления ===
 
Дан отрезок [a,b] (f(a)*f(b)<=0)
 
'''№18. Дана непрерывная на [a,b] функция f(x), имеющая на [a,b] ровно один корень (f(a)*f(b)<=0). Найти его методом половинного деления '''
<source lang="pascal">
<source lang="pascal">
// В качестве примера взяты eps = 0.0001 и функция f(x) = sin(x)
// В качестве примера взяты eps = 0.0001 и функция f(x) = sin(x)
Строка 522: Строка 405:
const f = sin;
const f = sin;


var a,b: real;
begin
begin
   write('Введите числа a и b (a<b): ');
   write('Введите числа a и b (a<b): ');
  var a,b : real;
   readln(a,b);
   readln(a,b);
   assert(a<b);
   assert(a<b);
   var fa := f(a);
   var fa := f(a);
   var fb := f(b);
   var fb := f(b);
   assert(fb*fa<0);
   assert(fb*fa<0);
   while (b-a) > eps do
   while (b-a) > eps do
   begin
   begin
Строка 535: Строка 420:
     var fx := f(x);
     var fx := f(x);
     if fa*fx <= 0 then
     if fa*fx <= 0 then
       b := x
       b := x;
     else
     else
     begin
     begin
Строка 542: Строка 427:
     end;
     end;
   end;
   end;
   writeln('Корень функции на [a,b] равен ',(b+a)/2);
   writeln('Корень функции на [a,b] равен ',(b+a)/2);
end.</source>
end.</source>


[http://pascalabc.net/WDE/?shared=UnREAL/Algoritm_18.pas Ссылка на алгоритм в среде WDE]
----
 


--UnREAL 20:29, 27 ноября 2010 (UTC)
© Буцев Виктор, Белоусько Тихон, Зуев Семен, Гончаров Владислав, Батраков Михаил, Гаджиев Казанфар, Пак Владислав

Текущая версия от 23:18, 31 декабря 2019

Простейшие алгоритмы

№1. Сумма вводимых целых чисел

begin
  var n := ReadInteger('Введите число слагаемых:'); 

  var s := 0.0; 
  for var i:=1 to n do
  begin 
    var x := ReadReal($'Введите слагаемое №{i}:'); 
    s += x;
  end;

  Println($'Сумма равна {s}');
end.

В алгоритме используются интерполированные строки вида $'Сумма равна {s}'. Они начинаются с $. Выражение в фигурных скобках, расположенное в такой строке, заменяется на его значение.

№2. Произведение целых чисел

begin
  var n := ReadInteger('Введите число множителей: ');

  var p := 1.0;
  for var i:=1 to n do
  begin
    var x := ReadReal('Введите множитель: ');
    p *= x;
  end;

  Println($'Произведение равно {p}');
end.

№3. Двойной факториал n!!=n*(n-2)*(n-4)*...*2 (или 1)

begin
  var x := ReadInteger('Введите x: ');

  var p := 1;
  while x>=2 do
  begin
    p *= x;
    x -= 2;
  end;

  Println($'Двойной факториал равен {p}');
end.

№4. Сколько нечетных среди n введенных

begin
  var n := ReadInteger('Введите n: ');

  var c := 0;
  for var i:=1 to n do
  begin
    var x := ReadInteger('Введите целое число: ');
    if x mod 2 <> 0 then
      c += 1;
  end;

  println($'Количество нечетных равно {c}');
end.

№5. Защита от неверного ввода

begin
  var x: real;
  repeat
    x := ReadReal('Введите x>0: ');
    if x<=0 then
      Println('Неверный ввод');
  until x>0;
end.

№6. Табулирование функции f(x) на отрезке в точках, разбивающих отрезок на N частей

Дан отрезок [a,b]

function f(x: real) := sin(x)*x;

begin
  var N := ReadInteger('Введите N: ');
  Assert(N>0);
  var (a,b) := ReadReal2('Введите a и b: ');

  var h := (b-a)/N;
  var x := a;
  loop N+1 do
  begin
    Writeln(x:5:2,f(x):10:4);
    x += h;
  end;
end.

№6a. Решение, использующее while. Погрешность округления и вычислительная погрешность

function f(x: real): real:= sin(x)*x;

begin
  var N:=ReadInteger('Введите N: ');
  Assert(N>0);
  var (a,b):=ReadReal2('Введите a и b: ');
 
  var h := (b-a)/N;
  var x := a;
  while x <= b+h/2 do
  begin
    writeln(x:5:2,f(x):10:4);
    x += h;
  end;
end.

Рекуррентные соотношения

№7. Вывод 10 первых степеней двойки

begin
  var x := 2;
  for var i := 1 to 10 do
  begin
    writeln(i:2,x:5);
    x *= 2;
  end;
end.

№8. Вывод всех двухзначных чисел, кратных 5

begin
  var x := 10;
  while x < 100 do
  begin
    writeln(x:3);
    x += 5;
  end;
end.

№9. Вывод n первых чисел Фибоначчи

begin
  var n := ReadInteger('Введите целое число n (n > 1): ');
  Assert(n>1);
  var (a,b) := (1,1);
  Print(a,b);
  loop n-2 do
  begin
    (a,b):=(b,a+b);
    Print(b);
  end;
end.

В алгоритме используются кортежи. В момент переприсваивания в цикле создаются буферные переменные, что позволяет нам избежать их объявления вручную.

№10. Найти НОД(A,B), используя алгоритм Евклида:

НОД(A,B) = НОД(B,A mod B); НОД(A,0) = A

begin
  var (a,b):=ReadInteger2('Введите целые числа A и B: ');
  while b<>0 do
    (A,B):=(B,A mod B);
  println($'НОД(A,B) = {A}');
end.

№11. Найти сумму цифр целого числа m

begin
  var m := ReadInteger('Введите целое число m: ');
 
  var (s,m1) := (0,abs(m));
  while m1 > 0 do
  begin
    s += m1 mod 10;
    m1 := m1 div 10;
  end;
 
  println($'Сумма цифр числа {m} равна {s}');
end.

Для работы с отрицательными числами в алгоритме используется стандартная функция abs(x) возвращающая модуль от x.

Максимумы и минимумы

№12. Найти max из введенных чисел

begin
  var n := ReadInteger('Введите целое число n (n>0): ');
  assert(n>0);
 
  var x := ReadReal('Введите 1 число: ');
  var max := x;
  for var i := 2 to n do
  begin
    x := ReadReal($'Введите {i} число: ');
    if max < x then
      max := x;
  end;
 
  Println($'Максимальное из введенных чисел: {max}');
end.

№12a. Найти min, удовлетворяющее условию p(x)

// Условие взятое как пример (Если число положительное, то условие p(x) возвращает true, иначе false)
function p(x: real): boolean:=x > 0;
 
begin
  var n := ReadInteger('Введите целое число n (n>0): ');
  assert(n>0);
 
  var min := real.MaxValue;
  for var i := 1 to n do
  begin
    var x := ReadReal($'Введите {i} число: ');
    if (x < min) and p(x) then
      min := x;
  end;
 
  if min = real.MaxValue then
    println('Нет чисел, удовлетворяющих условию')
  else println($'Минимальное из введенных чисел, удовлетворяющее условию: {min}');
end.

Суммирование рядов (конечных и бесконечных)

№13. Вычислить Σ(i=1..n) a^i/i!

begin
  var a:=ReadReal('Введите a: ');
  var n:=ReadInteger('Введите n (n>0): ');
  assert(n>0);
  var x := a;
  var s := x;
  for var i := 2 to n do
  begin
    x *= a / i;
    s += x;
  end;
  Println($'Сумма = {s}');
end.

№13a. Вычислить Σ(i=1..∞) (-1)^i * a^i/i!

begin
  var a:=ReadReal('Введите a (0 < a < 1): ');
  assert((a>0) and (a<1));
 
  var eps := 0.0001;
  var i := 1;
  var s := 0.0;
  var y := -a;
  repeat
    s += y / i;
    i += 1;
    y *= -a;
  until abs(y/i) < eps;
 
  Println($'Сумма = {s}');   
end.

Поиск значения

№14. Есть ли среди введенных число k?

var n,k: integer;
begin
  write('Введите целые числа n (n>0) и k: ');
  readln(n,k);
  assert(n>0);

  var Exists := false;
  for var i := 1 to n do
  begin
    write('Введите ', i, ' целое число: ');
    var x := ReadInteger;
    if x = k then
    begin
      Exists := true;
      break;
    end;
  end;

  if Exists then
    writeln('Число ', k, ' было введено')
  else writeln('Число ', k, ' не было введено');
end.

№14b. Есть ли среди введенных число k? (то же с использованием while)

var n,k: integer;
begin
  write('Введите целые числа n (n>0) и k: ');
  readln(n,k);
  assert(n>0);

  var Exists := false;
  var i := 1;
  while (i <= n) and not Exists do
  begin
    write('Введите ', i, ' целое число: ');
    var x := ReadInteger;
    i += 1;
    if x = k then
      Exists := true;
  end;

  if Exists then
    writeln('Число ', k, ' было введено')
  else writeln('Число ', k, ' не было введено');
end.

№15. Является ли число N>1 простым?

begin
  write('Введите целое число N (N>1): ');
  var N := ReadInteger;
  assert(N>1);

  var IsPrime := True;
  for var i := 2 to round(sqrt(N)) do
    if N mod i = 0 then
    begin
      IsPrime := False;
      break;
    end;

  if IsPrime then
    writeln('Число ', N, ' является простым')
  else writeln('Число ', N, ' является составным');
end.

Другие алгоритмы

№16. Разложение числа на простые множители

begin
  var x := ReadInteger('Введите целое число x (x>1): ');
  assert(x>1);

  var i := 2;
  write(x, ' = 1');
  repeat
    if x mod i = 0 then
    begin
      Print('*', i);
      x := x div i;
    end
    else i += 1;
  until x = 1;
end.

№17. Вычисление значения многочлена в точке x по схеме Горнера

var 
  x,a: real;
  n: integer;
begin
  write('Введите x: ');
  readln(x);
  write('Введите степень многочлена n (n>0): ');
  readln(n);
  assert(n>=0);
  write('Введите коэффициенты: ');
  readln(a);

  var s := a;
  for var i := 1 to n do
  begin
    write('Введите a_{', i+1,'}: ');
    readln(a);
    s := s*x + a;
  end;

  writeln('Значение многочлена p(x) = a_{1}*x^n + a_{2}*x^(n-1) + ... + a_{n}*x + a_{n+1} в точке x = ', x, ' равно ', s);
end.

№18. Дана непрерывная на отрезке функция f(x), имеющая на отрезке ровно один корень. Найти его методом половинного деления

Дан отрезок [a,b] (f(a)*f(b)<=0)

// В качестве примера взяты eps = 0.0001 и функция f(x) = sin(x)
const eps = 0.0001;
const f = sin;

var a,b: real;
begin
  write('Введите числа a и b (a<b): ');
  readln(a,b);
  assert(a<b);

  var fa := f(a);
  var fb := f(b);
  assert(fb*fa<0);

  while (b-a) > eps do
  begin
    var x := (b+a)/2;
    var fx := f(x);
    if fa*fx <= 0 then
      b := x;
    else
    begin
      a := x;
      fa := fx;
    end;
  end;

  writeln('Корень функции на [a,b] равен ',(b+a)/2);
end.

© Буцев Виктор, Белоусько Тихон, Зуев Семен, Гончаров Владислав, Батраков Михаил, Гаджиев Казанфар, Пак Владислав