Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
яп.doc
Скачиваний:
63
Добавлен:
13.05.2015
Размер:
216.06 Кб
Скачать

16. Операторы перехода и их особенности: break, continue, return.

break

Применение:

  • Завершение последовательности операторов в операторе switch;

  • Завершение работы цикла.

  • Форма оператора безусловного перехода (goto)

Особенности:

  • В цикле можно использовать более одного оператора break, НО, как правило большое число этих операторов приводит к деструктуризации кода.

  • Оператор break, который завершает последовательность операторов в операторе switch, оказывает влияние только на данный оператор switch, а не на какие-либо содержащие его циклы.

  • Оператор break нельзя использовать в качестве обычного средства выхода из цикла, его нужно использовать для выхода из цикла в определенных особых ситуациях.

continue

Оператор continue применяется, когда в текущей итерации цикла необходимо пропустить все команды до конца тела цикла.

При этом сам цикл не прерывается, условия продолжения или выхода вычисляются обычным образом.

В циклах while и do-while оператор continue вызывает передачу управления управляющему условному выражению цикла.

В цикле for управление передается вначале итерационной части цикла for, а потом условному выражению.

return:

Оператор return используется для выполнения явного возврата управления из метода.

17. Цикл с известным числом шагов и его особенности. Пример программы с блок-схемой.

Цикл – это многократное выполнение одинаковой последовательности действий.

for (начальные значения; условие продолжения цикла; изменение на каждом шаге) { тело цикла }

Особенности:

  • условие проверяется в начале очередного шага цикла, если оно ложно цикл не выполняется;

  • изменения (третья часть в заголовке) выполняются в конце очередного шага цикла;

  • если условие никогда не станет ложным, цикл может продолжаться бесконечно (зацикливание)

18. Цикл с условием (постусловием) и его особенности. Пример программы с блок-схемой.

Цикл с условием: while (<условие>) { тело цикла }

Особенности:

  • условие пересчитывается каждый раз при входе в цикл;

  • если условие на входе в цикл ложно, цикл не выполняется ни разу:

  • если условие никогда не станет ложным, программа зацикливается

Цикл с постусловием – это цикл, в котором проверка условия выполняется в конце цикла.

do {

System.out.print(“Введите положит. число”);

n = in.nextInt(); }

while ( n <= 0);

Особенности:

  • тело цикла всегда выполняется хотя бы один раз

  • после слова while ставится условие ПРОДОЛЖЕНИЯ цикла

19. Вложенные циклы. Примеры.

Вложенный цикл – цикл расположенный внутри тела другого цикла.

20. Применение циклов. Численный метод решения уравнений.

Язык Java предусматривает три различных оператора цикла: while, do-while и for. Первый из них обычно используют в ситуации, когда тело цикла нужно выполнить нуль или более раз, а второй применяется, если его выполнение хотя бы раз обязательно. Третий из операторов является наиболее универсальным и используется в различных ситуациях.

21. Применение циклов. Численные методы вычисления площади.

22. Применение циклов. Численный метод вычисления длины кривой.

PASCAL!!

const

stp = 0.001;

var

x0, x1, x, xt, s : double;

...

function myF(ax : double):double;

begin

result := ax*ax;

end;

...

//получим x0 и x1

x := x0;

s := 0;

while x <=x1 do

begin

xt := x + stp;

s := s+sqrt(sqr(xt-x)+sqr(myf(xt)-myf(x)));

x := xt;

end;

...

writeln('длина = ',s);

23.Статические методы. Примеры методов. Виды методов. Определение статического метода. Вызов статического метода. Статические методы не возвращающие значения.

Статические методы

Статическим методом называется фрагмент программы, которому присвоено некоторое уникальное имя, и который по этому имени можно вызывать из остальных частей программы. В момент, когда происходит вызов, выполняются действия, перечисленные внутри метода (в его описании или теле).

В объектно-ориентированном программировании основная задача методов заключается в том, чтобы изменять текущее состояние объекта, но до тех пор, когда в программе объекты ещё не используются, методы уже могут вводиться. Метод, который описан внутри некоторого класса, но вызывается без приложения к конкретному объекту этого класса, называется статическим.

Кроме имени и описания, о которых сказано выше, у метода есть ряд других характеристик:

Набор модификаторов.

Тип возвращаемого значения.

Набор аргументов (параметров).

