close

Вход

Забыли?

вход по аккаунту

?

FreeBASIC5

код для вставкиСкачать
Пособие для начинающих программировать на языке высокого уровня FreeBASIC. Работа состоит из нескольких глав. Фрагмент 5 "Некоторые штришки" содержит необходимые для работы подробности о программировании на FreeBASIC. Может быть интересно для уча
 1
Евгений Рыжов, инженер
Программирование на языке FreeBASIC
пособие для начинающих
Пособие для начинающих программировать на языке высокого уровня FreeBASIC.
Работа состоит из нескольких глав. Фрагмент 5 "Некоторые штришки"
содержит необходимые для раб
оты подробности о программировании на FreeBASIC.
Может быть интересно для учащихся школ, студентов институтов,
а также преподавателей.
Фрагмент 5. Некоторые штришки.
2
1.
Вместо введения
Главный футуролог Cisco Дэйв Эванс (Dave Evans) давно сниск
ал широкую известность своими долгосрочными прогнозами дальнейшего развития информационных и коммуникационных технологий, причем, как пишут американские СМИ, ещё ни разу не ошибся. Его специальность сегодня остается во многом экзотичной: штатные футурологи
есть у считанного числа компаний.
Дэйв Эванс
На пресс
-
конференции, организованной в Москве в конце сентября, Эванс отметил, что объем информации растет в геометрической прогрессии
. Если до начала XX века объем знаний человечества удваивался каждое стол
етие, то сегодня он увеличивается вдвое каждые 2
-
3 года. Таким образом, по мнению Эванса, человечество вступает в "эру зеттабайта": количество данных, передаваемых через Интернет, в 2016 году достигнет 1,3 зеттабайта, что равно 125 годам непрерывного воспр
оизведения часового телешоу. Аналогия с видеоматериалом не случайна, так как, согласно мнению футуролога, основная масса интернет
-
пользователей тяготеет к визуальному восприятию информации, и к 2015 году 90% всех данных в сети будут приходиться на видеокон
тент...
Помимо описанных тенденций, на пресс
-
конференции прозвучали следующие прогнозы:
К
2020 году устройств, подключённых к Интернету, будет по шесть на каждого жителя планеты, то есть всего -
50 млрд интернет
-
устройств.
К 2025 году количество роботов пр
евзойдет население развитых стран, к 2032 году -
их интеллектуальные возможности окажутся выше человеческих, к 2035 -
роботы полностью заменят людей в качестве рабочей силы.
Человечество входит в период самоэволюции: благодаря развивающейся науке трансплан
тологии средний возраст человека может увеличиться до 200 лет.
24 сентября 2012 главный футуролог посетил Москву. На пресс
-
конференции он поделился своими соображениями о воздействии современных сетевых технологий на нашу жизнь, а также рассказал о 10 важ
нейших тенденциях в сфере высоких технологий, которые изменят мир в ближайшие 10 лет.
Видеорепортаж о московской пресс
-
конференции Дэйва Эванса приведен на:
http://www.youtube.com/watch?v=j0maJIjx
DDo
Выступление (46 мин.) Дэйва Эванса на пресс
-
конференции приведено на:
http://www.youtube.com/watch?v=XzM8Fa8GQyw
Ну, как тут не вспомнить слова Николая Андреевича Криницкого
во введении к книге "Алгоритмы вокруг нас": "То, что сегодня записано в виде алгоритма, завтра будет выполняться роботами"... (см. Фрагмент 4. Алгоритмы вокруг нас).
3
2.
Традиционный небольшой экскурс в историю
Часто используемое в компьютерном сленге слово "софт"
(
от английского слова software), впервые применил в привычном сегодня смысле в статье в American Mathematical Monthly математик из Принстонского университета Джон Тьюки (John Wilder Tukey, 1915 —
2000) в 1958 году. Есть даже подтверждение этого со стороны Ф
реда Шапиро, редактора "Книги цитат Йельского (Yale University) университета".
Джон Уайлдер Тьюки
В дальнейшем будем стараться
придерживаться следующей классификации софта –
подразделять программное обеспечение по двум параметрам.
1) Программное обесп
ечение по назначению:
-
системное -
управление компонентами компьютерной системы,
-
прикладное -
выполняет конкретную работу пользователя,
-
инструментальное -
используется для проектирования, разработки, сопровождения.
2) Программное обеспечение по способ
у распространения и использования:
-
несвободное (закрытое) -
собственность авторов или правообладателей,
-
открытое -
доступен исходный код программ,
-
свободное -
получаемое и используемое бесплатно.
Компилятор FreeBASIC
(если еще помните, речь идет име
нно о нем) распространяется на условиях GNU GPL, стандартная библиотека —
на условиях GNU LGPL. Имеется несколько сред разработки, в качестве отладчика может использоваться GNU Debugger. Ассемблирование и компоновка производятся с помощью GNU Binary Utilit
ies. Наверное, нужно сказать несколько слов об этих таинственных "GNU"...
Проект GNU организован в 1984 году для разработки операционной системы GNU.
Название "GNU" —
это рекурсивное сокращение фразы "GNU's Not Unix!"
("GNU —
не Unix!"). "GNU" произноситс
я как гну, одним слогом, как глагол "гнуть" в первом лице, единственном числе настоящего времени изъявительного наклонения. Понятие "свободная программа" относится к свободе, а не к стоимости. Чтобы верно воспринимать эту концепцию, вы должны понимать слов
о "свободный" в том смысле, который заключается в выражении "вольная речь"
, а не "бесплатное пиво"
!
Свобода программы означает свободу пользователей выполнять, копировать, изучать, править и улучшать программу. Точнее, она заключается в четырех видах своб
оды пользователей программы:
Свобода запускать программы в любых целях (
свобода 0
).
Свобода изучать, как работает программа, и адаптировать ее под свои нужды (
свобода 1
). Для этого необходим доступ к исходному тексту.
Свобода распространять копии, чтобы по
мочь своему ближнему (
свобода 2
).
4
Свобода улучшать программу и делать ваши улучшения общедоступными к выгоде всего сообщества (
свобода 3
). Для этого необходим доступ к исходному тексту.
Проект GNU —
проект по разработке свободного программного обеспечения
(СПО), является результатом сотрудничества множества отдельных проектов. Проект был запущен известным программистом и сторонником СПО Ричардом Столлманом 27 сентября 1983 года в Массачусетском технологическом институте. Изначальной целью проекта было "раз
работать достаточно свободного программного обеспечения <...> чтобы можно было обойтись без программного обеспечения, которое не является свободным". Ричард Мэттью Столлман (Richard Matthew Stallman, часто сокращается до rms, по инициалам; 1953 г.р.) —
авт
ор проектов Коллекция компиляторов GNU (GCC) и Отладчиков GNU (GDB). В 1974 закончил Гарвард и поступил в Массачусетский технологический институт. Вскоре отказался от планов получения дальнейшего научного образования, но остался в МТИ работать программисто
м в лаборатории искусственного интеллекта. В январе 1984 оставил работу в МТИ, чтобы посвятить себя полностью работе над проектом GNU.
Ричард Столлман
Для работы над проектом Ричард Столлман создаёт некоммерческую организацию "Фонд свободного программно
го обеспечения". Своей основной целью Фонд ставит сохранение программного обеспечения, процесс разработки которого всегда будет гарантированно открытым, а исходные тексты всегда доступны. Более масштабная цель Фонда —
разработка операционной системы, целик
ом состоящей из открыто разрабатываемого программного обеспечения. Декларируя это, Столлман фактически хотел вернуть представлявшееся ему идеальным состояние, когда в MIT работали в собственной операционной системе для PDP
-
10
(мейнфрейм, производимый Digit
al Equipment Corporation (DEC) с конца 1960
-
х; расшифровывается как "Programmed Data Processor model 10". Эта машина использовалась во многих университетах, в том числе Массачусетском технологическом институте и Стэнфордском университете).
Фотография п
ульт
а
мейнфрейма PDP
-
10
приведена на следующей странице. 3.
Немного о "физических" числах
Ниже приведена таблица (шпаргалка для оценки решений "физических" задач), содержащая ориентировочные значения характеристических параметров двух реальных объектов: наблюдаемой Вселенной (достаточно крупный физический объект) и атома вещества (достаточно мелкий физический объект). Таблица поможет избежать возможных конфузов при обработке данных актуальных объектов, например, данных характерных для транспортной системы
большого города или некоторого технологического процесса: численные значения всех "диаметров", "масс", "времен" и 5
"штук", с которыми имеет дело инженер, как правило, не выходят за приведенные в таблице границы.
Пульт мейнфрейма PDP
-
10
Таблица. Харак
теристические числа реальных объектов
.
Параметр
Наблюдаемая Вселенная
Атом
Диаметр, м
10^+26
10^
-
10
Масса, кг
10^+53
10^
-
25
Время, с
10^+18
10^
-
16
Число атомов
, шт
10^+53 / 10^
-
25 = 10^+78
Например, "внутри" Вселенной (в космический вакуум) "погруже
но" до триллиона галактик (т.е. 10^12 галактик). Галактики –
это основные структурные единицы Вселенной и одни из самых красивейших видимых (в сильные телескопы) объектов, которые поражают своим многообразием размеров, свойств, характеристик и т.д. Важнейш
ий космологический параметр Вселенной –
плотность видимого вещества, составляет примерно 10^
-
31 г/куб.см.
6
На всякий случай, ниже приводится перечень основных физических единиц, принятых в системе СИ и приведенных в ГОСТ 8.417
-
2002 "ГСИ. Единицы величин".
Длина
L
метр (м)
Масса
М
килограмм (кг)
Время
Т
секунда (с)
Сила электрического тока
I
ампер (А)
Термодинамическая температура
Q
кельвин (К)
Количество вещества
N
моль (моль)
Сила света
J
кандела (кд)
Часто в документации используются множители и приставки
для образования десятичных кратных и дольных единиц. Их обозн
ачения приведены в таблице:
Десятичный
множитель
Приставка
Десятичный
множитель
Приставка
10^24
иотта
10^
-
1
деци
10^21
зетта
10^
-
2
санти
10^18
экса
10^
-
3
милли
10^15
пета
10^
-
6
мик
ро
10^12
тера
10^
-
9
нано
10^9
гига
10^
-
12
пико
10^6
мега
10^
-
15
фемто
10^3
кило
10^
-
18
атто
10^2
гекто
10^
-
21
зепто
10^1
дека
10^
-
24
иокто
4.
О компиляторе FreeBASIC
Компилятор FreeBASIC обладает полезной особенностью –
он работает как с текстам
и программ на языке QBasic, так и с текстами на языке FreeBASIC, создавая при этом модули для платформ Windows, Linux и DOS. Попутно напомним, что "трансляторы" реализуются в виде компиляторов или интерпретаторов. С точки зрения выполнения работы компилято
р и интерпретатор существенно различаются.
Компилятор
(compiler -
составитель) читает всю программу целиком, делает ее перевод и создает законченный вариант программы на машинном языке, который затем и выполняется.
Интерпретатор
(interpreter -
истолковате
ль) переводит и выполняет программу последовательно строка за строкой.
В любом случае первым вступает в работу функциональный модуль транслятора именуемый "Сканер"
. Эта компонента транслятора читает строки текста
и осуществляет проверку исходных строк на соответствие синтаксическим правилам и семантике данного языка программирования. Если первый отличный от пробела символ в строке -
управляющий (#)
, то такая строка рассматривается препроцессором как командная. Строки, не являющиеся командными, либо подверг
аются преобразованиям, либо остаются без изменения.
7
Синтаксис
—
совокупность правил некоторого языка, определяющих формирование его элементов. Иначе говоря, это совокупность правил образования семантически значимых последовательностей символов в данном яз
ыке. Синтаксис задается с помощью правил, которые описывают понятия некоторого языка. Примерами понятий являются: переменная, выражение, оператор, процедура. Последовательность понятий и их допустимое использование в правилах определяет синтаксически прави
льные структуры, образующие программы. Именно иерархия объектов, а не то, как они взаимодействуют между собой, определяются через синтаксис. Например, оператор может встречаться только в процедуре, а выражение в операторе, переменная может состоять из имен
и и необязательных индексов и т.д. Синтаксис не связан с такими явлениями в программе как "переход на несуществующую метку" или "переменная с данным именем не определена". Этим занимается семантика.
Семантика
—
правила и условия, определяющие соотношения между элементами языка и их смысловыми значениями, а также интерпретацию содержательного значения синтаксических конструкций языка. Объекты языка программирования не только размещаются в тексте в соответствии с некоторой иерархией, но и дополнительно связа
ны между собой посредством других понятий, образующих разнообразные ассоциации. Например, переменная, для которой синтаксис определяет допустимое местоположение только в описаниях и некоторых операторах, обладает определенным типом, может использоваться с ограниченным множеством операций, имеет адрес, размер и должна быть описана до того, как будет использоваться в программе.
FreeBASIC
является преемником QuickBasic, и для совместимости допускает изменение синтаксиса во время компиляции при помощи опции –
l
ang
в командной строке, либо при помощи управляющей команды #lang
в тексте программы. Имеются три варианта работы:
lang fb
разрешает все современные возможности поддерживаемые FreeBASIC,
lang deprecated
разрешает использование синтаксиса предыдущих версий FreeBASIC,
lang qb
разрешает использование синтаксиса QuickBasic, (на максимально возможном уровне).
Ассемблирование и компоновка производятся с помощью GNU Binary Utilities (код на FreeBASIC транслиру
ется в ассемблерный код (GAS) и уже он компилируется и линкуется). Компилятор распространяется на условиях GNU GPL, стандартная библиотека —
на GNU LGPL. Имеется несколько сред разработки, в качестве отладчика может использовать GNU Debugger (также поддерж
ивается gprof).
Ниже приведены тексты программы вычисления значения и производной по схеме Горнера. В ней предполагается, что полином записывается в стандартном виде по убывающим степеням аргумента:
Y = A(0)*X^N+A(1)*X^(N
-
1)+...+A(N
-
1)*X+A(N)
N -
степень полинома;
A -
массив коэффициентов полинома;
X -
значение аргумента;
Y -
значение полинома (в точке "Х");
P -
значение производной (в точке "Х").
8
В варианте на языке QBasic используются следующие суффиксы:
% -
обычное целое число
,
& -
длинное целое число
,
! –
действительное число обычной точности (по умолчанию)
,
# -
действительное число двойной точности
,
$ -
символьная строка
.
Такой способ многим кажется неудобным –
знаки сильно засоряют текст, но другим –
очень удачным –
всегда "под рукой" тип переменной
!
Вариант 1.
Используется ключ диалекта чистого QBasic 4.5
#Lang "QB"
SUB PGRN (N%, A
!
(), X
!
, Y
!
, P
!
)
' 11.09.1986
'
-------------------------------------------------------------
' Модуль вычисления зна
чения и производной по схеме Горнера
'
-------------------------------------------------------------
' Полином по убывающим степеням аргумента:
' Y = A(0)*X^N+A(1)*X^(N
-
1)+...+A(N
-
1)*X+A(N)
' N -
степень полинома;
' A -
массив коэффициентов полинома;
' X -
значение аргумента;
' Y -
значение полинома (в точке "Х");
' P -
значение производной (в точке "Х").
P! = 0
Y! = A!(0)
FOR K% = 1 TO N%
P! = P! * X! + Y!
Y! = Y! * X! + A!(K%)
NEXT K%
END SUB
'
' P R O G R A M "TSTPGRN"
' 10.10.2012
'
-------------------------------------------------------------
' Проверка вычисления значения и производной полинома
'
-------------------------------------------------------------
'
' Численные
значения коэффициентов полинома:
DATA 1., 0., -
6., 1., 4.
N% = 4
DIM A!(N%)
FOR J% = 0 TO N%: READ A!(J%): NEXT J%
PRINT " X YG PG YA PA"
F$ = " #.## ###.##### ###.##### ###.##### ###.#####"
FOR X! = 0 TO 2.0 STEP 0.25
CALL P
GRN (N%, A!(), X!, Y!, P!)
' Вычисления по аналитическим формулам
Y1=1.* X!^4 -
6.* X!^2 + X! + 4.
9
P1=4.* X!^3 -
12.* X! + 1.
PRINT USING F$; X!; Y!; P!; Y1!; P1!
NEXT X!
SLEEP
Результаты вычислений:
X YG PG YA PA
0.00 4.00000 1.00000 4.00000 1.00000
0.25 3.87891 -
1.93750 3.87891 -
1.93750
0.50 3.06250 -
4.50000 3.06250 -
4.50000
0.75 1.69141 -
6.31250 1.69141 -
6.31250
1.00 0.00000 -
7.00000 0.00000 -
7.00000
1.25 -
1.68359 -
6.187
50 -
1.68359 -
6.18750
1.50 -
2.93750 -
3.50000 -
2.93750 -
3.50000
1.75 -
3.24609 1.43750 -
3.24609 1.43750
2.00 -
2.00000 9.00000 -
2.00000 9.00000
Вариант 2.
Используется ключ диалекта полного FreeBASIC,
подпрограмма описана до ее выз
ова.
#lang "FB"
Sub PGorn (NN As Integer, AA() As Single, ByRef XX As Single, ByRef YY As single, ByRef PP As Single)
Dim KK As Integer
PP = 0
YY = AA(0)
For KK = 1 To NN
PP = PP * XX + YY
YY = YY * XX + AA(KK)
Next KK
End Sub
'
Dim N As integer
Dim A(N) As single
Dim As single Y, P, Y1, P1
Dim F As String
Data 1., 0., -
6., 1., 4.
N = 4
For J As integer = 0 To N: Read A(J): Next J
Print " X YG PG YA PA"
F = " #.## ###.##### ###.##### ###.##### ###.#####"
For X As Single = 0
To 2.0 Step 0.25
PGorn (N, A(), X, Y, P)
Y1=1.* X^4 -
6.* X^2 + X + 4. P1=4.* X^3 -
12.* X + 1. Print Using F; X; Y; P; Y1; P1
Next
Sleep
10
Обратите внимание –
в тексте подпрограмма расположена до появления ее вызова в основной программе, так что имя PG
orn
уже зан
есено в таблицу (уже известно)!
При вызовах используется два способа передачи параметров в функции или процедуры:
ByVal
-
передается само значение,
ByRef
-
передается указатель на это значение.
ByVal работает с копией значения переменной, а By
Ref с настоящим значением переменной. Можно создавать функции, процедуры и ниже в тексте их вызывать. Такой способ приносит схематичное построение программы: вверху функции, внизу главный модуль. Но не все хотят следовать таким правилам, да и кроме того ес
ли использовать написанные кем
-
нибудь функции в специальных файлах
-
библиотеках, то просто так вызвать функцию не получится. Ее нужно будет сначала продекларировать. Декларация -
это примерно тоже, что объявление переменных. Декларации делаются чаще всего в
начале модуля. Для декларации функции, процедуры, конструкторов, деструкторов применяют команду Declare. См. ниже этот вариант.
Вариант 3.
Используется ключ диалекта полного FreeBASIC,
подпрограмма описана после ее вызова.
#lang "FB"
Declare Sub PGorn (N As Integer, A() As Single, ByRef X As Single, ByRef Y As single, ByRef P As Single)
Dim N As integer
Dim A(N) As single
Dim As single Y, P, Y1, P1
Dim F As String
Data 1., 0., -
6., 1., 4.
N = 4
For J As integer = 0 To N: Read A(J): Next J
Print " X YG PG YA PA"
F = " #.## ###.##### ###.##### ###.##### ###.#####"
For X As Single = 0 To 2.0 Step 0.25
PGorn (N, A(), X, Y, P)
Y1=1.* X^4 -
6.* X^2 + X + 4. P1=4.* X^3 -
12.* X + 1. Print Using F; X; Y; P; Y1; P1
Next
Sleep
'
Sub PGorn (NN As Integer, AA() As Single, ByRef XX As Single, ByRef YY As single, ByRef PP As Single)
Dim KK As Integer
PP = 0
YY = AA(0)
For KK = 1 To NN
PP = PP * XX + YY
11
YY = YY * XX + AA(KK)
Next KK
End Sub
Компилятор даже способен "скушать" текст про
граммы, в котором есть фрагменты на языке FreeBASIC и фрагменты на языке QBasic
. Например, приведенная ниже программа работает, правда выдает предупреждение:
warning 30(0): Directive ignored after first pass
#Lang "FB" ' режим совместимости с полным Fr
eeBASIC
Dim As Integer I, J, K
I = 1: J = 2: K = I + J
Print I; J; K
'
#Lang "QB" ' режим совместимости с QBasic
10 A% = 3: B% = 4: C% = A% + B%
20 Print A%; B%; C%
Sleep
5.
Я неграмотный, никаких букв не знаю, только цифирь
...но какой простор для пытливого ума открывает эта "цифирь"! Посмотрите, например, "Математический папирус Ахмеса" или, иначе, "папирус Ринда" —
древнеегипетское учебное руководство по арифметике и геометрии.
1*9 + 2 = 11
12*9 + 3 = 111
123*9 + 4 = 1111
1234*9 + 5 = 11111
12345
*9 + 6 = 111111
123456*9 + 7 = 1111111
1234567*9 + 8 = 11111111
12345678*9 + 9 = 111111111
123456789*9 + 10 = 1111111111
9*9 + 7 = 88
98*9 + 6 = 888
987*9 + 5 = 8888
9876*9 + 4 = 88888
98765*9 + 3 = 888888
987654*9 + 2 = 8888888
9876543*9 + 1 = 88888888
9
8765432*9 + 0 = 888888888
Но есть две "цифири" без которых просто невозможно двигаться дальше!
В связи с этим представляется весьма полезным выполнить на машине следующую небольшую программку, которая вычисляет значение EPS
-
"машинного эпсилон" и значени
е NUL
-
"машинного нуля":
12
' P R O G R A M "TEST"
' 10.10.2012
'
-------------------------------------------------------------
' Программа для определения машинных констант
'
------------------------
-------------------------------------
'
#Lang "QB"
DEFSNG E ' DEFDBL E -
тип переменной
EPS = 1
DO
EPS = EPS/2
EPS1 = 1 + EPS
LOOP WHILE EPS1 > 1
PRINT EPS
'
DEFSNG N ' DEFDBL N –
тип
переменной
NUL0 = 1
DO
NUL = NUL0
NUL0 = NUL/2
LOOP WHILE NUL0
> 0
PRINT NUL
SLEEP
END
При выполнении программ на экран дисплея последовательно выводится:
значение "машинного эпсилон":
для DEFSNG E -
5.960464e
-
008
для DEFDBL E -
1.110223e
-
016
значение "машинного нуля":
для DEFSNG N
-
1.401298e
-
045
для DEFDBL N
-
4.9
40656e
-
324
А теперь приведем пример программы, которая почти не имеет отношения к рассматриваемому вопросу... Приведена только потому, что в свое время автору она доставила много "радости"
... Речь идет о решении в целых числах алгебраических линейных урав
нений с целыми коэффициентами более чем с одним неизвестным. Эта задача представляет собой одну из труднейших и древнейших математических задач. С ней мы все сталкивались, если память не изменяет, в 8 классе. Уравнения названы "Диофантовы" в честь древнегр
еческого математика Диофанта Александрийский (Diophantus), жившего предположительно в III веке н.э. При рассмотрении вопроса разрешимости алгебраических диофантовых уравнений можно воспользоваться тем, что любую систему таких уравнений можно преобразовать в одно диофантово уравнение степени не выше 4 в целых неотрицательных числах, разрешимое в том и только том случае, когда разрешима исходная система (при этом множество переменных и множество решений этого нового уравнения может оказаться совершенно другим
). Десятая проблема Гильберта, сформулированная в 1900 году, состоит в нахождении алгоритма решения произвольных алгебраических диофантовых уравнений. В 1970 Юрий Матиясевич доказал алгоритмическую неразрешимость этой проблемы.
13
Диофант Александрийский
Этими задачами много занимались самые выдающиеся математики древности, например, греческий математик Пифагор (VI век до н.э.), александрийский математик Диофант (III век н.э.), П.Ферма(XVII в.), Л.Эйлер(XVIII век), Ж.Л.Лагранж(XVIII век), П.Дирихле(XIX век
), К.Гаусс(XIX век), П.Чебышев(XIX в.) и многие другие. Решение уравнений в целых числах является важной задачей и для современной математики. Теоретический интерес уравнений в целых числах достаточно велик, так как эти уравнения тесно связаны со многими п
роблемами теории чисел...
' P R O G R A M "Diophant"
' 10.10.2012
'
-------------------------------------------------------------
' Решение уравнения Диофанта A
*
X
+ B
*
Y
= C
'
------------------------
-------------------------------------
'
#
Lang
"
FB
" ' режим FreeBASIC
-
совместимости (умолчание)
Sub Diophant(A As Integer, B As Integer, C As Integer,_
Q() As Integer, ByRef X As Integer, ByRef Y As Integer,_
ByRef Er As Integer)
Dim As Integer A1, B1, C1,
N, R, S, D, I, U, V
Er
= 0 ' пока ошибок нет
N
= 0: I
= 0
D = Abs(A): S = D: R = Abs(B)
If((A = 0) Or (B = 0)) Then Er = 65: GoTo ExSub
Do While R <> 0
I = I + 1
N = I: Q(I) = Int(S/R)
D = R: R = S -
R*Q(I): S = D
Loop
If(D <>
0) Then GoTo OK
If
(
C
<> 0) Then
Er
= 66: GoTo
ExSub
' уравнение не определено
Else
Er
= 65: GoTo
ExSub
' решение не существует
EndIf
OK:If((Int(C/D)*D) <> C) Then Er = 66: GoTo ExSub
A = A/D: B = B/D: C = C/D
If(N <> 0) Then
V = 1: U = 0
If(N = 1) Then GoTo Ex
I = N -
1
Else
V = 0: U = 1: GoTo Ex
EndIf
Do
S = V: V = U -
V*Q(I): U = S: I = I -
1
14
Loop While I <> 0
Ex:X = C*U*Sgn(A): Y = C*V*Sgn(B)
C = Int(X/B)
X = X -
C*B: Y = Y + C*A
ExSub
: ' точка выхода из подпрограммы
End Sub
'
Dim As Integer A, B, C, M, V ' исходные данные
M
= 3 ' максимальное количество цифр
Dim As Integer Q(1 To 5*M), X, Y, Er
Data 1, 3, 4
Data 10, 12, 578
Data 1
27, -
52, 1 Data 7, 3, 158
Data 0, 0, 97
Data
10, 12, 97
For
V
= 1 To
6 ' перебор вариантов
Read
A
, B
, C
' чтение данных
Diophant(A, B, C, Q(), X, Y, Er)
If
Er
= 0 Then
C
= A
*
X
+ B
*
Y
' проверка подстановкой
Print Using " Var = ## X = ##### Y = ##### C = #####"; V; X; Y; C
Else
Print Using " Var = ## Er = ##"; V; Er
EndIf
Next
V
Sleep
Результат выполнения программы:
Var = 1 X = 1 Y = 1 C = 4
Var = 2 X = 5 Y
= 44 C = 578
Var = 3 X = -
9 Y = -
22 C = 1
Var = 4 X = 2 Y = 48 C = 158
Var = 5 Er = 65
Var = 6 Er = 66
Если C не делится нацело на наибольший общий делитель (A,B), то уравнение не разрешимо в целых числах. Справедл
иво и обратное: если в уравнении C делится нацело на наибольший общий делитель, то оно разрешимо в целых числах.
Известна также теорема. Пусть A и B взаимно просты и [X0, Y0] —
какое
-
нибудь решение уравнения A*X + B*Y + C = 0.
Тогда формулы:
X = X0 –
B*t, Y = Y0 + A*t
при t = 0, +/
-
l, +
\
-
2, ... дают все решения уравнения.
На этом позвольте закруглиться.
До новых встреч!
Пишите: eugene_r@mail.ru
Документ
Категория
Информатика
Просмотров
203
Размер файла
448 Кб
Теги
freebasic программирование
1/--страниц
Пожаловаться на содержимое документа