Здесь приведены примеры программ и алгоритмов, используемых в курсе Основы программирования для студентов 1 курса ФИИТ мехмата ЮФУ
Редактировать

Количество по условию

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

Решение 1. Ввод данных в цикле

var c := 0;
loop n do
begin
  var x := ReadInteger;
  if x mod 2 <> 0 then
    c += 1;
end;

Решение 2. Отделение ввода данных от обработки данных

Используем ReadSeqInteger, возвращающую последовательность введенных целых. Далее используем цикл foreach по последовательности.

var sq := ReadSeqInteger(n);
var c := 0;
foreach var x in sq do
  if x mod 2 <> 0 then
    c += 1;

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

Решение 1. Используем TryRead и цикл while

var i: integer;
Print('Введите i (>0):');
while not TryRead(i) or not (i>0) do
  Print('Неверный ввод. Повторите:');

Решение 2. Используем цикл repeat

var i: integer;
repeat
  Print('Введите i (>0):');
until TryRead(i) and (i>0);

Табулирование функции

Задача. Затабулировать функцию f(x) на [a,b] в точках, разбивающих [a,b] на n частей

Решение 1. С помощью loop

Assert(n>0);
var h := (b-a)/n;
var x := a;
loop n+1 do
begin
  Println($'{x,5:f2} {Sin(x),9:f4}');
  x += h;
end;

Решение 2. С помощью while

Величину h/2 добавляем чтобы учесть влияние вычислительной погрешности

var h := (b-a)/n;
var x := a;
while x <= b+h/2 do
begin
  Println($'{x,5:f2} {Sin(x),9:f4}');
  x += h;
end;

Решение 3. С помощью PartitionPoints

Функция PartitionPoints возвращает последовательность точек , разбивающих [a,b] на n частей

foreach var x in PartitionPoints(a,b,n) do
  Println(x,f(x));

Числа Фибоначчи

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

Решение 1. С помощью трёх переменных

var n := ReadInteger;
var (a,b) := (1,1);
Print(a,b);
loop n-2 do
begin
  var c := a + b;
  Print(c);
  a := b;
  b := c;
end;

Решение 2. С помощью множественного присваивания

var n := ReadInteger;
var (a,b) := (1,1);
Print(a,b);
loop n-2 do
begin
  (a,b) := (b,a+b);  
  Print(b);
end;

Наибольший общий делитель

Задача. Найти НОД(a,b), используя алгоритм Евклида:

НОД(a,b) = НОД(b,a mod b);
НОД(a,0) = a

Решение 1. С помощью трёх переменных

var (a,b) := ReadInteger2;
repeat
  var c := a mod b;
  a := b;
  b := c;
until b=0;
Print(a);

Решение 2. С помощью множественного присваивания

var (a,b) := ReadInteger2;
repeat
  (a,b) := (b,a mod b);
until b=0;
Print(a);

Cумма цифр

Задача. Найти сумму цифр целого положительного числа m

Решение.

var m := ReadInteger;
var s := 0;
while m>0 do
begin
  s += m mod 10;
  m := m div 10;
end;

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

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

Решение 1. Ввод данных в цикле

var x := ReadReal;
var max := x;
loop n-1 do
begin
  x := ReadReal;
  if max < x then
    max := x;
end;

Решение 2. C помощью ReadSeqReal

var max := real.MinValue;
foreach var x in ReadSeqReal(n) do
  if x > max then
    max := x;

Задача. Найти минимальный элемент x, удовлетворяющий условию p(x)

Решение 1. Ввод данных в цикле

var min := real.MaxValue;
loop n do
begin
  var x := ReadReal;
  if (x < min) and p(x) then
    min := x;
end;
if min = real.MaxValue then 
  Println('Нет элемента, удовлетворяющего условию');

Суммирование рядов

Задача. Вычислить $$\sum\limits_{i=0}^n \frac{a^i}{i!}$$

Решение.

Read(a, n);
var x := a;
var s := x;
for var i := 2 to n do
begin
  x *= a / i;
  s += x;
end;

Предел последовательности

Задача. Вычислить $$\lim\limits_{n \to \infty} a_{n} = \sqrt{x}$$

Для решения используется следующая рекуррентная последовательность: $$a_1=x, a_{i+1}=\frac{1}{2}\left(a_n+\frac{x}{a_n}\right)$$

Решение 1.

Assert(x>=0);
var x := ReadReal;
var eps := 1e-10;
var a := x;
var b := real.MaxValue;
while Abs(b - a) >= eps do
begin
  b := a;
  a := (a + x/a) / 2;
end;
Print(a,Sqrt(x));

Решение 2. С помощью множественного присваивания

var (a,b) := (x,real.MaxValue);
while Abs(b - a) >= eps do
  (b,a) := (a, (a + x / a) / 2);

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

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

Решение 1. Неэффективное - без break

var Exists := False;
loop n do
begin
  var x := ReadInteger;
  if x = k then
    Exists := True;
end;

Решение 2. Эффективное - с break

var Exists := False;
loop n do
begin
  var x := ReadInteger;
  if x = k then
  begin
    Exists := True;
    break;
  end;
end;

Решение 3. С использованием while

var Exists := False;
var i := 1;
while (i<=n) and not Exists do
begin
  var x := ReadInteger;
  i += 1;
  if x = k then
    Exists := True;
end;

Определение простоты числа

Задача. Является ли число 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;

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

Решение.

Assert(x>=2);
var i := 2;
repeat
  if x mod i = 0 then
  begin
    Print(i);
    x := x div i;
  end
  else i += 1;
until x = 1;

Корень функции на отрезке

Задача. Дана непрерывная на $$[a,b]$$ функция $$f(x)$$, $$f(a) \cdot f(b) < 0$$, имеющая на $$(a,b)$$ ровно один корень. Найти его методом половинного деления

Решение.

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