Модификаторы метода

Для того чтобы создать статический метод, перед его именем надо указать модификатор static. Если этого не сделать, то метод можно будет вызывать только в приложении к конкретному объекту данного класса (будет нестатическим).

Модификатор public отвечает за уровень доступа к описываемому методу. Вместо public могут указываться уровни доступа private или protect, а также может не указываться ничего, тогда будет действовать уровень доступа по умолчанию.

С уровнями доступа мы познакомимся подробнее, когда будем создавать свои классы, а пока отметим, что доступ по умолчанию разрешает обращаться к методу из любой части того пакета, в котором метод описан. А уровень public открывает доступ к методу откуда угодно. В том числе и из других пакетов и программ.

Метод main обязан иметь уровень доступа public как раз потому, что к нему обращается виртуальная машина Java, не являющаяся частью какого-либо пакета.

Кроме этого, существуют другие модификаторы, которые, например, позволяют регулировать работу методов в процессе параллельных (многопоточных) вычислений.

Тип возвращаемого значения

Методы в Java условно можно разделить на 2 группы: функции и процедуры. К первой группе относятся методы, очень похожие на функции в математическом смысле. В результате своей работы такие методы возвращают в то место программы, из которого они были вызваны, некоторый конкретный результат существующего типа, то есть это может быть целое или вещественное число или логическое значение (int, double, boolean), массив (ссылка на него), объект (ссылка на него). Возвращаемое значение должно присваиваться переменной подходящего типа или же передаваться какому-либо другому методу в роли аргумента.

В отличие от функций, методы процедурного типа производят какие-либо полезные действия, но не дают законченного результата, который мог бы выражаться в одном конкретном значении или объекте.

Примеры:

double r = Math.random();

/* random относится к функциям */

System.out.println(r);

/* println относится к процедурам */

Если бы мы создали метод, который так же, как и println, печатал бы текст на экран, но при этом подсчитывал бы количество пробелов в тексте, и возвращал бы этот результат, то получили бы функцию. При этом функция продолжала бы выполнять полезные действия, характерные для процедуры println. Соответственно, функция более универсальна, чем процедура, но не всегда необходима.

При создании метода в первую очередь надо определить, будет ли он функцией или процедурой. Для промежуточных вычислений, как правило, используются функции. Для сокращения однотипных фрагментов кода могут подходить и процедуры.

После модификаторов, но также слева от имени метода, указывается тип возвращаемого им значения (если метод является функцией, например: int[] или double) или же слово void (если метод является процедурой).

Если метод является функцией, то в нём обязательно должна встречаться команда return после которой через пробел указывается то выражение, значение которого должно быть возвращено в качестве результата работы метода.

Все команды, указанные в описании метода после return, выполняться уже не будут, return без аргумента можно использовать внутри процедур. Он будет просто досрочно завершать процедуру (аналог break для цикла).

Аргументы (параметры)

При вызове метода в него из основной программы может передаваться набор некоторых значений. Для того чтобы научить метод их принимать (и внутри метода их обрабатывать), в круглых скобках после имени метода должны быть перечислены пары вида: тип_аргумента имя_аргумента через запятую.

Тогда при вызове метода можно будет указать набор значений, соответствующих по типам, описанным аргументам.

Значение, которые передаются методу в момент вызова, называются фактическими параметрами, а имена аргументов, которые фигурируют в описании метода — формальными параметрами.

Каждый формальный параметр является внутри метода локальной переменной, то есть он недоступен за пределами метода (вне блока его описания). В момент вызова метода фактическое значение копируется в формальный параметр.

В частности, это означает, что, передавая какую-либо переменную базового типа как параметр методу при его вызове, мы не сможем изменить значение этой переменной в основной программе. Если в метод через аргумент передаётся какого-либо объекта или массива, то внутрь метода копируется только ссылка на объект или массив (т. е. их адрес в памяти). Действия, которые мы совершим с массивом или объектом внутри метода, отразятся на состоянии этого массива или объекта в основной программе даже после того, как метод завершит свою работу. Внутри метода мы обращались по тому же адресу и работали с теми же данными в памяти, что доступны в основной программе.

Если имя фактического параметра совпадает с именем формального параметра, то это не влечёт никакой проблемы: внутри метода имеется локальная переменная, в которую при вызове копируется значение одноимённой глобальной переменной. Обращаясь по этому имени внутри метода, будем попадать на локальную переменную и никак не сможем добраться до глобальной.

