Root /ArchiveAbout
()

Proc 24 - 28

Proc 24 - 28

В задачах Proc24 - Proc28 задачника Абрамяна описываем функции, возвращающие True или False. Особенно следует обратить внимание на последний пример Proc28, где рассматривается функция определения простоты числа.

Proc24. Описать функцию Even(K) логического типа, возвращающую True, если целый параметр K является четным, и False в противном случае. С ее помощью найти количество четных чисел в наборе из 10 целых чисел.

{ Функция возвращает True, если целый параметр K 
является четным, и False в противном случае }
function Even(K: integer): boolean;
begin
 { Если K чётное, то K + 1 - нечётное. В последнем случае 
 функция odd(K + 1) возвратит true, иначе - false: }
  Even := odd(K + 1) 
end;

  { Основная программа }

const
  Q = 10; //количество вводимых чисел
  
var
  n: integer;
  count, i: byte;
  
begin
  count := 0; //количество четных чисел вначале равно 0
  writeln('Введите ', Q, ' целых чисел:');
  for i := 1 to Q do begin
    read(n); //вводим целое число
   { Если число n чётное (функция Even(n) возвращает true), 
   то увеличиваем общее количество чётных чисел на 1: }
    if Even(n) then inc(count) 
  end;
  writeln;
  writeln('Количество чётных чисел: ', count);
end.

**type** integer;: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647 **type** boolean;: Представляет логическое значение. **function** Odd(i: integer): boolean;: Возвращает True, если i нечетно **type** integer;: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647 **type** byte;: Представляет 8-битовое целое число без знака.Диапазон значений: 0..255 **procedure** Inc(**var** i: integer);: Увеличивает значение переменной i на 1 Сравните задачу Boolean3 на странице Является ли число положительным, нечетным, четным?.

Proc25. Описать функцию IsSquare(K) логического типа, возвращающую True, если целый параметр K (> 0) является квадратом некоторого целого числа, и False в противном случае. С ее помощью найти количество квадратов в наборе из 10 целых положительных чисел.

{ Функция возвращает True, если целый параметр K (> 0) является 
квадратом некоторого целого числа, и False в противном случае }
function IsSquare(K: integer): boolean;
begin
 { Если дробная часть корня квадратного K равна 0, то 
 функция возвратит True, в противном случае - False: }
  IsSquare := (frac(sqrt(K)) < 0.0000000001) 
end;

  { Основная программа }

const
  Q = 10; //количество вводимых чисел
  
var
  n: integer;
  count, i: byte;
  
begin
  count := 0; //количество точных квадратов вначале равно 0
  writeln('Введите ', Q, ' целых положительных чисел:');
  for i := 1 to Q do begin
    read(n); //вводим целое положительное число
   { Если n - точный квадрат (функция IsSquare(n) возвращает 
   true), то увеличиваем общее количество таких чисел на 1: }
    if IsSquare(n) then inc(count)
  end;
  writeln;
  writeln('Количество точных квадратов: ', count);
end.

**type** integer;: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647 **type** boolean;: Представляет логическое значение. **function** Frac(x: real): real;: Возвращает дробную часть числа x. **function** Sqrt(x: real): real;: Возвращает квадратный корень числа x. **type** integer;: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647 **type** byte;: Представляет 8-битовое целое число без знака.Диапазон значений: 0..255 **procedure** Inc(**var** i: integer);: Увеличивает значение переменной i на 1 Proc26. Описать функцию IsPower5(K) логического типа, возвращающую True, если целый параметр K (> 0) является степенью числа 5, и False в противном случае. С ее помощью найти количество степеней числа 5 в наборе из 10 целых положительных чисел.

{ Функция возвращает True, если целый параметр K (> 0) 
является степенью числа 5, и False в противном случае }
function IsPower5(K: integer): boolean;
var
  i: byte;
  res: integer;
begin
  res := 1; //начальное значение степеня числа 5
  i := 0; //начальный показатель степени
 { Выполняем цикл до тех пор пока степень числа 5 меньше K: }
  while res < K do begin
    inc(i); //увеличиваем показатель степени на 1
    res := res * 5; //i-й степень числа 5
  end;
 { Если res = K, то число K является степенью 5 и IsPower = True, 
 иначе IsPower = False: }
  IsPower5 := (res = K)
end;

  { Основная программа }

const
  Q = 10; //количество вводимых чисел
  
var
  n: integer;
  count, i: byte;
  
begin
  count := 0; //количество степеней 5 вначале равно 0
  writeln('Введите ', Q, ' целых положительных чисел:');
  for i := 1 to Q do begin
    read(n); //вводим целое положительное число
   { Если n - степень числа 5 (функция IsPower5(n) возвращает 
   true), то увеличиваем общее количество таких чисел на 1: }
    if IsPower5(n) then inc(count)
  end;
  writeln;
  writeln('Результат: ', count);
end.

**type** integer;: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647 **type** boolean;: Представляет логическое значение. **type** byte;: Представляет 8-битовое целое число без знака.Диапазон значений: 0..255 **type** integer;: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647 **procedure** Inc(**var** i: integer);: Увеличивает значение переменной i на 1 **type** integer;: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647 **type** byte;: Представляет 8-битовое целое число без знака.Диапазон значений: 0..255 **procedure** Inc(**var** i: integer);: Увеличивает значение переменной i на 1 Сравните пример Proc26 с задачей While4.

Proc27. Описать функцию IsPowerN(K, N) логического типа, возвращающую True, если целый параметр K (> 0) является степенью числа N (> 1), и False в противном случае. Дано число N (> 1) и набор из 10 целых положительных чисел. С помощью функции IsPowerN найти количество степеней числа N в данном наборе.

