Root /ArchiveAbout
()

Proc 6 - 9 задачника Абрамяна

Proc 6 - 9 задачника Абрамяна

Приветствую постоянных читателей и просто посетителей моего сайта 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