Описание метода

Метод должен описываться внутри класса, но при этом один метод не описывают внутри другого, то есть метод должен вкладываться непосредственно в блок класса.

Общая схема описания метода:

модификаторы тип_возвращаемого_значения имя_метода (формальные аргументы) {

// действия, выполняемые методом

// возможно, return

}

Имя метода по традиции должно начинаться с маленькой буквы. Если оно состоит из нескольких слов, каждое следующее слово начинают с заглавной буквы. Имя для метода выбирают так, чтобы было понятно, что он делает.

Рассмотрим несколько примеров:

Пример 1.

public static double kvadk (double) {

double t;

t = Math.pow(a, 0.5);

return t;

}

Теперь внутри метода main мы сможем использовать наш метод. Например, так:

int a = 25;

System.out.println(kvadk(a));

// 5.0

System.out.println(a)

// 25

При передаче фактических параметров в метод действует автоприведение. Если аргумент фактический не соответствует типу формального, то Java пробует привести фактический аргумент к более универсальному типу (в данном случае int был приведён к double).

Перегрузка методов

Сигнатурой метода называется совокупность его имени и набора формальных параметров.

Java позволяет создавать несколько методов с одинаковыми именами, но разными сигнатурами. Создание метода с тем же именем, но с другим набором параметров называется перегрузкой. Какой из перегруженных методов должен выполняться при вызове, Java определяет на основе фактических параметров.

void pr( double a) {

System.out.println(a);

}

void pr (String a) {

System.out.println(a);

}

void pr(int[] a) {

for (int i=0; i<a.length; i++) {

System.out.print(a[i]+" ")

}

System.out.println();

}

Пример использования метода.

int a = 5;

int [] m = {1, 2, 8, 3}

String s = "Мир";

pr (a) //работает исходный метод

pr (a+s); // 5 мир, работает первая перегрузка

pr (m); // 1 2 8 3

pr (m+a); // ошибка

Переменная а не относится к типу double, но её обрабатывает исходный метод, поскольку возможно автоприведение из int в double. В обратном направлении оно невозможно. Если бы метод имел аргумент типа int, то с его помощью вещественные числа выводить не получилось бы.

Перегрузка методов реализует такое важное свойство в программировании, как полиморфизм. Полиморфным называется программный код, который связан с одним общим именем, но имеет разные реализации. Какая из реализаций будет работать, выбирается на основе контекста, в котором имя было упомянуто. Конкретно для методов полиморфными являются их перегрузки, а выбор исполняемой перегрузки происходит по параметрам.

Полиморфизм: одно имя, много форм.

Примеры использования методов

Следующая программа ищет и выводит на экран все простые нетривиальные делители числа, введённого пользователем с клавиатуры, начиная с наибольшего из делителей, либо сообщает, что введённое число — является простым.

import java.util.Scanner;

public class Main {

public static boolean isPrime(int n) {

for(int i = 2; i <= Math.sqrt(n) ; i++) {

if(n%i == 0) {

return false;

}

}

return true;

}

public static void main(String[] args) {

Scanner sc = new Scanner(System.in);

System.out.print("Введите натуральное число: ");

if(sc.hasNextInt()) {

int u = sc.nextInt();

if(u > 0) {

if(isPrime(u)) {

System.out.println("Вы ввели простое число");

} else {

System.out.print("Простые делители числа: ");

for(int i = (int)Math.sqrt(u); i >= 2 ; i--) {

if(u%i == 0 && isPrime(i)) {

System.out.print(i+" ");

}

}

System.out.println();

}

} else {

System.out.println("Вы ввели не положительное число");

}

} else {

System.out.println("Вы ввели не целое число");

}

}

}

В следующем примере за счёт перегрузки будет создано несколько одноимённых методов.

Первый вариант метода будет просто переводить строку, т. е. фактически являться боле коротким синонимом встроенного метода System.out.println(). Параметров у этого варианта не будет.

Второй вариант метода (его первая перегрузка), проверяет, есть ли у числового аргумента дробная часть, если её нет, то аргумент приводится к целым и выводится на экран без нулевой дробной части (3 вместо 3.0). В этот метод смогут в качестве единственного аргумента передаваться не только переменные типа double, но и переменные любого другого типа, для которого возможно автоприведение к double (например, любые целочисленные переменные).

