Root /ArchiveAbout
()

Proc 29 - 31

Proc 29 - 31

Задача Proc29 о количестве цифр целого числа, Proc30 описывает функцию определения N-й цифры числа, а Proc31 рассматриваются палиндромы.

Proc29. Описать функцию DigitCount(K) целого типа, находящую количество цифр целого положительного числа K. Используя эту функцию, найти количество цифр для каждого из пяти данных целых положительных чисел.

{ Функция возвращает количество цифр целого положительного числа K }
function DigitCount(var K: integer): byte;
var
  c: byte;
begin
  c := 0; //сначала количество цифр равно 0
  repeat
    inc(c); //увеличиваем количество цифр на 1
    K := K div 10; //число заменяем на целую часть деления на 10
  until K = 0; //выходим из цикла, когда целая часть равна 0
  DigitCount := c
end;

  { Основная программа }
  
const
  n: byte = 5; //количество чисел для ввода

var
  K: integer; //число
  i: byte; //номер вводимого числа
  
begin
 { числа вводим в цикле: }
  for i := 1 to n do begin
    write('Введите целое положительное число: ');
    readln(K);
    writeln(' количество цифр: ', DigitCount(K)); //вызываем функцию
    writeln
  end
end.

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

Proc30. Описать функцию DigitN(K, N) целого типа, возвращающую N-ю цифру целого положительного числа K (цифры в числе нумеруются справа налево). Если количество цифр в числе K меньше N, то функция возвращает −1. Для каждого из пяти данных целых положительных чисел K1, K2, …, K5 вызвать функцию DigitN с параметром N, изменяющимся от 1 до 5.

{ Функция возвращает N-ю цифру целого положительного 
числа K (цифры в числе нумеруются справа налево) }
function DigitN(var K: integer; const N: byte): integer;
var
  digit, Count: byte; //цифра числа
begin
  Count := 0; //начальное количество цифр
  repeat
    digit := K mod 10; //цифра числа как остаток деления на 10
    inc(Count); //увеличиваем номер цифры на 1
    K := K div 10; //число заменяем на целую часть деления на 10
  until (K = 0) or (Count = N);
  if Count < N then DigitN := -1 //количество цифр меньше N
  else DigitN := Digit
end;

  { Основная программа }
  
const
  Q: byte = 5; //количество чисел для ввода

var
  K: integer; //число
  i, N: byte; //номер вводимого числа
  
begin
 { числа вводим в цикле: }
  for i := 1 to Q do begin
    write('Число: K', i, ' = ');
    readln(K);
    write('Номер цифры: N = ');
    readln(N);
    writeln(' Цифра: ', DigitN(K, N)); //вызываем функцию
    writeln
  end
end.

**type** integer;: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647 **type** byte;: Представляет 8-битовое целое число без знака.Диапазон значений: 0..255 **type** integer;: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647 **type** byte;: Представляет 8-битовое целое число без знака.Диапазон значений: 0..255 A **mod** B - остаток при целочисленном делении А на В **procedure** Inc(**var** i: integer);: Увеличивает значение переменной i на 1 A **div** B - целочисленное деление А на В **type** byte;: Представляет 8-битовое целое число без знака.Диапазон значений: 0..255 **type** integer;: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647 **type** byte;: Представляет 8-битовое целое число без знака.Диапазон значений: 0..255 Сравните примеры: Integer6, Integer9, Integer10, Разряд сотен и тысяч.

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

В комментариях задания Proc31 фигурирет такое понятие как вес разряда числа. Что это такое?

Вес разряда числа - это разрядная единица (то есть 10 в некоторой целой степени) той цифры числа, которая лежит в наибольшем разряде.

Рассмотрим некоторое число А, разложенное по степеням 10:

A = a10n1 + a10n2 + ... + a10nk,

{ функция возвращает True, если целый параметр K (> 0) 
является палиндромом (т. е. его запись читается одинаково 
слева направо и справа налево), и False в противном случае }
function IsPalindrome(var K: integer): boolean;

  { Функция возвращает количество цифр целого положительного числа K }
  function DigitCount(var CopyK, R: integer): byte;
  var
    c: byte;
  begin
    R := 1; //вес разряда 1-й цифры числа
    c := 0; //сначала количество цифр равно 0
    repeat
      inc(c); //увеличиваем количество цифр на 1
      R := R * 10; //находим вес разряда следующей цифры
      CopyK := CopyK div 10; //число делим на 10
    until CopyK = 0; //выходим из цикла, когда целая часть равна 0
    { На выходе мы получим число R в 10 раз большее, чем вес разряда 
    последней цифры числа K. Поэтому делим её на 10, чтобы получить 
    вес разряда последней цифры числа K: }
     R := R div 10;
     DigitCount := c
  end;

