s, t или e, за которой следует индекс - цепочка букв, цифр и знаков "-", "_". s -переменные имеют значением символы, t -переменные - e -переменные - любые выражения, включая пустые. Точка может отделять первую букву переменной от ее индекса.имя-функции { последовательность рефал-предложений };
GO, с которой начинается выполнение.$EXTERNAL (или $EXTERN , или $EXTRN ). Функция, являющаяся $ENTRY .В качестве примера оформления модулей в Рефале-5 рассмотрим приведенное ниже описание в модуле M1 и ее вызов в модуле M2:
Файл M1.REF:
* Функция Fact вычисляет произведение чисел от 1 до sN
* Здесь используются краткие обозначения для
* встроенных арифметических функций
$ENTRY Fact {
0 = 1;
sN = <* sN <Fact <– sN 1>>>;
};
Файл M2.REF:
* Головной модуль для вызова функции Fact
* Здесь используются расширения Рефала,
* а также встроенные функции ввода-вывода
* и преобразований символов
$EXTERN Fact;
$ENTRY GO { ,
<PRINTLN 'Введи число:'> ,
<READ_LINE> : {
= ;
e1 = <PRINTLN 'Fact(' e1 ') = ' <Fact <NUMB e1>>> <GO>;
};
};
В модуле М1 используются стандартные
В модуле M2 ввод числа функцией READ\_LINE и вычисление факториала от этого числа повторяется (GO ). Окончанием работы программы является ввод пустой строки. Введенное число преобразуется из Numb, затем вызывается внешняя функция вычисления факториала от введенного числа, после чего следует вывод строки:
Fact ( значение_числа ) = значение_факториала:
Введение
Для того чтобы продемонстрировать смысл и значение вводимой конструкции, мы сначала рассмотрим пример:
требуется написать функцию CBD, которая из входной строки выделяет
ее начало, ограниченное одним из некоторого множества символов: {"|", ",", ";"}.
Для решения этой задачи требуется во входной строке искать слева направо первый из указанного множества символов. Можно было бы для каждого символа из указанного множества написать свое
Прежде всего заметим, что задача нахождения в строке ("содержит"), которая узнает, содержит ли данный список
Include {
(e1 tA e2) tA = T;
(e1) tA = F;
};
Обращение к ней имеет вид: <. Результатом является символ-слово T, если список eL содержит tA, а в противном случае - символ-слово F.
Теперь вернемся к основной функции . Анализ результата вызова можно поручить какой-либо CBDO, которая в случае отрицательного результата (значение F ) снова вызовет функцию для анализа уже следующего символа, а в случае положительного результата (значение T ) удалит остаток строки и закончит работу. Решение это будет выглядеть следующим образом:
CBD {
sA eL = <CBDO sA eL <Include ('|,;') sA> >;
= ;
};
CBDO {
sA e1 F = sA <CBD e1>;
sA e1 T =;
};
Такое решение, связанное с ввести условие так, чтобы в случае его выполнения (символ не принадлежит указанному множеству), мы могли бы продолжить проверку следующего такого символа за счет рекурсивного обращения. В случае же невыполнения условия (
CBD {
sA eL, [sA не принадлежит множеству] = sA <CBD eL>;
eL = ;
};
Определим теперь
, Er : Ep,
где Er - произвольное Ep - произвольный Er может содержать переменные, которые уже встречались в этом же предложении слева от запятой. Образец Ep может содержать как старые, так и новые
Er и Ep, и в результате получаются рабочее выражение E'r и новый E'p.E'r вычисляется, и результат вычислений - объектное выражение E'r - сопоставляется с E'p.Перепишем функцию с использованием условия:
CBD {
sA eL, <Include ('|,;') sA> : F = sA <CBD eL>;
eL = ;
};
Заметим, что второе предложение объединяет два случая: когда строка начинается с разделителя и когда она пуста.
Мы можем еще упростить эту функцию, используя правило
CBD {
e1 sA e2, <Include ('|,;') sA> : T = e1;
e1 = e1;
};
Последний вариант иллюстрирует возможность того, что неуспех в условии не отвергает сразу предложение, а вызывает переход к следующему варианту сопоставления в предыдущем
Название введенной конструкции "
Рассмотрим другой пример сложения: функция Add складывает два числа, представленные в виде цепочек десятичных цифр, используя функцию сложения двух цифр Ad-:
Add {
(e1 sA) (e2 sB) , <Ad-digits sA sB> : e.Car s.Sum
= <Add (<Add (e1) (e2)>) (e.Car)> s.Sum;
(e1) (e2) = e1 e2;
};
Ad-digits {
'0' sX = sX;
sX '0' = sX;
'11' = '2';
. . .
'99' = '18';
};
Условие в первом предложении содержательно является Add-, сопоставление всегда выполняется успешно. В результате выполнения условия происходит сложение младших разрядов обоих чисел и результат сложения присваивается: младший разряд - переменной s.Sum, а старший разряд - разряд переноса - переменной e. (может иметь пустое значение, которое трактуется как '0'). За счет рекурсивного Add процесс сложения разрядов идет справа налево с добавлением переноса. Как только одно из чисел станет пустым (все его разряды будут сложены с разрядами другого), слева к результату сложения младших разрядов дописывается левая часть, оставшаяся от другого числа. Таким образом, программа демонстрирует экономное сложение столбиком.
Следующий пример демонстрирует возможность использования
Задача о назначении. Жители поселка N создали несколько общественных организаций. Каждый житель может входить в несколько организаций или ни в одну. Имеется список членов каждой организации. Требуется выбрать в каждой организации председателя так, чтобы никто не занимал двух постов сразу.
Формально: дан список должна построить список символов (председателей организаций, в котором все символы различны, и на i -м месте стоит символ из i -го
Для того чтобы решить задачу, сначала ее усложним: сведем ее к функции Assign1, которая имеет еще один аргумент - "запрещенное множество" eZ, т. е. список символов, которые нельзя использовать. Идея состоит в том, что символы, отобранные из части
Assign { eA = <Assign1 () eA>; };
Assign1 {
(eZ) = (eZ);
(eZ) (e1 sA e2) eX , <Include (eZ) sA> : F,
<Assign1 (eZ sA) eX> : (eR) = (eR);
(eZ) eX = ’*’;
};
В этом решении функция вызывает функцию Assign1 c дополнительным слева пустым списком, который и должна наполнить эта функция. Для его наполнения функция Assign1 во втором своем sA, не входящий в список sZ (первое условие), то этот символ включается в список вторым условием, но только в том случае, когда такое назначение не помешает назначениям для последующих Assign1. Если решение задачи существует, то второе sZ и, вызвав первое sZ (eR может быть любая - например, пустое выражение). Если же решения не существует, то для какого-либо очередного
Анализ приведенного решения показывает, что здесь имеет место полный перебор возможных назначений: если имеется n организаций по m членов, то трудоемкость алгоритма - $$\Theta (m^{n})$$. В то же время для такой задачи о назначениях существует алгоритм трудоемкости $$\Theta (mn^{2})$$. В одном из упражнений предлагается написать такой алгоритм на Рефале-5.
Другой структурирующей конструкцией
Рассмотрим в качестве примера функцию слияния двух упорядоченных последовательностей в одну упорядоченную последовательность. Используемая при этом функция сравнивает первые используется в условии функции
Merge {
(tA e1)(tB e2), <Compare (tA tB)> : '<'
= tA <Merge (e1) (tB e2)>;
(tA e1)(tB e2), <Compare (tA tB)> : '='
= tA tB <Merge (e1) (e2)>;
(tA e1)(tB e2), <Compare (tA tB)> : '>'
= tB <Merge (tA e1) (e2)>;
(e1)(e2) = e1 e2;
}
В этом примере первые 3 начинаются с одинаковых образцов и одинаковых левых частей условий. Их можно вынести за
В общем случае при исполнении
При использовании конструкции блока программа функции станет более наглядной:
Merge {
(tA e1)(tB e2), <Compare (tA tB)> : {
'<' = tA <Merge (e1) (tB e2)>;
'=' = tA tB <Merge (e1) (e2)>;
'>' = tB <Merge (tA e1) (e2)>;
}
(e1)(e2) = e1 e2;
}
В общем случае
В описанном примере мы выделили
По аналогии с образцовым окончанием и образцовым блоком вводятся
Рассмотрим пример Compset , которая сравнивает 2 множества на включение и возвращает в качестве результата символ '<', если первое множество включено во второе, символ '>', если первое множество включает второе, и символ '?', если ни одно из множеств не включено в другое. При описании будем использовать функцию Diff, которая определяет Compset можно описать следующим образом:
Compset {
(e1) (e2) , <Diff (e1) (e2)> : = '<';
(e1) (e2) , <Diff (e2) (e1)> : = '>';
(e1) (e2) , : = '?';
}
Все 3
Compset (e1) (e2) , {
<Diff (e1) (e2)> : = '<';
<Diff (e2) (e1)> : = '>';
: = '?';
}
Diff на Рефале-5, определяющую s, t или e, за которой следует индекс - цепочка букв, цифр и знаков "-", "_". s -переменные имеют значением символы, t -переменные - e -переменные - любые выражения, включая пустые. Точка может отделять первую букву переменной от ее индекса.имя-функции { последовательность рефал-предложений };
GO, с которой начинается выполнение.$EXTERNAL (или $EXTERN , или $EXTRN ). Функция, являющаяся $ENTRY .В качестве примера оформления модулей в Рефале-5 рассмотрим приведенное ниже описание в модуле M1 и ее вызов в модуле M2:
Файл M1.REF:
* Функция Fact вычисляет произведение чисел от 1 до sN
* Здесь используются краткие обозначения для
* встроенных арифметических функций
$ENTRY Fact {
0 = 1;
sN = <* sN <Fact <– sN 1>>>;
};
Файл M2.REF:
* Головной модуль для вызова функции Fact
* Здесь используются расширения Рефала,
* а также встроенные функции ввода-вывода
* и преобразований символов
$EXTERN Fact;
$ENTRY GO { ,
<PRINTLN 'Введи число:'> ,
<READ_LINE> : {
= ;
e1 = <PRINTLN 'Fact(' e1 ') = ' <Fact <NUMB e1>>> <GO>;
};
};
В модуле М1 используются стандартные
В модуле M2 ввод числа функцией READ\_LINE и вычисление факториала от этого числа повторяется (GO ). Окончанием работы программы является ввод пустой строки. Введенное число преобразуется из Numb, затем вызывается внешняя функция вычисления факториала от введенного числа, после чего следует вывод строки:
Fact ( значение_числа ) = значение_факториала:
Введение
Для того чтобы продемонстрировать смысл и значение вводимой конструкции, мы сначала рассмотрим пример:
требуется написать функцию CBD, которая из входной строки выделяет
ее начало, ограниченное одним из некоторого множества символов: {"|", ",", ";"}.
Для решения этой задачи требуется во входной строке искать слева направо первый из указанного множества символов. Можно было бы для каждого символа из указанного множества написать свое
Прежде всего заметим, что задача нахождения в строке ("содержит"), которая узнает, содержит ли данный список
Include {
(e1 tA e2) tA = T;
(e1) tA = F;
};
Обращение к ней имеет вид: <. Результатом является символ-слово T, если список eL содержит tA, а в противном случае - символ-слово F.
Теперь вернемся к основной функции . Анализ результата вызова можно поручить какой-либо CBDO, которая в случае отрицательного результата (значение F ) снова вызовет функцию для анализа уже следующего символа, а в случае положительного результата (значение T ) удалит остаток строки и закончит работу. Решение это будет выглядеть следующим образом:
CBD {
sA eL = <CBDO sA eL <Include ('|,;') sA> >;
= ;
};
CBDO {
sA e1 F = sA <CBD e1>;
sA e1 T =;
};
Такое решение, связанное с ввести условие так, чтобы в случае его выполнения (символ не принадлежит указанному множеству), мы могли бы продолжить проверку следующего такого символа за счет рекурсивного обращения. В случае же невыполнения условия (
CBD {
sA eL, [sA не принадлежит множеству] = sA <CBD eL>;
eL = ;
};
Определим теперь
, Er : Ep,
где Er - произвольное Ep - произвольный Er может содержать переменные, которые уже встречались в этом же предложении слева от запятой. Образец Ep может содержать как старые, так и новые
Er и Ep, и в результате получаются рабочее выражение E'r и новый E'p.E'r вычисляется, и результат вычислений - объектное выражение E'r - сопоставляется с E'p.Перепишем функцию с использованием условия:
CBD {
sA eL, <Include ('|,;') sA> : F = sA <CBD eL>;
eL = ;
};
Заметим, что второе предложение объединяет два случая: когда строка начинается с разделителя и когда она пуста.
Мы можем еще упростить эту функцию, используя правило
CBD {
e1 sA e2, <Include ('|,;') sA> : T = e1;
e1 = e1;
};
Последний вариант иллюстрирует возможность того, что неуспех в условии не отвергает сразу предложение, а вызывает переход к следующему варианту сопоставления в предыдущем
Название введенной конструкции "
Рассмотрим другой пример сложения: функция Add складывает два числа, представленные в виде цепочек десятичных цифр, используя функцию сложения двух цифр Ad-:
Add {
(e1 sA) (e2 sB) , <Ad-digits sA sB> : e.Car s.Sum
= <Add (<Add (e1) (e2)>) (e.Car)> s.Sum;
(e1) (e2) = e1 e2;
};
Ad-digits {
'0' sX = sX;
sX '0' = sX;
'11' = '2';
. . .
'99' = '18';
};
Условие в первом предложении содержательно является Add-, сопоставление всегда выполняется успешно. В результате выполнения условия происходит сложение младших разрядов обоих чисел и результат сложения присваивается: младший разряд - переменной s.Sum, а старший разряд - разряд переноса - переменной e. (может иметь пустое значение, которое трактуется как '0'). За счет рекурсивного Add процесс сложения разрядов идет справа налево с добавлением переноса. Как только одно из чисел станет пустым (все его разряды будут сложены с разрядами другого), слева к результату сложения младших разрядов дописывается левая часть, оставшаяся от другого числа. Таким образом, программа демонстрирует экономное сложение столбиком.
Следующий пример демонстрирует возможность использования
Задача о назначении. Жители поселка N создали несколько общественных организаций. Каждый житель может входить в несколько организаций или ни в одну. Имеется список членов каждой организации. Требуется выбрать в каждой организации председателя так, чтобы никто не занимал двух постов сразу.
Формально: дан список должна построить список символов (председателей организаций, в котором все символы различны, и на i -м месте стоит символ из i -го
Для того чтобы решить задачу, сначала ее усложним: сведем ее к функции Assign1, которая имеет еще один аргумент - "запрещенное множество" eZ, т. е. список символов, которые нельзя использовать. Идея состоит в том, что символы, отобранные из части
Assign { eA = <Assign1 () eA>; };
Assign1 {
(eZ) = (eZ);
(eZ) (e1 sA e2) eX , <Include (eZ) sA> : F,
<Assign1 (eZ sA) eX> : (eR) = (eR);
(eZ) eX = ’*’;
};
В этом решении функция вызывает функцию Assign1 c дополнительным слева пустым списком, который и должна наполнить эта функция. Для его наполнения функция Assign1 во втором своем sA, не входящий в список sZ (первое условие), то этот символ включается в список вторым условием, но только в том случае, когда такое назначение не помешает назначениям для последующих Assign1. Если решение задачи существует, то второе sZ и, вызвав первое sZ (eR может быть любая - например, пустое выражение). Если же решения не существует, то для какого-либо очередного
Анализ приведенного решения показывает, что здесь имеет место полный перебор возможных назначений: если имеется n организаций по m членов, то трудоемкость алгоритма - $$\Theta (m^{n})$$. В то же время для такой задачи о назначениях существует алгоритм трудоемкости $$\Theta (mn^{2})$$. В одном из упражнений предлагается написать такой алгоритм на Рефале-5.
Другой структурирующей конструкцией
Рассмотрим в качестве примера функцию слияния двух упорядоченных последовательностей в одну упорядоченную последовательность. Используемая при этом функция сравнивает первые используется в условии функции
Merge {
(tA e1)(tB e2), <Compare (tA tB)> : '<'
= tA <Merge (e1) (tB e2)>;
(tA e1)(tB e2), <Compare (tA tB)> : '='
= tA tB <Merge (e1) (e2)>;
(tA e1)(tB e2), <Compare (tA tB)> : '>'
= tB <Merge (tA e1) (e2)>;
(e1)(e2) = e1 e2;
}
В этом примере первые 3 начинаются с одинаковых образцов и одинаковых левых частей условий. Их можно вынести за
В общем случае при исполнении
При использовании конструкции блока программа функции станет более наглядной:
Merge {
(tA e1)(tB e2), <Compare (tA tB)> : {
'<' = tA <Merge (e1) (tB e2)>;
'=' = tA tB <Merge (e1) (e2)>;
'>' = tB <Merge (tA e1) (e2)>;
}
(e1)(e2) = e1 e2;
}
В общем случае
В описанном примере мы выделили
По аналогии с образцовым окончанием и образцовым блоком вводятся
Рассмотрим пример Compset , которая сравнивает 2 множества на включение и возвращает в качестве результата символ '<', если первое множество включено во второе, символ '>', если первое множество включает второе, и символ '?', если ни одно из множеств не включено в другое. При описании будем использовать функцию Diff, которая определяет Compset можно описать следующим образом:
Compset {
(e1) (e2) , <Diff (e1) (e2)> : = '<';
(e1) (e2) , <Diff (e2) (e1)> : = '>';
(e1) (e2) , : = '?';
}
Все 3
Compset (e1) (e2) , {
<Diff (e1) (e2)> : = '<';
<Diff (e2) (e1)> : = '>';
: = '?';
}
Diff на Рефале-5, определяющую Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.