Третий метод с одним параметром просто вызывает четвёртый метод, передавая в качестве параметров ему полученный массив, а также пробел в качестве второго параметра. Обратите внимание, что мы вызываем метод, который будет описан далее по ходу программу, это вполне допустимо.

Четвёртый метод выводит числовой массив, обрабатывая каждый элемент уже существующим методом. После каждого выведенного элемента добавляется переданный в параметре разделитель.

public class Main {

public static void pr() {

System.out.println();

}

public static void pr(double d) {

if((int)d == d) {

System.out.print((int)d);

} else {

System.out.print(d);

}

}

public static void pr(double[] m) {

pr(m, " ");

}

public static void pr(double[] m, String s) {

for(int i = 0; i < m.length; i++) {

pr(m[i]);

System.out.print(s);

}

}

public static void main(String[] args) {

double[] arrn = {1, 2.71, 3.14, 15, -5, 92, 0.5};

double p = 3.0;

int k = 13;

pr(p); // вывод числа, без дробной части при возможности

pr(); // переводит строку

pr(arrn); // вывод числового массива в строку

pr(); // переводит строку

pr(arrn,", "); // вывод числового массива в строку через запятую

pr(); // переводит строку

pr(k); // вывод целого числа через автоприведение

}

}

В результате работы программы на экран будет выведено:

3

1 2.71 3.14 15 -5 92 0.5

1, 2.71, 3.14, 15, -5, 92, 0.5,

1

24.Статические методы. Локальные переменные. Формальные и фактические параметры. Статические методы, не возвращающие значения и их особенности. Логические методы.

Формальные параметры подпрограммы указывают, с какими аргументами следует обращаться к этой подпрограмме (количество аргументов, их последовательность, типы). Они задаются в заголовке подпрограммы в виде списка, разбитого на группы. Разделителем групп является знак точка с запятой (;). В каждую группу включаются параметры одного типа, принадлежащие к одной категории.

Все формальные параметры можно разбить на четыре категории:

параметры-значения;

параметры-переменные;

параметры-константы (используются только в версии 7.0);

параметры-процедуры и параметры-функции.

Локальная переменная - любая переменная примитивного или ссылочного типа, объявленная внутри любого метода. Память для локальной переменной не выделяется в куче (heap) a выделяется в стеке (call stack) метода, который создаётся при вызове метода, по завершении работы метода стек уничтожается вместе с локальными переменными. Для локальных переменных не существует дефолтных значений, как это происходит для переменных экземпляров, например. При попытке использовать явно неинициализированную локальную переменную выдаётся ошибка компиляции - variable <your local var> might not have been initialized.

Формальные параметры – данные, с которыми работает подпрограмма (ПП). Это внутренние данные для ПП. Они перечисляются в заголовке ПП и связаны с фактическими параметрами. Фактические параметры – данные, передаваемые в ПП и возвращаемые из нее. Это внешние для ПП данные, с которыми имеет дело вызывающая часть программы. В ПП им соответствуют формальные параметры. Указываются в списке фактических параметров при обращении к ПП. Синонимы:

Параметры = формальные параметры.

Аргументы = фактические параметры.

Для формальных и фактических параметров необходимо соблюдать соответствия:

одинаковое количество,

одинаковый порядок следования,

совместимость типов по присвоению.

Категории формальных параметров

Параметры-значения (в списке формальных параметров не имеют атрибута). Передаются ПП через стек, как копии, и не изменяются ею.

Параметры-переменные (в списке формальных параметров имеют атрибут var). Передаются ПП через адреса, и могут изменяться ею. Используются для возврата результатов в вызывающую программу.

Выходные параметры-переменные (в списке формальных параметров имеют атрибут out). Подобны параметрам-переменным, но передаются только из ПП в программу.

Параметры-константы (в списке формальных параметров имеют атрибут const). Передаются ПП через адреса, но не могут изменяться ею. Применяются вместо параметров-значений, когда стек может переполняться.

Процедуры или функции. Это параметры процедурного типа. Задаются именами.

Параметры без типа. За правильность использования отвечает программист.

Умалчиваемые параметры. Их в списке фактических параметров можно пропускать. В списке формальных параметров для них нужно задать тип и значение.

