ВВЕРХ
ВНИЗ
  • Home
  • Proc
  • Proc 29 - 31

Proc 29 - 31

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

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

Код Pascal
1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  
23  
24  
25  
26  
27  
28  
29  
30  
31  
{ Функция возвращает количество цифр целого положительного числа 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.

Сравните задачу Proc6.

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

Код Pascal
1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  
23  
24  
25  
26  
27  
28  
29  
30  
31  
32  
33  
34  
35  
36  
{ Функция возвращает 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.

Сравните примеры:   Integer6,    Integer9, Integer10,    Разряд сотен и тысяч.

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

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

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

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

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

где n1 > n2 > ... > nk.
Цифра а1 имеет наивысший разряд, а цифра ak - наименьший разряд. Тогда вес числа А - это 10n1. Например, для числа 35435 = 3·10000 + 5·1000 + 4·100 + 3·10 + 5 вес разряда 10000, для числа 546 = 5·100 + 4·10 + 6 вес разряда 100 и т.д.

Код Pascal
1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  
23  
24  
25  
26  
27  
28  
29  
30  
31  
32  
33  
34  
35  
36  
37  
38  
39  
40  
41  
42  
43  
44  
45  
46  
47  
48  
49  
50  
51  
52  
53  
54  
55  
56  
57  
58  
59  
60  
61  
62  
63  
64  
65  
66  
{ функция возвращает 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.

*   *   *

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

Код Pascal
1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
{ функция проверяет, является ли число 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;

*   *   *

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

Код Pascal
1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
{ функция проверяет, является ли число 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;

В теле функции IsPalindrome(K) для досрочного завершения цикла мы вызвали оператор break. Посмотрите на указанной странице, что это за оператор и как он работает. И ещё: это именно оператор, а не процедура, как в некоторых языках программирования. На этом все. Если есть вопросы, то задавайте их в комментариях.



Яндекс.Метрика