{Тело основной процедуры IsPalindrome } 
var
  CopyK, R: integer;
  DigitFirst, DigitLast, Q: byte; //цифра числа
begin
  CopyK := K; //делаем копию числа K
 { Вызываем ф-ю для определения количества Q цифр числа, 
 а также веса разряда R последней цифры числа K: }
  Q := DigitCount(CopyK, R); 
  IsPalindrome := true; //по умолчанию число K - палиндром
  if Q > 1 then //количество цифр больше 1 
    repeat
      DigitFirst := K div R; //первая цифра
      DigitLast := K mod 10; //последняя цифра
      if DigitFirst <> DigitLast then begin //цифры не совпадают
        IsPalindrome := false; //результат: не палиндром
        break //выходим из цикла
      end;
      K := K mod R;
      K := K div 10; //удаляем последнюю цифру числа
      R := R div 100;
      Q := Q - 2;
    until Q < 2; //выходим из цикла, когда целая часть равна 0
end;
 
  { Основная программа }

const
  n: byte = 10;
  
var
  K: integer;
  i: byte;  
  
begin
  for i := 1 to n do begin
    write('Введите целое положительное число: ');
    readln(K);
    writeln(' является ли оно палиндромом?  ', IsPalindrome(K));
    writeln
  end
end.

**type** integer;: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647 **type** boolean;: Представляет логическое значение. **type** integer;: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647 **type** byte;: Представляет 8-битовое целое число без знака.Диапазон значений: 0..255 **type** byte;: Представляет 8-битовое целое число без знака.Диапазон значений: 0..255 **procedure** Inc(**var** i: integer);: Увеличивает значение переменной i на 1 A **div** B - целочисленное деление А на В A **div** B - целочисленное деление А на В **type** integer;: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647 **type** byte;: Представляет 8-битовое целое число без знака.Диапазон значений: 0..255 **const** true = True;: Представляет логическое значение. A **div** B - целочисленное деление А на В A **mod** B - остаток при целочисленном делении А на В **const** false = False;: Представляет логическое значение. A **mod** B - остаток при целочисленном делении А на В A **div** B - целочисленное деление А на В A **div** B - целочисленное деление А на В **type** byte;: Представляет 8-битовое целое число без знака.Диапазон значений: 0..255 **type** integer;: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647 **type** byte;: Представляет 8-битовое целое число без знака.Диапазон значений: 0..255 * * *

Второй вариант функции IsPalindrome(K):

{ функция проверяет, является ли число K палиндромом }
function IsPalindrome(K: integer): boolean;  
var
  j, Q: byte;
  S: string;
begin
  IsPalindrome := true;
  S := IntToStr(K);
  Q := Length(S);
  for j := 1 to (Q div 2) do
    if s[j] <> s[Q - j + 1] then begin 
      result := false; 
      break 
    end
end;

**type** integer;: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647 **type** boolean;: Представляет логическое значение. **type** byte;: Представляет 8-битовое целое число без знака.Диапазон значений: 0..255 **type** string;: Представляет текст как последовательность знаков Юникода. **const** true = True;: Представляет логическое значение. A **div** B - целочисленное деление А на В **const** false = False;: Представляет логическое значение. * * *

Третий вариант функции IsPalindrome(K):

{ функция проверяет, является ли число K палиндромом }
function IsPalindrome(K: integer): boolean;  
var
  Digit: array[1..20] of byte;
  j, Q: byte;
begin
  Q := 0; //количество цифр вначале равно 0
  repeat
    inc(Q); //увеличиваем количество цифр на 1
    Digit[Q] := K mod 10; //находим Q-ю цифру числа
    K := K div 10; //число заменяем на целую часть деления на 10
  until K = 0; //выходим из цикла, когда целая часть равна 0
  IsPalindrome := true; //по умолчанию число K - палиндром
  for j := 1 to (Q div 2) do
    if Digit[j] <> Digit[Q - j + 1] then begin 
      IsPalindrome := false; 
      break 
    end
end;

**type** integer;: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647 **type** boolean;: Представляет логическое значение. **type** byte;: Представляет 8-битовое целое число без знака.Диапазон значений: 0..255 **type** byte;: Представляет 8-битовое целое число без знака.Диапазон значений: 0..255 **procedure** Inc(**var** i: integer);: Увеличивает значение переменной i на 1 A **mod** B - остаток при целочисленном делении А на В A **div** B - целочисленное деление А на В **const** true = True;: Представляет логическое значение. A **div** B - целочисленное деление А на В **const** false = False;: Представляет логическое значение. В теле функции IsPalindrome(K) для досрочного завершения цикла мы вызвали оператор break. Посмотрите на указанной странице, что это за оператор и как он работает. И ещё: это именно оператор, а не процедура, как в некоторых языках программирования. На этом все. Если есть вопросы, то задавайте их в комментариях.