Прежде всего, логическими методами isFileO, isDirectoryO можно выяснить, является ли путь, указанный в конструкторе, путем к файлу или каталогу.

Для каталога можно получить его содержимое — список имен файлов и подкаталогов— методом list о, возвращающим массив строк stringf]. Можно получить такой же список в виде массива объектов класса File[] методом listFilest). Можно выбрать из списка только некоторые файлы, реализовав интерфейс FileNameFiiter и обратившись к методу

list(FileNameFilter filter).

Если каталог с указанным в конструкторе путем не существует, его можно создать логическим методом mkdir(). Этот метод возвращает true, если каталог удалось создать. Логический метод mkdirso создает еще и все несуществующие каталоги, указанные в пути.

Пустой каталог удаляется методом delete ().

Для файла можно получить его длину в байтах методом length (), время последней модификации в секундах с 1 января 1970 г. методом lastModifiedo. Если файл не существует, эти методы возвращают нуль.

Логические методы canRead (), canwrite () показывают права доступа к файлу.

Файл можно переименовать логическим методом renameTo(Fiie newMame) или удалить логическим методом delete о. Эти методы возвращают true, если операция прошла удачно.

Если файл с указанным в конструкторе путем не существует, его можно создать логическим методом createNewFilet), возвращающим true, если файл не существовал, и его удалось создать, и false, если файл уже существовал.

25. Системы счисления. Классификация с/с.

с/с – правило записи чисел с помощью определенного набора специальных знаков (алфавита).

Классификация с/с:

  • Унарная с/с – с/с в которой для записи используется одна I. Не является позиционной.

  • Непозиционные с/с.

Римская.

Алфавит: I – 1; V – 5; X – 10; C – 50; L – 100; D – 500; M – 1000.

Правила составления римских цифр:

  • Если цифра меньшего значения стоит справа от цифры большего значения, то их значения суммируются, иначе, из большего вычитается меньшее.

  • I, X, C, M – могут встретиться в записи числа не больше 3 раз подряд.

  • V, L, D – могут встретиться в записи числа не более 1ого раза подряд.

  • Позиционные с/с – с/с, в которых значение каждой цифры числа в изображении числа определяется ее позицией в ряду других цифр.

26. Перевод целых чисел из одной с/с в другую.

Преобразование Zp → Z1 → Zq. Пример.

Идея алгоритма перевода: положим начальное значение Zq = 0, из числа Zp вычтем 1 по правилам вычитания системы p, т.е. Zp = Zp - 1, и добавим ее к Zq по правилам сложения системы q, т. е. Zq = Zq +1. Будем повторять эту последовательность действий, пока не достигнем Zp = 0.

27. Перевод целых чисел из одной с/с в другую.

Преобразование Zp → Z10. Пример.

28. Перевод целых чисел из одной с/с в другую.

Преобразование Z10 → Zq. Пример.

27, 28:

Преобразование Zp → Z10 → Zq

Алгоритм преобразования в получении числа в десятичном счислении за счет последовательного преобразования

Пример 2

Выполнить преобразование 4435 → Z10

4435 = 4·52+4·51+3·50 = 4·25+4·5+3·1 = 12310

Из десятичной системы счисления в другую можно путем определения числа

Пример 3

Выполнить преобразование 12310 → Z5.

В итоге остатки от деления (3, 4) и результат последнего целочисленного деления (4) образуют обратный порядок цифр нового числа. Следовательно, 12310 = 4435

29. Перевод дробных чисел из одной с/с в другую.

Преобразование 0,Y10 → 0,Yq. Пример.

алгоритм преобразования: 0, Y10→ 0,Yq:

1. Умножить исходную дробь в десятичной системе счисления на q, выделить целую часть — она будет первой (старшей) цифрой новой дроби; отбросить целую часть.

2. Для оставшейся дробной части операцию умножения с выделением целой и дробных частей повторять, пока в дробной части не окажется О или не будет достигнута желаемая точность конечного числа; появляющиеся при этом целые будут цифрами новой дроби.

3. Записать дробь в виде последовательности цифр после нуля с разделителем в порядке их появления в пп. 1 и 2.

30. Перевод дробных чисел из одной с/с в другую.

Преобразование 0,Yp → 0,Y10. Пример.

Перевод 0,Yp0,Y10, как и в случае натуральных чисел, сводится к вычислению значения формы (5) в десятичной системе счисления. Например,

