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

Материал из Вики проекта PascalABC.NET
Перейти к навигацииПерейти к поиску
Нет описания правки
Строка 58: Строка 58:


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


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


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


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

Версия от 19:22, 29 ноября 2010

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

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

begin
  var x , n : integer;
  var s := 0;
  writeln('Введите число слагаемых');
  readln(n);
  for var i:=1 to n do
  begin 
    writeln('Введите слагаемое');
    readln(x);
    s += x;
  end;
  writeln('Сумма слагаемых равна ',s);
end.

Ссылка на алгоритм в среде WDE


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

begin
  var x , n : integer;
  var p := 1;
  writeln('Введите число множителей');
  readln(n);
  for var i:=1 to n do
    begin
      writeln('Введите множитель');
      readln(x);
      p *= x;
    end;
  writeln('Произведение равно ', p);
end.

Ссылка на алгоритм в среде WDE


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

begin
  var p := 1;
  var x , n : integer;
  writeln('Введите n');
  readln(x);
  while x>=2 do
  begin
    p *= x;
    x -= 2;
  end;
  writeln('Двойной факториал равен ', p);
end.

Ссылка на алгоритм в среде WDE


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

begin
  var x , n : integer;
  var c := 0;
  writeln('Введите n');
  readln(n);
  for var i:=1 to n do
  begin
    writeln('Введите целое число');
    readln(x);
    if x mod 2 <> 0 then
      c += 1;
  end;
  writeln('Количество нечетных равно ', c);
end.

Ссылка на алгоритм в среде WDE


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

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

Ссылка на алгоритм в среде WDE


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

function f(x : real): real;
begin
//Введите любую функцию
  result := sin(x);
end;

begin
  var N : integer;
  var a , b : real;
  writeln('Введите N');
  readln(N);
  writeln('Введите a и b');
  read(a,b);
  Assert(N>0);
  var h := (b-a)/N;
  var x := a;
  for var i:=0 to N do
  begin
    writeln('Значение икса равно ',x);
    writeln('Значение функции равно ', f(x):10:4);
    x += h;
  end;
end.

Ссылка на алгоритм в среде WDE


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

function f(x : real): real;
begin
//Введите любую функцию
  result := sin(x);
end;

begin
  var N : integer;
  var a , b : real;
  writeln('Введите N');
  readln(N);
  writeln('Введите a и b');
  read(a,b);
  Assert(N>0);
  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.

Ссылка на алгоритм в среде WDE

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

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

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

Ссылка на алгоритм в среде WDE


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

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

Ссылка на алгоритм в среде WDE


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

begin
  write('Введите целое число n (n > 1): ');
  var n : integer;
  readln(n);
  var a := 1;
  var b := 1;
  write(1, ' ', 1, ' ');
  for var i := 3 to n do
  begin
    var c := a + b;
    write(c, ' ');
    a := b;
    b := c;
  end;
end.

Ссылка на алгоритм в среде WDE


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

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

begin
  write('Введите целые числа A и B: ');
  var A,B,C : integer;
  readln(A,B);
  repeat
    C := A mod B;
    A := B;
    B := C;
  until C = 0;
  write('НОД(A,B) = ', A);
end.

Ссылка на алгоритм в среде WDE


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

begin
  write('Введите целое положительное число m: ');
  var m : integer;
  readln(m);
  assert(m > 0);
  var s := 0;
  while m > 0 do
  begin
    s += m mod 10;
    m := m div 10;
  end;
  writeln('Сумма цифр числа m равна ', s);
end.

Ссылка на алгоритм в среде WDE


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

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

begin
  write('Введите целое число n (n>0): ');
  var n : integer;
  readln(n);
  assert(n>0);
  write('Введите 1 число: ');
  var x : real;
  readln(x);
  var max := x;
  for var i := 2 to n do
  begin
    write('Введите ', i, ' число: ');
    readln(x);
    if max < x then
      max := x;
  end;
  writeln('Максимальное из введенных чисел: ', max);
end.

Ссылка на алгоритм в среде WDE


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

