close

Вход

Забыли?

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

?

FreeBASIC2

код для вставкиСкачать
Пособие для начинающих программировать на языке FreeBASIC. Фрагмент 2 – вполне обнадеживающее продолжение осваивания языка. Может представлять интерес для учащихся школ, студентов институтов, а также преподавателей.
 1
Евгений Рыжов, инженер
Программирование на языке FreeBASIC
пособие для начинающих
Пособие для начинающих программировать на языке FreeBASIC.
Фрагмент 2 –
вполне обнадеживающее продолжение осваивания языка.
Может представлять интерес для учащихся школ,
студентов институтов,
а также преподавателей.
Фрагмент 2. Все еще впереди
Девочка вся в слезах с учебником по математике подходит к папе.
-
Что случилось? Почему рыдаешь?
-
Я не могу решить задачку!
-
Про что задача?
Молчание.
-
Что там в условии? Почему молчишь?
Дочка заливается новой порцией слез:
-
Я не знаю... Я еще не читала...
2
Из личных наблюдений автора
–
со временем меняются отношения между людьми. Во времена моего обучения программированию в институте дистанция межу учителями и учениками была не столь катастрофически велика –
даже самому ленивому ученику без серьезной математической подготовки (например, будущему металлургу) преподаватель "умудрялся" объяснить, что и как делает программа... В то время
учитель говорил доброжелательно: "ребя
та, не волнуйтесь, это все очень просто, у вас наверняка получится". В нынешн
ее
врем
я
, не слишком хорошо подготовленный преподаватель, говорит: "это сложно, это не для вашего ума, вы все равно не поймете"! Полагаете, что без глубокой веры в талантливость п
редставителей подрастающего поколения, еще можно утверждать:
Что может собственных Платонов
И быстрых разумов Невтонов
Российская земля рождать?
Давайте пошутим:
Чем отличается программист от нормального человека?
Нормальный человек думает, что в килобайте
1000 байт,
программист же думает, что в километре 1024 метра.
Две замечательные математические константы
Как известно числа π
и e
входят во множество математических формул эксплуатируемых в физике, химии, биологии и управлении... Такая "востребованност
ь" говорит о том, что они отражают какие
-
то наиболее общие, глобальные законы природы.
Кроме того, между ними существует теснейшая связь! Об этом –
чуть ниже.
Число e
появилось сравнительно недавно. Его иногда называют "неперовым числом" в честь изобретат
еля логарифмов шотландского математика Джона Непера (1550
-
1617), однако необоснованно, так как нет твердых оснований для утверждения, что Непер имел о числе е четкое представление". Впервые обозначение "
e
" ввел Леонард Эйлер (1707
-
1783), который точно вычи
слил 23 десятичные знака этого числа с помощью бесконечного числового ряда, полученного Даниилом Бернули (1700
-
1782). Надеюсь к этой "математической достопримечательности" вернемся в следующих "фрагментах" пособия...
Леонард Эйлер (1707
-
1783)
О времени п
оявления числа π
и его авторе ничего не известно. Есть два источника информации. Первый –
"Математический папирус Ахмеса"
(известен как папирус Ринда) —
древнеегипетское учебное руководство по арифметике и геометрии переписанное около 1650 до Р.Х. писцом п
о имени Ахмес. В 1870 папирус был расшифрован, переведён и издан. Ныне большая часть рукописи находится в Британском музее в Лондоне, а вторая часть —
в Нью
-
Йорке. Папирус Ахмеса включает условия и решения 84 задач и является наиболее полным египетским зад
ачником, дошедшим до наших дней. Второй источник -
"Московский математический папирус"
, 3
находящийся в Государственном музее изобразительных искусств имени А.С.Пушкина, уступает папирусу Ахмеса по полноте (он состоит из 25 задач), но превосходит его по возр
асту. Московский математический папирус (известен как "математический папирус Голенищева") —
один из древнейших известных современности математических текстов. Он был составлен около 1850 до Р.Х., за 200 лет до "Математический папирус Ахмеса".
Ахмес, око
ло 1650 до Р.Х. И вот между этими, такими далекими по времени, числами π
и e
существует теснейшая связь –
они входят в замечательную формулу Л.Эйлера
, которая устанавливает соотношение между ними:
e ^(i*
π
) = -
1
Здесь i –
"мнимая единица" -
комплексное
число, квадрат которого равен отрицательной единице. Она позволяет расширить поле вещественных чисел до поля комплексных чисел. Причиной введения мнимой единицы послужило то, что не каждое полиномиальное уравнение f(x) = 0 с вещественными коэффициентами и
меет решения в поле вещественных чисел. Так, уравнение x^2 + 1 = 0 не имеет вещественных корней. Однако оказывается, что любое полиномиальное уравнение с комплексными коэффициентами, имеет комплексное решение. Этот результат зафиксирован в "Основной теорем
е алгебры".
Приведенная выше ф
ормул
а
Эйлера может быть записана в тригонометрическом виде:
exp(i*z) = cos(z) + i*sin(z),
где
z = a + b*i –
некоторое комплексное число,
a = Re(z) –
действительная часть числа,
b = Im(z) –
мнимая часть числа.
Красивые
форм
улы
:
exp(i*Pi) = cos(Pi) + i*sin(Pi) = -
1,
exp(i*Pi/2) = cos(Pi/2) + i*sin(Pi/2) = i.
Человек, который первый обозначил в 1706 число Pi от греческого слова perijerio ("окружность") греческой же буквой π
, это Уильям Джонс (William Jones, 1675 —
1749) —
б
ританский (валлийский) математик. Общепринятым это обозначение стало после того, как его (начиная с 1736 года) стал систематически употреблять Леонард Эйлер. Несмотря на свою невеликую важность, как исследователя математики, Уильям Джонс хорошо известен ис
торикам математики, так как он вел обширную переписку со многими математиками семнадцатого столетия, включая Исаака Ньютона. Ну, как не поместить его портрет!
4
Уильям Джонс (William Jones, 1675 —
1749)
Число Pi -
иррациональное число, но могущее быть вы
численным с любой степенью точности, в стародавние времена называли "лудольфово число" по имени голландского математика Лудольфа ван Цейлена
(1539 –
1610), вычислившего это число с 35 десятичными знаками. В наши времена Джон фон Нейман
с сотрудниками, в ию
не 1949 года, используя машину " ENIAC", вычислили 2037 цифр числа Pi за 70 часов. С тех пор вычисление числа Pi стало своеобразным соревнованием.
В 1957 Фелтон пытался вычислить 10 тысяч
знаков Pi, но из
-
за ошибки компьютера только первые 7480 знаков оказ
ались правильными. Рубеж в 10 тысяч знаков был достигнут годом позже Женюи с помощью компьютера IBM 704. В 1961 Дэниел Шенкс и Джон У. Ренч
-
младший вычислили 100 тысяч знаков Pi с помощью компьютера IBM 7090 менее чем за 9 часов. Отметка в миллион знаков б
ыла пройдена в 1973 Жаном Гийу и М. Буйе. Это заняло чуть меньше суток работы компьютера CDC 7600 (вычисления Шенкса —
Ренча и Гийу —
Буйе были проделаны дважды при помощи двух разных выражений для Пи через арктангенсы).
В 2009 ученым из Университета Цуку
ба (Япония) удалось установить новый рекорд точности вычисления числа Pi
-
более чем 2,5 триллиона знаков после запятой. Вычисления проводились на суперкомпьютере T2K Tsukuba System, оборудованном 640 процессорами AMD Opteron с четырьмя ядрами, обеспечиваю
щими суммарную производительность до 95 триллионов операций с плавающей запятой в секунду. На расчеты числа Pi ушло 73 часа 36 минут. 11 января 2010 француз Фабрис Беллар вычислил на домашнем компьютере
число Pi
с рекордной точностью. Новый рекорд составля
ет около 2,7 триллиона десятичных знаков. Беллар потратил на вычисления 103 дн
я
. 16
октября
2011 очередной рекорд
-
фундаментальная математическая константа была посчитана с точностью до 10 триллионов (10^12) знаков после запятой, сообщается на сайте:
http://www.numberworld.org/misc_runs/pi
-
10t/details.html
Рекордные вычисления провели американец Александр Йи и японец Шигеру Кондо. Предыдущий рекорд по вычислению знаков Пи после зап
ятой -
5 триллионов -
также принадлежит им. Для работы использовался специально созданный для вычисления фундаментальной константы компьютер, который работал 371 день. Десятитриллионная цифра числа Pi
оказалась равна пяти.
Трудно сказать "нематематику" хор
ошо это или плохо! Понятно, что на практике знание такого количество цифр числа не нужно. Так, например, 39 знаков числа Pi
достаточно для того, чтобы вычислить длину окружности с диаметром, равным диаметру Вселенной, с погрешностью меньше диаметра одного атома водорода.
Вместе с тем, с набором цифр числа Pi
связано большое количество теоретических вопросов, для которых подобного рода исследования фактически являются экспериментальной проверкой гипотез.
5
Следует отметить, что такой прогресс в вычислениях и
мел место не только благодаря более быстрому аппаратному обеспечению, но и благодаря разработке новых алгоритмов вычисления. А наблюдаемый прогресс подстегивает все новые и новые разработки... Как побочный продукт разрабатываются специализированные тесты п
роизводительности –
"бенчмарк"
(benchmark) —
контрольные задачи, необходимые для определения сравнительных характеристик производительности компьютерных системы. Количество "бенчмарков" с каждым днем растет. Тем не менее, общепризнанными являются лишь неск
олько десятков из них, на результатах которых часто базируются рейтинги производительности тех или иных компьютерных компонентов. Для оценки "качества" математических алгоритмов
применяются свои "бенчмарки". Например, известная программа SuperP
i
-
тест, вы
числяющий число Pi с заданным количеством знаков после запятой. Программа SuperPi
нагружает процессор огромным числом операций с плавающей запятой, но работает только в однопоточном режиме –
ни о каком распараллеливании между ядрами речь не идет.
Для "быт
овых нужд" в качестве приближения можно использовать дробь (22/7) = 3.142857 —
хорошее приближение к Pi
, предложенное Архимедом. Но народ в эпоху "тоталитаризма" пользовался и таким приближением –
оказывается, что "четвертинка" (0,25 литров водки) в степен
и "пол
-
литры" (0,5 литров водки) давала в ценах до 197
1
года число P
i
(как все было "сбалансировано)! Поскольку в языке FreeBASIC отсутствует операция возведения в нецелую степень, напишем и выполним для проверки программу:
Dim As Double A
, B ' переменные двойной точности
A = 2.87: B = 1.49 ' их численные значения
Print Exp(A*Log(B)) ' A^B = 3.14083116
Sleep ' для выхода -
нажать любую клавишу
Не "заморачиваясь" на специализированной программе SuperPI, попробуем собстве
нный вариант (текст приведен ниже), который имеет правдоподобное соотношение математических операций и переходов. Всех читающих этот "фрагмент" автор просит сообщить
(адрес указан в левом нижнем углу -
в
ладелец: eugene_r
) свои соображения по поводу использ
ования программы для тестирования и, если не затруднит, результаты тестирования с указанием процессора и операционной системы. Согласитесь это интересно!
' P R O G R A M "Benchmark"
' 10.10.2012
'
-----
--------------------------------------------------------
' Тестовая программа определения длительности выполнения
'
-------------------------------------------------------------
Sub Bench(N As Integer, A As Single, ByRef S As Single)
Dim As Single B(
N)
Dim As Integer I
S = 0
For I = 1 To N
B(I) = A*A*A + A/A -
A + A
S = S + B(I)
Next I
S = S/N
End Sub
'
ниже основная программа
6
Dim As Double Start
Dim As Single A, S
Dim As Integer J, N
Print " Wait!..."
Start = Timer ' запомнить время старта
Do ' делать
Sleep 1 ' ждать 1 миллисекунду
Loop While (Timer -
Start) < 5 ' пока не 5 секунд
N = 10: A = 1.0 ' исходные данные
For J = 1 To 1000000 ' выполнять цикл
Bench(N, A, S) ' набор операций
Next J ' следующая итерация
Print " Done!"
Print Timer -
Start ' 5.315581...
Sleep ' ждать нажатия клавиши
Кроме времени исполне
ния тестовой программы представляет практический интерес и размер исполняемого модуля
. После запуска программы
:
<
Пуск
>
<
Выполнить
>
"C:
\
Program Files
\
FreeBASIC
\
Projects
\
_b.bat" Benchmark.bas
содержимое ранее созданного каталога (см. Программирование на яз
ыке FreeBASIC Фрагмент 1
) имеет вид:
Содержимое
папки
C:
\
Program Files
\
FreeBASIC
\
Projects
1
112 Benchmark.bas
22
528 Benchmark.exe
54 First_dos.bas
19
968 First_dos.exe
54 First_win.bas
19
968 First_win.exe
244 _b.bat
Обращает на себя внимание небольшое различие между размерами
"маленьких программ" (файлы First_dos.exe и First_win.exe) и относительно "большой программы" (файл Benchmark.exe). Это интуитивно поня
тно –
кроме собственно алгоритма тестовой задачки, в памяти присутствуют и компоненты необходимые для связи с операционной средой.
К слову, если в используемом косвенном командном файле _b.bat
заменить строку:
fbc.exe %1.bas -
s console
на
строку
:
fbc.exe
%1.bas -
r -
c -
s console
то компилятор FreeBASIC будет создавать и сохранять
в том же каталоге промежуточные файлы <name>.asm и <name>.o, что бывает удобно при анализе работы как самого компилятора, так и при отладке программы пользователя. Общая схема
(о
пущены некоторые подробности) представлена на рисунке
ниже
:
7
Такая, на первый взгляд сложная, процедура создания программных модулей позволяет компилятору FreeBASIC создавать не только бинарные EXE
, но и файлы других форматов: OBJ, LIB, DLL
. Так, для с
оздания статической или динамической библиотеки достаточно добавить лишь один ключ в командную строку компилятора:
-
lib
или -
dll
.
8
В качестве простых учебных примеров
ниже приведены тексты программ на языке FreeBASIC для вычисления числа Pi.
' P R O G R A M "Pi_31415"
' 10.10.2012
'
-------------------------------------------------------------
' Программа №1: суммирование указанного количества членов
'
------------------------------------------------
-------------
' используется ряд Pi/4 = 1 –
1/3 + 1/5 –
1/7 +1/9...
Dim As Double Pi
Dim As Integer I, N, S
N = 1000000000: Pi = 0: S = 1
For I=1 To N Step 2
Pi = Pi + S/I: S = -
S
Next I
Pi = 4*Pi
Print Pi ' 3.1415926515
Sleep
В этой программе вычисление осуществляется суммированием членов ряда от I
=
1 до I
=
1000000000
. Ниже приведен вариант программы, где вычисления прекращаются при достижении заданной точности (пока абсолютная величина следующей "добавки" к сумме больше заданного числа).
' P R O G R A M "Pi_31415"
' 10.10.2012
'
-------------------------------------------------------------
' Программа №2: суммирование до указанной точности
'
---------------------------------------------
----------------
' используется ряд Pi/4 = 1 –
1/3 + 1/5 –
1/7 +1/9...
Dim As Double Pi, Delta
Dim As Integer I, S
I = 1: Pi = 0: S = 1
Do
Delta = S/I: Pi = Pi + Delta
I = I + 2: S = -
S
Loop While Abs(Delta) > 0.000000001
Pi = 4*Pi
Print Pi '
3.1415926555
Sleep
Читателям понятно, что н
еотъемлемой частью любой "взрослой" программы являются циклы и переходы
по условию, например, такие как в про
грамме ниже. Если в массиве существует элемент равный нулю, то вывести его номер, если нет –
сообщить.
Dim As Integer A(5), I, NUM
A(1) = 1: A(2) = 2: A(3) = 0: A(4) = 4: A(5) = 5
NUM
= 0 ' пока нет нулевых элементов
For I = 1 To 5 ' перебор
I от
1 до
5
If A(I) = 0 Then NUM = I: Exit For ' обнаружен
элемент
Next
I
' следующий
элеме
нт
9
If
NUM
<> 0
Then
' есть нулевой элемент
Print
NUM
' вывести его номер
Else
' нет нулевого элемента
Print " net nulevyh elementov!"
End If
Sleep
Конечно, пример нелепый, но зато –
понятный!
Для организации итерационных циклов в я
зыке FreeBASIC
предусмотрен
ы
две алгоритмические структуры
.
Первая структура называется "цикл с предусловием" и реализуется оператором:
Do [ { Until | While } < условие
> ]
[ statement block ]
Loop
Вторая структура носит название "цикл с постусловием"
и
реализуется оператором:
Do
[ statement block ]
Loop [ { Until | While } < условие
> ]
Exit D
o
–
может использоваться внутри цикла для досрочного выхода из него
.
Следующая программа не требует комментариев –
формула приведена в тексте.
' P R O G R
A M "Pi_31415"
' 10.10.2012
'
-------------------------------------------------------------
' Программа №3: вычисление по формуле Гаусса
'
-------------------------------------------------------------
' формула Гаусса в тексте прог
р
аммы...
Dim As Double Pi
Pi = 12*Atn(1/18) + 8*Atn(1/57) -
5*Atn(1/239)
Pi = 4*Pi
Print Pi ' 3.1415926535
Sleep
В инженерной практике для решения сложных задач часто применяют так называемое "
имитационное моделирование
" —
метод исследования, при котором изучаемая система заменяется моделью, с достаточной точностью описывающей реальную систему, с которой проводятся эксперименты с целью получения информации об этой системе. Экспериментирование с моделью называют имитацией
(имитация —
это постижение сути явления, не прибегая к экспериментам на реальном объекте). Этот метод исследования настолько логически прост
, что используется не только для моделирования стохастических процессов, но и для решения вполне "детерминированных
" математических задач. В этом случае его часто называют метод "Монте
-
Карло"
. Это настолько интересная тема, что заслуживает отдельного 10
"Фрагмента"
, который состоится, если будет получено одобрение читателей
. Годом рождения метода Монте
-
Карло считается 194
9, когда в свет вы
шла статья Метрополиса и Улама "Метод Монте
-
Карло". Название метода происходит от названия города в княжестве Монако, широко известного своими многочисленными казино, поскольку именно рулетка является одним из самых широко известных генер
аторов случайных чисел. Станислав Улам пишет в своей автобиографии "Приключения математика", что название было предложено Николасом Метрополисом в честь его дяди, который был азартным игроком. Ниже приведена программа, использующая программный генератор сл
учайных чисел Rnd()
для нахождения значения числа Pi. При каждом обращении эта функция генерирует очередное псевдослучайное действительное дробное число из диапазона от 0 до 1.
' P R O G R A M "Pi_31415"
' 10.10.2012
'
-------------------------------------------------------------
' Программа №4: вычисление методом Монте
-
Карло
'
-------------------------------------------------------------
' бросание точки в четверть круга случайным образом...
Dim As D
ouble R, X, Y, YC, Pi
Dim As Integer I, N, NC
Screen 12 ' 640x480
Cls
View (1, 1)
-
(475, 475), , 15 ' физическое квадратное окно
Window (0, 0)
-
(1, 1) ' логическое окно вывода
R = 1 ' единичный радиус
Circle (0, 0), 1, 1 ' вывод окружности
N = 100000: NC = 0 ' количество точек
For I = 1 To N ' перебрать все точки
X = Rnd() ' случайная координата X
YC = Sqr(R^2 -
X^2) ' координаты Y на окружности
Y = Rnd() ' случайная координата Y
If Y < YC Then NC = NC + 1: PSet(X, Y), 13
If Y >= YC Then PSet(X, Y), 11
Next I
Pi = 4*(NC/N)
Locate 4, 40: Print Using "NO = ######"; N -
NC
Locate 12, 20: Print Using "NC = ######"; NC
Locate 16, 30: Pr
int Using "Pi = ##.######"; Pi
Sleep
На этом позвольте закруглиться.
До новых встреч!
Пишите
: eugene
_
r
@
mail
.
ru
Документ
Категория
Информатика
Просмотров
220
Размер файла
364 Кб
Теги
freebasic программирование
1/--страниц
Пожаловаться на содержимое документа