{ Функция возвращает True, если целый параметр K (> 0) является 
степенью числа N (N > 1), и False в противном случае }
function IsPowerN(K: integer; N: byte): boolean;
var
  i: byte;
  res: integer;
begin
  res := 1; //начальное значение степеня числа N
  i := 0; //показатель степени вначале
 { Выполняем цикл до тех пор пока степень числа N меньше K: }
  while res < K do begin
    inc(i); //увеличиваем показатель степени на 1
    res := res * N; //i-й степень числа N
  end;
 { Если res = K, то число K является степенью N и 
 IsPower = True, иначе IsPower = False: }
  IsPowerN := (res = K) 
end;

  { Основная программа }

const
  Q = 1; //количество вводимых чисел
  
var
  K, N: integer;
  count, i: byte;
  
begin
 { Вводим N: }
  repeat
    write('N = ');
    readln(N);
  until N > 1; //если N > 1, то выходим из цикла и продолжаем
  count := 0; //количество степеней N вначале равно 0
  writeln('Введите ', Q, ' целых положительных чисел:');
  for i := 1 to Q do begin
    read(K); //вводим целое положительное число
   { Если K - степень числа N (функция IsPowerN(K, N) возвращает 
   true), то увеличиваем общее количество таких чисел на 1: }
    if IsPowerN(K, N) then inc(count)
  end;
  writeln;
  writeln('Результат: ', count);
end.

**type** integer;: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647 **type** byte;: Представляет 8-битовое целое число без знака.Диапазон значений: 0..255 **type** boolean;: Представляет логическое значение. **type** byte;: Представляет 8-битовое целое число без знака.Диапазон значений: 0..255 **type** integer;: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647 **procedure** Inc(**var** i: integer);: Увеличивает значение переменной i на 1 **type** integer;: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647 **type** byte;: Представляет 8-битовое целое число без знака.Диапазон значений: 0..255 **procedure** Inc(**var** i: integer);: Увеличивает значение переменной i на 1 Proc28. Описать функцию IsPrime(N) логического типа, возвращающую True, если целый параметр N (> 1) является простым числом, и False в противном случае (число, большее 1, называется простым, если оно не имеет положительных делителей, кроме 1 и самого себя). Дан набор из 10 целых чисел, больших 1. С помощью функции IsPrime найти количество простых чисел в данном наборе.

Таблица простых чисел в Pascal

{ Функция возвращает True, если целый параметр N (> 1) 
является простым числом, и False в противном случае }
function IsPrime(N: integer): boolean;
var
  d: word; //делители числа N
  max: word;
begin
  max := trunc(sqrt(N)); //наибольший делитель для проверки
  if N < 2 then IsPrime := false //числа меньшие 2 не простые
  else
  if N = 2 then IsPrime := true //число 2 - простое
  else //все остальные четные числа - простые:
  if odd(N + 1) then IsPrime := false 
  else begin
    d := 3; //минимальное нечетное число-делитель
    IsPrime := true; //сначала считаем, что N - простое
   { Будем делить проверяемое на простоту число N на 
   нечетные делители d, начиная от 3 и до max: }
    while d <= max do 
     { Если N не делится на d, то делитель d увеличиваем на 2: }
      if N mod d <> 0 then inc(d, 2) 
      else begin 
        IsPrime := false; //в противном случае - число составное
        break //и выходим из цикла
      end
  end
end;
  
  { Основная программа }

const
  Q = 10; //количество вводимых чисел
  
var
  N: integer;
  i, count: byte;
  
begin
  count := 0; //количество простых чисел вначале равно 0
  writeln('Введите ', Q, ' целых положительных чисел:');
  for i := 1 to Q do begin
    read(N); //вводим целое положительное число
   { Если число N простое (функция IsPrime(N) возвращает True), 
   то увеличиваем общее количество простых чисел на 1: }
    if IsPrime(N) then inc(count)
  end;
  writeln;
  writeln('Результат: ', count); //выводим количество простых чисел
end.

**type** integer;: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647 **type** boolean;: Представляет логическое значение. **type** word;: Представляет 16-битовое целое число без знака.Диапазон значений: 0 .. 65 535 **function** Max(a,b: integer): integer;: Возвращает максимальное из чисел a, b. **type** word;: Представляет 16-битовое целое число без знака.Диапазон значений: 0 .. 65 535 **function** Max(a,b: integer): integer;: Возвращает максимальное из чисел a, b. **function** Trunc(x: real): integer;: Возвращает целую часть числа x. **function** Sqrt(x: real): real;: Возвращает квадратный корень числа x. **const** false = False;: Представляет логическое значение. **const** true = True;: Представляет логическое значение. **function** Odd(i: integer): boolean;: Возвращает True, если i нечетно **const** false = False;: Представляет логическое значение. **const** true = True;: Представляет логическое значение. **function** Max(a,b: integer): integer;: Возвращает максимальное из чисел a, b. A **mod** B - остаток при целочисленном делении А на В **procedure** Inc(**var** i: integer);: Увеличивает значение переменной i на 1 **const** false = False;: Представляет логическое значение. **type** integer;: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647 **type** byte;: Представляет 8-битовое целое число без знака.Диапазон значений: 0..255 **procedure** Inc(**var** i: integer);: Увеличивает значение переменной i на 1 В функции IsPrime(N) для выхода из цикла мы вызвали оператор break. Хотя, наверное, более естественно было бы воспользоваться оператором exit (эти две ссылки находятся на одной странице). Познакомьтесь с этими операторами поближе и посмотрите, какое между ними отличие.