// Условие взятое как пример (Если число положительное, то условие p(x) возвращает true, иначе false)
function p(x : real) : boolean;
begin
  if x > 0 then
    Result := true
  else
    Result := false;
end;

begin
  write('Введите целое число n (n>0): ');
  var n : integer;
  readln(n);
  assert(n>0);
  var min := real.MaxValue;
  for var i := 1 to n do
  begin
    var x : real;
    write('Введите ', i, ' число: ');
    readln(x);
    if (x < min) and p(x) then
      min := x;
  end;
  if min = real.MaxValue then
    writeln('Нет чисел удовлетворяющих условию (являющихся положительными)')
  else
    writeln('Минимальное из введенных чисел и удовлетворяющее условию (являющееся положительным): ', min);
end.

Ссылка на алгоритм в среде WDE


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

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

begin
  write('Введите число a и n (n>0): ');
  var a : real;
  var n : integer;
  readln(a,n);
  assert(n>0);
  var x := a;
  var s := x;
  for var i := 2 to n do
  begin
    x *= a / i;
    s += x;
  end;
  writeln('Сумма ',chrunicode(931),'(i=1..n) a^i/i! равна ', s);
end.

Ссылка на алгоритм в среде WDE


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

begin
  write('Введите число a (0 < a < 1): ');
  var a : real;
  readln(a);
  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;
  writeln('Сумма ',chrunicode(931),'(i=1..',chrunicode(8734),') (-1)^i * a^i/i! равна ', s);   
end.

Ссылка на алгоритм в среде WDE


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

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

begin
  write('Введите целые числа n (n>0) и k: ');
  var n,k : integer;
  readln(n,k);
  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.

Ссылка на алгоритм в среде WDE


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

begin
  write('Введите целые числа n (n>0) и k: ');
  var n,k : integer;
  readln(n,k);
  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
    begin
      Exists := true;
      break;
    end;
  end;
  if Exists then
    writeln('Число ', k, ' было введено')
  else
    writeln('Число ', k, ' не было введено');
end.

Ссылка на алгоритм в среде WDE


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

begin
  write('Введите целые числа n (n>0) и k: ');
  var n,k : integer;
  readln(n,k);
  assert(n>0);
  var Exists := false;
  var i := 1;
  while (i <= n) and not Exists do
  begin
    write('Введите ', i, ' целое число: ');
    var x : integer;
    readln(x);
    i += 1;
    if x = k then
      Exists := true;
  end;
  if Exists then
    writeln('Число ', k, ' было введено')
  else
    writeln('Число ', k, ' не было введено');
end.

Ссылка на алгоритм в среде WDE


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

begin
  write('Введите целое число N (N>0): ');
  var N : integer;
  readln(N);
  assert(N>0);
  var IsSimple := true;
  // for var i := 2 to N-1 do
  for var i := 2 to round(sqrt(N)) do
    if N mod i = 0 then
    begin
      IsSimple := false;
      break;
    end;
  if IsSimple then
    writeln('Число ', N, ' является простым')
  else
    writeln('Число ', N, ' не является простым');
end.

Ссылка на алгоритм в среде WDE


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

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

begin
  write('Введите целое число x (x>1): ');
  var x : integer;
  readln(x);
  assert(x>1);
  var i := 2;
  write(x, ' = 1');
  repeat
    if x mod i = 0 then
    begin
      write(' * ', i);
      x := x div i;
    end
    else
      i += 1;
  until x = 1;
end.

Ссылка на алгоритм в среде WDE


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

begin
  write('Введите значение x, значение старшей степени x - n (n>=0) и коэффициент при старшей степени x - a_{1}: ');
  var x,a : real;
  var n : integer;
  readln(x,n,a);
  assert(n>=0);
  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.

Ссылка на алгоритм в среде WDE


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

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

begin
  write('Введите числа a и b (a<b): ');
  var a,b : real;
  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.

Ссылка на алгоритм в среде WDE


--UnREAL 20:29, 27 ноября 2010 (UTC)