Реализация линейного конгруэнтного метода на Си 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Реализация линейного конгруэнтного метода на Си



unsigned long g_random_seed = 1; //глобальная переменная с последним числом

unsigned long my_rand()
{
//размер unsigned long равен 4 байта!
//m = 2^32
return g_random_seed = 69069LU*g_random_seed + 5LU;
}

Реализация линейного конгруэнтного метода на Python

g_random_seed = 1
def rr():
global g_random_seed
g_random_seed = (69069*g_random_seed+5)%(2**32)

ВОПРОС

Почему в алгоритме на Си отсутствует деление по модулю m, но код работает, а в Python наличие %(2**32)обязательно?

ОТВЕТ

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

При этом unsigned long int имеет размер 4 байта — это 32 бита, следовательно результаты операций сложения и умножения в Си для типа unsigned long int и так всегда будут происходить по модулю 232.

Арифметическая и геометрическая прогрессия

Арифметическая прогрессия

Арифметическая прогрессия — числовая последовательность a1,a2,a3,…, в которой каждый член, начиная со второго, есть сумма предыдущего члена и некоторого постоянного числа d, называемого разностью или шагом арифметической прогрессии.

Зная первый член арифметической прогрессии a1 и ее разность d, можно последовательно находить остальные члены с помощью рекуррентного соотношения an+1=an+d, которое вытекает из определения.

Отсюда следует, что арифметическую прогрессию можно представить в виде

a1,a1+d,a1+2∗d,…

ПОСЛЕДОВАТЕЛЬНОСТЬ СУММ АРИФМЕТИЧЕСКОЙ ПРОГРЕССИИ

Сумма первых n членов арифметической прогрессии Sn=a1+a2+a3+… может быть найдена по формулам

Sn=(a1+an)∗n/2, где a1 — первый член прогрессии, an — член с номером n, n — количество суммируемых членов.

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

Геометрическая прогрессия

Геометрическая прогрессия — последовательность чисел b1,b2,b3,… (членов прогрессии), в которой каждое последующее число, начиная со второго, получается из предыдущего умножением его на определённое число q (знаменатель прогрессии), где b1,b2=b1q,b3=b2q,….,bn=bn−1q.

Отладка приложения на Python

Синтаксические ошибки

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

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

ПРИМЕР

>>> x***x
File "<stdin>", line 1
x***x
^
SyntaxError: invalid syntax

Исключения

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

>>> 10*(1/0)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ZeroDivisionError: int division or modulo by zero
>>> 4 + spam*3
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'spam' is not defined
>>> '2' + 2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Can't convert 'int' object to str implicitly

Последняя строка сообщения показывает, что произошло. Исключения бывают разного типа - он выводится в сообщении. Типы исключений в приведенном примере: ZeroDivisionError, NameError и TypeError. Имена стандартных исключений являются встроенными идентификаторами, но не являются зарезервированными ключевыми словами.

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

ОБРАБОТКА ИСКЛЮЧЕНИЙ

Вы можете писать программы, которые будут обрабатывать определенные исключения. Посмотрите на следующий пример, в котором пользователю будет выдаваться приглашение до тех пор, пока не будет введено целое число или выполнение не будет прервано (обычно Ctrl-C). Во втором случае генерируется исключение KeyboardInterrupt.

while True:
try:
x = int(input("Введите, пожалуйста, целое число: "))
break
except ValueError:
print "Вы ошиблись. Попробуйте еще раз…" …

Инструкция try работает следующим образом.

· Сначала выполняется ветвь try (инструкции, находящиеся между ключевыми словами try и except).

· Если не возникает исключительной ситуации, ветвь except пропускается и выполнение инструкции try завершается.

· Если во время выполнения ветви try генерируется исключение, оставшаяся часть ветви пропускается. Далее, если тип (класс) исключения соответствует указанному после ключевого слова except, выполняется ветвь except и выполнение инструкции try завершается.

· Если исключение не соответствует указанному после ключевого слова except, то оно передается внешнему блоку try или, если обработчик не найден, исключение считается не перехваченным, выполнение прерывается и выводится сообщение об ошибке.

Если исключение не обрабатывается, значение исключения выводится в сообщении об ошибке после имени класса исключения.

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

ГЕНЕРАЦИЯ ИСКЛЮЧЕНИЙ

Инструкция raise позволяет программисту принудительно сгенерировать исключение. Например:

>>> raise NameError('HiThere')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: HiThere

В качестве аргумента raise используется экземпляр класса. Класс указывает на тип исключения; аргумент, передаваемый конструктору, обычно описывает "подробности" возникновения исключительной ситуации.

"СТРАХОВАНИЕ" ОТ ОШИБОК

Еще один вариант записи инструкции try - с определением "страховочной" ветви finally, которая будет выполняться при любых обстоятельствах. Например:

try:
raise KeyboardInterrupt()
finally:
print 'До свидания!'

Ветвь finally выполняется независимо от того, возникла ли исключительная ситуация во время выполнения блока try или нет, в том числе и если выход происходит по инструкции break или return.

Русские буквы в python

ВВОД И ВЫВОД РУССКИХ БУКВ

В Python (начиная с версии 3) строки хранятся в кодировке Unicode. Это позволяет использовать в них в том числе буквы национальных алфавитов: от русских до китайских иероглифов:

>>> s = input()
Привет!
>>> print(s)
Привет!



Поделиться:


Последнее изменение этой страницы: 2017-02-19; просмотров: 535; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.222.115.120 (0.005 с.)