0,0112 = 0·2-1 + 1·2-2 + 1·2-3 = 0,25 + 0,125 = 0,37510

Следует сознавать, что после перевода дроби, которая была конечной в исходной системе счисления, она может оказаться бесконечной в новой системе. Соответственно, рациональное число в исходной системе может после перехода превратиться в иррациональное. Справедливо и обратное утверждение: число иррациональное в исходной системе счисления в иной системе может оказаться рациональным.

Пример 5. Выполнить преобразование 5,3(3)10 X3

Перевод целой части, очевидно, дает: 510 = 123. Перевод дробной части: 0,3(3)10 = 0,13. Окончательно: 5,3(3)10 = 12,13.

31. Понятие экономичности с/c.

Под экономичностью системы счисления будем понимать то количество чисел, которое можно записать в данной системе с помощью определенного количества цифр.

32. Перевод чисел между с/c 2 ↔ 8 ↔ 16. Пример.

Теорема 1.

Для преобразования целого числа ZpZq в том случае, если системы счисления связаны соотношением q = pr, где r - целое число большее 1, достаточно Zp разбить справа налево на группы по r цифр и каждую из них независимо перевести в систему q.

Доказательство.

Пусть максимальный показатель степени в записи числа p по форме (1) равен k-1, причем, 2r>k-1>r.

Zp = (ak-1…a1a0)p = ak-1·pk-1 + ak-2·pk-2 + ……+ aj·pj +…+ a1·p1 + a0·p0

Вынесем множитель pr из всех слагаемых, у которых jr. Получим:

Zp = (ak-1·pk-1-r + ak-2·pk-2-r +… + ar·p0)·pr + (ar-1·pr-1 +… + a0·p0)·p0 = b1·q1 + b0·q0, где

b1 = ak-1·pk-1-r + … + ar·p0 = (ak-1…ar )p

b0 = ar-1·pr-1 +… + a0·p0 = (ar-1…a0)p

Таким образом, r-разрядные числа системы с основанием p оказываются записанными как цифры системы с основанием q. Этот результат можно обобщить на ситуацию произвольного k-1>r - в этом случае выделится не две, а больше (m) цифр числа с основанием q. Очевидно, Zq = (bm … b0 )q.

Пример 6. Выполнить преобразование Z2 = 1100012Z8.

Исходное число разбивается на группы по три разряда справа налево (8 = 23, следовательно, r = 3) и каждая тройка в соответствии с таблицей 1 переводится в 8-ричную систему счисления независимо от остальных троек:

Следовательно, 1100012 = 618 . Аналогично, разбивая Z2 на группы по 4 двоичные цифры и дополняя старшую группу незначащими нулями слева, получим 1100012= 3116.

Теорема 2.

Для преобразования целого числа Zp Zq в том случае, если системы счисления связаны соотношением p = qr, где r - целое число большее 1, достаточно каждую цифру Zp заменить соответствующим r-разрядным числом в системе счисления q, дополняя его при необходимости незначащими нулями слева до группы в r цифр.

Доказательство.

Пусть исходное число содержит две цифры, т.е.

Zp = (a1a0)p = a1·p1 + a0·p0.

Для каждой цифры справедливо: 0ai p-1 и поскольку p = qr, 0ai qr -1, то в представлении этих цифр в системе счисления q максимальная степень многочленов (1) будет не более r - 1 и эти многочлены будут содержать по r цифр:

a1 = br-1(1)·qr-1+br-2(1)·qr-2+…+0(1)·q0

a0 = br-1(0)·qr-1+br-2(0)·qr-2+…+0(0)·q0

Тогда:

Zp = (a1a0)p = (br-1(1)·qr-1+…+b0(1)·q0)·qr+(br-1(0)·qr-1+…+b0(0)·q0)·q0 =

= br-1(1)·q2r-1+…+b0(1 )·qr+br-1(0)·qr-1+…+b0(0)·q0 = (br-1(1)…b0(0))q = Zq

причем, число Zq содержит 2r цифр. Доказательство легко обобщается на случай произвольного количества цифр в числе Zp.

Пример 7. Выполнить преобразование D316Z2.

Переходы Z8 Z16 и Z16 Z8, очевидно, удобнее осуществлять через промежуточный переход к двоичной системе. Например, 1238 = 0010100112 = 5316.