Задача 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 на 1A **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..255A **mod** B
- остаток при целочисленном делении А на В**procedure** Inc(**var** i: integer);
: Увеличивает значение переменной i на 1A **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 = a1·10n1 + a2·10n2 + ... + ak·10nk,
{ функция возвращает 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 на 1A **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 на 1A **mod** B
- остаток при целочисленном делении А на ВA **div** B
- целочисленное деление А на В**const** true = True;
: Представляет логическое значение.A **div** B
- целочисленное деление А на В**const** false = False;
: Представляет логическое значение. В теле функции IsPalindrome(K) для досрочного завершения цикла мы вызвали оператор break. Посмотрите на указанной странице, что это за оператор и как он работает. И ещё: это именно оператор, а не процедура, как в некоторых языках программирования. На этом все. Если есть вопросы, то задавайте их в комментариях.