Приветствую постоянных читателей и просто посетителей моего сайта progmatem.ru. На этой странице решаем задачи Proc6-9 на из задачника Абрамяна, где рассматриваем работу с целыми числами и их цифрами.
Proc6. Описать процедуру DigitCountSum(K, C, S), находящую количество C цифр целого положительного числа K, а также их сумму S (K — входной, C и S — выходные параметры целого типа). С помощью этой процедуры найти количество и сумму цифр для каждого из пяти данных целых чисел.
{ процедура возвращает количество C цифр целого
положительного числа K, а также их сумму S }
procedure DigitCountSum(K: integer; var C, S: integer);
begin
C := 0; { <== сначала количество цифр равно 0 }
S := 0; { <== сумма цифр равна 0 }
K := abs(K); { <== заменяем К на его модуль
(в случае отрицательного числа) }
repeat
inc(C); { <== увеличиваем количество цифр на 1 }
S := S + K mod 10; { <== к сумме прибавляем последнюю
цифру - остаток от деления K на 10 }
K := K div 10; { <== число K нацело делим на 10 }
until K = 0 { <-- выходим, когда целая часть равна 0 }
end;
var
K, C, S: integer; { <-- входные и выходные параметны процедуры }
i: byte; { <-- номер вводимого числа }
begin
{ Ввод 5 чисел производится в цикле: }
for i := 1 to 5 do begin
write(i, ')Введите целое положительное число: ');
readln(K); { <-- вводим число }
DigitCountSum(K, C, S); { <-- вызываем процедуру }
writeln(' Количество цифр: ', C); { <-- выводим количество цифр }
writeln(' Сумма цифр: ', S); { <-- выводим сумму цифр }
writeln
end;
readln
end.
**type** integer;
: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647
**type** integer;
: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647
**type** integer;
: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647
**type** integer;
: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647
**type** integer;
: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647
**type** integer;
: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647
**type** integer;
: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647
**type** integer;
: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647
Замечание: Сравните задачу Proc6 с задачей Integer7, а также integer11.
Proc7. Описать процедуру InvDigits(K), меняющую порядок следования цифр целого положительного числа K на обратный (K — параметр целого типа, являющийся одновременно входным и выходным). С помощью этой процедуры поменять порядок следования цифр на обратный для каждого из пяти данных целых чисел.
{ Процедура меняет порядок цифр числа K на обратный }
procedure InvDigits(var K: integer);
var
N: integer;
begin
N := K; { <== запоминаем начальное значение K }
K := 0; { <== обнуляем первоначальное число }
repeat
K := 10 * K + N mod 10; { <== предыдущее К умножаем на 10 и
прибавляем последнюю цифру N (остаток от деления на 10) }
N := N div 10 { <== удаляем последнюю цифру N, разделив его на 10 }
until N = 0 { <-- выходим, когда число равно 0 }
{ На выходе из данной процедуры получим число K из цифр,
записанных в обратном порядке относительно первоначального
переданного процедуре числа K. Обратите внимание, что число K мы
передали в процедуру, и число K получили на выходе. Это возможно
потому, что K описана в процедуре как переменная (на это
указывает var). }
end;
var
K: integer;
i: byte;
begin
{ Ввод 5 чисел производится в цикле: }
for i := 1 to 5 do begin
write(i, ')Введите целое число: ');
readln(K); { <-- вводим число }
InvDigits(K); { <-- вызываем процедуру со входным параметром K }
writeln('Число "в обратном плрядке": ', K);
writeln
end;
readln
end.
**type** integer;
: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647
**type** integer;
: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647
**type** integer;
: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647
**type** integer;
: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647
**type** integer;
: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647
**type** integer;
: Представляет 32-битовое целое число со знаком.Диапазон значений: -2 147 483 648 .. 2 147 483 647
Замечание: Сравните эту задачу с решениями Integer8 и Integer12.
Proc8. Описать процедуру AddRightDigit(D, K), добавляющую к целому положительному числу K справа цифру D (D — входной параметр целого типа, лежащий в диапазоне 0–9, K — параметр целого типа, являющийся одновременно входным и выходным). С помощью этой процедуры последовательно добавить к данному числу K справа данные цифры D1 и D2, выводя результат каждого добавления.
Следующий код к задаче Proc8 допускает ввод и отрицательных чисел К.
{ Процедура добавляет к целому
числу K справа цифру D }
procedure AddRightDigit(D: byte; var K: integer);
begin
{ Чтобы добавить к числу цифру справа, надо это число умножить
на 10, и к результату прибавить цифру. Например, к 27 добавим 3:
27 * 10 = 270; 270 + 3 = 273. }
if K > 0 then K := 10 * K + D { <== для положительного К }
else K := 10 * K - D { <== для отрицательного К }
end;
var
K: integer;
D1, D2: byte;
begin
write('K = ');
readln(K); { <-- вводим число K }
repeat
write('D1 = ');
readln(D1) { <-- вводим цифру D1 }
until (D1 >= 0) and (D1 < 10); { <-- выходим, если D1
однозначное положительное число }
repeat
write('D2 = ');
readln(D2) { <-- вводим цифру D2 }
until (D2 >= 0) and (D2 < 10); { <-- выходим, если D2
однозначное положительное число }
AddRightDigit(D1, K); { <-- добавляем справа к числу K цифру D1 }
writeln(K); { <-- результат первого добавления }
AddRightDigit(D2, K); { <-- добавляем справа к числу K цифру D2 }
writeln(K); { <-- результат второго добавления }
readln
end.
**type** byte;
: Представляет 8-битовое целое число без знака.Диапазон значений: 0..255
**type** byte;
: Представляет 8-битовое целое число без знака.Диапазон значений: 0..255
**type** byte;
: Представляет 8-битовое целое число без знака.Диапазон значений: 0..255
**type** byte;
: Представляет 8-битовое целое число без знака.Диапазон значений: 0..255
Proc9. Описать процедуру AddLeftDigit(D, K), добавляющую к целому положительному числу K слева цифру D (D — входной параметр целого типа, лежащий в диапазоне 1–9, K — параметр целого типа, являющийся одновременно входным и выходным). С помощью этой процедуры последовательно добавить к данному числу K слева данные цифры D1 и D2, выводя результат каждого добавления.
В этой задаче, как и в предыдущей, возможны отрицательные значения для К, несмотря на то, что в условии сказано только о положительных.
{ Процедура добавляет к целому числу K слева цифру D }
procedure AddLeftDigit(D: byte; var K: integer);
var
N, count: integer;
begin
{ Минимальная разрядная числа K: }
if K > 0 then count := 1 { <-- для положительного числа }
else count := -1; { <-- для отрицательного числа }
N := K; { <== запоминаем число K }
repeat
count := 10 * count; { <== увеличиваем разряд на 1 }
N := N div 10 { <== делим N нацело на 10 (удаляем последнюю цифру) }
until N = 0; { <-- выходим из цикла при N=0 }
K := count * D + K
end;
var
K: integer;
D1, D2: byte;
begin
write('K = ');
readln(K);
{ Вводим однозначные положительные D1 и D2: }
repeat
write('D1 = ');
readln(D1) { <-- вводим цифру D1 }
until (D1 > 0) and (D1 < 10);
repeat
write('D2 = ');
readln(D2) { <-- вводим цифру D2 }
until (D2 > 0) and (D2 < 10);
AddLeftDigit(D1, K); { <-- добавляем цифру D1 слева }
writeln(K);
AddLeftDigit(D2, K); { <-- добавляем цифру D2 слева }
writeln(K);
readln
end.
**type** byte;
: Представляет 8-битовое целое число без знака.Диапазон значений: 0..255
**type** byte;
: Представляет 8-битовое целое число без знака.Диапазон значений: 0..255
**type** byte;
: Представляет 8-битовое целое число без знака.Диапазон значений: 0..255
**type** byte;
: Представляет 8-битовое целое число без знака.Диапазон значений: 0..255
**type** byte;
: Представляет 8-битовое целое число без знака.Диапазон значений: 0..255
**type** byte;
: Представляет 8-битовое целое число без знака.Диапазон значений: 0..255